1use crate::theme::Theme;
3use strum::EnumIter;
4use strum::{EnumString, IntoStaticStr};
5
6#[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 CatppuccinMocha,
24 Cyberpunk,
26 #[default]
28 Dracula,
29 EverforestDark,
31 GruvboxDark,
33 Mono,
35 Nord,
37 OneDark,
39 RosePine,
41 SolarizedLight,
43 TokyoNight,
45}
46
47impl BuiltinTheme {
49 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 pub fn default_light() -> BuiltinTheme {
69 BuiltinTheme::SolarizedLight
70 }
71
72 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}