Skip to main content

address/ip/
conversions.rs

1use crate::{Host, HostRef, IPAddress, IPv4Address, IPv6Address, SocketAddress};
2
3impl IPAddress {
4    //! Conversions
5
6    /// Converts the address to an optional IPv4 address.
7    #[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    /// Converts the address to an optional IPv6 address.
13    #[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    /// Converts the address to a socket address with the `port`.
19    pub const fn to_socket(self, port: u16) -> SocketAddress {
20        SocketAddress::new(self, port)
21    }
22
23    /// Converts the address to a host.
24    pub const fn to_host(self) -> Host {
25        Host::Address(self)
26    }
27
28    /// Converts the address to a host reference.
29    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}