use std_::fmt::{self, Display};
use core_extensions::collection_traits::Cloned;
mod sealed {
pub trait Sealed {}
}
use self::sealed::Sealed;
pub trait IsFieldErr: Sealed + 'static + Copy + Cloned {}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum InfallibleAccess {}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct FailedAccess;
impl Cloned for FailedAccess {
type Cloned = Self;
#[inline(always)]
fn cloned_(&self) -> Self {
*self
}
}
impl Cloned for InfallibleAccess {
type Cloned = Self;
#[inline(always)]
fn cloned_(&self) -> Self {
*self
}
}
impl Sealed for FailedAccess {}
impl IsFieldErr for FailedAccess {}
impl Sealed for InfallibleAccess {}
impl IsFieldErr for InfallibleAccess {}
#[cfg(feature = "std")]
mod std_impls {
use super::{FailedAccess, InfallibleAccess};
use std::error::Error;
impl Error for FailedAccess {
#[inline(always)]
fn description(&self) -> &str {
"Some field could not be accessed"
}
}
impl Error for InfallibleAccess {
#[inline(always)]
fn description(&self) -> &str {
"The field isn't optional,this function is uncallable"
}
}
}
impl Display for FailedAccess {
#[inline(always)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("Some field could not be accessed")
}
}
impl From<InfallibleAccess> for FailedAccess {
#[inline(always)]
fn from(_: InfallibleAccess) -> Self {
FailedAccess
}
}
impl Display for InfallibleAccess {
#[inline(always)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("This field can always be accessed.")
}
}
pub trait IntoFieldErr<T>: IsFieldErr {
fn into_field_err(self) -> T
where
T: IsFieldErr;
}
impl<T> IntoFieldErr<T> for T
where
T: IsFieldErr,
{
#[inline(always)]
fn into_field_err(self) -> T {
self
}
}
impl IntoFieldErr<FailedAccess> for InfallibleAccess {
#[inline(always)]
fn into_field_err(self) -> FailedAccess {
match self {}
}
}
pub trait CombinedErrs {
type Combined: IsFieldErr;
}
pub type CombinedErrsOut<This> = <This as CombinedErrs>::Combined;
mod impl_combine_errs {
use super::{
CombinedErrs, CombinedErrsOut, FailedAccess as OF, InfallibleAccess as IF, IsFieldErr,
};
macro_rules! combined_err_impls {
(small=>
$( $ty:ty = $output:ty ,)*
) => {
$(
impl CombinedErrs for $ty {
type Combined=$output;
}
)*
};
(large=>
$((
$( ($t0:ident,$t1:ident,$t2:ident,$t3:ident,), )*
$($trailing:ident,)*
))*
)=>{
$(
#[allow(non_camel_case_types)]
impl< $($t0,$t1,$t2,$t3,)* $($trailing,)* CombTuples,CombTrail >
CombinedErrs
for ($($t0,$t1,$t2,$t3,)* $($trailing,)*)
where
$( ($t0,$t1,$t2,$t3): CombinedErrs, )*
(
$( CombinedErrsOut<($t0,$t1,$t2,$t3)>, )*
):CombinedErrs<Combined=CombTuples>,
CombTuples:IsFieldErr,
($($trailing,)*):CombinedErrs<Combined=CombTrail>,
CombTrail:IsFieldErr,
(CombTuples,CombTrail):CombinedErrs,
{
type Combined=CombinedErrsOut<(CombTuples,CombTrail)>;
}
)*
};
}
combined_err_impls! {
small=>
()=IF,
(IF,)=IF,
(OF,)=OF,
(IF,IF)=IF,
(OF,IF)=OF,
(IF,OF)=OF,
(OF,OF)=OF,
(IF,IF,IF)=IF,
(OF,IF,IF)=OF,
(IF,OF,IF)=OF,
(OF,OF,IF)=OF,
(IF,IF,OF)=OF,
(OF,IF,OF)=OF,
(IF,OF,OF)=OF,
(OF,OF,OF)=OF,
(IF,IF,IF,IF)=IF,
(OF,IF,IF,IF)=OF,
(IF,OF,IF,IF)=OF,
(OF,OF,IF,IF)=OF,
(IF,IF,OF,IF)=OF,
(OF,IF,OF,IF)=OF,
(IF,OF,OF,IF)=OF,
(OF,OF,OF,IF)=OF,
(IF,IF,IF,OF)=OF,
(OF,IF,IF,OF)=OF,
(IF,OF,IF,OF)=OF,
(OF,OF,IF,OF)=OF,
(IF,IF,OF,OF)=OF,
(OF,IF,OF,OF)=OF,
(IF,OF,OF,OF)=OF,
(OF,OF,OF,OF)=OF,
}
combined_err_impls! {
large=>
((e0,e1,e2,e3,),e4,)
((e0,e1,e2,e3,),e4,e5,)
((e0,e1,e2,e3,),e4,e5,e6,)
((e0,e1,e2,e3,),(e4,e5,e6,e7,),)
((e0,e1,e2,e3,),(e4,e5,e6,e7,),e8,)
((e0,e1,e2,e3,),(e4,e5,e6,e7,),e8,e9,)
((e0,e1,e2,e3,),(e4,e5,e6,e7,),e8,e9,e10,)
((e0,e1,e2,e3,),(e4,e5,e6,e7,),(e8,e9,e10,e11,),)
}
}