1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
use crate::traits::Merge; use crate::NetAddr; use crate::Netv4Addr; use crate::Netv6Addr; impl Merge for NetAddr { type Output = Option<Self>; fn merge(&self, other: &Self) -> Self::Output { match (self, other) { (Self::V4(a), Self::V4(b)) => a.merge(b).map(|netvxaddr: Netv4Addr| netvxaddr.into()), (Self::V6(a), Self::V6(b)) => a.merge(b).map(|netvxaddr: Netv6Addr| netvxaddr.into()), (_, _) => unimplemented!(), } } } #[cfg(test)] mod tests { use super::*; mod v4 { use super::*; #[test] fn mergeable_networks_correct() { let a: NetAddr = "10.0.0.0/24".parse().unwrap(); let b: NetAddr = "10.0.1.0/24".parse().unwrap(); assert_eq!(a.merge(&b), Some("10.0.0.0/23".parse().unwrap())); } #[test] fn mergeable_networks_reflexive() { let a: NetAddr = "10.0.0.0/24".parse().unwrap(); let b: NetAddr = "10.0.1.0/24".parse().unwrap(); assert_eq!(a.merge(&b), b.merge(&a)); } #[test] fn nested_networks_takes_biggest() { let a: NetAddr = "10.0.0.0/24".parse().unwrap(); let b: NetAddr = "10.0.0.0/23".parse().unwrap(); assert_eq!(a.merge(&b), Some(b)); } #[test] fn nested_networks_reflexive() { let a: NetAddr = "10.0.0.0/24".parse().unwrap(); let b: NetAddr = "10.0.0.0/23".parse().unwrap(); assert_eq!(a.merge(&b), b.merge(&a)); } #[test] fn adjacent_but_not_mergable_none() { let a: NetAddr = "10.0.1.0/24".parse().unwrap(); let b: NetAddr = "10.0.2.0/24".parse().unwrap(); assert_eq!(a.merge(&b), None); assert_eq!(b.merge(&a), None); assert_eq!(a.merge(&b), b.merge(&a)); } } mod v6 { use super::*; #[test] fn mergeable_networks_correct() { let a: NetAddr = "2001:db8:dead:beef::/64".parse().unwrap(); let b: NetAddr = "2001:db8:dead:beee::/64".parse().unwrap(); assert_eq!( a.merge(&b), Some("2001:db8:dead:beee::/63".parse().unwrap()) ); } #[test] fn mergeable_networks_reflexive() { let a: NetAddr = "2001:db8:dead:beef::/64".parse().unwrap(); let b: NetAddr = "2001:db8:dead:beee::/64".parse().unwrap(); assert_eq!(a.merge(&b), b.merge(&a)); } #[test] fn nested_networks_takes_biggest() { let a: NetAddr = "2001:db8:dead:beee::/63".parse().unwrap(); let b: NetAddr = "2001:db8:dead:beef::/64".parse().unwrap(); assert_eq!(a.merge(&b), Some(a)); } #[test] fn nested_networks_reflexive() { let a: NetAddr = "2001:db8:dead:beee::/63".parse().unwrap(); let b: NetAddr = "2001:db8:dead:beef::/64".parse().unwrap(); assert_eq!(a.merge(&b), b.merge(&a)); } #[test] fn adjacent_but_not_mergable_none() { let a: NetAddr = "2001:db8:dead:beee::/64".parse().unwrap(); let b: NetAddr = "2001:db8:dead:beed::/64".parse().unwrap(); assert_eq!(a.merge(&b), None); assert_eq!(b.merge(&a), None); assert_eq!(a.merge(&b), b.merge(&a)); } } }