use super::{generate_struct::generate_struct, utils::get_externals};
use proc_macro2::{Ident, TokenStream};
use quote::quote;
use syn::{ItemFn, Result, Type};
pub(crate) fn generate(ast: &ItemFn, _: &TokenStream) -> Result<TokenStream> {
let sig = &ast.sig;
let ident = &sig.ident;
let exts = get_externals(&sig.inputs[0]);
let exts_args = generate_externals_atributes(&exts);
let externals = generate_externals(&exts);
let structure = generate_struct(ast, sig, ident, &exts)?;
Ok(quote! {
pub fn #ident(#exts_args) -> impl plux_rs::function::Function<Output = plux_rs::function::FunctionOutput> {
#structure
Function { #externals }
}
})
}
fn generate_externals_atributes(exts: &Vec<(Ident, &Type)>) -> TokenStream {
let exts: Vec<_> = exts
.iter()
.map(|(name, ty)| {
quote! { #name: #ty }
})
.collect();
quote! { #(#exts),* }
}
fn generate_externals(exts: &Vec<(Ident, &Type)>) -> TokenStream {
let exts = exts.iter().map(|(name, _)| name).collect::<Vec<_>>();
quote! { #(#exts),* }
}