aether-wisp 0.6.3

A terminal UI for AI coding agents via the Agent Client Protocol (ACP)
Documentation
use super::UiSettings;

pub(crate) struct SettingsModel {
    ui: UiSettings,
    theme: ThemeApplication,
}

#[derive(Default)]
struct ThemeApplication {
    in_flight: bool,
    queued: Option<String>,
}

pub(crate) struct ThemeChangeRequest {
    pub(crate) settings: UiSettings,
    pub(crate) value: String,
}

impl SettingsModel {
    pub(crate) fn new(ui: UiSettings) -> Self {
        Self { ui, theme: ThemeApplication::default() }
    }

    pub(crate) fn ui(&self) -> &UiSettings {
        &self.ui
    }

    pub(crate) fn request_theme_change(&mut self, value: String) -> Option<ThemeChangeRequest> {
        if self.theme.in_flight {
            self.theme.queued = Some(value);
            None
        } else {
            Some(self.start_theme_change(value))
        }
    }

    pub(crate) fn finish_theme_change(&mut self, settings: UiSettings) -> Option<ThemeChangeRequest> {
        self.theme.in_flight = false;
        if let Some(value) = self.theme.queued.take() {
            Some(self.start_theme_change(value))
        } else {
            self.ui = settings;
            None
        }
    }

    fn start_theme_change(&mut self, value: String) -> ThemeChangeRequest {
        let mut settings = self.ui.clone();
        settings.theme.file = (!value.is_empty()).then(|| value.clone());
        self.theme.in_flight = true;
        ThemeChangeRequest { settings, value }
    }
}