pub fn function<Input: AnyTokenStream, Dummy: AnyTokenStream, Output: MacroOutput, Return: AnyTokenStream, Function>(
input: impl AnyTokenStream,
input_as_dummy: bool,
body: impl FunctionMacroHandler<Function, Input = Input, Dummy = Dummy, Output = Output>
) -> Return
Expand description
Handles function like proc_macro
implementation
Use function!
to support Parse
and ToTokens
as well.
Takes any TokenStream
for input
and returns any
TokenStream
. If input_as_dummy = true
the item input will be used as
default dummy code on error. body
takes a FunctionMacroHandler
with
one TokenStream
parameter. 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,
false,
|input: TokenStream, dummy: &mut TokenStream, emitter: &mut Emitter| -> Result {
// ..
},
);
Note: When input_as_dummy = true
the dummy: &mut TokenStream
will be
initialized with input
. To override assign a new TokenStream
:
use manyhow::{function, Result, SilentError};
use proc_macro2::TokenStream;
use quote::{quote, ToTokens};
let input = quote!(some input);
let output: TokenStream = function(
input,
true,
|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}};