diff --git a/src/backend/repartcfg.rs b/src/backend/repartcfg.rs index 751cfdb..76ea7ec 100644 --- a/src/backend/repartcfg.rs +++ b/src/backend/repartcfg.rs @@ -316,8 +316,8 @@ impl<'de> serde::Deserialize<'de> for PartTypeIdent { } ini_enum! { - #[derive(Debug, serde::Deserialize)] - #[serde(rename_all = "lowercase")] + #[derive(Debug)] + // #[serde(rename_all = "lowercase")] pub enum FileSystem { Ext4, Btrfs, @@ -328,8 +328,8 @@ ini_enum! { Swap, } - #[derive(Debug, Deserialize, Default)] - #[serde(rename_all = "lowercase")] + #[derive(Debug, Default)] + // #[serde(rename_all = "lowercase")] pub enum EncryptOption { #[default] Off, @@ -338,8 +338,8 @@ ini_enum! { KeyFileTpm2 => "key-file+tpm2", } - #[derive(Debug, Default, Deserialize)] - #[serde(rename_all = "lowercase")] + #[derive(Debug, Default)] + // #[serde(rename_all = "lowercase")] pub enum Verity { #[default] Off, diff --git a/src/backend/test/root.conf b/src/backend/test/root.conf index 09e439b..4116ca3 100644 --- a/src/backend/test/root.conf +++ b/src/backend/test/root.conf @@ -12,3 +12,4 @@ FactoryReset=yes # This path is actually relative; see man repart.d at --copy-source option CopyFiles=/:/ ExcludeFiles=/boot/ +Encrypt=key-file diff --git a/src/util/macros.rs b/src/util/macros.rs index 17ae60e..640b4dc 100644 --- a/src/util/macros.rs +++ b/src/util/macros.rs @@ -67,6 +67,25 @@ macro_rules! ini_enum { )*}) } } + impl<'de> serde::Deserialize<'de> for $name { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + match s.as_str() { + $( + s if s == ini_enum!(@match $field $(=> $s)?) => Ok(Self::$field), + )* + other => { + let variants: &[&str] = &[$( + stringify!($field), + )*]; + Err(serde::de::Error::unknown_variant(other, variants)) + } + } + } + } }; ( $(#[$outmeta1:meta])*