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}