#![doc(
html_logo_url = "https://use.ink/img/crate-docs/logo.png",
html_favicon_url = "https://use.ink/crate-docs/favicon.png"
)]
mod enforced_error;
mod generator;
mod traits;
pub use generator::generate_type_spec;
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::Event {
type Generator = generator::Event<'a>;
}
impl<'a> CodeGenerator for &'a ir::StorageItem {
type Generator = generator::StorageItem<'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()
}