use serde::{Deserialize, Deserializer, Serialize};
use serde_json::Value;
use ts_rs::TS;
use super::{ColumnConfigMap, TableRef};
#[derive(Clone, Debug, Default, Serialize, PartialEq, TS)]
#[serde(untagged)]
pub enum OptionalUpdate<T: Clone> {
#[ts(skip)]
SetDefault,
#[default]
Missing,
Update(T),
}
pub type PluginUpdate = OptionalUpdate<String>;
pub type SettingsUpdate = OptionalUpdate<bool>;
pub type ThemeUpdate = OptionalUpdate<String>;
pub type TitleUpdate = OptionalUpdate<String>;
pub type TableUpdate = OptionalUpdate<TableRef>;
pub type VersionUpdate = OptionalUpdate<String>;
pub type ColumnConfigUpdate = OptionalUpdate<ColumnConfigMap>;
pub type PluginConfigUpdate = OptionalUpdate<serde_json::Map<String, Value>>;
impl<T: Clone> From<Option<T>> for OptionalUpdate<T> {
fn from(opt: Option<T>) -> Self {
match opt {
Some(v) => Self::Update(v),
None => Self::SetDefault,
}
}
}
impl<'a, T> Deserialize<'a> for OptionalUpdate<T>
where
T: Deserialize<'a> + Clone,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'a>,
{
Option::deserialize(deserializer).map(Into::into)
}
}