compose-derive 0.1.0

A positional memoization runtime similar to Jetpack Compose Runtime.
Documentation
use darling::FromMeta;
use proc_macro2::TokenStream;
use quote::quote;
use syn::ItemFn;

#[derive(Debug, FromMeta)]
pub struct MacroArgs {
    #[darling(default)]
    skip_inject_cx: bool,
}

pub fn transform_compose_fn(macro_args: MacroArgs, func: ItemFn) -> TokenStream {
    let fn_args = &func.sig.inputs;

    if macro_args.skip_inject_cx {
        quote! {
            #[track_caller]
            #func
        }
    } else {
        let fn_name = &func.sig.ident;
        let fn_generics = &func.sig.generics.params;
        let fn_return = &func.sig.output;
        let fn_where = &func.sig.generics.where_clause;
        let fn_block = &func.block;

        quote! {
            #[track_caller]
            fn #fn_name<#fn_generics>(cx: &mut compose_rt::Composer, #fn_args) #fn_return
            #fn_where
            #fn_block
        }
    }
}