atm0s_sdn_transport_compose/
lib.rs

1#[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}