]>
Commit | Line | Data |
---|---|---|
f035d41b XL |
1 | use std::collections::HashMap; |
2 | ||
3 | use serde::Serialize; | |
4 | ||
5 | use crate::{ErrorCode, Request, RequestId, Response, ResponseError}; | |
6 | ||
7 | /// Manages the set of pending requests, both incomming and outgoing. | |
8 | #[derive(Debug)] | |
9 | pub struct ReqQueue<I, O> { | |
10 | pub incoming: Incoming<I>, | |
11 | pub outgoing: Outgoing<O>, | |
12 | } | |
13 | ||
14 | impl<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)] | |
24 | pub struct Incoming<I> { | |
25 | pending: HashMap<RequestId, I>, | |
26 | } | |
27 | ||
28 | #[derive(Debug)] | |
29 | pub struct Outgoing<O> { | |
30 | next_id: u64, | |
31 | pending: HashMap<RequestId, O>, | |
32 | } | |
33 | ||
34 | impl<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 | ||
52 | impl<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 | } |