address/ip/
conversions.rs1use crate::{Host, HostRef, IPAddress, IPv4Address, IPv6Address, SocketAddress};
2
3impl IPAddress {
4 #[must_use]
8 pub const fn to_v4(self) -> Option<IPv4Address> {
9 if let Self::V4(ip) = self { Some(ip) } else { None }
10 }
11
12 #[must_use]
14 pub const fn to_v6(self) -> Option<IPv6Address> {
15 if let Self::V6(ip) = self { Some(ip) } else { None }
16 }
17
18 pub const fn to_socket(self, port: u16) -> SocketAddress {
20 SocketAddress::new(self, port)
21 }
22
23 pub const fn to_host(self) -> Host {
25 Host::Address(self)
26 }
27
28 pub const fn to_host_ref(self) -> HostRef<'static> {
30 HostRef::Address(self)
31 }
32}
33
34impl From<IPv4Address> for IPAddress {
35 fn from(v4: IPv4Address) -> Self {
36 v4.to_ip()
37 }
38}
39
40impl From<IPv6Address> for IPAddress {
41 fn from(v6: IPv6Address) -> Self {
42 v6.to_ip()
43 }
44}
45
46#[cfg(test)]
47mod tests {
48 use crate::{Host, HostRef, IPAddress, IPv4Address, IPv6Address, SocketAddress};
49
50 #[test]
51 fn ip_to_v4() {
52 let ip: IPAddress = IPv4Address::LOCALHOST.to_ip();
53 let result: Option<IPv4Address> = ip.to_v4();
54 let expected: Option<IPv4Address> = Some(IPv4Address::LOCALHOST);
55 assert_eq!(result, expected);
56
57 let ip: IPAddress = IPv6Address::LOCALHOST.to_ip();
58 let result: Option<IPv4Address> = ip.to_v4();
59 let expected: Option<IPv4Address> = None;
60 assert_eq!(result, expected);
61 }
62
63 #[test]
64 fn ip_to_v6() {
65 let ip: IPAddress = IPv4Address::LOCALHOST.to_ip();
66 let result: Option<IPv6Address> = ip.to_v6();
67 let expected: Option<IPv6Address> = None;
68 assert_eq!(result, expected);
69
70 let ip: IPAddress = IPv6Address::LOCALHOST.to_ip();
71 let result: Option<IPv6Address> = ip.to_v6();
72 let expected: Option<IPv6Address> = Some(IPv6Address::LOCALHOST);
73 assert_eq!(result, expected);
74 }
75
76 #[test]
77 fn ip_to_socket() {
78 let ip: IPAddress = IPv4Address::LOCALHOST.to_ip();
79 let result: SocketAddress = ip.to_socket(80);
80 let expected: SocketAddress = SocketAddress::new(IPAddress::V4(IPv4Address::LOCALHOST), 80);
81 assert_eq!(result, expected);
82 }
83
84 #[test]
85 fn ip_to_host() {
86 let ip: IPAddress = IPAddress::V4(IPv4Address::LOCALHOST);
87
88 let result: Host = ip.to_host();
89 let expected: Host = Host::Address(IPAddress::V4(IPv4Address::LOCALHOST));
90 assert_eq!(result, expected);
91
92 let result: HostRef = ip.to_host_ref();
93 let expected: HostRef = HostRef::Address(IPAddress::V4(IPv4Address::LOCALHOST));
94 assert_eq!(result, expected);
95 }
96
97 #[test]
98 fn ip_from() {
99 let result: IPAddress = IPv4Address::LOCALHOST.into();
100 let expected: IPAddress = IPAddress::V4(IPv4Address::LOCALHOST);
101 assert_eq!(result, expected);
102
103 let result: IPAddress = IPv6Address::LOCALHOST.into();
104 let expected: IPAddress = IPAddress::V6(IPv6Address::LOCALHOST);
105 assert_eq!(result, expected);
106 }
107}