use std::collections::BTreeMap;
use serde::Deserialize;
use crate::config::loader::legacy::RawLegacyTheme;
use crate::domain::format::{AngleMode, Notation};
use crate::theme::GlyphVariant;
pub(super) type ColorMap = BTreeMap<String, String>;
#[derive(Debug, Default, Deserialize)]
#[serde(default, deny_unknown_fields)]
pub(super) struct RawConfig {
pub(super) notation: Option<Notation>,
pub(super) decimals: Option<usize>,
pub(super) angle_mode: Option<AngleMode>,
pub(super) decimal_separator: Option<String>,
pub(super) thousands_separator: Option<String>,
pub(super) trim_trailing_zeros: Option<bool>,
pub(super) max_history: Option<usize>,
pub(super) restore_last_settings: Option<bool>,
pub(super) live_feedback: Option<bool>,
pub(super) history_spacing: Option<usize>,
pub(super) history_separator: Option<bool>,
pub(super) input_max_lines: Option<usize>,
pub(super) confirm_delete: Option<bool>,
pub(super) confirm_quit: Option<bool>,
pub(super) glyphs: Option<GlyphVariant>,
pub(super) theme: Option<RawLegacyTheme>,
pub(super) appearance: Option<RawAppearance>,
pub(super) highlight: Option<RawHighlight>,
pub(super) themes: BTreeMap<String, ColorMap>,
pub(super) keys: BTreeMap<String, KeyBinding>,
}
#[derive(Debug, Default, Deserialize)]
#[serde(default, deny_unknown_fields)]
pub(super) struct RawAppearance {
pub(super) theme: Option<String>,
pub(super) glyphs: Option<GlyphVariant>,
pub(super) colors: ColorMap,
}
#[derive(Debug, Default, Deserialize)]
#[serde(default, deny_unknown_fields)]
pub(super) struct RawHighlight {
pub(super) function: Option<String>,
pub(super) constant: Option<String>,
pub(super) operator: Option<String>,
pub(super) number: Option<String>,
pub(super) variable: Option<String>,
pub(super) ans: Option<String>,
pub(super) comment: Option<String>,
pub(super) unit: Option<String>,
}
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub(super) enum KeyBinding {
One(String),
Many(Vec<String>),
}
impl KeyBinding {
pub(super) fn into_keys(self) -> Vec<String> {
match self {
KeyBinding::One(key) => vec![key],
KeyBinding::Many(keys) => keys,
}
}
}