macro_rules! attribute { ($input:expr, #[as_dummy] $item:expr, $impl:expr $(,)?) => { ... }; ($input:expr, $item:expr, $impl:expr $(,)?) => { ... }; }
Expand description
Handles proc_macro_attribute
implementation
Takes any TokenStream
for input
and item
and its return value. If
#[as_dummy]
is specified on item, it will be used as default
dummy code on error. body
takes a AttributeMacroHandler
with two
TokenStream
s or types implementing Parse
parameters and returning a
TokenStream
or type implementing ToTokens
. 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, |input: TokenStream,
item: TokenStream,
dummy: &mut TokenStream,
emitter: &mut Emitter|
-> Result {
// ..
});
Note: When #[as_dummy]
is specified 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,
#[as_dummy]
item,
|input: TokenStream,
item: syn::ItemStruct,
dummy: &mut TokenStream|
-> Result<syn::ItemStruct, SilentError> {
assert_tokens!(dummy.to_token_stream(), {
struct Struct;
});
*dummy = quote! {
struct Struct(HelloWorld);
};
// ..
Err(SilentError)
},
);
assert_tokens! {output, {struct Struct(HelloWorld);}};