Macro manyhow::attribute

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