orma-derive 0.3.3

Derive macros for Orma
Documentation
use proc_macro2::TokenStream;
use quote::quote;

fn maybe_ident(arg: &syn::FnArg) -> Option<&syn::Ident> {
    match arg {
        syn::FnArg::Typed(syn::PatType { pat, .. }) => match pat.as_ref() {
            syn::Pat::Ident(ident) => Some(&ident.ident),
            _ => None,
        },
        _ => None,
    }
}

pub fn test_impl(mut item: syn::ItemFn) -> TokenStream {
    let aa = std::mem::take(&mut item.sig.inputs);
    let vis = &item.vis;
    let sig = &item.sig;
    let block = &item.block;
    let ident = format!("{}", sig.ident);

    let args = aa.iter().filter_map(maybe_ident);

    quote! {
        #[::tokio::test]
        #vis #sig {
            #(
                let #args = #args (#ident);
            )*
            #block
        }
    }
}