1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
use std::io;
use std::net::SocketAddr;
use std::any::Any;
use std::fmt::Debug;
use std::fmt::Display;
use std::fmt::Formatter;
use tokio_core::reactor;
use tokio_io::AsyncRead;
use tokio_io::AsyncWrite;
use futures::stream::Stream;
use futures::Future;
use server_conf::ServerConf;
pub trait ToSocketListener {
fn to_listener(&self, conf: &ServerConf) -> Box<ToTokioListener + Send>;
fn cleanup(&self);
}
#[derive(Clone)]
pub enum AnySocketAddr {
Inet(SocketAddr),
Unix(String)
}
impl Display for AnySocketAddr {
fn fmt(&self, f: &mut Formatter) -> ::std::fmt::Result {
match *self {
AnySocketAddr::Inet(ref inet_addr) => Display::fmt(inet_addr, f),
AnySocketAddr::Unix(ref unix_addr) => Display::fmt(unix_addr, f),
}
}
}
impl AnySocketAddr {
pub fn port(&self) -> io::Result<u16> {
match self {
&AnySocketAddr::Inet(ref inet_addr) => Ok(inet_addr.port()),
&AnySocketAddr::Unix(_) =>
Err(io::Error::new(io::ErrorKind::Other, "Cannot get port from unix domain socket"))
}
}
}
impl ToSocketListener for AnySocketAddr {
fn to_listener(&self, conf: &ServerConf) -> Box<ToTokioListener + Send> {
match self {
&AnySocketAddr::Inet(ref inet_addr) => inet_addr.to_listener(conf),
#[cfg(unix)]
&AnySocketAddr::Unix(ref unix_addr) => unix_addr.to_listener(conf),
#[cfg(not(unix))]
&AnySocketAddr::Unix(..) => panic!("cannot use unix sockets on non-unix"),
}
}
fn cleanup(&self) {
match self {
&AnySocketAddr::Inet(ref inet_addr) => inet_addr.cleanup(),
#[cfg(unix)]
&AnySocketAddr::Unix(ref unix_addr) => unix_addr.cleanup(),
#[cfg(not(unix))]
&AnySocketAddr::Unix(..) => {},
}
}
}
impl ToClientStream for AnySocketAddr {
fn connect(&self, handle: &reactor::Handle)
-> Box<Future<Item=Box<StreamItem>, Error=io::Error> + Send>
{
match self {
&AnySocketAddr::Inet(ref inet_addr) => inet_addr.connect(handle),
#[cfg(unix)]
&AnySocketAddr::Unix(ref unix_addr) => unix_addr.connect(handle),
#[cfg(not(unix))]
&AnySocketAddr::Unix(..) => panic!("cannot use unix sockets on non-unix"),
}
}
}
pub trait ToTokioListener {
fn to_tokio_listener(self: Box<Self>, handle: &reactor::Handle) -> Box<ToServerStream>;
fn local_addr(&self) -> io::Result<AnySocketAddr>;
}
pub trait ToServerStream {
fn incoming(self: Box<Self>)
-> Box<Stream<Item=(Box<StreamItem>, Box<Any>), Error=io::Error>>;
}
pub trait ToClientStream:
Display +
Send + Sync
{
fn connect(&self, handle: &reactor::Handle)
-> Box<Future<Item=Box<StreamItem>, Error=io::Error> + Send>;
}
pub trait StreamItem:
AsyncRead +
AsyncWrite +
io::Read +
io::Write +
Debug +
Send + Sync
{
fn is_tcp(&self) -> bool;
fn set_nodelay(&self, no_delay: bool) -> io::Result<()>;
}