use core::fmt::{Debug, Display};
use core::hash::Hash;
use core::ops::RangeInclusive;
use core::str::FromStr;
use super::{Length, Prefix};
use crate::{concrete, error::Error};
pub trait Range:
Clone
+ Debug
+ Display
+ From<Self::Prefix>
+ FromStr<Err = Error>
+ Hash
+ IntoIterator<Item = Self::Prefix>
+ PartialEq
+ Eq
+ PartialOrd
{
type Prefix: Prefix<Length = Self::Length>;
type Length: Length;
fn prefix(&self) -> Self::Prefix;
fn lower(&self) -> Self::Length;
fn upper(&self) -> Self::Length;
fn with_intersection(self, len_range: RangeInclusive<Self::Length>) -> Option<Self>;
fn with_length_range(self, len_range: RangeInclusive<Self::Length>) -> Option<Self>;
#[must_use]
fn or_longer(self) -> Self {
let lower = self.lower();
let upper = self.prefix().max_prefix_len();
self.with_length_range(lower..=upper).unwrap()
}
fn or_longer_excl(self) -> Option<Self> {
let lower = self.lower().increment().ok()?;
let upper = self.prefix().max_prefix_len();
self.with_length_range(lower..=upper)
}
fn with_length(self, len: Self::Length) -> Option<Self> {
self.with_length_range(len..=len)
}
fn afi(&self) -> concrete::Afi {
self.prefix().afi()
}
fn new_prefix_length(&self, length: u8) -> Result<Self::Length, Error> {
self.prefix().new_prefix_length(length)
}
}