1use crate::theme::Theme;
3use strum::EnumIter;
4use strum::{EnumString, IntoStaticStr};
5
6#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, EnumIter, EnumString, IntoStaticStr)]
9#[strum(serialize_all = "kebab-case", ascii_case_insensitive)]
10pub enum BuiltinTheme {
11 CatppuccinMocha,
13 Cyberpunk,
15 #[default]
17 Dracula,
18 EverforestDark,
20 GruvboxDark,
22 Mono,
24 Nord,
26 OneDark,
28 RosePine,
30 SolarizedLight,
32 TokyoNight,
34}
35
36impl BuiltinTheme {
38 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 pub fn default_light() -> BuiltinTheme {
59 BuiltinTheme::SolarizedLight
60 }
61
62 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}