Function manyhow::attribute

source ·
pub fn attribute<Input: AnyTokenStream, Item: AnyTokenStream, Dummy: AnyTokenStream, Output: MacroOutput, Return: AnyTokenStream, Function>(
    input: impl AnyTokenStream,
    item: impl AnyTokenStream,
    item_as_dummy: bool,
    body: impl AttributeMacroHandler<Function, Item = Item, Input = Input, Dummy = Dummy, Output = Output>
) -> Return
Expand description

Handles proc_macro_attribute implementation

Takes any TokenStream for input and item and returns any TokenStream. If item_as_dummy = true the item input will be used as default dummy code on error. body takes a AttributeMacroHandler with two TokenStream parameters. 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,
    false,
    |input: TokenStream,
     item: TokenStream,
     dummy: &mut TokenStream,
     emitter: &mut Emitter|
     -> Result {
        // ..
    },
);

Note: When item_as_dummy = true 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,
    item,
    true,
    |input: TokenStream,
     item: TokenStream,
     dummy: &mut TokenStream|
     -> Result<TokenStream, SilentError> {
        assert_tokens!(dummy.to_token_stream(), {
            struct Struct;
        });
        *dummy = quote! {
            struct Struct(HelloWorld);
        };
        // ..
        Err(SilentError)
    },
);

assert_tokens! {output, {struct Struct(HelloWorld);}};