mod tokens;
pub use tokens::{ThemeTokens, TokenValue};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Theme {
pub id: String,
pub name: String,
#[serde(default)]
pub description: Option<String>,
pub tokens: ThemeTokens,
}
impl Theme {
pub fn new(id: impl Into<String>, name: impl Into<String>) -> Self {
Self {
id: id.into(),
name: name.into(),
description: None,
tokens: ThemeTokens::default(),
}
}
pub fn default_theme() -> Self {
Self {
id: "default".into(),
name: "Default Theme".into(),
description: Some("Standard RenderReport theme".into()),
tokens: ThemeTokens::default(),
}
}
pub fn merge(&mut self, other: &Theme) {
self.tokens.merge(&other.tokens);
}
pub fn with_overrides(mut self, overrides: HashMap<String, TokenValue>) -> Self {
for (key, value) in overrides {
self.tokens.set(&key, value);
}
self
}
}
impl Default for Theme {
fn default() -> Self {
Self::default_theme()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_theme_creation() {
let theme = Theme::new("custom", "Custom Theme");
assert_eq!(theme.id, "custom");
assert_eq!(theme.name, "Custom Theme");
}
#[test]
fn test_theme_merge() {
let mut base = Theme::default_theme();
let mut custom = Theme::new("custom", "Custom");
custom
.tokens
.set("color.primary", TokenValue::Color("#ff0000".into()));
base.merge(&custom);
assert_eq!(
base.tokens.get("color.primary"),
Some(&TokenValue::Color("#ff0000".into()))
);
}
}