Skip to main content

airio_core/
transport.rs

1pub mod and_then;
2pub mod map;
3pub mod map_err;
4pub mod upgrade;
5
6mod boxed;
7
8use std::{error, fmt, net::SocketAddr};
9
10use futures::{Stream, TryFuture, TryFutureExt, future};
11
12use crate::ConnectedPoint;
13
14pub use boxed::Boxed;
15
16pub trait Transport {
17    type Output;
18    type Error: error::Error;
19    type Dialer: Future<Output = Result<Self::Output, Self::Error>>;
20    type ListenerUpgrade: Future<Output = Result<Self::Output, Self::Error>>;
21    type Listener: Stream<Item = ListenerEvent<Self::ListenerUpgrade, Self::Error>>;
22
23    fn listen(&self, addr: SocketAddr) -> Result<Self::Listener, Self::Error>;
24
25    fn connect(&self, addr: SocketAddr) -> Result<Self::Dialer, Self::Error>;
26
27    fn map<F, O>(self, f: F) -> map::Map<Self, F>
28    where
29        Self: Sized,
30        F: FnOnce(Self::Output, ConnectedPoint) -> O,
31    {
32        map::Map::new(self, f)
33    }
34
35    fn and_then<TMap, TFut, O>(self, f: TMap) -> and_then::AndThen<Self, TMap>
36    where
37        Self: Sized,
38        TMap: FnOnce(Self::Output, ConnectedPoint) -> TFut,
39        TFut: TryFuture<Ok = O>,
40        <TFut as TryFuture>::Error: error::Error + 'static,
41    {
42        and_then::AndThen::new(self, f)
43    }
44
45    fn map_err<F, O>(self, f: F) -> map_err::MapErr<Self, F>
46    where
47        Self: Sized,
48        F: FnOnce(Self::Error) -> O,
49        O: error::Error + 'static,
50    {
51        map_err::MapErr::new(self, f)
52    }
53
54    fn upgrade(self) -> upgrade::Builder<Self>
55    where
56        Self: Sized,
57        Self::Error: 'static,
58    {
59        upgrade::Builder::new(self)
60    }
61}
62
63pub enum ListenerEvent<T, E> {
64    Listened(SocketAddr),
65    Incoming {
66        local_addr: SocketAddr,
67        remote_addr: SocketAddr,
68        upgrade: T,
69    },
70    Closed(Result<(), E>),
71    Error(E),
72}
73
74impl<U, E> ListenerEvent<U, E> {
75    pub fn map_upgrade<F, O>(self, f: F) -> ListenerEvent<O, E>
76    where
77        F: FnOnce(U) -> O,
78    {
79        match self {
80            ListenerEvent::Listened(addr) => ListenerEvent::Listened(addr),
81            ListenerEvent::Incoming {
82                local_addr,
83                remote_addr,
84                upgrade,
85            } => ListenerEvent::Incoming {
86                local_addr,
87                remote_addr,
88                upgrade: f(upgrade),
89            },
90            ListenerEvent::Closed(result) => ListenerEvent::Closed(result),
91            ListenerEvent::Error(err) => ListenerEvent::Error(err),
92        }
93    }
94
95    pub fn map_err<F, O>(self, f: F) -> ListenerEvent<U, O>
96    where
97        F: FnOnce(E) -> O,
98    {
99        match self {
100            ListenerEvent::Listened(addr) => ListenerEvent::Listened(addr),
101            ListenerEvent::Incoming {
102                local_addr,
103                remote_addr,
104                upgrade,
105            } => ListenerEvent::Incoming {
106                local_addr,
107                remote_addr,
108                upgrade,
109            },
110            ListenerEvent::Closed(result) => ListenerEvent::Closed(result.map_err(f)),
111            ListenerEvent::Error(err) => ListenerEvent::Error(f(err)),
112        }
113    }
114
115    pub fn map_upgrade_err<F, O>(self, f: F) -> ListenerEvent<future::MapErr<U, F>, E>
116    where
117        U: TryFuture<Error = E>,
118        F: FnOnce(E) -> O,
119    {
120        match self {
121            ListenerEvent::Listened(addr) => ListenerEvent::Listened(addr),
122            ListenerEvent::Incoming {
123                local_addr,
124                remote_addr,
125                upgrade,
126            } => ListenerEvent::Incoming {
127                local_addr,
128                remote_addr,
129                upgrade: upgrade.map_err(f),
130            },
131            ListenerEvent::Closed(result) => ListenerEvent::Closed(result),
132            ListenerEvent::Error(err) => ListenerEvent::Error(err),
133        }
134    }
135}
136
137impl<U, E> fmt::Debug for ListenerEvent<U, E>
138where
139    E: fmt::Debug,
140{
141    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
142        match self {
143            ListenerEvent::Listened(addr) => write!(f, "Listened({})", addr),
144            ListenerEvent::Incoming {
145                local_addr,
146                remote_addr,
147                upgrade: _,
148            } => write!(
149                f,
150                "Incoming(local: {}, remote: {})",
151                local_addr, remote_addr
152            ),
153            ListenerEvent::Closed(result) => write!(f, "Closed({:?})", result),
154            ListenerEvent::Error(err) => write!(f, "Error({:?})", err),
155        }
156    }
157}