meta_merge_core 0.1.0

Core logic for meta_merge
Documentation
use crate::macros::ok_or_compiler_error;
use proc_macro2::TokenStream;
use quote::quote;
use syn::*;

pub fn apply_outer(
    macro_ident_tokens: impl Into<TokenStream>,
    input: impl Into<TokenStream>,
) -> TokenStream {
    ok_or_compiler_error!(apply_inner(macro_ident_tokens.into(), input.into()))
}

fn apply_inner(macro_ident_tokens: TokenStream, input: TokenStream) -> Result<TokenStream> {
    let item: Item = parse2::<Item>(input)?;
    apply_item(macro_ident_tokens, item)
}

fn apply_item(macro_ident_tokens: TokenStream, item: Item) -> Result<TokenStream> {
    Ok(apply(macro_ident_tokens, item))
}

fn apply(macro_ident_tokens: TokenStream, item: Item) -> TokenStream {
    quote! {
        #macro_ident_tokens {
            #item
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use quote::quote;

    #[test]
    fn test_export() -> Result<()> {
        let apply_attr: Attribute = parse_quote! {
            #[apply(Foo!)]
        };
        let item = parse_quote! {
            #[derive(Debug)]
            struct Foo;
        };
        let result_tokens = apply_item(apply_attr.meta.require_list()?.tokens.clone(), item)?;
        assert_eq!(
            result_tokens.to_string(),
            quote! {
                Foo! {
                    #[derive(Debug)]
                    struct Foo;
                }
            }
            .to_string()
        );
        Ok(())
    }
}