pub fn attribute<Input: AnyTokenStream, Item: AnyTokenStream, Dummy: AnyTokenStream, Output: MacroOutput, Return: AnyTokenStream, Function>(
input: impl AnyTokenStream,
item: impl AnyTokenStream,
item_as_dummy: bool,
body: impl AttributeMacroHandler<Function, Item = Item, Input = Input, Dummy = Dummy, Output = Output>,
) -> Return
Expand description
Handles proc_macro_attribute
implementation
Takes any TokenStream
for input
and item
and returns any
TokenStream
. If item_as_dummy = true
the item input will be used as
default dummy code on error. body
takes a AttributeMacroHandler
with
two TokenStream
parameters. And an optional &mut Emitter
and
a &mut TokenStream
for storing a dummy output.
use manyhow::{attribute, Emitter, Result};
use proc_macro2::TokenStream;
attribute(
input,
item,
false,
|input: TokenStream,
item: TokenStream,
dummy: &mut TokenStream,
emitter: &mut Emitter|
-> Result {
// ..
},
);
Note: When item_as_dummy = true
the dummy: &mut TokenStream
will be
initialized with item
. To override assign a new TokenStream
:
use manyhow::{attribute, Result, SilentError};
use proc_macro2::TokenStream;
use quote::{quote, ToTokens};
let item = quote!(
struct Struct;
);
let output: TokenStream = attribute(
input,
item,
true,
|input: TokenStream,
item: TokenStream,
dummy: &mut TokenStream|
-> Result<TokenStream, SilentError> {
assert_tokens!(dummy.to_token_stream(), {
struct Struct;
});
*dummy = quote! {
struct Struct(HelloWorld);
};
// ..
Err(SilentError)
},
);
assert_tokens! {output, {struct Struct(HelloWorld);}};