1use super::DocTree;
2use ratatui::style::{Color::*, Modifier, Style};
3use termtree::GlyphPalette;
4
5#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
6pub enum Tag {
7 Module,
8 ModuleFolded,
9 Struct,
10 Union,
11 Enum,
12 Trait,
13 Function,
14 Constant,
15 Static,
16 TypeAlias,
17 Import,
18 MacroDecl,
19 MacroFunc,
20 MacroAttr,
21 MacroDerv,
22 #[default]
23 Unknown,
24 NoImpls,
25 Implementations,
26 ImplInherent,
27 InherentImpls,
28 ImplTrait,
29 TraitImpls,
30 ImplAuto,
31 AutoImpls,
32 ImplBlanket,
33 BlanketImpls,
34 NoVariants, Variants, Variant,
37 NoFields,
38 Fields,
39 Field,
40 FieldsPrivate,
41 NoAssocOrImpls,
42 AssocTypes,
43 AssocType,
44 AssocConsts,
45 AssocConst,
46 AssocFns,
47 AssocFn,
48 Implementors,
49 Implementor,
50 Structs,
51 Unions,
52 Enums,
53 Traits,
54 Functions,
55 Constants,
56 Statics,
57 TypeAliass,
58 MacroDecls,
59 MacroFuncs,
60 MacroAttrs,
61 MacroDervs,
62}
63
64fn fg(r: u8, g: u8, b: u8) -> Style {
66 Style::default().fg(Rgb(r, g, b))
67}
68
69fn bfg(r: u8, g: u8, b: u8) -> Style {
71 Style::default()
72 .fg(Rgb(r, g, b))
73 .add_modifier(Modifier::BOLD)
74}
75
76fn bufg(r: u8, g: u8, b: u8) -> Style {
78 Style::default()
79 .fg(Rgb(r, g, b))
80 .add_modifier(Modifier::BOLD | Modifier::UNDERLINED)
81}
82
83impl Tag {
84 pub fn style(self) -> Style {
85 match self {
88 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),
122 Tag::Implementations => Style::default().fg(White),
123 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),
136 }
137 }
138
139 pub fn glyph(self) -> GlyphPalette {
140 match self {
141 Tag::ModuleFolded => icon!(@fold "[Mod]"),
142 Tag::Module => icon!("[Mod]"),
143 Tag::Struct => icon!("[Struct]"),
144 Tag::Union => icon!("[Union]"),
145 Tag::Enum => icon!("[Enum]"),
146 Tag::Trait => icon!("[Trait]"),
147 Tag::Function => icon!("[Fn]"),
148 Tag::Constant => icon!("[Const]"),
149 Tag::Static => icon!("[Static]"),
150 Tag::TypeAlias => icon!("[type alias]"),
151 Tag::MacroDecl => icon!("[macro decl]"),
152 Tag::MacroFunc => icon!("[macro func]"),
153 Tag::MacroAttr => icon!("[macro attr]"),
154 Tag::MacroDerv => icon!("[macro derv]"),
155 Tag::Field => icon!("[field]"),
160 Tag::Variant => icon!("[variant]"),
161 Tag::AssocType => icon!("[type]"),
162 Tag::AssocConst => icon!("[const]"),
163 Tag::AssocFn => icon!("[fn]"),
164 _ => GlyphPalette::default(),
165 }
166 }
167
168 pub fn show(self) -> DocTree {
170 let text = match self {
171 Tag::Implementations => "Implementations",
172 Tag::NoImpls => "No Implementations!",
173 Tag::InherentImpls => "Inherent Impls",
174 Tag::TraitImpls => "Trait Impls",
175 Tag::AutoImpls => "Auto Impls",
176 Tag::BlanketImpls => "Blanket Impls",
177 Tag::NoVariants => "No Variants!",
178 Tag::Variants => "Variants",
179 Tag::NoFields => "No Fields!",
180 Tag::Fields => "Fields",
181 Tag::FieldsPrivate => "/* private fields */",
182 Tag::NoAssocOrImpls => "No Associated Items Or Implementors!",
183 Tag::AssocTypes => "Associated Types",
184 Tag::AssocConsts => "Associated Constants",
185 Tag::AssocFns => "Associated Functions",
186 Tag::Implementors => "Implementors",
187 Tag::Structs => "Structs",
188 Tag::Unions => "Unions",
189 Tag::Enums => "Enums",
190 Tag::Traits => "Traits",
191 Tag::Functions => "Functions",
192 Tag::Constants => "Constants",
193 Tag::Statics => "Statics",
194 Tag::TypeAliass => "Type Alias",
195 Tag::MacroDecls => "Macros - Declarative",
196 Tag::MacroFuncs => "Macros - Function",
197 Tag::MacroAttrs => "Macros - Attribute",
198 Tag::MacroDervs => "Macros - Derive",
199 _ => {
200 error!(
201 "Tag `{self:?}` should reply on contexts like \
202 name/path/type instead of plain text"
203 );
204 return DocTree::new(
205 "A Tag shouldn't be here. Check out the log.".into(),
206 Tag::Unknown,
207 None,
208 );
209 }
210 };
211 DocTree::new(text.into(), self, None)
212 }
213}