atm0s_sdn_transport_compose/
lib.rs1#[macro_export]
2
3macro_rules! compose_transport {
4 ($name:ident, $($field:ident: $ty:ty),*) => {
5 atm0s_sdn::compose_transport_desp::paste! {
6 use atm0s_sdn::Transport;
7 use atm0s_sdn::compose_transport_desp::FutureExt as _;
8 pub struct $name {
9 connector: [<$name Connector>],
10 }
11
12 impl $name {
13 pub fn new($($field: $ty,)*) -> Self {
14 Self {
15 connector: [<$name Connector>] {
16 conn_ids: std::collections::HashMap::new(),
17 $($field,)*
18 },
19 }
20 }
21 }
22
23 #[async_trait::async_trait]
24 impl atm0s_sdn::Transport for $name {
25 fn connector(&mut self) -> &mut dyn atm0s_sdn::TransportConnector {
26 &mut self.connector
27 }
28
29 async fn recv(&mut self) -> Result<atm0s_sdn::TransportEvent, ()> {
30 atm0s_sdn::compose_transport_desp::select! {
31 $(event = self.connector.$field.recv().fuse() => event),*
32 }
33 }
34 }
35
36 pub struct [<$name Connector>] {
37 conn_ids: std::collections::HashMap<atm0s_sdn::ConnId, usize>,
38 $($field: $ty,)*
39 }
40
41 impl atm0s_sdn::TransportConnector for [<$name Connector>] {
42 fn create_pending_outgoing(&mut self, dest: atm0s_sdn::NodeAddr) -> Vec<atm0s_sdn::ConnId> {
43 let mut conn_ids = Vec::new();
44 let mut i = 0;
45
46 $(
47 for conn_id in self.$field.connector().create_pending_outgoing(dest.clone()) {
48 self.conn_ids.insert(conn_id, i);
49 conn_ids.push(conn_id);
50 }
51 i += 1;
52 )*
53 conn_ids
54 }
55
56 fn continue_pending_outgoing(&mut self, conn_id: atm0s_sdn::ConnId) {
57 if let Some(index) = self.conn_ids.remove(&conn_id) {
58 let mut i = 0;
59 $(
60 if i == index {
61 self.$field.connector().continue_pending_outgoing(conn_id);
62 return;
63 }
64 i += 1;
65 )*
66 }
67 }
68
69 fn destroy_pending_outgoing(&mut self, conn_id: atm0s_sdn::ConnId) {
70 if let Some(index) = self.conn_ids.remove(&conn_id) {
71 let mut i = 0;
72 $(
73 if i == index {
74 self.$field.connector().destroy_pending_outgoing(conn_id);
75 return;
76 }
77 i += 1;
78 )*
79 }
80 }
81 }
82 }
83 };
84}