diff --git a/src/tools/mod.rs b/src/tools/mod.rs index d8ed7275..03b9da86 100644 --- a/src/tools/mod.rs +++ b/src/tools/mod.rs @@ -16,7 +16,6 @@ pub mod apt; pub mod config; pub mod disks; -pub mod serde_filter; pub mod statistics; pub mod subscription; pub mod systemd; diff --git a/src/tools/serde_filter.rs b/src/tools/serde_filter.rs deleted file mode 100644 index dc579e4e..00000000 --- a/src/tools/serde_filter.rs +++ /dev/null @@ -1,97 +0,0 @@ -use std::marker::PhantomData; - -use serde::Deserialize; - -/// Helper to filter data while deserializing it. -/// -/// An example use case is filtering out expired registration challenges at load time of our TFA -/// config: -/// -/// ``` -/// # use proxmox_backup::tools::serde_filter::FilteredVecVisitor; -/// # use serde::{Deserialize, Deserializer, Serialize}; -/// # const CHALLENGE_TIMEOUT: i64 = 2 * 60; -/// #[derive(Deserialize)] -/// struct Challenge { -/// /// Expiration time as unix epoch. -/// expires: i64, -/// -/// // ...other entries... -/// } -/// -/// #[derive(Default, Deserialize)] -/// #[serde(deny_unknown_fields)] -/// #[serde(rename_all = "kebab-case")] -/// pub struct TfaUserData { -/// // ...other entries... -/// -/// #[serde(skip_serializing_if = "Vec::is_empty", default)] -/// #[serde(deserialize_with = "filter_expired_registrations")] -/// registrations: Vec, -/// } -/// -/// fn filter_expired_registrations<'de, D>(deserializer: D) -> Result, D::Error> -/// where -/// D: Deserializer<'de>, -/// { -/// let expire_before = proxmox_time::epoch_i64() - CHALLENGE_TIMEOUT; -/// -/// Ok(deserializer.deserialize_seq( -/// FilteredVecVisitor::new( -/// "a u2f registration challenge entry", -/// move |c: &Challenge| c.expires < expire_before, -/// ) -/// )?) -/// } -/// ``` -pub struct FilteredVecVisitor -where - F: Fn(&T) -> bool -{ - filter: F, - expecting: &'static str, - _ty: PhantomData, -} - -impl FilteredVecVisitor -where - F: Fn(&T) -> bool, -{ - pub fn new(expecting: &'static str, filter: F) -> Self { - Self { - filter, - expecting, - _ty: PhantomData, - } - } -} - -impl<'de, F, T> serde::de::Visitor<'de> for FilteredVecVisitor -where - F: Fn(&T) -> bool, - T: Deserialize<'de>, -{ - type Value = Vec; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str(self.expecting) - } - - fn visit_seq(self, mut seq: A) -> Result - where - A: serde::de::SeqAccess<'de>, - { - let mut out = match seq.size_hint() { - Some(hint) => Vec::with_capacity(hint), - None => Vec::new(), - }; - - while let Some(entry) = seq.next_element::()? { - if (self.filter)(&entry) { - out.push(entry); - } - } - - Ok(out) - } -}