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
38
39
40
41
42
#![recursion_limit = "128"]
#![feature(proc_macro)]

extern crate proc_macro;
#[macro_use]
extern crate quote;
extern crate rundo_types;
extern crate syn;

mod literal;
mod rundo_struct;

use literal::LiteralMacro;
use rundo_struct::RundoStruct;
use proc_macro::TokenStream;

#[proc_macro_attribute]
pub fn rundo(args: TokenStream, input: TokenStream) -> TokenStream {
    let ast = syn::parse(input).expect("Well, can't parse the code, maybe some syntax error!");
    impl_rundo_attrs(&ast).into()
}

fn impl_rundo_attrs(item: &syn::Item) -> quote::Tokens {
    if let &syn::Item::Struct(ref s) = item {
        let op_def = s.op_struct_def();
        let struct_def = s.struct_def();
        let impl_rundo = s.impl_rundo();
        let literal_macro = s.literal_macro();

        quote! {
            #op_def

            #struct_def

            #impl_rundo

            #literal_macro
        }
    } else {
        panic!("#[rundo] is only support for structs now!");
    }
}