Skip to main content

tca_types/
builtin.rs

1//! Built in hardcoded themes for tca-rust
2use crate::theme::Theme;
3use strum::EnumIter;
4use strum::{EnumString, IntoStaticStr};
5
6/// Enum of built in themes.
7
8#[derive(
9    Debug,
10    Default,
11    Clone,
12    Copy,
13    PartialEq,
14    Eq,
15    EnumIter,
16    EnumString,
17    IntoStaticStr,
18    serde::Serialize,
19)]
20#[strum(serialize_all = "kebab-case", ascii_case_insensitive)]
21pub enum BuiltinTheme {
22    /// Catppuccin Mocha — dark, pastel-toned.
23    CatppuccinMocha,
24    /// Cyberpunk — high-contrast neon on dark.
25    Cyberpunk,
26    /// Dracula — the classic dark purple theme (default).
27    #[default]
28    Dracula,
29    /// Everforest Dark — muted green forest tones.
30    EverforestDark,
31    /// Gruvbox Dark — warm retro earth tones.
32    GruvboxDark,
33    /// Mono — minimal monochrome.
34    Mono,
35    /// Nord — cool arctic blue palette.
36    Nord,
37    /// One Dark — Atom-inspired dark theme.
38    OneDark,
39    /// Rosé Pine — soho vibes, muted rose tones.
40    RosePine,
41    /// Solarized Light — the classic light theme.
42    SolarizedLight,
43    /// Tokyo Night — vibrant dark blues and purples.
44    TokyoNight,
45}
46
47/// Built in themes to provide an easy on ramp for users who haven't installed theme files.
48impl BuiltinTheme {
49    /// Get the actual Theme from the Enum.
50    pub fn theme(self) -> Theme {
51        let src = match self {
52            BuiltinTheme::CatppuccinMocha => include_str!("themes/catppuccin-mocha.yaml"),
53            BuiltinTheme::Cyberpunk => include_str!("themes/cyberpunk.yaml"),
54            BuiltinTheme::Dracula => include_str!("themes/dracula.yaml"),
55            BuiltinTheme::EverforestDark => include_str!("themes/everforest-dark.yaml"),
56            BuiltinTheme::GruvboxDark => include_str!("themes/gruvbox-dark.yaml"),
57            BuiltinTheme::Mono => include_str!("themes/mono.yaml"),
58            BuiltinTheme::Nord => include_str!("themes/nord-dark.yaml"),
59            BuiltinTheme::OneDark => include_str!("themes/one-dark.yaml"),
60            BuiltinTheme::RosePine => include_str!("themes/rose-pine.yaml"),
61            BuiltinTheme::SolarizedLight => include_str!("themes/solarized-light.yaml"),
62            BuiltinTheme::TokyoNight => include_str!("themes/tokyo-night.yaml"),
63        };
64        Theme::from_base24_str(src).expect("Built in base24 YAML is invalid.")
65    }
66
67    /// Returns a nice default light Theme.
68    pub fn default_light() -> BuiltinTheme {
69        BuiltinTheme::SolarizedLight
70    }
71
72    /// Iterator to get all the built in themes.
73    pub fn iter() -> impl Iterator<Item = BuiltinTheme> {
74        <Self as strum::IntoEnumIterator>::iter()
75    }
76}
77
78#[cfg(test)]
79mod tests {
80    use super::*;
81
82    #[test]
83    fn all_builtin_themes_load_without_panic() {
84        for variant in BuiltinTheme::iter() {
85            let theme = variant.theme();
86            assert!(!theme.meta.name.is_empty(), "{variant:?} has empty name");
87        }
88    }
89}