middleware_core/bus/
service.rs1use 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}