Documentation
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(", ")
    }
}