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