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}