ink_codegen/generator/
contract.rs1use crate::{
16 generator,
17 GenerateCode,
18 GenerateCodeUsing,
19};
20use derive_more::From;
21use proc_macro2::TokenStream as TokenStream2;
22use quote::quote;
23
24#[derive(From)]
26pub struct Contract<'a> {
27 contract: &'a ir::Contract,
29}
30impl_as_ref_for_generator!(Contract);
31
32impl GenerateCode for Contract<'_> {
33 fn generate_code(&self) -> TokenStream2 {
35 let module = self.contract.module();
36 let ident = module.ident();
37 let attrs = module.attrs();
38 let vis = module.vis();
39 let env = self.generate_code_using::<generator::Env>();
40 let storage = self.generate_code_using::<generator::Storage>();
41 let events = module.events().map(move |event| {
42 let event_generator = generator::Event::from(event);
43 event_generator.generate_code()
44 });
45 let dispatch2 = self.generate_code_using::<generator::Dispatch>();
46 let item_impls = self.generate_code_using::<generator::ItemImpls>();
47 let metadata = self.generate_code_using::<generator::Metadata>();
48 let contract_reference =
49 self.generate_code_using::<generator::ContractReference>();
50 let non_ink_items = self
51 .contract
52 .module()
53 .items()
54 .iter()
55 .filter_map(ir::Item::map_rust_item);
56 quote! {
57 #( #attrs )*
58 #vis mod #ident {
59 #env
60 #storage
61 #( #events )*
62 #dispatch2
63 #item_impls
64 #contract_reference
65 #metadata
66 #( #non_ink_items )*
67 }
68 }
69 }
70}