valust_utils/
net.rs

1//! Network related validators.
2
3use std::net::{
4    AddrParseError, IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6,
5};
6
7/// Check if a string-like item is a valid IP address.
8///
9/// ```rust
10/// # use valust_utils::net::is_ip;
11/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
12/// # use valust_derive::Valust;
13/// #
14/// #[derive(Valust)]
15/// struct Stringify {
16///     #[valid(func(is_ip))]
17///     ip: String,
18/// }
19/// ```
20pub fn is_ip(s: impl AsRef<str>) -> bool {
21    s.as_ref().parse::<IpAddr>().is_ok()
22}
23
24/// Convert a string-like item into an IP address.
25///
26/// ```rust
27/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
28/// # use valust_derive::Valust;
29/// use valust_utils::net::ip as trans_ip;
30/// #[derive(Valust)]
31/// struct Stringify {
32///     #[trans(func(String => try(trans_ip)))]
33///     ip: std::net::IpAddr,
34/// }
35/// ```
36pub fn ip(s: impl AsRef<str>) -> Result<IpAddr, AddrParseError> {
37    s.as_ref().parse()
38}
39
40/// Check if a string-like item is a valid IPv4 address.
41///
42/// ```rust
43/// # use valust_utils::net::is_ipv4;
44/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
45/// # use valust_derive::Valust;
46/// #
47/// #[derive(Valust)]
48/// struct Stringify {
49///     #[valid(func(is_ipv4))]
50///     ipv4: String,
51/// }
52/// ```
53pub fn is_ipv4(s: impl AsRef<str>) -> bool {
54    s.as_ref().parse::<Ipv4Addr>().is_ok()
55}
56
57/// Convert a string-like item into an IPv4 address.
58///
59/// ```rust
60/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
61/// # use valust_derive::Valust;
62/// use valust_utils::net::ipv4;
63/// #[derive(Valust)]
64/// struct Stringify {
65///     #[trans(func(String => try(ipv4)))]
66///     ip: std::net::Ipv4Addr,
67/// }
68/// ```
69pub fn ipv4(s: impl AsRef<str>) -> Result<Ipv4Addr, AddrParseError> {
70    s.as_ref().parse()
71}
72
73/// Check if a string-like item is a valid IPv6 address.
74///
75/// ```rust
76/// # use valust_utils::net::is_ipv6;
77/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
78/// # use valust_derive::Valust;
79/// #
80/// #[derive(Valust)]
81/// struct Stringify {
82///     #[valid(func(is_ipv6))]
83///     ipv6: String,
84/// }
85/// ```
86pub fn is_ipv6(s: impl AsRef<str>) -> bool {
87    s.as_ref().parse::<Ipv6Addr>().is_ok()
88}
89
90/// Convert a string-like item into an IPv6 address.
91///
92/// ```rust
93/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
94/// # use valust_derive::Valust;
95/// use valust_utils::net::ipv6;
96/// #[derive(Valust)]
97/// struct Stringify {
98///     #[trans(func(String => try(ipv6)))]
99///     ip: std::net::Ipv6Addr,
100/// }
101/// ```
102pub fn ipv6(s: impl AsRef<str>) -> Result<Ipv6Addr, AddrParseError> {
103    s.as_ref().parse()
104}
105
106/// Check if a string-like item is a valid Socket address.
107///
108/// ```rust
109/// # use valust_utils::net::is_sock;
110/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
111/// # use valust_derive::Valust;
112/// #
113/// #[derive(Valust)]
114/// struct Stringify {
115///     #[valid(func(is_sock))]
116///     ip: String,
117/// }
118/// ```
119pub fn is_sock(s: impl AsRef<str>) -> bool {
120    s.as_ref().parse::<SocketAddr>().is_ok()
121}
122
123/// Convert a string-like item into a Socket address.
124///
125/// ```rust
126/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
127/// # use valust_derive::Valust;
128/// use valust_utils::net::sock;
129/// #[derive(Valust)]
130/// struct Stringify {
131///     #[trans(func(String => try(sock)))]
132///     socket: std::net::SocketAddr,
133/// }
134/// ```
135pub fn sock(s: impl AsRef<str>) -> Result<SocketAddr, AddrParseError> {
136    s.as_ref().parse()
137}
138
139/// Check if a string-like item is a valid SocketV4 address.
140///
141/// ```rust
142/// # use valust_utils::net::is_sockv4;
143/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
144/// # use valust_derive::Valust;
145/// #
146/// #[derive(Valust)]
147/// struct Stringify {
148///     #[valid(func(is_sockv4))]
149///     socket_v4: String,
150/// }
151/// ```
152pub fn is_sockv4(s: impl AsRef<str>) -> bool {
153    s.as_ref().parse::<SocketAddrV4>().is_ok()
154}
155
156/// Convert a string-like item into a SocketV4 address.
157///
158/// ```rust
159/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
160/// # use valust_derive::Valust;
161/// use valust_utils::net::sockv4;
162/// #[derive(Valust)]
163/// struct Stringify {
164///     #[trans(func(String => try(sockv4)))]
165///     socket_v4: std::net::SocketAddrV4,
166/// }
167/// ```
168pub fn sockv4(s: impl AsRef<str>) -> Result<SocketAddrV4, AddrParseError> {
169    s.as_ref().parse()
170}
171
172/// Check if a string-like item is a valid SocketV6 address.
173///
174/// ```rust
175/// # use valust_utils::net::is_sockv6;
176/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
177/// # use valust_derive::Valust;
178/// #
179/// #[derive(Valust)]
180/// struct Stringify {
181///     #[valid(func(is_sockv6))]
182///     socket_v6: String,
183/// }
184/// ```
185pub fn is_sockv6(s: impl AsRef<str>) -> bool {
186    s.as_ref().parse::<SocketAddrV6>().is_ok()
187}
188
189/// Convert a string-like item into an IPv6 address.
190///
191/// ```rust
192/// # use valust::{Validate, Raw, error::display::ErrorDisplay};
193/// # use valust_derive::Valust;
194/// use valust_utils::net::sockv6;
195/// #[derive(Valust)]
196/// struct Stringify {
197///     #[trans(func(String => try(sockv6)))]
198///     socket_v6: std::net::SocketAddrV6,
199/// }
200/// ```
201pub fn sockv6(s: impl AsRef<str>) -> Result<SocketAddrV6, AddrParseError> {
202    s.as_ref().parse()
203}