diff --git a/src/filter.rs b/src/filter.rs index 0e475bb..b8b46ec 100644 --- a/src/filter.rs +++ b/src/filter.rs @@ -8,29 +8,31 @@ pub struct IpFilters<'a> { impl<'a> Default for IpFilters<'a> { fn default() -> Self { - Self::new(vec![]) + Self::new() } } impl<'a> IpFilters<'a> { - pub fn new(filters: Vec<IpFilter<'a>>) -> Self { - Self { filters } + pub fn new() -> Self { + Self { + filters: Default::default(), + } } pub fn with_non_broadcast() -> Self { - Self::new(vec![Box::new(|src, dst| { - macro_rules! non_broadcast { - ($addr:expr) => { - match $addr { - IpAddr::V4(v4) => { - !(v4.is_broadcast() || v4.is_multicast() || v4.is_multicast()) - } - IpAddr::V6(v6) => !(v6.is_multicast() || v6.is_unspecified()), - } - }; - } - non_broadcast!(src) && non_broadcast!(dst) - })]) + macro_rules! non_broadcast { + ($addr:ident) => { + match $addr { + IpAddr::V4(a) => !(a.is_broadcast() || a.is_multicast() || a.is_multicast()), + IpAddr::V6(a) => !(a.is_multicast() || a.is_unspecified()), + } + }; + } + Self { + filters: vec![Box::new(|src, dst| { + non_broadcast!(src) && non_broadcast!(dst) + })], + } } pub fn add(&mut self, filter: IpFilter<'a>) { @@ -44,12 +46,11 @@ impl<'a> IpFilters<'a> { self.filters.push(Box::new(filter)); } + pub fn add_all<I: IntoIterator<Item = IpFilter<'a>>>(&mut self, filters: I) { + self.filters.extend(filters.into_iter()); + } + pub fn is_allowed(&self, src: &IpAddr, dst: &IpAddr) -> bool { - for filter in &self.filters { - if !filter(src, dst) { - return false; - } - } - true + self.filters.iter().all(|filter| filter(src, dst)) } }