elrond-wasm-derive 0.3.2

Elrond WebAssembly smart contract API procedural macros
Documentation

use super::arg_def::*;
use super::parse_attr::*;

pub fn extract_method_args(m: &syn::TraitItemMethod, is_method_payable: bool, allow_callback_args: bool) -> Vec<MethodArg> {
    let mut arg_index: isize = -1; // ignore the first argument, which is &self
    m.sig.inputs
        .iter()
        .filter_map(|arg| {
            let arg_opt = match arg {
                syn::FnArg::Receiver(ref selfref) => {
                    if selfref.mutability.is_some() || arg_index != -1 {
                        panic!("Trait method must have `&self` as its first argument.");
                    }
                    None
                },
                syn::FnArg::Typed(pat_typed) => {
                    let pat = &*pat_typed.pat;
                    let ty = &*pat_typed.ty;

                    let is_callback_arg = is_callback_arg(&pat_typed);
                    if is_callback_arg && !allow_callback_args {
                        panic!("Callback args not allowed here");
                    }

                    if let Some(multi_attr) = MultiAttribute::parse(&pat_typed) {
                        Some(MethodArg{
                            index: -1,
                            pat: pat.clone(),
                            ty: ty.clone(),
                            is_callback_arg: is_callback_arg,
                            metadata: ArgMetadata::Multi(multi_attr),
                        })
                    } else if is_payment(&pat_typed) {
                        if !is_method_payable {
                            panic!("Cannot have payment arguments to non-payable methods.");
                        }
                        if is_callback_arg {
                            panic!("Payment arguments cannot be annotated with #[callback_arg].");
                        }
                        Some(MethodArg{
                            index: -1,
                            pat: pat.clone(),
                            ty: ty.clone(), // TODO: check that it is BigUint
                            is_callback_arg: is_callback_arg,
                            metadata: ArgMetadata::Payment,
                        })
                    } else {
                        arg_index=arg_index+1;
                        Some(MethodArg{
                            index: arg_index as i32,
                            pat: pat.clone(),
                            ty: ty.clone(),
                            is_callback_arg: is_callback_arg,
                            metadata: ArgMetadata::Single,
                        })
                    }
                }
            };
            
            arg_opt
        })
        .collect()
}