Function manyhow::function

source ·
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}};