fix: support all accumulators in enum forward deserialization
Previously limited to Option<T> only.
This commit is contained in:
parent
03d99af431
commit
a575fc627a
|
@ -170,9 +170,9 @@ fn deserialize_forward_enum(
|
|||
let v_ident = &variant.ident;
|
||||
variants.extend(
|
||||
quote!(if <#no_lifetime_type as FromXml>::matches(id, None) {
|
||||
let mut value = None;
|
||||
let mut value = <#no_lifetime_type as FromXml>::Accumulator::default();
|
||||
<#no_lifetime_type as FromXml>::deserialize(&mut value, #field_str, deserializer)?;
|
||||
*into = value.map(#ident::#v_ident);
|
||||
*into = ::instant_xml::Accumulate::try_done(value, #field_str).map(#ident::#v_ident).ok();
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use std::borrow::Cow;
|
||||
|
||||
use similar_asserts::assert_eq;
|
||||
|
||||
use instant_xml::{from_str, to_string, FromXml, ToXml};
|
||||
|
@ -26,3 +28,33 @@ fn wrapped_enum() {
|
|||
assert_eq!(xml, to_string(&v).unwrap());
|
||||
assert_eq!(v, from_str(xml).unwrap());
|
||||
}
|
||||
|
||||
#[derive(Debug, FromXml, PartialEq, ToXml)]
|
||||
#[xml(forward)]
|
||||
enum FooCow<'a> {
|
||||
Bar(Cow<'a, [BarBorrowed<'a>]>),
|
||||
Baz(Cow<'a, [BazBorrowed<'a>]>),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, FromXml, PartialEq, ToXml)]
|
||||
#[xml(rename = "Bar")]
|
||||
struct BarBorrowed<'a> {
|
||||
bar: Cow<'a, str>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, FromXml, PartialEq, ToXml)]
|
||||
#[xml(rename = "Baz")]
|
||||
struct BazBorrowed<'a> {
|
||||
baz: Cow<'a, str>,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn with_cow_accumulator() {
|
||||
let v = FooCow::Bar(Cow::Borrowed(&[BarBorrowed {
|
||||
bar: Cow::Borrowed("test"),
|
||||
}]));
|
||||
let xml = r#"<Bar><bar>test</bar></Bar>"#;
|
||||
|
||||
assert_eq!(xml, to_string(&v).unwrap());
|
||||
assert_eq!(v, from_str(xml).unwrap());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue