mod enforced_error;
mod generator;
mod traits;
use self::{
enforced_error::EnforcedErrors,
traits::{
GenerateCode,
GenerateCodeUsing,
},
};
use proc_macro2::TokenStream as TokenStream2;
pub trait CodeGenerator: Sized {
type Generator: From<Self> + GenerateCode;
}
impl<'a> CodeGenerator for &'a ir::Contract {
type Generator = generator::Contract<'a>;
}
impl<'a> CodeGenerator for &'a ir::InkTraitDefinition {
type Generator = generator::TraitDefinition<'a>;
}
impl<'a> CodeGenerator for &'a ir::InkTest {
type Generator = generator::InkTest<'a>;
}
impl<'a> CodeGenerator for &'a ir::ChainExtension {
type Generator = generator::ChainExtension<'a>;
}
impl<'a> CodeGenerator for &'a ir::SelectorMacro<ir::marker::SelectorId> {
type Generator = generator::SelectorId<'a>;
}
impl<'a> CodeGenerator for &'a ir::SelectorMacro<ir::marker::SelectorBytes> {
type Generator = generator::SelectorBytes<'a>;
}
impl<'a> CodeGenerator for &'a ir::Blake2x256Macro {
type Generator = generator::Blake2x256<'a>;
}
pub fn generate_code<T>(entity: T) -> TokenStream2
where
T: CodeGenerator,
{
<T as CodeGenerator>::Generator::from(entity).generate_code()
}