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 117 118 119 120 121 122 123 124 125 126 127
use super::Mask; use std::net::IpAddr; impl Mask for IpAddr { type Output = Result<Self, &'static str>; fn mask(&self, other: &Self) -> Self::Output { match (self, other) { (Self::V4(a), Self::V4(b)) => Ok(Self::V4(a.mask(b))), (Self::V6(a), Self::V6(b)) => Ok(Self::V6(a.mask(b))), (_, _) => Err("mismatched address types"), } } } #[cfg(test)] mod tests { use super::*; mod v4 { use super::*; #[test] fn bidirectionally_returns_ok() { let a: IpAddr = "192.0.2.1".parse().unwrap(); let b: IpAddr = "255.255.255.0".parse().unwrap(); assert!(a.mask(&b).is_ok()); assert!(b.mask(&a).is_ok()); } #[test] fn returns_correct_answer() { let a: IpAddr = "192.0.2.1".parse().unwrap(); let b: IpAddr = "255.255.255.0".parse().unwrap(); assert_eq!(a.mask(&b), Ok("192.0.2.0".parse::<IpAddr>().unwrap())); } #[test] fn is_reflexive() { let a: IpAddr = "192.0.2.1".parse().unwrap(); let b: IpAddr = "255.255.255.0".parse().unwrap(); assert_eq!(a.mask(&b), b.mask(&a)); } #[test] fn v6_bidirectionally_returns_err() { let a: IpAddr = "192.0.2.0".parse().unwrap(); let b: IpAddr = "ffff:ffff::".parse().unwrap(); assert!(a.mask(&b).is_err()); assert!(b.mask(&a).is_err()); } #[test] fn v6_returns_correct_error() { let a: IpAddr = "192.0.2.0".parse().unwrap(); let b: IpAddr = "ffff:ffff::".parse().unwrap(); assert_eq!(a.mask(&b), Err("mismatched address types")); } #[test] fn v6_is_reflexive() { let a: IpAddr = "192.0.2.0".parse().unwrap(); let b: IpAddr = "ffff:ffff::".parse().unwrap(); assert_eq!(a.mask(&b), b.mask(&a)); } } mod v6 { use super::*; #[test] fn bidirectionally_returns_ok() { let a: IpAddr = "2001:db8::dead:beef".parse().unwrap(); let b: IpAddr = "ffff:ffff::".parse().unwrap(); assert!(a.mask(&b).is_ok()); assert!(b.mask(&a).is_ok()); } #[test] fn returns_correct_answer() { let a: IpAddr = "2001:db8::dead:beef".parse().unwrap(); let b: IpAddr = "ffff:ffff::".parse().unwrap(); assert_eq!(a.mask(&b), Ok("2001:db8::".parse::<IpAddr>().unwrap())); } #[test] fn is_reflexive() { let a: IpAddr = "2001:db8::dead:beef".parse().unwrap(); let b: IpAddr = "ffff:ffff::".parse().unwrap(); assert_eq!(a.mask(&b), b.mask(&a)); } #[test] fn v4_bidirectionally_returns_ok() { let a: IpAddr = "2001:db8::dead:beef".parse().unwrap(); let b: IpAddr = "255.255.255.0".parse().unwrap(); assert!(a.mask(&b).is_err()); assert!(b.mask(&a).is_err()); } #[test] fn v4_returns_correct_answer() { let a: IpAddr = "2001:db8::dead:beef".parse().unwrap(); let b: IpAddr = "255.255.255.0".parse().unwrap(); assert_eq!(a.mask(&b), Err("mismatched address types")); } #[test] fn v4_is_reflexive() { let a: IpAddr = "2001:db8::dead:beef".parse().unwrap(); let b: IpAddr = "255.255.255.0".parse().unwrap(); assert_eq!(a.mask(&b), b.mask(&a)); } } }