odra_codegen/generator/
module_impl.rs1use derive_more::From;
2use odra_ir::module::ImplItem;
3use quote::ToTokens;
4
5use crate::{poet::OdraPoetUsingImpl, GenerateCode};
6
7use self::{def::ContractDef, deploy::Deploy, reference::ContractReference};
8
9mod def;
10mod deploy;
11mod reference;
12
13#[derive(From)]
14pub struct ModuleImpl<'a> {
15 contract: &'a odra_ir::module::ModuleImpl
16}
17
18as_ref_for_contract_impl_generator!(ModuleImpl);
19
20impl GenerateCode for ModuleImpl<'_> {
21 fn generate_code(&self) -> proc_macro2::TokenStream {
22 let ident = self.contract.ident();
23 let original_item_impls = self.contract.impl_items().iter().map(|item| match item {
24 ImplItem::Constructor(item) => item.impl_item.to_token_stream(),
25 ImplItem::Method(item) => item.impl_item.to_token_stream(),
26 ImplItem::Other(item) => item.to_token_stream()
27 });
28
29 let contract_def = self.generate_code_using::<ContractDef>();
30 let deploy = self.generate_code_using::<Deploy>();
31 let contract_ref = self.generate_code_using::<ContractReference>();
32
33 quote::quote! {
34 impl #ident {
35 # (#original_item_impls)*
36 }
37
38 #contract_def
39
40 #deploy
41
42 #contract_ref
43 }
44 }
45}