pub enum IpRange {
V4 {
start: Ipv4Addr,
end: Ipv4Addr,
},
V6 {
start: Ipv6Addr,
end: Ipv6Addr,
},
}Expand description
Inclusive IP range (start <= end) for either IPv4 or IPv6.
Keep this in your crate so you control ordering rules and serialization.
Variants§
Implementations§
Source§impl IpRange
impl IpRange
Sourcepub fn new(start: IpAddr, end: IpAddr) -> Result<Self, String>
pub fn new(start: IpAddr, end: IpAddr) -> Result<Self, String>
Create a validated range.
Ensures the start/end address families match and that start <= end.
§Examples
IPv4:
use std::net::{IpAddr, Ipv4Addr};
use firewall_objects::ip::range::IpRange;
let r = IpRange::new(
IpAddr::V4(Ipv4Addr::new(192, 0, 2, 10)),
IpAddr::V4(Ipv4Addr::new(192, 0, 2, 20)),
).unwrap();
assert!(r.contains(IpAddr::V4(Ipv4Addr::new(192, 0, 2, 15))));IPv6:
use std::net::{IpAddr, Ipv6Addr};
use firewall_objects::ip::range::IpRange;
let r = IpRange::new(
IpAddr::V6(Ipv6Addr::LOCALHOST),
IpAddr::V6(Ipv6Addr::LOCALHOST),
).unwrap();
assert!(r.contains(IpAddr::V6(Ipv6Addr::LOCALHOST)));Mismatched families fail:
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
use firewall_objects::ip::range::IpRange;
let err = IpRange::new(
IpAddr::V4(Ipv4Addr::new(192, 0, 2, 10)),
IpAddr::V6(Ipv6Addr::LOCALHOST),
).unwrap_err();
assert!(err.contains("families must match"));Sourcepub fn new_v4(start: Ipv4Addr, end: Ipv4Addr) -> Result<Self, String>
pub fn new_v4(start: Ipv4Addr, end: Ipv4Addr) -> Result<Self, String>
Create a validated IPv4 range.
Sourcepub fn new_v6(start: Ipv6Addr, end: Ipv6Addr) -> Result<Self, String>
pub fn new_v6(start: Ipv6Addr, end: Ipv6Addr) -> Result<Self, String>
Create a validated IPv6 range.
Sourcepub fn as_v4(&self) -> Option<(Ipv4Addr, Ipv4Addr)>
pub fn as_v4(&self) -> Option<(Ipv4Addr, Ipv4Addr)>
Return the (start, end) tuple for an IPv4 range.
Sourcepub fn as_v6(&self) -> Option<(Ipv6Addr, Ipv6Addr)>
pub fn as_v6(&self) -> Option<(Ipv6Addr, Ipv6Addr)>
Return the (start, end) tuple for an IPv6 range.
Sourcepub fn start_v4(&self) -> Option<Ipv4Addr>
pub fn start_v4(&self) -> Option<Ipv4Addr>
Return the start of the range as IPv4, if this is an IPv4 range.
Sourcepub fn end_v4(&self) -> Option<Ipv4Addr>
pub fn end_v4(&self) -> Option<Ipv4Addr>
Return the end of the range as IPv4, if this is an IPv4 range.
Sourcepub fn start_v6(&self) -> Option<Ipv6Addr>
pub fn start_v6(&self) -> Option<Ipv6Addr>
Return the start of the range as IPv6, if this is an IPv6 range.
Sourcepub fn end_v6(&self) -> Option<Ipv6Addr>
pub fn end_v6(&self) -> Option<Ipv6Addr>
Return the end of the range as IPv6, if this is an IPv6 range.
Sourcepub fn contains_v4(&self, ip: Ipv4Addr) -> bool
pub fn contains_v4(&self, ip: Ipv4Addr) -> bool
Check whether the given IPv4 address is within the range (inclusive).
Sourcepub fn contains_v6(&self, ip: Ipv6Addr) -> bool
pub fn contains_v6(&self, ip: Ipv6Addr) -> bool
Check whether the given IPv6 address is within the range (inclusive).
Sourcepub fn parse(s: &str) -> Result<Self, String>
pub fn parse(s: &str) -> Result<Self, String>
Parse an IP range from a string.
Supported format is start-end where both sides are valid IP addresses
of the same family (IPv4 or IPv6). Whitespace around addresses is allowed.
§Examples
IPv4:
use std::net::{IpAddr, Ipv4Addr};
use firewall_objects::ip::range::IpRange;
let r = IpRange::parse("192.0.2.10-192.0.2.20").unwrap();
assert!(r.contains(IpAddr::V4(Ipv4Addr::new(192, 0, 2, 15))));IPv6:
use std::net::{IpAddr, Ipv6Addr};
use firewall_objects::ip::range::IpRange;
let r = IpRange::parse("::1-::1").unwrap();
assert!(r.contains(IpAddr::V6(Ipv6Addr::LOCALHOST)));Bad formats fail:
use firewall_objects::ip::range::IpRange;
assert!(IpRange::parse("192.0.2.10").is_err());
assert!(IpRange::parse("192.0.2.10-").is_err());
assert!(IpRange::parse("-192.0.2.10").is_err());