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
use core::ops::RangeInclusive;
use super::Address;
use crate::traits::Afi;
/// An inclusive range of [`Address<A>`].
///
/// # Example
///
/// ``` rust
/// use ip::{concrete::AddressRange, Ipv4};
///
/// let range = AddressRange::<Ipv4>::new("10.250.0.0".parse()?, "10.252.255.255".parse()?);
///
/// let mid = "10.251.127.1".parse()?;
///
/// assert!(range.contains(&mid));
/// # Ok::<(), ip::Error>(())
/// ```
#[derive(Clone, Debug)]
pub struct Range<A: Afi>(RangeInclusive<Address<A>>);
impl<A: Afi> Range<A> {
/// Construct a new [`AddressRange<A>`][Self] from `start` and `end` bounds.
pub const fn new(start: Address<A>, end: Address<A>) -> Self {
Self(start..=end)
}
/// Returns [`true`] if `addr` is contained in the range.
pub fn contains(&self, addr: &Address<A>) -> bool {
self.0.contains(addr)
}
}
impl<A: Afi> From<&RangeInclusive<A::Primitive>> for Range<A> {
fn from(range: &RangeInclusive<A::Primitive>) -> Self {
Self::new(Address::new(*range.start()), Address::new(*range.end()))
}
}