mod call_builder;
mod call_forwarder;
mod definition;
mod message_builder;
mod trait_registry;
use crate::GenerateCode;
use derive_more::From;
use proc_macro2::{
Span,
TokenStream as TokenStream2,
};
use quote::{
format_ident,
quote_spanned,
};
#[derive(From, Copy, Clone)]
pub struct TraitDefinition<'a> {
trait_def: &'a ir::InkTraitDefinition,
}
impl<'a> TraitDefinition<'a> {
fn append_trait_suffix(&self, prefix: &str) -> syn::Ident {
format_ident!("__ink_{}{}", prefix, self.trait_def.item().ident(),)
}
fn span(&self) -> Span {
self.trait_def.item().span()
}
}
impl GenerateCode for TraitDefinition<'_> {
fn generate_code(&self) -> TokenStream2 {
let span = self.trait_def.item().span();
let trait_definition = self.generate_trait_definition();
let trait_registry = self.generate_trait_registry_impl();
let trait_message_builder = self.generate_message_builder();
let trait_call_builder = self.generate_call_builder();
let trait_call_forwarder = self.generate_call_forwarder();
quote_spanned!(span =>
#trait_definition
const _: () = {
#trait_registry
#trait_message_builder
#trait_call_builder
#trait_call_forwarder
};
)
}
}