]> git.proxmox.com Git - rustc.git/blame - vendor/lsp-server/src/req_queue.rs
New upstream version 1.48.0+dfsg1
[rustc.git] / vendor / lsp-server / src / req_queue.rs
CommitLineData
f035d41b
XL
1use std::collections::HashMap;
2
3use serde::Serialize;
4
5use crate::{ErrorCode, Request, RequestId, Response, ResponseError};
6
7/// Manages the set of pending requests, both incomming and outgoing.
8#[derive(Debug)]
9pub struct ReqQueue<I, O> {
10 pub incoming: Incoming<I>,
11 pub outgoing: Outgoing<O>,
12}
13
14impl<I, O> Default for ReqQueue<I, O> {
15 fn default() -> ReqQueue<I, O> {
16 ReqQueue {
17 incoming: Incoming { pending: HashMap::default() },
18 outgoing: Outgoing { next_id: 0, pending: HashMap::default() },
19 }
20 }
21}
22
23#[derive(Debug)]
24pub struct Incoming<I> {
25 pending: HashMap<RequestId, I>,
26}
27
28#[derive(Debug)]
29pub struct Outgoing<O> {
30 next_id: u64,
31 pending: HashMap<RequestId, O>,
32}
33
34impl<I> Incoming<I> {
35 pub fn register(&mut self, id: RequestId, data: I) {
3dfed10e 36 self.pending.insert(id, data);
f035d41b
XL
37 }
38 pub fn cancel(&mut self, id: RequestId) -> Option<Response> {
39 let _data = self.complete(id.clone())?;
40 let error = ResponseError {
41 code: ErrorCode::RequestCanceled as i32,
42 message: "canceled by client".to_string(),
43 data: None,
44 };
45 Some(Response { id, result: None, error: Some(error) })
46 }
47 pub fn complete(&mut self, id: RequestId) -> Option<I> {
48 self.pending.remove(&id)
49 }
50}
51
52impl<O> Outgoing<O> {
53 pub fn register<P: Serialize>(&mut self, method: String, params: P, data: O) -> Request {
54 let id = RequestId::from(self.next_id);
55 self.pending.insert(id.clone(), data);
56 self.next_id += 1;
57 Request::new(id, method, params)
58 }
59 pub fn complete(&mut self, id: RequestId) -> O {
60 self.pending.remove(&id).unwrap()
61 }
62}