1#![allow(missing_docs)]
2use crate::Theme;
4use strum::{EnumIter, EnumString, IntoStaticStr};
5
6#[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}