buntrail-core 0.1.1

Revisioned documents and shared editor contracts.
Documentation
use crate::contracts::TerminalStyle;

#[derive(Clone, Copy, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum Appearance {
    System,
    Light,
    Dark,
}
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
pub enum TerminalScheme {
    Automatic,
    Graphite,
    Paper,
}
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct Preferences {
    pub appearance: Appearance,
    pub terminal_scheme: TerminalScheme,
    pub show_icons: bool,
    pub terminal: TerminalStyle,
}
impl Default for Preferences {
    fn default() -> Self {
        Self {
            appearance: Appearance::System,
            terminal_scheme: TerminalScheme::Automatic,
            show_icons: true,
            terminal: TerminalStyle {
                font_family: "Menlo".into(),
                font_size: 12.0,
                ansi_palette: [
                    0x000000, 0xcd0000, 0x00cd00, 0xcdcd00, 0x0000ee, 0xcd00cd, 0x00cdcd, 0xe5e5e5,
                    0x7f7f7f, 0xff0000, 0x00ff00, 0xffff00, 0x5c5cff, 0xff00ff, 0x00ffff, 0xffffff,
                ],
                foreground: 0xe5e5e5,
                background: 0x000000,
                cursor: 0xffffff,
            },
        }
    }
}
impl Preferences {
    pub fn valid(&self) -> bool {
        !self.terminal.font_family.is_empty()
            && self.terminal.font_family.len() <= 256
            && self.terminal.font_size.is_finite()
            && (8.0..=48.0).contains(&self.terminal.font_size)
            && self
                .terminal
                .ansi_palette
                .iter()
                .chain([
                    &self.terminal.foreground,
                    &self.terminal.background,
                    &self.terminal.cursor,
                ])
                .all(|color| *color <= 0xffffff)
    }
    pub fn apply(&mut self, overrides: &PreferencesOverride) {
        if let Some(v) = overrides.appearance {
            self.appearance = v;
        }
        if let Some(v) = &overrides.terminal_scheme {
            self.terminal_scheme = v.clone();
        }
        if let Some(v) = &overrides.terminal {
            self.terminal = v.clone();
        }
    }
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct PreferencesOverride {
    pub terminal_scheme: Option<TerminalScheme>,
    pub appearance: Option<Appearance>,
    pub terminal: Option<TerminalStyle>,
}