use std::fmt;
pub trait SvgId: Copy {
fn name(&self) -> &str;
}
#[derive(Clone,Copy,PartialEq)]
pub enum NameRef<'a, T: SvgId> {
Id(T),
Name(&'a str),
}
#[derive(Clone,PartialEq)]
pub enum Name<T: SvgId> {
Id(T),
Name(String),
}
impl<'a, T: SvgId> From<T> for NameRef<'a, T> {
fn from(value: T) -> NameRef<'a, T> {
NameRef::Id(value)
}
}
impl<'a, T: SvgId> From<&'a str> for NameRef<'a, T> {
fn from(value: &'a str) -> NameRef<'a, T> {
NameRef::Name(value)
}
}
impl<'a, T: SvgId> From<NameRef<'a, T>> for Name<T> {
fn from(value: NameRef<T>) -> Name<T> {
match value {
NameRef::Id(id) => Name::Id(id),
NameRef::Name(name) => Name::Name(name.to_string()),
}
}
}
impl<'a, T: SvgId> fmt::Debug for NameRef<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
NameRef::Id(id) => write!(f, "{}", id.name()),
NameRef::Name(name) => write!(f, "{}", name),
}
}
}
impl<T: SvgId> Name<T> {
pub fn into_ref(&self) -> NameRef<T> {
match *self {
Name::Id(id) => NameRef::Id(id),
Name::Name(ref name) => NameRef::Name(name),
}
}
}
impl<T: SvgId> fmt::Debug for Name<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self.into_ref())
}
}