applied this one early, thanks On Wed, Jul 02, 2025 at 04:49:52PM +0200, Gabriel Goller wrote: > From: Stefan Hanreich <s.hanre...@proxmox.com> > > proxmox_serde provides helpers for parsing optional numbers / booleans > coming from perl, so move to using them instead of implementing our > own versions here. No functional changes intended. > > Signed-off-by: Stefan Hanreich <s.hanre...@proxmox.com> > --- > proxmox-ve-config/Cargo.toml | 1 + > proxmox-ve-config/debian/control | 4 ++ > proxmox-ve-config/src/firewall/bridge.rs | 3 +- > proxmox-ve-config/src/firewall/cluster.rs | 6 +- > proxmox-ve-config/src/firewall/guest.rs | 14 ++-- > proxmox-ve-config/src/firewall/host.rs | 26 ++++---- > proxmox-ve-config/src/firewall/parse.rs | 80 ----------------------- > 7 files changed, 28 insertions(+), 106 deletions(-) > > diff --git a/proxmox-ve-config/Cargo.toml b/proxmox-ve-config/Cargo.toml > index 83ee12db2cdf..ecf3fd22b07a 100644 > --- a/proxmox-ve-config/Cargo.toml > +++ b/proxmox-ve-config/Cargo.toml > @@ -16,6 +16,7 @@ serde = { version = "1", features = [ "derive" ] } > serde_json = "1" > serde_plain = "1" > serde_with = "3" > +proxmox-serde = { version = "1.0.0", features = [ "perl" ]} > > proxmox-schema = "4.1" > proxmox-sys = "1" > diff --git a/proxmox-ve-config/debian/control > b/proxmox-ve-config/debian/control > index 4f17d557ddc7..0f6766f93fdc 100644 > --- a/proxmox-ve-config/debian/control > +++ b/proxmox-ve-config/debian/control > @@ -10,6 +10,8 @@ Build-Depends-Arch: cargo:native <!nocheck>, > librust-log-0.4+default-dev <!nocheck>, > librust-nix-0.29+default-dev <!nocheck>, > librust-proxmox-schema-4+default-dev (>= 4.1-~~) <!nocheck>, > + librust-proxmox-serde-1+default-dev <!nocheck>, > + librust-proxmox-serde-1+perl-dev <!nocheck>, > librust-proxmox-sortable-macro-1+default-dev <!nocheck>, > librust-proxmox-sys-1+default-dev <!nocheck>, > librust-serde-1+default-dev <!nocheck>, > @@ -34,6 +36,8 @@ Depends: > librust-log-0.4+default-dev, > librust-nix-0.29+default-dev, > librust-proxmox-schema-4+default-dev (>= 4.1-~~), > + librust-proxmox-serde-1+default-dev, > + librust-proxmox-serde-1+perl-dev, > librust-proxmox-sortable-macro-1+default-dev, > librust-proxmox-sys-1+default-dev, > librust-serde-1+default-dev, > diff --git a/proxmox-ve-config/src/firewall/bridge.rs > b/proxmox-ve-config/src/firewall/bridge.rs > index 4acb6fa23096..6dea60ea74c4 100644 > --- a/proxmox-ve-config/src/firewall/bridge.rs > +++ b/proxmox-ve-config/src/firewall/bridge.rs > @@ -3,7 +3,6 @@ use std::io; > use anyhow::Error; > use serde::Deserialize; > > -use crate::firewall::parse::serde_option_bool; > use crate::firewall::types::log::LogLevel; > use crate::firewall::types::rule::{Direction, Verdict}; > > @@ -55,7 +54,7 @@ impl Config { > #[derive(Debug, Default, Deserialize)] > #[cfg_attr(test, derive(Eq, PartialEq))] > pub struct Options { > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > enable: Option<bool>, > > policy_forward: Option<Verdict>, > diff --git a/proxmox-ve-config/src/firewall/cluster.rs > b/proxmox-ve-config/src/firewall/cluster.rs > index ce3dd53446f8..a775cd99ade4 100644 > --- a/proxmox-ve-config/src/firewall/cluster.rs > +++ b/proxmox-ve-config/src/firewall/cluster.rs > @@ -10,7 +10,7 @@ use crate::firewall::types::log::LogRateLimit; > use crate::firewall::types::rule::{Direction, Verdict}; > use crate::firewall::types::{Alias, Group, Rule}; > > -use crate::firewall::parse::{serde_option_bool, serde_option_log_ratelimit}; > +use crate::firewall::parse::serde_option_log_ratelimit; > > #[derive(Debug, Default)] > pub struct Config { > @@ -118,10 +118,10 @@ impl Config { > #[derive(Debug, Default, Deserialize)] > #[cfg_attr(test, derive(Eq, PartialEq))] > pub struct Options { > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > enable: Option<bool>, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > ebtables: Option<bool>, > > #[serde(default, with = "serde_option_log_ratelimit")] > diff --git a/proxmox-ve-config/src/firewall/guest.rs > b/proxmox-ve-config/src/firewall/guest.rs > index 23eaa4e29d0d..4428a75b0696 100644 > --- a/proxmox-ve-config/src/firewall/guest.rs > +++ b/proxmox-ve-config/src/firewall/guest.rs > @@ -13,8 +13,6 @@ use crate::firewall::types::Ipset; > use anyhow::{bail, Error}; > use serde::Deserialize; > > -use crate::firewall::parse::serde_option_bool; > - > /// default return value for [`Config::is_enabled()`] > pub const GUEST_ENABLED_DEFAULT: bool = false; > /// default return value for [`Config::allow_ndp()`] > @@ -37,25 +35,25 @@ pub const GUEST_POLICY_FORWARD_DEFAULT: Verdict = > Verdict::Accept; > #[derive(Debug, Default, Deserialize)] > #[cfg_attr(test, derive(Eq, PartialEq))] > pub struct Options { > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > dhcp: Option<bool>, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > enable: Option<bool>, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > ipfilter: Option<bool>, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > ndp: Option<bool>, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > radv: Option<bool>, > > log_level_in: Option<LogLevel>, > log_level_out: Option<LogLevel>, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > macfilter: Option<bool>, > > #[serde(rename = "policy_in")] > diff --git a/proxmox-ve-config/src/firewall/host.rs > b/proxmox-ve-config/src/firewall/host.rs > index 394896c48221..f7b02f96d0a7 100644 > --- a/proxmox-ve-config/src/firewall/host.rs > +++ b/proxmox-ve-config/src/firewall/host.rs > @@ -36,49 +36,49 @@ pub const HOST_LOG_INVALID_CONNTRACK: bool = false; > #[derive(Debug, Default, Deserialize)] > #[cfg_attr(test, derive(Eq, PartialEq))] > pub struct Options { > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > enable: Option<bool>, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > nftables: Option<bool>, > > log_level_in: Option<LogLevel>, > log_level_out: Option<LogLevel>, > log_level_forward: Option<LogLevel>, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > log_nf_conntrack: Option<bool>, > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > ndp: Option<bool>, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > nf_conntrack_allow_invalid: Option<bool>, > > // is Option<Vec<>> for easier deserialization > #[serde(default, with = "parse::serde_option_conntrack_helpers")] > nf_conntrack_helpers: Option<Vec<String>>, > > - #[serde(default, with = "parse::serde_option_number")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_i64")] > nf_conntrack_max: Option<i64>, > - #[serde(default, with = "parse::serde_option_number")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_i64")] > nf_conntrack_tcp_timeout_established: Option<i64>, > - #[serde(default, with = "parse::serde_option_number")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_i64")] > nf_conntrack_tcp_timeout_syn_recv: Option<i64>, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > nosmurfs: Option<bool>, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > protection_synflood: Option<bool>, > - #[serde(default, with = "parse::serde_option_number")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_i64")] > protection_synflood_burst: Option<i64>, > - #[serde(default, with = "parse::serde_option_number")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_i64")] > protection_synflood_rate: Option<i64>, > > smurf_log_level: Option<LogLevel>, > tcp_flags_log_level: Option<LogLevel>, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = > "proxmox_serde::perl::deserialize_bool")] > tcpflags: Option<bool>, > } > > diff --git a/proxmox-ve-config/src/firewall/parse.rs > b/proxmox-ve-config/src/firewall/parse.rs > index 8cf475740eab..7fd5c8461a56 100644 > --- a/proxmox-ve-config/src/firewall/parse.rs > +++ b/proxmox-ve-config/src/firewall/parse.rs > @@ -148,86 +148,6 @@ pub fn parse_named_section_tail<'a>( > }) > } > > -// parses a number from a string OR number > -pub mod serde_option_number { > - use std::fmt; > - > - use serde::de::{Deserializer, Error, Visitor}; > - > - pub fn deserialize<'de, D: Deserializer<'de>>( > - deserializer: D, > - ) -> Result<Option<i64>, D::Error> { > - struct V; > - > - impl<'de> Visitor<'de> for V { > - type Value = Option<i64>; > - > - fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { > - f.write_str("a numerical value") > - } > - > - fn visit_str<E: Error>(self, v: &str) -> Result<Self::Value, E> { > - v.parse().map_err(E::custom).map(Some) > - } > - > - fn visit_none<E: Error>(self) -> Result<Self::Value, E> { > - Ok(None) > - } > - > - fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, > D::Error> > - where > - D: Deserializer<'de>, > - { > - deserializer.deserialize_any(self) > - } > - } > - > - deserializer.deserialize_any(V) > - } > -} > - > -// parses a bool from a string OR bool > -pub mod serde_option_bool { > - use std::fmt; > - > - use serde::de::{Deserializer, Error, Visitor}; > - > - pub fn deserialize<'de, D: Deserializer<'de>>( > - deserializer: D, > - ) -> Result<Option<bool>, D::Error> { > - struct V; > - > - impl<'de> Visitor<'de> for V { > - type Value = Option<bool>; > - > - fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { > - f.write_str("a boolean-like value") > - } > - > - fn visit_bool<E: Error>(self, v: bool) -> Result<Self::Value, E> > { > - Ok(Some(v)) > - } > - > - fn visit_str<E: Error>(self, v: &str) -> Result<Self::Value, E> { > - super::parse_bool(v).map_err(E::custom).map(Some) > - } > - > - fn visit_none<E: Error>(self) -> Result<Self::Value, E> { > - Ok(None) > - } > - > - fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, > D::Error> > - where > - D: Deserializer<'de>, > - { > - deserializer.deserialize_any(self) > - } > - } > - > - deserializer.deserialize_any(V) > - } > -} > - > // parses a comma_separated list of strings > pub mod serde_option_conntrack_helpers { > use std::fmt; > -- > 2.39.5 > > > > _______________________________________________ > pve-devel mailing list > pve-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel > >
_______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel