macro_rules! function { (#[as_dummy] $input:expr, $impl:expr $(,)?) => { ... }; ($input:expr, $impl:expr $(,)?) => { ... }; }
Expand description
Handles function like proc_macro
implementation
Takes any TokenStream
for input
and returns any TokenStream
. If
#[as_dummy]
is specified on input, it will be used as default
dummy code on error. body
takes a FunctionMacroHandler
with one
TokenStream
or type implementing Parse
parameter and returns a
TokenStream
or type implementing ToTokens
. And an optional &mut Emitter
and a &mut TokenStream
for storing a dummy output.
use manyhow::{function, Emitter, Result};
use proc_macro2::TokenStream;
function!(input, |input: syn::Item,
dummy: &mut TokenStream,
emitter: &mut Emitter|
-> Result<syn::ItemImpl> {
// ..
});
Note: When #[as_dummy]
is specified on the input, the dummy: &mut TokenStream
will be initialized with input
. To override assign a new
TokenStream
:
use proc_macro_utils::assert_tokens;
use manyhow::{function, Result, SilentError};
use proc_macro2::TokenStream;
use quote::{quote, ToTokens};
let input = quote!(some input);
let output: TokenStream = function!(
#[as_dummy] input,
|input: TokenStream, dummy: &mut TokenStream|
-> Result<TokenStream, SilentError> {
assert_tokens!(dummy.to_token_stream(), {
some input
});
*dummy = quote! {
another input
};
// ..
Err(SilentError)
},
);
assert_tokens! {output, {another input}};