ip/concrete/addr/
range.rs

1use core::ops::RangeInclusive;
2
3use super::Address;
4use crate::traits::Afi;
5
6/// An inclusive range of [`Address<A>`].
7///
8/// # Example
9///
10/// ``` rust
11/// use ip::{concrete::AddressRange, Ipv4};
12///
13/// let range = AddressRange::<Ipv4>::new("10.250.0.0".parse()?, "10.252.255.255".parse()?);
14///
15/// let mid = "10.251.127.1".parse()?;
16///
17/// assert!(range.contains(&mid));
18/// # Ok::<(), ip::Error>(())
19/// ```
20#[derive(Clone, Debug)]
21pub struct Range<A: Afi>(RangeInclusive<Address<A>>);
22
23impl<A: Afi> Range<A> {
24    /// Construct a new [`AddressRange<A>`][Self] from `start` and `end` bounds.
25    pub const fn new(start: Address<A>, end: Address<A>) -> Self {
26        Self(start..=end)
27    }
28
29    /// Returns [`true`] if `addr` is contained in the range.
30    pub fn contains(&self, addr: &Address<A>) -> bool {
31        self.0.contains(addr)
32    }
33}
34
35impl<A: Afi> From<&RangeInclusive<A::Primitive>> for Range<A> {
36    fn from(range: &RangeInclusive<A::Primitive>) -> Self {
37        Self::new(Address::new(*range.start()), Address::new(*range.end()))
38    }
39}