# Macro syn::parse_macro_input

source · [−]

    macro_rules! parse_macro_input {
        ($tokenstream:ident as $ty:ty) => { ... };
        ($tokenstream:ident with $parser:path) => { ... };
        ($tokenstream:ident) => { ... };
    }

Expand description

Parse the input TokenStream of a macro, triggering a compile error if the tokens fail to parse.

Refer to the `parse` module documentation for more details about parsing in Syn.

## Intended usage

This macro must be called from a function that returns `proc_macro::TokenStream`. Usually this will be your proc macro entry point, the function that has the #[proc_macro] / #[proc_macro_derive] / #[proc_macro_attribute] attribute.

    use proc_macro::TokenStream;
    use syn::{parse_macro_input, Result};
    use syn::parse::{Parse, ParseStream};

    struct MyMacroInput {
        /* ... */
    }

    impl Parse for MyMacroInput {
        fn parse(input: ParseStream) -> Result<Self> {
            /* ... */
        }
    }

    #[proc_macro]
    pub fn my_macro(tokens: TokenStream) -> TokenStream {
        let input = parse_macro_input!(tokens as MyMacroInput);

        /* ... */
    }

## Usage with Parser

This macro can also be used with the `Parser` trait for types that have multiple ways that they can be parsed.

    impl MyMacroInput {
        fn parse_alternate(input: ParseStream) -> Result<Self> {
            /* ... */
        }
    }

    #[proc_macro]
    pub fn my_macro(tokens: TokenStream) -> TokenStream {
        let input = parse_macro_input!(tokens with MyMacroInput::parse_alternate);

        /* ... */
    }

## Expansion

`parse_macro_input!($variable as $Type)` expands to something like:

    match syn::parse::<$Type>($variable) {
        Ok(syntax_tree) => syntax_tree,
        Err(err) => return proc_macro::TokenStream::from(err.to_compile_error()),
    }