ipnetwork/
parse.rs
1use crate::error::IpNetworkError;
2
3pub fn cidr_parts(cidr: &str) -> Result<(&str, Option<&str>), IpNetworkError> {
4 if let Some(sep) = cidr.find('/') {
6 let (ip, prefix) = cidr.split_at(sep);
7 if prefix[1..].find('/').is_some() {
9 Err(IpNetworkError::InvalidCidrFormat(format!(
10 "CIDR must contain a single '/': {cidr}"
11 )))
12 } else {
13 Ok((ip, Some(&prefix[1..])))
15 }
16 } else {
17 Ok((cidr, None))
19 }
20}
21
22pub fn parse_prefix(prefix: &str, max: u8) -> Result<u8, IpNetworkError> {
23 prefix
24 .parse()
25 .map_err(|_| IpNetworkError::InvalidPrefix)
26 .and_then(|mask| {
27 if mask > max {
28 Err(IpNetworkError::InvalidPrefix)
29 } else {
30 Ok(mask)
31 }
32 })
33}