From d4717d4c4c229cd8c903cb23049f1e9cc9be86fc Mon Sep 17 00:00:00 2001 From: Changyuan Lyu Date: Sun, 14 Jun 2026 11:25:31 -0700 Subject: [PATCH] fix(aco): deserialize nested types inside Option When deserialize_option constructs a sub-deserializer to parse the Some value, it was inheriting top_level from its parent. For fields inside a struct or map, the parent's top_level is false, causing the sub-deserializer to mistakenly treat its resolved input as a reference ID that needs to be dereferenced. Fix this by setting top_level to true when creating the sub-deserializer inside deserialize_option. Also add a test case to cover this scenario. Assisted-by: Antigravity:Gemini-3.5-Flash Signed-off-by: Changyuan Lyu --- serde-aco/src/de.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/serde-aco/src/de.rs b/serde-aco/src/de.rs index 08fd7acb..33d4d428 100644 --- a/serde-aco/src/de.rs +++ b/serde-aco/src/de.rs @@ -170,7 +170,11 @@ impl<'s> de::Deserializer<'s> for &mut Deserializer<'s, '_> { if id.starts_with("id_") && s.is_empty() { visitor.visit_none() } else { - let mut sub_de = Deserializer { input: s, ..*self }; + let mut sub_de = Deserializer { + input: s, + top_level: true, + ..*self + }; visitor.visit_some(&mut sub_de) } } @@ -581,6 +585,23 @@ mod test { from_args::>>("id_none,2", &map_none).unwrap(), vec![None, Some(2)] ); + + #[derive(Debug, Deserialize, PartialEq, Eq)] + struct SimpleStruct { + val: u32, + other: u32, + } + #[derive(Debug, Deserialize, PartialEq, Eq)] + struct TestOptionStruct { + opt: Option, + } + assert_eq!( + from_args::("opt=id_s", &[("id_s", "val=12,other=34")].into()) + .unwrap(), + TestOptionStruct { + opt: Some(SimpleStruct { val: 12, other: 34 }) + } + ); } #[test]