mod cover;
mod ipstd;
mod slot;
mod network;
mod private;
mod shorten;
#[cfg(test)]
mod tests;
pub use cover::*;
pub use ipstd::*;
pub use network::Ipv6NetPrefix;
pub use shorten::*;
pub use slot::*;
use std::error::Error;
use std::fmt;
use std::fmt::{Debug, Display};
use std::hash::Hash;
use std::net::{Ipv4Addr, Ipv6Addr};
use std::str::FromStr;
pub use crate::prefix::private::IpPrivatePrefix;
use ipnet::{Ipv4Net, Ipv6Net};
pub trait IpRootPrefix: IpPrefix {
fn root() -> Self; }
#[allow(clippy::len_without_is_empty)]
pub trait IpPrefix: IpPrivatePrefix + Debug + Clone + Copy {
type Slot: BitSlot;
fn bitslot(&self) -> Self::Slot;
fn bitslot_trunc(&self) -> Self::Slot;
fn len(&self) -> u8;
#[inline]
fn bitmask(&self) -> Self::Slot {
<Self::Slot as BitSlot>::bitmask(self.len())
}
const MAX_LEN: u8;
type Addr: Display + Clone + Copy + Eq + Hash;
fn network(&self) -> Self::Addr;
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum IpPrefixError {
PrefixLenError,
AddrParseError,
}
impl Display for IpPrefixError {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match self {
IpPrefixError::PrefixLenError => fmt.write_str("invalid IP prefix length"),
IpPrefixError::AddrParseError => fmt.write_str("invalid IP address syntax"),
}
}
}
impl Error for IpPrefixError {}
impl From<ipnet::AddrParseError> for IpPrefixError {
fn from(_: ipnet::AddrParseError) -> Self {
IpPrefixError::AddrParseError
}
}
impl From<std::net::AddrParseError> for IpPrefixError {
fn from(_: std::net::AddrParseError) -> Self {
IpPrefixError::AddrParseError
}
}
impl From<ipnet::PrefixLenError> for IpPrefixError {
fn from(_: ipnet::PrefixLenError) -> Self {
IpPrefixError::PrefixLenError
}
}