Open
Description
Example with tagged and untagged enums showing different errors. The tagged error seems to point to the source of the issue.
use serde::Deserialize;
fn main() {
// struct
let bs = br##"<Xs><st><v s="some_s"/></st></Xs>"##;
// works as expected with 0, 1, or more `v` elements
let xs: Xs = quick_xml::de::from_reader(&bs[..]).unwrap();
eprintln!("{:#?}", xs);
// tagged enum
// no v, works
let bn = br##"
<XEnumWithTag>
<en type="V">
</en>
</XEnumWithTag>
"##;
let xn: XEnumWithTag = quick_xml::de::from_reader(&bn[..]).unwrap();
eprintln!("{:#?}", xn);
// 1 v or more, fails with: "invalid type: map, expected a sequence"
let bn = br##"
<XEnumWithTag>
<en type="V">
<v s="some_s"/>
</en>
</XEnumWithTag>
"##;
let xn_res: Result<XEnumWithTag, _> = quick_xml::de::from_reader(&bn[..]);
match xn_res {
Ok(xn) => eprintln!("{:#?}", xn),
Err(e) => eprintln!("XEnumWithTag failed to deserialize: {:?}", e),
}
// same story with untagged, just different error
// no v, works
let bn = br##"
<XEnumUntagged>
<en>
</en>
</XEnumUntagged>
"##;
let xn: XEnumUntagged = quick_xml::de::from_reader(&bn[..]).unwrap();
eprintln!("{:#?}", xn);
// 1 v or more, fails with: "data did not match any variant of untagged enum EnumUntagged"
let bn = br##"
<XEnumUntagged>
<en>
<v s="some_s"/>
</en>
</XEnumUntagged>
"##;
let xn_res: Result<XEnumUntagged, _> = quick_xml::de::from_reader(&bn[..]);
match xn_res {
Ok(xn) => eprintln!("{:#?}", xn),
Err(e) => eprintln!("XEnumUntagged failed to deserialize: {:?}", e),
}
}
#[derive(Deserialize, Debug)]
struct SWrap {
s: String,
}
#[derive(Deserialize, Debug)]
#[serde(tag="type")]
enum EnumWithTag {
S{ s: String },
V{
//v: Option<SWrap>, // works
//v: Vec<SWrap>, // fails
v: Option<Vec<SWrap>>, // fails if not None
},
}
#[derive(Deserialize, Debug)]
#[serde(untagged)]
enum EnumUntagged {
S{ s: String },
V{
v: Option<Vec<SWrap>>, // fails if not None
},
}
#[derive(Deserialize, Debug)]
struct St {
v: Option<Vec<SWrap>>, // works
}
#[derive(Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Xs {
st: Option<St>,
}
#[derive(Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct XEnumWithTag {
en: Option<EnumWithTag>,
}
#[derive(Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct XEnumUntagged {
en: Option<EnumUntagged>,
}