#![allow(missing_docs)]
use anyhow::{anyhow, Error};
use quote::ToTokens;
use xsd_parser::{
config::{
GeneratorFlags, IdentTriple, InterpreterFlags, OptimizerFlags, ParserFlags, Resolver,
Schema,
},
exec_generator_module, exec_interpreter, exec_optimizer, exec_parser,
schema::Schemas,
types::{IdentType, Types},
Config,
};
fn main() -> Result<(), Error> {
let mut config = Config::default();
config.parser.resolver = vec![Resolver::File];
config.parser.flags = ParserFlags::all();
config.parser.schemas = vec![Schema::File("schema/XMLSchema.xsd".into())];
config.interpreter.flags = InterpreterFlags::all();
config.optimizer.flags = OptimizerFlags::all() - OptimizerFlags::REMOVE_DUPLICATES;
config.generator.flags = GeneratorFlags::all();
let schemas = exec_parser(config.parser)?;
let types = exec_interpreter(config.interpreter, &schemas)?;
let types = define_custom_names(&schemas, types)?;
let types = exec_optimizer(config.optimizer, types)?;
let module = exec_generator_module(config.generator, &schemas, &types)?;
let code = module.to_token_stream().to_string();
println!("{code}");
Ok(())
}
fn define_custom_names(schemas: &Schemas, mut types: Types) -> Result<Types, Error> {
let ident = IdentTriple::from((IdentType::Element, "xs:schema"));
let ident = ident.resolve(schemas)?;
let ty = types
.get_mut(&ident)
.ok_or_else(|| anyhow!("Unable to find `xs:schema` element in the types map!"))?;
ty.display_name = Some("MyCustomSchema".into());
Ok(types)
}