From 20390d4bbcb13d0891c5f61a3e90a19a79b69699 Mon Sep 17 00:00:00 2001 From: Keagan McClelland Date: Tue, 21 Sep 2021 11:39:30 -0600 Subject: [PATCH] splits up package pointer types --- appmgr/src/config/mod.rs | 4 +-- appmgr/src/config/spec.rs | 68 +++++++++++++++++++++++++++++---------- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/appmgr/src/config/mod.rs b/appmgr/src/config/mod.rs index 590a2f799..483dae9c0 100644 --- a/appmgr/src/config/mod.rs +++ b/appmgr/src/config/mod.rs @@ -448,8 +448,8 @@ pub fn configure<'a, Db: DbHandle>( // handle backreferences for ptr in &dep_info.pointers { - if let PackagePointerSpecVariant::Config { selector, multi } = ptr { - if selector.select(*multi, &next) != selector.select(*multi, &prev) { + if let PackagePointerSpecVariant::Config(cfg_ptr) = ptr { + if cfg_ptr.select(&next) != cfg_ptr.select(&prev) { if let Err(e) = configure( ctx, db, dependent, None, timeout, dry_run, overrides, breakages, ) diff --git a/appmgr/src/config/spec.rs b/appmgr/src/config/spec.rs index 9769fe594..c8ff6a3a9 100644 --- a/appmgr/src/config/spec.rs +++ b/appmgr/src/config/spec.rs @@ -1520,7 +1520,7 @@ impl PackagePointerSpec { config_overrides: &BTreeMap, ) -> Result { match &self.target { - PackagePointerSpecVariant::TorAddress { interface } => { + PackagePointerSpecVariant::Tor(TorAddressPointer { interface }) => { let addr = crate::db::DatabaseModel::new() .package_data() .idx_model(&self.package_id) @@ -1532,7 +1532,7 @@ impl PackagePointerSpec { .map_err(|e| ConfigurationError::SystemError(Error::from(e)))?; Ok(addr.to_owned().map(Value::String).unwrap_or(Value::Null)) } - PackagePointerSpecVariant::LanAddress { interface } => { + PackagePointerSpecVariant::Lan(LanAddressPointer { interface }) => { let addr = crate::db::DatabaseModel::new() .package_data() .idx_model(&self.package_id) @@ -1544,7 +1544,7 @@ impl PackagePointerSpec { .map_err(|e| ConfigurationError::SystemError(Error::from(e)))?; Ok(addr.to_owned().map(Value::String).unwrap_or(Value::Null)) } - PackagePointerSpecVariant::Config { selector, multi } => { + PackagePointerSpecVariant::Config(ConfigPointer { selector, multi }) => { if let Some(cfg) = config_overrides.get(&self.package_id) { Ok(selector.select(*multi, &Value::Object(cfg.clone()))) } else { @@ -1644,23 +1644,57 @@ impl ValueSpec for PackagePointerSpec { #[serde(tag = "target")] #[serde(rename_all = "kebab-case")] pub enum PackagePointerSpecVariant { - TorAddress { - interface: InterfaceId, - }, - LanAddress { - interface: InterfaceId, - }, - Config { - selector: Arc, - multi: bool, - }, + Tor(TorAddressPointer), + Lan(LanAddressPointer), + Config(ConfigPointer), } impl fmt::Display for PackagePointerSpecVariant { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { - Self::TorAddress { interface } => write!(f, "tor-address: {}", interface), - Self::LanAddress { interface } => write!(f, "lan-address: {}", interface), - Self::Config { selector, .. } => write!(f, "config: {}", selector), + Self::Tor(tor) => write!(f, "{}", tor), + Self::Lan(lan) => write!(f, "{}", lan), + Self::Config(cfg) => write!(f, "{}", cfg), + } + } +} + +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct TorAddressPointer { + interface: InterfaceId, +} +impl fmt::Display for TorAddressPointer { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + TorAddressPointer { interface } => write!(f, "tor-address: {}", interface), + } + } +} + +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct LanAddressPointer { + interface: InterfaceId, +} +impl fmt::Display for LanAddressPointer { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + LanAddressPointer { interface } => write!(f, "lan-address: {}", interface), + } + } +} +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct ConfigPointer { + selector: Arc, + multi: bool, +} +impl ConfigPointer { + pub fn select(&self, val: &Value) -> Value { + self.selector.select(self.multi, val) + } +} +impl fmt::Display for ConfigPointer { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ConfigPointer { selector, .. } => write!(f, "config: {}", selector), } } } @@ -1671,7 +1705,7 @@ pub struct ConfigSelector { compiled: CompiledJsonPath, } impl ConfigSelector { - pub fn select(&self, multi: bool, val: &Value) -> Value { + fn select(&self, multi: bool, val: &Value) -> Value { let selected = self.compiled.select(&val).ok().unwrap_or_else(Vec::new); if multi { Value::Array(selected.into_iter().cloned().collect())