Skip to main content

middleware_core/bus/
service.rs

1use std::sync::Arc;
2
3use super::{ServiceBus, ServiceChannel, ServiceLoadEntry};
4
5impl ServiceChannel {
6    pub fn push_request(&self, id: u64, req: Box<dyn std::any::Any + Send>) {
7        self.requests
8            .lock()
9            .expect("service req lock poisoned")
10            .push_back((id, req));
11    }
12
13    pub fn pop_request(&self) -> Option<(u64, Box<dyn std::any::Any + Send>)> {
14        self.requests
15            .lock()
16            .expect("service req lock poisoned")
17            .pop_front()
18    }
19
20    pub fn push_response(&self, id: u64, res: Box<dyn std::any::Any + Send>) {
21        self.responses
22            .lock()
23            .expect("service res lock poisoned")
24            .insert(id, res);
25    }
26
27    pub fn pop_response(&self, id: u64) -> Option<Box<dyn std::any::Any + Send>> {
28        self.responses
29            .lock()
30            .expect("service res lock poisoned")
31            .remove(&id)
32    }
33
34    pub fn pending_request_count(&self) -> usize {
35        self.requests
36            .lock()
37            .expect("service req lock poisoned")
38            .len()
39    }
40
41    pub fn pending_response_count(&self) -> usize {
42        self.responses
43            .lock()
44            .expect("service res lock poisoned")
45            .len()
46    }
47}
48
49impl ServiceBus {
50    pub fn get_or_create(&mut self, service: &str) -> Arc<ServiceChannel> {
51        self.channels
52            .entry(service.to_string())
53            .or_insert_with(|| Arc::new(ServiceChannel::default()))
54            .clone()
55    }
56
57    pub fn load_entries(&self) -> Vec<ServiceLoadEntry> {
58        let mut out = self
59            .channels
60            .iter()
61            .map(|(service, ch)| ServiceLoadEntry {
62                service: service.clone(),
63                pending_requests: ch.pending_request_count(),
64                pending_responses: ch.pending_response_count(),
65            })
66            .collect::<Vec<_>>();
67        out.sort_by(|a, b| a.service.cmp(&b.service));
68        out
69    }
70}