use std::collections::HashMap;
use rosace_core::Platform;
use crate::theme::ThemeData;
#[derive(Clone)]
pub struct Themes {
fallback: ThemeData,
per_platform: HashMap<Platform, ThemeData>,
}
impl Themes {
pub fn new(fallback: ThemeData) -> Self {
Self { fallback, per_platform: HashMap::new() }
}
pub fn platform(mut self, platform: Platform, theme: ThemeData) -> Self {
self.per_platform.insert(platform, theme);
self
}
pub fn resolve(&self, platform: Platform) -> ThemeData {
self.per_platform.get(&platform).cloned().unwrap_or_else(|| self.fallback.clone())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::built_in::{cupertino, light_theme, material};
#[test]
fn resolve_returns_registered_theme_for_platform() {
let themes = Themes::new(light_theme())
.platform(Platform::Ios, cupertino())
.platform(Platform::Android, material());
assert_eq!(themes.resolve(Platform::Ios).app_bar.height, cupertino().app_bar.height);
assert_eq!(themes.resolve(Platform::Android).app_bar.height, material().app_bar.height);
}
#[test]
fn resolve_falls_back_for_unregistered_platform() {
let themes = Themes::new(light_theme()).platform(Platform::Ios, cupertino());
let resolved = themes.resolve(Platform::MacOs);
assert_eq!(resolved.app_bar.height, light_theme().app_bar.height);
}
}