async_ssh2_tokio/
to_socket_addrs_with_hostname.rs

1use std::io;
2use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs};
3
4pub trait ToSocketAddrsWithHostname {
5    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>>;
6    fn hostname(&self) -> String;
7}
8
9impl ToSocketAddrsWithHostname for String {
10    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>> {
11        self.as_str().to_socket_addrs().map(|iter| iter.collect())
12    }
13    fn hostname(&self) -> String {
14        self.clone()
15    }
16}
17
18impl ToSocketAddrsWithHostname for &str {
19    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>> {
20        ToSocketAddrs::to_socket_addrs(self).map(|iter| iter.collect())
21    }
22    fn hostname(&self) -> String {
23        self.to_string()
24    }
25}
26
27impl ToSocketAddrsWithHostname for (&str, u16) {
28    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>> {
29        ToSocketAddrs::to_socket_addrs(self).map(|iter| iter.collect())
30    }
31    fn hostname(&self) -> String {
32        self.0.to_string()
33    }
34}
35
36impl ToSocketAddrsWithHostname for (String, u16) {
37    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>> {
38        ToSocketAddrs::to_socket_addrs(self).map(|iter| iter.collect())
39    }
40    fn hostname(&self) -> String {
41        self.0.clone()
42    }
43}
44
45impl ToSocketAddrsWithHostname for (IpAddr, u16) {
46    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>> {
47        ToSocketAddrs::to_socket_addrs(self).map(|iter| iter.collect())
48    }
49    fn hostname(&self) -> String {
50        format!("{}", self.0)
51    }
52}
53
54impl ToSocketAddrsWithHostname for (Ipv4Addr, u16) {
55    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>> {
56        ToSocketAddrs::to_socket_addrs(self).map(|iter| iter.collect())
57    }
58    fn hostname(&self) -> String {
59        format!("{}", self.0)
60    }
61}
62
63impl ToSocketAddrsWithHostname for (Ipv6Addr, u16) {
64    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>> {
65        ToSocketAddrs::to_socket_addrs(self).map(|iter| iter.collect())
66    }
67    fn hostname(&self) -> String {
68        format!("{}", self.0)
69    }
70}
71
72impl ToSocketAddrsWithHostname for SocketAddr {
73    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>> {
74        Ok(vec![*self])
75    }
76    fn hostname(&self) -> String {
77        format!("{}", self.ip())
78    }
79}
80
81impl ToSocketAddrsWithHostname for SocketAddrV4 {
82    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>> {
83        Ok(vec![SocketAddr::V4(*self)])
84    }
85    fn hostname(&self) -> String {
86        format!("{}", self.ip())
87    }
88}
89
90impl ToSocketAddrsWithHostname for SocketAddrV6 {
91    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>> {
92        Ok(vec![SocketAddr::V6(*self)])
93    }
94    fn hostname(&self) -> String {
95        format!("{}", self.ip())
96    }
97}
98
99impl ToSocketAddrsWithHostname for &[SocketAddr] {
100    fn to_socket_addrs(&self) -> io::Result<Vec<SocketAddr>> {
101        Ok(self.to_vec())
102    }
103
104    fn hostname(&self) -> String {
105        self.iter()
106            .map(|addr| addr.ip().to_string())
107            .collect::<Vec<_>>()
108            .join(",")
109    }
110}