use std::collections::BTreeMap;
use serde::Deserialize;
use crate::store::Secret;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, serde::Serialize)]
#[serde(rename_all = "lowercase")]
pub enum LossyMode {
#[default]
Adapt,
Reject,
}
#[derive(Default, Clone, Debug, PartialEq, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct PartialIngress {
pub listen: Option<String>,
pub token: Option<Secret>,
pub lossy: Option<LossyMode>,
#[serde(default)]
pub lossy_overrides: BTreeMap<String, LossyMode>,
}
impl PartialIngress {
fn or(mut self, other: PartialIngress) -> PartialIngress {
for (key, value) in other.lossy_overrides {
self.lossy_overrides.entry(key).or_insert(value);
}
PartialIngress {
listen: self.listen.or(other.listen),
token: self.token.or(other.token),
lossy: self.lossy.or(other.lossy),
lossy_overrides: self.lossy_overrides,
}
}
}
pub(crate) fn or_ingress(
hi: Option<PartialIngress>,
lo: Option<PartialIngress>,
) -> Option<PartialIngress> {
match (hi, lo) {
(Some(hi), Some(lo)) => Some(hi.or(lo)),
(hi, lo) => hi.or(lo),
}
}