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(())
}
}