#![allow(missing_docs)]
use anyhow::{anyhow, Error};
use quote::ToTokens;
use xsd_parser::{
config::{
Config, GeneratorFlags, IdentQuadruple, InterpreterFlags, OptimizerFlags, ParserFlags,
Resolver, Schema,
},
exec_generator, exec_interpreter, exec_optimizer, exec_parser, exec_render,
models::{meta::MetaTypes, schema::Schemas, IdentType},
};
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 meta_types = exec_interpreter(config.interpreter, &schemas)?;
let meta_types = define_custom_names(&schemas, meta_types)?;
let meta_types = exec_optimizer(config.optimizer, meta_types)?;
let data_types = exec_generator(config.generator, &schemas, &meta_types)?;
let module = exec_render(config.renderer, &data_types)?;
let code = module.to_token_stream().to_string();
println!("{code}");
Ok(())
}
fn define_custom_names(schemas: &Schemas, mut types: MetaTypes) -> Result<MetaTypes, Error> {
let ident = IdentQuadruple::from((IdentType::Element, "xs:schema"));
let ident = ident.resolve(schemas)?;
let ty = types
.items
.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)
}