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]