use heck::ToLowerCamelCase as _;
use proc_macro2::{
Span,
TokenStream as TokenStream2,
};
use quote::{
format_ident,
quote,
quote_spanned,
};
pub fn output_ident(message_name: &syn::Ident) -> syn::Ident {
format_ident!("{}Output", message_name.to_string().to_lower_camel_case())
}
pub fn input_bindings(inputs: ir::InputsIter) -> Vec<syn::Ident> {
inputs
.enumerate()
.map(|(n, _)| format_ident!("__ink_binding_{}", n))
.collect::<Vec<_>>()
}
pub fn input_types(inputs: ir::InputsIter) -> Vec<&syn::Type> {
inputs.map(|pat_type| &*pat_type.ty).collect::<Vec<_>>()
}
pub fn input_types_tuple(inputs: ir::InputsIter) -> TokenStream2 {
let input_types = input_types(inputs);
if input_types.len() != 1 {
quote! { ( #( #input_types ),* ) }
} else {
quote! { #( #input_types )* }
}
}
pub fn input_bindings_tuple(inputs: ir::InputsIter) -> TokenStream2 {
let input_bindings = input_bindings(inputs);
match input_bindings.len() {
0 => quote! { _ },
1 => quote! { #( #input_bindings ),* },
_ => quote! { ( #( #input_bindings ),* ) },
}
}
pub fn generate_argument_list<'b, Args>(args: Args) -> TokenStream2
where
Args: IntoIterator<Item = &'b syn::Type>,
<Args as IntoIterator>::IntoIter: Iterator,
{
use syn::spanned::Spanned as _;
args.into_iter().fold(
quote! { ::ink::env::call::utils::EmptyArgumentList },
|rest, arg| {
let span = arg.span();
quote_spanned!(span=>
::ink::env::call::utils::ArgumentList<::ink::env::call::utils::Argument<#arg>, #rest>
)
}
)
}
pub fn generate_reference_to_trait_info(
span: Span,
trait_path: &syn::Path,
) -> TokenStream2 {
quote_spanned!(span=>
<<::ink::reflect::TraitDefinitionRegistry<Environment>
as #trait_path>::__ink_TraitInfo as ::ink::reflect::TraitInfo>::ID
)
}