use serde::{Deserialize, Serialize};
use tatara_lisp::DeriveTataraDomain;
pub const DEFAULT_PRESET: &str = "vellum";
#[derive(DeriveTataraDomain, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
#[tatara(keyword = "deftheme")]
pub struct ThemeSpec {
#[serde(default = "default_preset")]
pub preset: String,
}
fn default_preset() -> String {
DEFAULT_PRESET.to_string()
}
impl Default for ThemeSpec {
fn default() -> Self {
Self { preset: DEFAULT_PRESET.to_string() }
}
}
impl ThemeSpec {
#[must_use]
pub fn effective_preset(&self) -> &str {
if self.preset.is_empty() {
DEFAULT_PRESET
} else {
&self.preset
}
}
}
pub const KNOWN_PRESETS: &[&str] =
&["vellum", "nord", "gruvbox-dark", "tokyo-night", "catppuccin-mocha"];
#[must_use]
pub fn is_known_preset(name: &str) -> bool {
KNOWN_PRESETS.iter().any(|p| *p == name)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn vellum_is_a_known_preset() {
assert!(is_known_preset("vellum"));
}
#[test]
fn default_theme_is_vellum() {
assert_eq!(ThemeSpec::default().preset, "vellum");
assert_eq!(ThemeSpec::default().effective_preset(), "vellum");
}
#[test]
fn empty_preset_resolves_to_vellum() {
let t = ThemeSpec { preset: String::new() };
assert_eq!(t.effective_preset(), "vellum");
}
}