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"]
#![allow(unused_imports)]

extern crate proc_macro;

#[macro_use]
extern crate quote;

use batbox::*;
use proc_macro2::TokenStream;

mod uniforms;

#[proc_macro_derive(Uniforms)]
pub fn derive_uniforms(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    uniforms::derive(input.into()).into()
}

mod vertex;

#[proc_macro_derive(Vertex)]
pub fn derive_vertex(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    vertex::derive(input.into()).into()
}

fn simple_derive(
    input: TokenStream,
    typ: syn::Path,
    expand: fn(&syn::DeriveInput) -> TokenStream,
) -> TokenStream {
    let s = input.to_string();
    let ast: syn::DeriveInput = syn::parse_str(&s).unwrap();
    let input_type = &ast.ident;
    let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl();
    let impl_body = expand(&ast);
    let expanded = quote! {
        impl#impl_generics #typ for #input_type#ty_generics #where_clause {
            #impl_body
        }
    };
    expanded.into()
}