use std::collections::HashMap;
use std::fmt;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize, serde::Serialize)]
#[serde(deny_unknown_fields)]
pub struct ThemeFile {
pub meta: ThemeMeta,
#[serde(default)]
pub palette: HashMap<String, String>,
#[serde(default)]
pub tokens: HashMap<String, String>,
#[serde(default)]
pub styles: HashMap<String, StyleDef>,
#[serde(default)]
pub gradients: HashMap<String, Vec<String>>,
}
#[derive(Debug, Clone, Deserialize, serde::Serialize)]
#[serde(deny_unknown_fields)]
pub struct ThemeMeta {
pub name: String,
#[serde(default)]
pub author: Option<String>,
#[serde(default)]
pub variant: ThemeVariant,
#[serde(default)]
pub version: Option<String>,
#[serde(default)]
pub description: Option<String>,
}
impl ThemeMeta {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
author: None,
variant: ThemeVariant::default(),
version: None,
description: None,
}
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, serde::Serialize)]
#[serde(rename_all = "lowercase")]
pub enum ThemeVariant {
#[default]
Dark,
Light,
}
impl fmt::Display for ThemeVariant {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Dark => write!(f, "Dark"),
Self::Light => write!(f, "Light"),
}
}
}
#[allow(clippy::struct_excessive_bools)]
#[derive(Debug, Clone, Default, Deserialize, serde::Serialize)]
#[serde(deny_unknown_fields)]
pub struct StyleDef {
pub fg: Option<String>,
pub bg: Option<String>,
#[serde(default)]
pub bold: bool,
#[serde(default)]
pub dim: bool,
#[serde(default)]
pub italic: bool,
#[serde(default)]
pub underline: bool,
#[serde(default)]
pub slow_blink: bool,
#[serde(default)]
pub rapid_blink: bool,
#[serde(default)]
pub reversed: bool,
#[serde(default)]
pub hidden: bool,
#[serde(default)]
pub crossed_out: bool,
}