mod dynamic_to_choice;
mod empty_enums;
mod empty_unions;
mod flatten_complex_type;
mod flatten_unions;
mod merge_choice_cardinality;
mod merge_enum_unions;
mod misc;
mod remove_duplicates;
mod resolve_typedefs;
mod unrestricted_base;
use thiserror::Error;
use crate::types::{Ident, Types};
use self::misc::{BaseMap, TypedefMap};
#[must_use]
#[derive(Debug)]
pub struct Optimizer {
types: Types,
bases: Option<BaseMap>,
typedefs: Option<TypedefMap>,
}
#[derive(Error, Debug)]
pub enum Error {
#[error("Unknown type identifier: {0}!")]
UnknownType(Ident),
#[error("The type is not a union type: {0}!")]
ExpectedUnion(Ident),
#[error("The type is not a complex choice type: {0}!")]
ExpectedComplexChoice(Ident),
#[error("The type is not a complex type: {0}!")]
ExpectedComplexType(Ident),
#[error("Complex type {0} is missing a content type!")]
MissingContentType(Ident),
}
macro_rules! get_bases {
($this:expr) => {{
if $this.bases.is_none() {
$this.bases = Some(crate::optimizer::BaseMap::new(&$this.types));
}
$this.bases.as_ref().unwrap()
}};
}
macro_rules! get_typedefs {
($this:expr) => {{
if $this.typedefs.is_none() {
$this.typedefs = Some(crate::optimizer::TypedefMap::new(&$this.types));
}
$this.typedefs.as_ref().unwrap()
}};
}
pub(super) use get_bases;
pub(super) use get_typedefs;
impl Optimizer {
pub fn new(types: Types) -> Self {
Self {
types,
bases: None,
typedefs: None,
}
}
#[must_use]
pub fn finish(self) -> Types {
self.types
}
}