use super::*;
#[derive(Debug, Clone)]
pub enum Typing {
Primitive(String),
Generic(String),
Normal { name: String, path: String },
}
impl Renderable for Typing {
fn render(&self) -> Html {
match self {
Typing::Primitive(term) => html! {<span class="primitive">{term}</span>},
Typing::Generic(term) => html! {<span class="generic">{term}</span>},
Typing::Normal { name, path } => match path.len() {
0 => html! {<span class="type">{name}</span>},
_ => html! {<a class="type" href=path.as_str()>{name}</a>},
},
}
}
}
impl From<&str> for Typing {
fn from(s: &str) -> Self {
match s {
"u8" | "u16" | "u32" | "u64" | "i8" | "i16" | "i32" | "i64" | "f32" | "f64" | "char" | "bool" => {
Typing::Primitive(String::from(s))
}
_ => Typing::Generic(String::from(s)),
}
}
}
impl Display for Typing {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
match self {
Typing::Primitive(name) | Typing::Generic(name) | Typing::Normal { name, .. } => write!(f, "{}", name),
}
}
}
impl Listable for Typing {
fn left() -> Option<Html> {
Some(Html::from("<"))
}
fn right() -> Option<Html> {
Some(Html::from(">"))
}
fn delimiter() -> Html {
Html::from(", ")
}
}
pub fn build_generics(generics: &[Typing]) -> Html {
let left = vec![Html::from("<")];
let right = vec![Html::from(">")];
let comma = Html::from(", ");
let items: Html =
left.into_iter().chain(generics.into_iter().map(|s| s.render()).intersperse(comma)).chain(right.into_iter()).collect();
html! {<>{items}</>}
}