ip_network/
helpers.rs

1pub fn bit_length(number: u32) -> u8 {
2    32 - number.leading_zeros() as u8
3}
4
5pub fn bite_mask(mask: u8) -> u32 {
6    debug_assert!(mask <= 32);
7    match mask {
8        0 => 0,
9        n => !0 << (32 - n),
10    }
11}
12
13pub fn bite_mask_u128(mask: u8) -> u128 {
14    debug_assert!(mask <= 128);
15    match mask {
16        0 => 0,
17        n => !0 << (128 - n),
18    }
19}
20
21pub fn split_ip_netmask(input: &str) -> Option<(&str, &str)> {
22    let delimiter = match input.find('/') {
23        Some(pos) => pos,
24        None => return None,
25    };
26    let (ip, mask) = input.split_at(delimiter);
27    let mask = &mask[1..];
28
29    if ip.is_empty() || mask.is_empty() {
30        None
31    } else {
32        Some((ip, mask))
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::{bite_mask, bite_mask_u128, split_ip_netmask};
39
40    #[test]
41    fn get_bite_mask_32() {
42        assert_eq!(u32::MAX, bite_mask(32));
43    }
44
45    #[test]
46    fn get_bite_mask_0() {
47        assert_eq!(0, bite_mask(0));
48    }
49
50    #[test]
51    fn get_bite_mask_u128_0() {
52        assert_eq!(0, bite_mask_u128(0));
53    }
54
55    #[test]
56    fn get_bite_mask_u128_128() {
57        assert_eq!(u128::MAX, bite_mask_u128(128));
58    }
59
60    #[test]
61    fn split_ip_netmask_normal() {
62        let (ip, netmask) = split_ip_netmask("192.168.1.1/24").unwrap();
63        assert_eq!("192.168.1.1", ip);
64        assert_eq!("24", netmask);
65    }
66
67    #[test]
68    fn split_ip_netmask_invalid_1() {
69        let a = split_ip_netmask("ab");
70        assert!(a.is_none());
71    }
72
73    #[test]
74    fn split_ip_netmask_invalid_2() {
75        let a = split_ip_netmask("/");
76        assert!(a.is_none());
77    }
78
79    #[test]
80    fn split_ip_netmask_invalid_3() {
81        let a = split_ip_netmask("192.168.1.1/");
82        assert!(a.is_none());
83    }
84}