use crate::app::model::Model;
use crate::components::common::{Msg, ThemeActivityMsg};
use crate::theme::ThemeManager;
use crate::theme::types::ThemeConfig;
use tuirealm::terminal::TerminalAdapter;
impl<T> Model<T>
where
T: TerminalAdapter,
{
pub fn update_theme(&mut self, msg: ThemeActivityMsg) -> Option<Msg> {
match msg {
ThemeActivityMsg::ThemeSelected(theme_name, flavor_name) => {
self.handle_theme_selected(theme_name, flavor_name)
}
ThemeActivityMsg::ThemePickerClosed => self.handle_theme_picker_closed(),
}
}
fn handle_theme_selected(&mut self, theme_name: String, flavor_name: String) -> Option<Msg> {
log::info!("Switching to theme: {theme_name} ({flavor_name})");
let theme_config = ThemeConfig {
theme_name: theme_name.clone(),
flavor_name: flavor_name.clone(),
};
match ThemeManager::global().lock() {
Ok(mut manager) => {
if let Err(e) = manager.switch_theme_from_config(&theme_config) {
if let Err(unmount_err) = self.unmount_theme_picker() {
self.error_reporter.report_mount_error(
"ThemePicker",
"unmount",
unmount_err,
);
}
self.error_reporter.report_theme_error("switch", e);
return None;
}
}
Err(e) => {
if let Err(unmount_err) = self.unmount_theme_picker() {
self.error_reporter
.report_mount_error("ThemePicker", "unmount", unmount_err);
}
self.error_reporter.report_theme_error("acquire_lock", e);
return None;
}
}
if let Err(e) = self.unmount_theme_picker() {
self.error_reporter
.report_mount_error("ThemePicker", "unmount", e);
return None;
}
self.set_redraw(true);
log::info!("Successfully switched to theme: {theme_name} ({flavor_name})");
None
}
fn handle_theme_picker_closed(&mut self) -> Option<Msg> {
log::debug!("Theme picker closed");
if let Err(e) = self.unmount_theme_picker() {
self.error_reporter
.report_mount_error("ThemePicker", "unmount", e);
None
} else {
None
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_theme_error_handling_returns_error_message() {
let invalid_theme = "nonexistent_theme".to_string();
let invalid_flavor = "nonexistent_flavor".to_string();
let _theme_config = ThemeConfig {
theme_name: invalid_theme.clone(),
flavor_name: invalid_flavor.clone(),
};
assert_eq!(invalid_theme, "nonexistent_theme");
assert_eq!(invalid_flavor, "nonexistent_flavor");
}
#[test]
fn test_theme_config_creation() {
let config = ThemeConfig {
theme_name: "test_theme".to_string(),
flavor_name: "test_flavor".to_string(),
};
assert_eq!(config.theme_name, "test_theme");
assert_eq!(config.flavor_name, "test_flavor");
}
}