1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#[macro_use] extern crate proc_macro_hack;
extern crate proc_macro2;

mod builtins;
mod parser;
mod state;

use parser::parse_body;
use proc_macro2::TokenStream;
use state::State;
use std::env;
use std::str::FromStr;

proc_macro_expr_impl! {
    pub fn router_dsl_impl(input: &str) -> String {
        let mut stream = TokenStream::from_str(input).unwrap().into_iter();
        let result = parse_body(&mut stream, &State::default());

        if let Ok(debug) = env::var("WARPDSL_DEBUG") {
            if debug.contains("input") {
                eprintln!("======== [DEBUG:INPUT] =========");
                for token in TokenStream::from_str(input).unwrap() {
                    eprintln!("{:#?}", token);
                }
                eprintln!("================================");
            }

            if debug.contains("output") {
                eprintln!("======== [DEBUG:OUTPUT] ========");
                eprintln!("{}", result);
                eprintln!("================================");
            }
        }

        result
    }
}