82 lines · 2.2 KB · Rust
RawDownload
use std::sync::Arc; use serde::{Deserialize, Serialize};use strum::EnumIter; #[derive(    Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Serialize, Deserialize, EnumIter,)]#[serde(rename_all = "snake_case")]pub enum RustdocItemKind {    Mod,    Macro,    Struct,    Enum,    Constant,    Trait,    Function,    TypeAlias,    AttributeMacro,    DeriveMacro,} impl RustdocItemKind {    pub(crate) const fn class(&self) -> &'static str {        match self {            Self::Mod => "mod",            Self::Macro => "macro",            Self::Struct => "struct",            Self::Enum => "enum",            Self::Constant => "constant",            Self::Trait => "trait",            Self::Function => "fn",            Self::TypeAlias => "type",            Self::AttributeMacro => "attr",            Self::DeriveMacro => "derive",        }    }} #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone)]pub struct RustdocItem {    pub kind: RustdocItemKind,    /// The item path, up until the name of the item.    pub path: Vec<Arc<str>>,    /// The name of the item.    pub name: Arc<str>,} impl RustdocItem {    pub fn display(&self) -> String {        let mut path_segments = self.path.clone();        path_segments.push(self.name.clone());         path_segments.join("::")    }     pub fn url_path(&self) -> String {        let name = &self.name;        let mut path_components = self.path.clone();         match self.kind {            RustdocItemKind::Mod => {                path_components.push(name.clone());                path_components.push("index.html".into());            }            RustdocItemKind::Macro            | RustdocItemKind::Struct            | RustdocItemKind::Enum            | RustdocItemKind::Constant            | RustdocItemKind::Trait            | RustdocItemKind::Function            | RustdocItemKind::TypeAlias            | RustdocItemKind::AttributeMacro            | RustdocItemKind::DeriveMacro => {                path_components                    .push(format!("{kind}.{name}.html", kind = self.kind.class()).into());            }        }         path_components.join("/")    }}