ipnetwork/
parse.rs

1use crate::error::IpNetworkError;
2
3pub fn cidr_parts(cidr: &str) -> Result<(&str, Option<&str>), IpNetworkError> {
4    // Try to find a single slash
5    if let Some(sep) = cidr.find('/') {
6        let (ip, prefix) = cidr.split_at(sep);
7        // Error if cidr has multiple slashes
8        if prefix[1..].find('/').is_some() {
9            Err(IpNetworkError::InvalidCidrFormat(format!(
10                "CIDR must contain a single '/': {cidr}"
11            )))
12        } else {
13            // Handle the case when cidr has exactly one slash
14            Ok((ip, Some(&prefix[1..])))
15        }
16    } else {
17        // Handle the case when cidr does not have a slash
18        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}