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
TokenStreams 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);}};