use std::fmt::{Debug, Display};
use std::hash::Hash;
use std::ops::Deref;
pub trait Identity: Hash + PartialEq + Eq + PartialOrd + Ord + Clone + Display + Debug {
fn escaped(&self) -> String {
let id = self.to_string();
let mut output = String::new();
let mut chars = id.chars();
if let Some(first) = chars.next() {
if first.is_ascii_alphabetic() || first == '_' {
output.push(first);
} else if first.is_ascii_alphanumeric() {
output.push('_');
output.push(first);
} else {
output.push('_');
}
}
for character in chars {
if character.is_ascii_alphanumeric() || character == '_' {
output.push(character)
} else {
output.push('_')
}
}
output
}
}
macro_rules! impl_identity {
($($t:ty) +) => {
$(impl Identity for $t {})*
}
}
impl_identity! {
i8 u8 i16 u16 i32 u32 i64 u64
usize isize
&'static str
}
pub trait Identifiable<T: Identity> {
fn get_id(&self) -> T;
}
impl<T, I: Identity, D> Identifiable<I> for D
where
T: Identifiable<I>,
D: Deref<Target = T>,
{
fn get_id(&self) -> I {
self.deref().get_id()
}
}