netaddr2/netv4addr/
display.rs1use super::Netv4Addr;
2use core::fmt;
3
4impl fmt::Display for Netv4Addr {
5 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
6 let mask: u32 = self.mask().into();
7 let ones = mask.count_ones();
8 let cidr_mask: u32 = u32::max_value().checked_shl(32 - ones).unwrap_or(0);
9
10 if mask == cidr_mask {
11 write!(f, "{}/{}", self.addr(), ones)
12 } else {
13 write!(f, "{}/{}", self.addr(), self.mask())
14 }
15 }
16}
17
18#[cfg(test)]
19mod tests {
20 use super::Netv4Addr;
21
22 #[test]
23 fn cidr() {
24 let addr: Netv4Addr = "127.0.0.1/0.0.0.0".parse().unwrap();
28 assert_eq!(format!("{}", addr), "0.0.0.0/0");
29
30 let addr: Netv4Addr = "127.0.0.1/255.255.255.0".parse().unwrap();
32 assert_eq!(format!("{}", addr), "127.0.0.0/24");
33
34 let addr: Netv4Addr = "127.0.0.1/255.255.255.255.".parse().unwrap();
36 assert_eq!(format!("{}", addr), "127.0.0.1/32");
37 }
38
39 #[test]
40 fn non_cidr() {
41 let addr: Netv4Addr = "127.0.0.1/251.255.255.0".parse().unwrap();
42 assert_eq!(format!("{}", addr), "123.0.0.0/251.255.255.0")
43 }
44}