use crate::{
errors::{
InetTupleError,
NetworkLengthTooLongError,
NetworkParseError,
},
internal_traits::{
PrivCidr,
PrivInet,
PrivInetPair,
PrivUnspecAddress,
},
Family,
InetIterator,
};
use core::{
fmt::{
Debug,
Display,
},
hash::Hash,
net::AddrParseError,
str::FromStr,
};
pub trait Address:
Copy + Debug + Display + FromStr<Err = AddrParseError> + Ord + Hash + PrivUnspecAddress
{
type Inet: Inet<Address = Self>;
type Cidr: Cidr<Address = Self>;
type InetPair: InetPair<Address = Self>;
}
pub trait Cidr:
Copy + Debug + Display + FromStr<Err = NetworkParseError> + Ord + Hash + PrivCidr
{
type Address: Address<Cidr = Self>;
fn new(addr: Self::Address, len: u8) -> Result<Self, NetworkParseError>;
fn new_host(addr: Self::Address) -> Self;
fn iter(&self) -> InetIterator<Self::Address>;
fn first_address(&self) -> Self::Address;
fn first(&self) -> <Self::Address as Address>::Inet;
fn last_address(&self) -> Self::Address;
fn last(&self) -> <Self::Address as Address>::Inet;
fn network_length(&self) -> u8;
fn family(&self) -> Family;
fn is_host_address(&self) -> bool;
fn mask(&self) -> Self::Address;
fn contains(&self, addr: &Self::Address) -> bool;
}
pub trait Inet:
Copy + Debug + Display + FromStr<Err = NetworkParseError> + Ord + Hash + PrivInet
{
type Address: Address<Inet = Self>;
fn new(addr: Self::Address, len: u8) -> Result<Self, NetworkLengthTooLongError>;
fn new_host(addr: Self::Address) -> Self;
fn increment(&mut self) -> bool;
fn next(self) -> Option<Self>;
fn decrement(&mut self) -> bool;
fn previous(self) -> Option<Self>;
fn overflowing_add(self, step: u128) -> (Self, bool);
fn overflowing_sub(self, step: u128) -> (Self, bool);
fn network(&self) -> <Self::Address as Address>::Cidr;
fn address(&self) -> Self::Address;
fn first_address(&self) -> Self::Address;
fn first(&self) -> Self;
fn last_address(&self) -> Self::Address;
fn last(&self) -> Self;
fn network_length(&self) -> u8;
fn family(&self) -> Family;
fn is_host_address(&self) -> bool;
fn mask(&self) -> Self::Address;
fn contains(&self, addr: &Self::Address) -> bool;
}
pub trait InetPair: Copy + Debug + Eq + Hash + PrivInetPair {
type Address: Address<InetPair = Self>;
fn new(
first: <Self::Address as Address>::Inet,
second: <Self::Address as Address>::Inet,
) -> Result<Self, InetTupleError>;
fn new_from_addresses(
first: Self::Address,
second: Self::Address,
len: u8,
) -> Result<Self, InetTupleError>;
fn first(&self) -> <Self::Address as Address>::Inet;
fn second(&self) -> <Self::Address as Address>::Inet;
fn network(&self) -> <Self::Address as Address>::Cidr;
fn network_length(&self) -> u8;
fn family(&self) -> Family;
fn iter(self) -> InetIterator<Self::Address>;
}