From 593695772d3738a4a897df6c04b493c394569aa5 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 3 Oct 2025 16:15:47 -0400 Subject: [PATCH] Remove ok_or_default helper and add a unit test for test_deserialize_empty_vec_or_none --- wp_serde_helper/src/lib.rs | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/wp_serde_helper/src/lib.rs b/wp_serde_helper/src/lib.rs index 411458e95..08536363c 100644 --- a/wp_serde_helper/src/lib.rs +++ b/wp_serde_helper/src/lib.rs @@ -3,7 +3,6 @@ use serde::{ de::{self, DeserializeOwned, Unexpected}, ser, }; -use serde_json::Value; use std::{fmt, marker::PhantomData}; pub use wp_serde_date::wp_utc_date_format; @@ -361,15 +360,6 @@ impl<'de> de::Visitor<'de> for DeserializeStringVecOrStringAsOptionVisitor { } } -pub fn ok_or_default<'a, T, D>(deserializer: D) -> Result -where - T: Deserialize<'a> + Default, - D: Deserializer<'a>, -{ - let v: Value = Deserialize::deserialize(deserializer)?; - Ok(T::deserialize(v).unwrap_or_default()) -} - struct DeserializeEmptyVecOrNone(PhantomData); impl<'de, T> de::Visitor<'de> for DeserializeEmptyVecOrNone @@ -543,20 +533,26 @@ mod tests { assert_eq!(expected_result, option_string_vec_or_string.string); } - #[derive(Debug, Deserialize)] - pub struct OptionStringOrBool { - #[serde(deserialize_with = "ok_or_default")] - pub value: Option, + #[derive(Debug, Deserialize, PartialEq, Eq)] + pub struct OptionStructOrEmptyArray { + #[serde(deserialize_with = "deserialize_empty_vec_or_none")] + pub value: Option, + } + + #[derive(Debug, Deserialize, PartialEq, Eq)] + pub struct OptionStructOrEmptyArrayInner { + foo: String, } #[rstest] - #[case(r#"{"value": "foo"}"#, Some("foo".to_string()))] - #[case(r#"{"value": "false"}"#, Some("false".to_string()))] - #[case(r#"{"value": false}"#, None)] + #[case(r#"{"value": {"foo": "bar"}}"#, Some(OptionStructOrEmptyArrayInner { foo: "bar".to_string() }))] #[case(r#"{"value": []}"#, None)] - fn test_ok_or_default(#[case] test_case: &str, #[case] expected_result: Option) { - let option_string_or_bool: OptionStringOrBool = + fn test_deserialize_empty_vec_or_none( + #[case] test_case: &str, + #[case] expected_result: Option, + ) { + let option_struct: OptionStructOrEmptyArray = serde_json::from_str(test_case).expect("Test case should be a valid JSON"); - assert_eq!(expected_result, option_string_or_bool.value); + assert_eq!(expected_result, option_struct.value); } }