use std::collections::HashMap;
use ratatui::style::Color;
use crate::services::theme::loader::parse_color::parse_hex_color;
use crate::services::theme::loader::theme_json::ColorValue;
use crate::services::theme::ThemeVariant;
pub fn resolve_color_value(
value: &ColorValue,
defs: &HashMap<String, String>,
variant: ThemeVariant,
) -> Option<Color> {
match value {
ColorValue::Direct(s) => resolve_string(s, defs),
ColorValue::Variant { dark, light } => {
let s = match variant {
ThemeVariant::Dark => dark,
ThemeVariant::Light => light,
};
resolve_string(s, defs)
}
}
}
fn resolve_string(s: &str, defs: &HashMap<String, String>) -> Option<Color> {
if s.starts_with('#') {
return parse_hex_color(s);
}
if let Some(hex) = defs.get(s) {
return parse_hex_color(hex);
}
if s.chars().all(|c| c.is_ascii_hexdigit()) && (s.len() == 6 || s.len() == 3) {
return parse_hex_color(s);
}
None
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_resolve_direct_hex() {
let defs = HashMap::new();
let value = ColorValue::Direct("#ff0000".to_string());
let result = resolve_color_value(&value, &defs, ThemeVariant::Dark);
assert_eq!(result, Some(Color::Rgb(255, 0, 0)));
}
#[test]
fn test_resolve_reference() {
let mut defs = HashMap::new();
defs.insert("darkRed".to_string(), "#cc241d".to_string());
let value = ColorValue::Direct("darkRed".to_string());
let result = resolve_color_value(&value, &defs, ThemeVariant::Dark);
assert_eq!(result, Some(Color::Rgb(204, 36, 29)));
}
#[test]
fn test_resolve_variant_dark() {
let mut defs = HashMap::new();
defs.insert("darkBlue".to_string(), "#458588".to_string());
defs.insert("lightBlue".to_string(), "#076678".to_string());
let value = ColorValue::Variant {
dark: "darkBlue".to_string(),
light: "lightBlue".to_string(),
};
let dark_result = resolve_color_value(&value, &defs, ThemeVariant::Dark);
assert_eq!(dark_result, Some(Color::Rgb(69, 133, 136)));
let light_result = resolve_color_value(&value, &defs, ThemeVariant::Light);
assert_eq!(light_result, Some(Color::Rgb(7, 102, 120)));
}
}