pub trait Displayable: core::fmt::Debug + core::fmt::Display {
private!();
}
pub trait Symbolic {
type Item: Displayable;
}
macro_rules! impl_symbolic {
(<$tag:ident>: [$($t:ty),* $(,)?]) => {
$(
impl_symbolic!(@impl <$tag>: $t );
)*
};
(@impl <Self>: $t:ty ) => {
impl Symbolic for $t {
type Item = Self;
}
};
(@impl <$T:ident>: $t:ty ) => {
impl<$T> Symbolic for $t
where
$T: Displayable,
{
type Item = $T;
}
};
}
impl<T> Displayable for T
where
T: core::fmt::Debug + core::fmt::Display,
{
seal!();
}
impl Symbolic for &str {
type Item = Self;
}
impl_symbolic! {
<Self>: [u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64, char, bool]
}
#[cfg(feature = "alloc")]
impl_symbolic! {
<Self>: [
alloc::string::String,
]
}
#[cfg(feature = "alloc")]
impl_symbolic! {
<T>: [
alloc::boxed::Box<T>,
alloc::rc::Rc<T>,
alloc::sync::Arc<T>,
alloc::vec::Vec<T>,
]
}