term_rustdoc/tree/
tag.rs

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, // Head for no variants
35    Variants,   // Head for variants
36    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
64// for each normal item/list element
65fn fg(r: u8, g: u8, b: u8) -> Style {
66    Style::default().fg(Rgb(r, g, b))
67}
68
69// for the title of a list of items
70fn bfg(r: u8, g: u8, b: u8) -> Style {
71    Style::default()
72        .fg(Rgb(r, g, b))
73        .add_modifier(Modifier::BOLD)
74}
75
76// for data structure name
77fn 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        // fg(159, 234, 115), // #9FEA73
86        // fg(Rgb(177, 84, 5)),     // #B15405
87        match self {
88            Tag::ModuleFolded => bufg(213, 245, 85), // #D5F555
89
90            Tag::Module => bfg(213, 245, 85),     // #D5F555
91            Tag::Structs => bfg(60, 148, 165),    // #3C94A5
92            Tag::Struct => bufg(60, 148, 165),    // #3C94A5
93            Tag::Fields => bfg(137, 199, 210),    // #89C7D2
94            Tag::Field => fg(137, 199, 210),      // #89C7D2
95            Tag::NoFields => fg(137, 199, 210),   // #89C7D2
96            Tag::Unions => bufg(141, 218, 187),   // #8DDABB
97            Tag::Union => bufg(141, 218, 187),    // #8DDABB
98            Tag::Enums => bfg(212, 61, 141),      // #D43D8D
99            Tag::Enum => bufg(212, 61, 141),      // #D43D8D
100            Tag::Variants => bfg(183, 64, 168),   // #B740A8
101            Tag::Variant => fg(183, 64, 168),     // #B740A8
102            Tag::NoVariants => fg(183, 64, 168),  // #B740A8
103            Tag::Traits => bfg(255, 140, 41),     // #FF8C29
104            Tag::Trait => bufg(255, 140, 41),     // #FF8C29
105            Tag::Functions => bfg(214, 83, 76),   // #D6534C
106            Tag::Function => fg(214, 83, 76),     // #D6534C
107            Tag::Constants => bfg(232, 218, 104), // #E8DA68
108            Tag::Constant => fg(232, 218, 104),   // #E8DA68
109            Tag::Statics => bfg(43, 43, 175),     // #2B2BAF
110            Tag::Static => bfg(43, 43, 175),      // #2B2BAF
111            Tag::TypeAliass => bfg(144, 99, 200), // #9063C8
112            Tag::TypeAlias => fg(144, 99, 200),   // #9063C8
113            Tag::MacroDecls => bfg(15, 129, 29),  // #0F811D
114            Tag::MacroDecl => fg(15, 129, 29),    // #0F811D
115            Tag::MacroFuncs => bfg(96, 215, 117), // #60D775
116            Tag::MacroFunc => fg(96, 215, 117),   // #60D775
117            Tag::MacroAttrs => bfg(159, 233, 27), // #9FE91B
118            Tag::MacroAttr => fg(159, 233, 27),   // #9FE91B
119            Tag::MacroDervs => bfg(98, 152, 0),   // #629800
120            Tag::MacroDerv => fg(98, 152, 0),     // #629800
121            Tag::Unknown | Tag::FieldsPrivate => Style::default().fg(DarkGray),
122            Tag::Implementations => Style::default().fg(White),
123            Tag::InherentImpls => bfg(243, 101, 134), // #F36586
124            Tag::ImplInherent => fg(243, 101, 134),   // #F36586
125            Tag::TraitImpls => bfg(255, 195, 144),    // #FFC390
126            Tag::ImplTrait => fg(255, 195, 144),      // #FFC390
127            Tag::AutoImpls => bfg(255, 140, 41),      // #FF8C29
128            Tag::ImplAuto => fg(255, 140, 41),        // #FF8C29
129            Tag::BlanketImpls => bfg(222, 186, 0),    // #DEBA00
130            Tag::ImplBlanket => fg(222, 186, 0),      // #DEBA00
131            Tag::Implementors => bfg(111, 162, 255),  // #6FA2FF
132            Tag::Implementor => fg(111, 162, 255),    // #6FA2FF
133            // black fg on gray bg in bg/fg inversion
134            // If not set, black fg on black bg.
135            _ => 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::ImplInherent => icon!("[inhrt]"),
156            // Tag::ImplTrait => icon!("[trait]"),
157            // Tag::ImplAuto => icon!("[auto]"),
158            // Tag::ImplBlanket => icon!("[blkt]"),
159            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    /// Show as a simple heading node with no need for contexts/ids.
169    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}