xsd-parser 1.5.2

Rust code generator for XML schema files
Documentation
use quote::ToTokens;
use xsd_parser::{
    config::{GeneratorFlags, InterpreterFlags, OptimizerFlags, ParserFlags, Schema},
    exec_generator, exec_interpreter, exec_optimizer, exec_parser, exec_render, Config,
};

use crate::utils::{generate_test_validate, ConfigEx};

fn config() -> Config {
    let mut config = Config::test_default()
        .with_schemas([
            Schema::file("tests/schema/ofd/schema/Annotations.xsd"),
            Schema::file("tests/schema/ofd/schema/Annotion.xsd"),
            Schema::file("tests/schema/ofd/schema/Attachments.xsd"),
            Schema::file("tests/schema/ofd/schema/CustomTags.xsd"),
            Schema::file("tests/schema/ofd/schema/Definition.xsd"),
            Schema::file("tests/schema/ofd/schema/Document.xsd"),
            Schema::file("tests/schema/ofd/schema/Extensions.xsd"),
            Schema::file("tests/schema/ofd/schema/OFD.xsd"),
            Schema::file("tests/schema/ofd/schema/Page.xsd"),
            Schema::file("tests/schema/ofd/schema/Res.xsd"),
            Schema::file("tests/schema/ofd/schema/Signatures.xsd"),
            Schema::file("tests/schema/ofd/schema/Signature.xsd"),
            Schema::file("tests/schema/ofd/schema/Version.xsd"),
        ])
        .with_parser_flags(ParserFlags::all())
        .with_interpreter_flags(InterpreterFlags::all())
        .with_optimizer_flags(OptimizerFlags::all())
        .with_generator_flags(
            GeneratorFlags::all()
                - GeneratorFlags::ADVANCED_ENUMS
                - GeneratorFlags::NILLABLE_TYPE_SUPPORT
                - GeneratorFlags::BUILD_IN_ABSOLUTE_PATHS
                - GeneratorFlags::ABSOLUTE_PATHS_INSTEAD_USINGS,
        );

    config.generator.type_postfix.type_ = "XType".into();
    config.generator.type_postfix.element = String::new();
    config.generator.type_postfix.element_type = "XElementType".into();

    config
}

#[test]
fn generate_default() {
    generate_test("tests/schema/ofd/expected/default.rs", config());
}

#[test]
fn generate_quick_xml() {
    generate_test(
        "tests/schema/ofd/expected/quick_xml.rs",
        config().with_quick_xml(),
    );
}

#[test]
#[cfg(not(feature = "update-expectations"))]
fn read_quick_xml() {
    use quick_xml::{ofd::Ofd, page::Page};

    let _obj = crate::utils::quick_xml_read_test::<Ofd, _>("tests/schema/ofd/examples/OFD.xml");
    let _obj =
        crate::utils::quick_xml_read_test::<Page, _>("tests/schema/ofd/examples/Content.xml");
}

fn generate_test(expected_rs: &str, mut config: Config) {
    let schemas = exec_parser(config.parser).unwrap();
    let meta_types = exec_interpreter(config.interpreter, &schemas).unwrap();
    let meta_types = exec_optimizer(config.optimizer, meta_types).unwrap();
    let data_types = exec_generator(config.generator, &schemas, &meta_types).unwrap();
    let module = exec_render(config.renderer, &data_types).unwrap();
    let code = module.to_token_stream().to_string();

    generate_test_validate(code, expected_rs);
}

#[cfg(not(feature = "update-expectations"))]
mod default {
    #![allow(unused_imports)]

    include!("expected/default.rs");
}

#[cfg(not(feature = "update-expectations"))]
mod quick_xml {
    #![allow(unused_imports)]

    include!("expected/quick_xml.rs");
}