odra-codegen 0.7.1

Code generators for Odra IR.
Documentation
use derive_more::From;
use odra_ir::ExternalContractItem as IrExternalContractItem;
use syn::parse_quote;

use super::common::{self, build_ref};
use crate::GenerateCode;

#[derive(From)]
pub struct ExternalContractItem<'a> {
    item: &'a IrExternalContractItem
}

impl GenerateCode for ExternalContractItem<'_> {
    fn generate_code(&self) -> proc_macro2::TokenStream {
        let IrExternalContractItem {
            item_trait,
            item_ref
        } = &self.item;
        let trait_ident = &item_trait.ident;
        let ref_ident = &item_ref.ident;

        let methods = item_trait
            .items
            .iter()
            .filter_map(|item| match item {
                syn::TraitItem::Method(method) => Some(method),
                _ => None
            })
            .map(|item| {
                let sig = &item.sig;
                let entrypoint_name = &item.sig.ident.to_string();
                let args = common::filter_args(&item.sig.inputs);
                let ret = &sig.output;

                let fn_body = common::generate_fn_body(args, entrypoint_name, ret);
                let result: syn::ImplItemMethod = parse_quote! {
                    #sig {
                        #fn_body
                    }
                };
                result
            });
        let contract_ref = build_ref(ref_ident, trait_ident);

        quote::quote! {
            #item_trait

            #contract_ref

            impl #trait_ident for #ref_ident {
                # ( #methods) *
            }
        }
    }
}