use core::fmt;
use super::PrefixLength;
use crate::{
concrete::{
self,
mask_types::{Bit, Host, Net, Type},
Ipv4, Ipv6,
},
traits,
};
#[allow(variant_size_differences)]
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
pub enum Mask<T: Type> {
Ipv4(concrete::Mask<T, Ipv4>),
Ipv6(concrete::Mask<T, Ipv6>),
}
pub type Netmask = Mask<Net>;
pub type Hostmask = Mask<Host>;
pub type Bitmask = Mask<Bit>;
impl<T: Type> traits::Mask for Mask<T> {}
impl traits::Netmask for Netmask {}
impl traits::Hostmask for Hostmask {}
impl traits::Bitmask for Bitmask {}
impl<T: Type> From<concrete::Mask<T, Ipv4>> for Mask<T> {
fn from(mask: concrete::Mask<T, Ipv4>) -> Self {
Self::Ipv4(mask)
}
}
impl<T: Type> From<concrete::Mask<T, Ipv6>> for Mask<T> {
fn from(mask: concrete::Mask<T, Ipv6>) -> Self {
Self::Ipv6(mask)
}
}
impl From<PrefixLength> for Netmask {
fn from(len: PrefixLength) -> Self {
match len {
PrefixLength::Ipv4(len) => Self::Ipv4(len.into()),
PrefixLength::Ipv6(len) => Self::Ipv6(len.into()),
}
}
}
impl From<PrefixLength> for Hostmask {
fn from(len: PrefixLength) -> Self {
match len {
PrefixLength::Ipv4(len) => Self::Ipv4(len.into()),
PrefixLength::Ipv6(len) => Self::Ipv6(len.into()),
}
}
}
impl<T: Type> fmt::Display for Mask<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Ipv4(mask) => mask.fmt(f),
Self::Ipv6(mask) => mask.fmt(f),
}
}
}