async_ssh2_tokio/
to_socket_addrs_with_hostname.rs1use 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}