xmlity-quick-xml 0.0.9

XMLity implementation of quick-xml.
Documentation
use xmlity::{Deserialize, Serialize};

use crate::define_test;

#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[xelement(name = "any", allow_unknown_children = "any")]
pub struct Any {
    #[xelement(name = "b")]
    b: String,
    #[xelement(name = "d", optional)]
    d: Option<String>,
    e: String,
}

define_test!(
    allow_unknown_children_any,
    [
        (
            Any {
                b: "BVal".to_string(),
                d: None,
                e: "Text".to_string(),
            },
            r###"<any><b>BVal</b>Text</any>"###
        ),
        (
            Any {
                b: "BVal".to_string(),
                d: Some("DVal".to_string()),
                e: "Abc".to_string(),
            },
            r###"<any><b>BVal</b><d>DVal</d>Abc</any>"###,
            r###"<any><b>BVal</b><c/><d>DVal</d>Abc</any>"###
        )
    ]
);

#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[xelement(name = "at_end", allow_unknown_children = "at_end")]
pub struct AtEnd {
    #[xelement(name = "b")]
    b: String,
    #[xelement(name = "d", optional)]
    d: Option<String>,
    e: String,
}

define_test!(
    allow_unknown_children_at_end,
    [
        (
            AtEnd {
                b: "BVal".to_string(),
                d: None,
                e: "Text".to_string(),
            },
            r###"<at_end><b>BVal</b>Text</at_end>"###
        ),
        (
            AtEnd {
                b: "BVal".to_string(),
                d: Some("DVal".to_string()),
                e: "Abc".to_string(),
            },
            r###"<at_end><b>BVal</b><d>DVal</d>Abc</at_end>"###,
            r###"<at_end><b>BVal</b><d>DVal</d>Abc<c/></at_end>"###
        )
    ]
);

#[test]
fn error_child_in_middle() {
    let xml = r###"<at_end><b>BVal</b><c/><d>DVal</d>Abc</at_end>"###;
    let result: Result<AtEnd, _> = xmlity_quick_xml::de::from_str(xml);
    assert!(result.is_err());
}

#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[xelement(name = "none", allow_unknown_children = "none")]
pub struct NoUnknown {
    #[xelement(name = "b")]
    b: String,
    #[xelement(name = "d", optional)]
    d: Option<String>,
    e: String,
}

define_test!(
    allow_unknown_children_none,
    [
        (
            NoUnknown {
                b: "BVal".to_string(),
                d: None,
                e: "Text".to_string(),
            },
            r###"<none><b>BVal</b>Text</none>"###
        ),
        (
            NoUnknown {
                b: "BVal".to_string(),
                d: Some("DVal".to_string()),
                e: "Abc".to_string(),
            },
            r###"<none><b>BVal</b><d>DVal</d>Abc</none>"###
        )
    ]
);

#[test]
fn error_child_in_middle_none() {
    let xml = r###"<none><b>BVal</b><c/><d>DVal</d>Abc</none>"###;
    let result: Result<NoUnknown, _> = xmlity_quick_xml::de::from_str(xml);
    assert!(result.is_err());
}

#[test]
fn error_child_in_end() {
    let xml = r###"<none><b>BVal</b><d>DVal</d>Abc<c/></none>"###;
    let result: Result<NoUnknown, _> = xmlity_quick_xml::de::from_str(xml);
    assert!(result.is_err());
}