use crate::{
generator,
GenerateCode,
GenerateCodeUsing,
};
use derive_more::From;
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
#[derive(From)]
pub struct Contract<'a> {
contract: &'a ir::Contract,
}
impl_as_ref_for_generator!(Contract);
impl GenerateCode for Contract<'_> {
fn generate_code(&self) -> TokenStream2 {
let module = self.contract.module();
let ident = module.ident();
let attrs = module.attrs();
let vis = module.vis();
let env = self.generate_code_using::<generator::Env>();
let storage = self.generate_code_using::<generator::Storage>();
let events = self.generate_code_using::<generator::Events>();
let dispatch2 = self.generate_code_using::<generator::Dispatch>();
let item_impls = self.generate_code_using::<generator::ItemImpls>();
let metadata = self.generate_code_using::<generator::Metadata>();
let contract_reference =
self.generate_code_using::<generator::ContractReference>();
let non_ink_items = self
.contract
.module()
.items()
.iter()
.filter_map(ir::Item::map_rust_item);
quote! {
#( #attrs )*
#vis mod #ident {
#env
#storage
#events
#dispatch2
#item_impls
#contract_reference
#metadata
#( #non_ink_items )*
}
}
}
}