parse_it_macros/
lib.rs

1use parse_it_codegen::syntax::{Mod, ParseIt};
2
3#[proc_macro]
4pub fn parse_it(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
5    let input = syn::parse_macro_input!(input as ParseIt);
6    let mut result = proc_macro::TokenStream::new();
7    for submod in input.mods {
8        match submod {
9            Mod::Parser(parser_mod) => {
10                let middle = match parser_mod.compile() {
11                    Ok(middle) => middle,
12                    Err(msg) => return msg.into(),
13                };
14                let tokens: proc_macro::TokenStream = match middle.expand() {
15                    Ok(expanded) => expanded.into(),
16                    Err(msg) => return msg.into(),
17                };
18                result.extend(tokens);
19            }
20            Mod::Lexer(lexer_mod) => {
21                let middle = match lexer_mod.compile() {
22                    Ok(middle) => middle,
23                    Err(msg) => return msg.into(),
24                };
25                let tokens: proc_macro::TokenStream = match middle.expand() {
26                    Ok(expanded) => expanded.into(),
27                    Err(msg) => return msg.into(),
28                };
29                result.extend(tokens);
30            }
31        }
32    }
33    result
34}