1use futures_channel::oneshot;
9use serde_json::Value;
10use std::collections::HashMap;
11use std::sync::RwLock;
12
13pub(super) struct Observer {
14 requests: RwLock<HashMap<u32, oneshot::Sender<Value>>>,
15}
16
17impl Observer {
18 pub fn new() -> Self {
19 Observer {
20 requests: RwLock::default(),
21 }
22 }
23
24 pub fn subscribe(&self, extra: u32) -> oneshot::Receiver<Value> {
25 let (sender, receiver) = oneshot::channel();
26 self.requests.write().unwrap().insert(extra, sender);
27 receiver
28 }
29
30 pub fn notify(&self, response: Value) {
31 let extra = response["@extra"].as_u64().unwrap() as u32;
32 match self.requests.write().unwrap().remove(&extra) {
33 Some(sender) => {
34 if sender.send(response).is_err() {
35 log::warn!("Got a response of an unaccessible request");
36 }
37 }
38 None => {
39 log::warn!("Got a response of an unknown request");
40 }
41 }
42 }
43}