use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use crate::domain::error::Result;
use crate::domain::format::{AngleMode, Notation};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct PersistedState {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub settings: Option<PersistedSettings>,
#[serde(default)]
pub variables: BTreeMap<String, PersistedValue>,
#[serde(default)]
pub history: Vec<PersistedEntry>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PersistedValue {
pub value: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PersistedSettings {
pub notation: Notation,
pub decimals: usize,
pub angle_mode: AngleMode,
pub decimal_separator: String,
#[serde(default = "default_trim_trailing_zeros")]
pub trim_trailing_zeros: bool,
}
fn default_trim_trailing_zeros() -> bool {
true
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PersistedEntry {
pub input: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub value: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
}
pub trait StateRepository {
fn load(&self) -> Result<PersistedState>;
fn save(&self, state: &PersistedState) -> Result<()>;
}