use std::collections::{HashMap, HashSet};
use std::borrow::Cow;
use serde::{Serialize, Deserialize};
use serde_with::serde_as;
use crate::types::*;
use crate::glue::*;
use crate::util::*;
#[serde_as]
#[derive(Debug, Clone, Default, PartialEq, Eq, Deserialize, Serialize, Suitability)]
#[serde(deny_unknown_fields)]
pub struct Params<'a> {
#[serde_with = "SetPreventDuplicates<_>"]
#[serde(default, skip_serializing_if = "is_default")]
pub flags: Cow<'a, HashSet<String>>,
#[serde_with = "MapPreventDuplicates<_, _>"]
#[serde(default, skip_serializing_if = "is_default")]
pub vars: Cow<'a, HashMap<String, String>>,
#[serde_with = "MapPreventDuplicates<_, _>"]
#[serde(default, skip_serializing_if = "is_default")]
pub sets: Cow<'a, HashMap<String, Set<String>>>,
#[serde_with = "MapPreventDuplicates<_, _>"]
#[serde(default, skip_serializing_if = "is_default")]
pub lists: Cow<'a, HashMap<String, Vec<String>>>,
#[serde_with = "MapPreventDuplicates<_, _>"]
#[serde(default, skip_serializing_if = "is_default")]
pub maps: Cow<'a, HashMap<String, Map<String>>>,
#[serde_with = "MapPreventDuplicates<_, _>"]
#[serde(default, skip_serializing_if = "is_default")]
pub named_partitionings: Cow<'a, HashMap<String, NamedPartitioning>>,
#[cfg(feature = "http")]
#[serde(default, skip_serializing_if = "is_default")]
pub http_client_config: Cow<'a, HttpClientConfig>
}
impl<'a> Params<'a> {
pub fn borrowed(&'a self) -> Self {
Self {
flags : Cow::Borrowed(&*self.flags),
vars : Cow::Borrowed(&*self.vars),
sets : Cow::Borrowed(&*self.sets),
lists : Cow::Borrowed(&*self.lists),
maps : Cow::Borrowed(&*self.maps),
named_partitionings: Cow::Borrowed(&*self.named_partitionings),
#[cfg(feature = "http")]
http_client_config : Cow::Borrowed(&*self.http_client_config)
}
}
}
#[serde_as]
#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, Eq)]
pub struct ParamsDiff {
#[serde_with = "SetPreventDuplicates<_>"]
#[serde(default, skip_serializing_if = "is_default")] pub flags : HashSet<String>,
#[serde_with = "SetPreventDuplicates<_>"]
#[serde(default, skip_serializing_if = "is_default")] pub unflags: HashSet<String>,
#[serde_with = "MapPreventDuplicates<_, _>"]
#[serde(default, skip_serializing_if = "is_default")] pub vars : HashMap<String, String>,
#[serde_with = "MapPreventDuplicates<_, _>"]
#[serde(default, skip_serializing_if = "is_default")] pub unvars: HashSet<String>,
#[serde(default, skip_serializing_if = "is_default")] pub init_sets: Vec<String>,
#[serde_with = "MapPreventDuplicates<_, _>"]
#[serde(default, skip_serializing_if = "is_default")] pub insert_into_sets: HashMap<String, Vec<Option<String>>>,
#[serde_with = "MapPreventDuplicates<_, _>"]
#[serde(default, skip_serializing_if = "is_default")] pub remove_from_sets: HashMap<String, Vec<Option<String>>>,
#[serde(default, skip_serializing_if = "is_default")] pub delete_sets: Vec<String>,
#[serde(default, skip_serializing_if = "is_default")] pub init_maps: Vec<String>,
#[serde_with = "MapPreventDuplicates<_, _>"]
#[serde(default, skip_serializing_if = "is_default")] pub map_diffs: HashMap<String, MapDiff<String>>,
#[serde(default, skip_serializing_if = "is_default")] pub delete_maps: Vec<String>,
#[cfg(feature = "http")]
#[serde(default, skip_serializing_if = "is_default")] pub http_client_config_diff: Option<HttpClientConfigDiff>
}
impl ParamsDiff {
pub fn apply_once(self, to: &mut Params) {
debug!(Params::apply_once, &self, to);
to.flags.to_mut().extend(self.flags);
for flag in self.unflags {to.flags.to_mut().remove(&flag);}
to.vars.to_mut().extend(self.vars);
for var in self.unvars {to.vars.to_mut().remove(&var);}
for k in self.init_sets {
to.sets.to_mut().entry(k).or_default();
}
for (k, v) in self.insert_into_sets {
to.sets.to_mut().entry(k).or_default().extend(v);
}
for (k, vs) in self.remove_from_sets {
if let Some(x) = to.sets.to_mut().get_mut(&k) {
for v in vs {
x.remove(v.as_ref());
}
}
}
for k in self.delete_sets {
to.sets.to_mut().remove(&k);
}
for k in self.init_maps {
to.maps.to_mut().entry(k).or_default();
}
for (k, v) in self.map_diffs {
v.apply_once(to.maps.to_mut().entry(k).or_default());
}
for k in self.delete_maps {
to.maps.to_mut().remove(&k);
}
#[cfg(feature = "http")] if let Some(http_client_config_diff) = self.http_client_config_diff {http_client_config_diff.apply_once(to.http_client_config.to_mut());}
}
pub fn apply_multiple(&self, to: &mut Params) {
debug!(Params::apply_multiple, self, to);
to.flags.to_mut().extend(self.flags.iter().cloned());
for flag in &self.unflags {to.flags.to_mut().remove(flag);}
to.vars.to_mut().extend(self.vars.iter().map(|(k, v)| (k.clone(), v.clone())));
for var in &self.unvars {to.vars.to_mut().remove(var);}
for k in &self.init_sets {
to.sets.to_mut().entry(k.clone()).or_default();
}
for (k, v) in &self.insert_into_sets {
to.sets.to_mut().entry(k.clone()).or_default().extend(v.iter().cloned());
}
for (k, vs) in &self.remove_from_sets {
if let Some(x) = to.sets.to_mut().get_mut(k) {
for v in vs {
x.remove(v.as_ref());
}
}
}
for k in &self.delete_sets {
to.sets.to_mut().remove(k);
}
for k in &self.init_maps {
to.maps.to_mut().entry(k.clone()).or_default();
}
for (k, v) in &self.map_diffs {
v.apply_multiple(to.maps.to_mut().entry(k.clone()).or_default());
}
for k in &self.delete_maps {
to.maps.to_mut().remove(k);
}
#[cfg(feature = "http")] if let Some(http_client_config_diff) = &self.http_client_config_diff {http_client_config_diff.apply_multiple(to.http_client_config.to_mut());}
}
}