netaddr2/netv4addr/
display.rs

1use 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		// We test in three main cases:
25
26		// (i) The mask has zero bits... (shl must not fail)
27		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		// (ii) The mask has 0 < n < 32 bits...
31		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		// (iii) The mask has 32 bits...
35		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}