From 8c0fa989b65ac21e78ff6b5406cabb1d497848e1 Mon Sep 17 00:00:00 2001 From: fufesou Date: Fri, 19 May 2023 11:10:24 +0800 Subject: [PATCH] fix macro_role: serde_field_string, add config tests Signed-off-by: fufesou --- libs/hbb_common/src/config.rs | 46 +++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index 16d606c78..fff6fc5a1 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -105,12 +105,9 @@ macro_rules! serde_field_string { where D: de::Deserializer<'de>, { - let s: &str = de::Deserialize::deserialize(deserializer).unwrap_or_default(); - Ok(if s.is_empty() { - Self::$default_func() - } else { - s.to_owned() - }) + let s: String = + de::Deserialize::deserialize(deserializer).unwrap_or(Self::$default_func()); + Ok(s) } }; } @@ -252,7 +249,11 @@ pub struct PeerConfig { #[serde(flatten)] pub view_only: ViewOnly, - #[serde(default, skip_serializing_if = "Option::is_none")] + #[serde( + default, + skip_serializing_if = "Option::is_none", + deserialize_with = "deserialize_option_resolution" + )] pub custom_resolution: Option, // The other scalar value must before this @@ -1495,6 +1496,7 @@ deserialize_default!(deserialize_option_string, Option); deserialize_default!(deserialize_hashmap_string_string, HashMap); deserialize_default!(deserialize_hashmap_string_bool, HashMap); deserialize_default!(deserialize_hashmap_string_configoidcprovider, HashMap); +deserialize_default!(deserialize_option_resolution, Option); #[cfg(test)] mod tests { @@ -1543,4 +1545,34 @@ mod tests { }) ); } + + #[test] + fn test_peer_config_deserialize() { + let default_peer_config = toml::from_str::("").unwrap(); + // test custom_resolution + { + let wrong_type_str = r#" + view_style = "adaptive" + scroll_style = "scrollbar" + custom_resolution = true + "#; + let mut compare_config = default_peer_config.clone(); + compare_config.view_style = "adaptive".to_string(); + compare_config.scroll_style = "scrollbar".to_string(); + let cfg = toml::from_str::(wrong_type_str); + assert_eq!(cfg, Ok(compare_config), "Failed to test wrong_type_str"); + + let wrong_field_str = r#" + [custom_resolution] + w = 1920 + h = 1080 + hello = "world" + [ui_flutter] + "#; + let mut compare_config = default_peer_config.clone(); + compare_config.custom_resolution = Some(Resolution { w: 1920, h: 1080 }); + let cfg = toml::from_str::(wrong_field_str); + assert_eq!(cfg, Ok(compare_config), "Failed to test wrong_field_str"); + } + } }