pub trait Tagged {
fn get_tag_names(&self) -> &'static [&'static str];
fn includes_tag_name(&self, tag: &str) -> bool {
self.get_tag_names().contains(&tag)
}
fn get_tags<T: Tag>(&self) -> Vec<T> {
self.get_tag_names()
.into_iter()
.filter_map(|name| T::from(name))
.collect()
}
fn get_tag<T: Tag>(&self) -> Option<T> {
self.get_tag_names()
.into_iter()
.filter_map(|name| T::from(name))
.next()
}
fn includes_tag<T: Tag + PartialEq>(&self, tag: &T) -> bool {
self.get_tag_names()
.into_iter()
.filter_map(|name| T::from(name))
.filter(|t| t == tag)
.count()
> 0
}
}
pub trait Tag: Sized {
fn from(string: &str) -> Option<Self>;
}