use super::DocTree;
use ratatui::style::{Color::*, Modifier, Style};
use termtree::GlyphPalette;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum Tag {
Module,
ModuleFolded,
Struct,
Union,
Enum,
Trait,
Function,
Constant,
Static,
TypeAlias,
Import,
MacroDecl,
MacroFunc,
MacroAttr,
MacroDerv,
Unknown,
NoImpls,
Implementations,
ImplInherent,
InherentImpls,
ImplTrait,
TraitImpls,
ImplAuto,
AutoImpls,
ImplBlanket,
BlanketImpls,
NoVariants, Variants, Variant,
NoFields,
Fields,
Field,
FieldsPrivate,
NoAssocOrImpls,
AssocTypes,
AssocType,
AssocConsts,
AssocConst,
AssocFns,
AssocFn,
Implementors,
Implementor,
Structs,
Unions,
Enums,
Traits,
Functions,
Constants,
Statics,
TypeAliass,
MacroDecls,
MacroFuncs,
MacroAttrs,
MacroDervs,
}
fn fg(r: u8, g: u8, b: u8) -> Style {
Style::default().fg(Rgb(r, g, b))
}
fn bfg(r: u8, g: u8, b: u8) -> Style {
Style::default()
.fg(Rgb(r, g, b))
.add_modifier(Modifier::BOLD)
}
fn bufg(r: u8, g: u8, b: u8) -> Style {
Style::default()
.fg(Rgb(r, g, b))
.add_modifier(Modifier::BOLD | Modifier::UNDERLINED)
}
impl Tag {
pub fn style(self) -> Style {
match self {
Tag::ModuleFolded => bufg(213, 245, 85), Tag::Module => bfg(213, 245, 85), Tag::Structs => bfg(60, 148, 165), Tag::Struct => bufg(60, 148, 165), Tag::Fields => bfg(137, 199, 210), Tag::Field => fg(137, 199, 210), Tag::NoFields => fg(137, 199, 210), Tag::Unions => bufg(141, 218, 187), Tag::Union => bufg(141, 218, 187), Tag::Enums => bfg(212, 61, 141), Tag::Enum => bufg(212, 61, 141), Tag::Variants => bfg(183, 64, 168), Tag::Variant => fg(183, 64, 168), Tag::NoVariants => fg(183, 64, 168), Tag::Traits => bfg(255, 140, 41), Tag::Trait => bufg(255, 140, 41), Tag::Functions => bfg(214, 83, 76), Tag::Function => fg(214, 83, 76), Tag::Constants => bfg(232, 218, 104), Tag::Constant => fg(232, 218, 104), Tag::Statics => bfg(43, 43, 175), Tag::Static => bfg(43, 43, 175), Tag::TypeAliass => bfg(144, 99, 200), Tag::TypeAlias => fg(144, 99, 200), Tag::MacroDecls => bfg(15, 129, 29), Tag::MacroDecl => fg(15, 129, 29), Tag::MacroFuncs => bfg(96, 215, 117), Tag::MacroFunc => fg(96, 215, 117), Tag::MacroAttrs => bfg(159, 233, 27), Tag::MacroAttr => fg(159, 233, 27), Tag::MacroDervs => bfg(98, 152, 0), Tag::MacroDerv => fg(98, 152, 0), Tag::Unknown | Tag::FieldsPrivate => Style::default().fg(DarkGray),
Tag::Implementations => Style::default().fg(White),
Tag::InherentImpls => bfg(243, 101, 134), Tag::ImplInherent => fg(243, 101, 134), Tag::TraitImpls => bfg(255, 195, 144), Tag::ImplTrait => fg(255, 195, 144), Tag::AutoImpls => bfg(255, 140, 41), Tag::ImplAuto => fg(255, 140, 41), Tag::BlanketImpls => bfg(222, 186, 0), Tag::ImplBlanket => fg(222, 186, 0), Tag::Implementors => bfg(111, 162, 255), Tag::Implementor => fg(111, 162, 255), _ => Style::default().fg(Gray),
}
}
pub fn glyph(self) -> GlyphPalette {
match self {
Tag::ModuleFolded => icon!(@fold "[Mod]"),
Tag::Module => icon!("[Mod]"),
Tag::Struct => icon!("[Struct]"),
Tag::Union => icon!("[Union]"),
Tag::Enum => icon!("[Enum]"),
Tag::Trait => icon!("[Trait]"),
Tag::Function => icon!("[Fn]"),
Tag::Constant => icon!("[Const]"),
Tag::Static => icon!("[Static]"),
Tag::TypeAlias => icon!("[type alias]"),
Tag::MacroDecl => icon!("[macro decl]"),
Tag::MacroFunc => icon!("[macro func]"),
Tag::MacroAttr => icon!("[macro attr]"),
Tag::MacroDerv => icon!("[macro derv]"),
Tag::Field => icon!("[field]"),
Tag::Variant => icon!("[variant]"),
Tag::AssocType => icon!("[assoc type]"),
Tag::AssocConst => icon!("[assoc constant]"),
Tag::AssocFn => icon!("[assoc fn]"),
_ => GlyphPalette::default(),
}
}
pub fn show(self) -> DocTree {
let text = match self {
Tag::Implementations => "Implementations",
Tag::NoImpls => "No Implementations!",
Tag::InherentImpls => "Inherent Impls",
Tag::TraitImpls => "Trait Impls",
Tag::AutoImpls => "Auto Impls",
Tag::BlanketImpls => "Blanket Impls",
Tag::NoVariants => "No Variants!",
Tag::Variants => "Variants",
Tag::NoFields => "No Fields!",
Tag::Fields => "Fields",
Tag::FieldsPrivate => "/* private fields */",
Tag::NoAssocOrImpls => "No Associated Items Or Implementors!",
Tag::AssocTypes => "Associated Types",
Tag::AssocConsts => "Associated Constants",
Tag::AssocFns => "Associated Functions",
Tag::Implementors => "Implementors",
Tag::Structs => "Structs",
Tag::Unions => "Unions",
Tag::Enums => "Enums",
Tag::Traits => "Traits",
Tag::Functions => "Functions",
Tag::Constants => "Constants",
Tag::Statics => "Statics",
Tag::TypeAliass => "Type Alias",
Tag::MacroDecls => "Macros - Declarative",
Tag::MacroFuncs => "Macros - Function",
Tag::MacroAttrs => "Macros - Attribute",
Tag::MacroDervs => "Macros - Derive",
_ => {
error!(
"Tag `{self:?}` should reply on contexts like \
name/path/type instead of plain text"
);
return DocTree::new(
"A Tag shouldn't be here. Check out the log.".into(),
Tag::Unknown,
None,
);
}
};
DocTree::new(text.into(), self, None)
}
}