use crate::model::{self, ExtDefinition, ExternalFunc, Param}; use syn::spanned::Spanned; use syn::{FnArg, Ident, ImplItem, ImplItemMethod, ItemImpl, ReturnType}; /// Parse an incoming stream of tokens into externalities definition. pub fn parse(input: proc_macro2::TokenStream) -> Result { let item_impl = syn::parse2::(input).map_err(|_| ())?; let mut funcs = vec![]; for item in item_impl.items { match item { ImplItem::Method(ImplItemMethod { sig, .. }) => { let index = funcs.len() as u32; // self TODO: handle this properly let args = sig .decl .inputs .iter() .skip(1) .enumerate() .map(|(idx, input)| { let param_name = format!("arg{}", idx); let ident = Ident::new(¶m_name, input.span()); Param { ident } }) .collect::>(); let return_ty = match sig.decl.output { ReturnType::Default => None, ReturnType::Type(_, ty) => Some(ty.span()), }; funcs.push(ExternalFunc { index, name: sig.ident.to_string(), args, return_ty, }); } _ => {} } } Ok(ExtDefinition { funcs, generics: item_impl.generics.clone(), ty: item_impl.self_ty.clone(), }) }