odra_codegen/generator/
module_impl.rs

1use 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}