Skip to main content

tca_types/
builtin.rs

1#![allow(missing_docs)]
2//! Built in hardcoded themes for tca-rust
3use crate::Theme;
4use strum::{EnumIter, 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")]
10pub enum BuiltinTheme {
11    #[strum(serialize = "catppuccin-mocha", serialize = "catppuccin mocha")]
12    CatppuccinMocha,
13    Cyberpunk,
14    #[default]
15    Dracula,
16    #[strum(serialize = "everforest-dark", serialize = "everforest dark")]
17    EverforestDark,
18    #[strum(serialize = "gruvbox-dark", serialize = "gruvbox dark")]
19    GruvboxDark,
20    Mono,
21    Nord,
22    #[strum(serialize = "one-dark", serialize = "one dark")]
23    OneDark,
24    #[strum(serialize = "rose-pine", serialize = "rose pine")]
25    RosePine,
26    #[strum(serialize = "solarized light", serialize = "solarized-light")]
27    SolarizedLight,
28    #[strum(serialize = "tokyo-night", serialize = "tokyo night")]
29    TokyoNight,
30}
31
32impl BuiltinTheme {
33    pub fn theme(&self) -> Theme {
34        let src = match self {
35            BuiltinTheme::CatppuccinMocha => include_str!("themes/catppuccin-mocha.toml"),
36            BuiltinTheme::Cyberpunk => include_str!("themes/cyberpunk.toml"),
37            BuiltinTheme::Dracula => include_str!("themes/dracula.toml"),
38            BuiltinTheme::EverforestDark => include_str!("themes/everforest-dark.toml"),
39            BuiltinTheme::GruvboxDark => include_str!("themes/gruvbox-dark.toml"),
40            BuiltinTheme::Mono => include_str!("themes/mono.toml"),
41            BuiltinTheme::Nord => include_str!("themes/nord-dark.toml"),
42            BuiltinTheme::OneDark => include_str!("themes/one-dark.toml"),
43            BuiltinTheme::RosePine => include_str!("themes/rose-pine.toml"),
44            BuiltinTheme::SolarizedLight => include_str!("themes/solarized-light.toml"),
45            BuiltinTheme::TokyoNight => include_str!("themes/tokyo-night.toml"),
46        };
47
48        toml::from_str(src).expect("Built in theme TOML is invalid.")
49    }
50
51    pub fn default_dark() -> Self {
52        BuiltinTheme::default()
53    }
54    pub fn default_light() -> Self {
55        BuiltinTheme::SolarizedLight
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62    use strum::IntoEnumIterator;
63
64    #[test]
65    fn all_builtin_themes_load_without_panic() {
66        for variant in BuiltinTheme::iter() {
67            let theme = variant.theme();
68            assert!(!theme.meta.name.is_empty(), "{variant:?} has empty name");
69        }
70    }
71}