1#![recursion_limit = "128"]
2
3extern crate proc_macro;
4
5use proc_macro::TokenStream;
6use proc_macro2;
7use quote::quote;
8use syn::{parse_macro_input, DeriveInput};
9
10mod interface_block;
11mod resources;
12mod transform_feedback;
13mod util;
14mod vertex;
15
16#[proc_macro_derive(InterfaceBlock)]
17pub fn derive_interface_block(input: TokenStream) -> TokenStream {
18 let input = parse_macro_input!(input as DeriveInput);
19
20 interface_block::expand_derive_interface_block(&input)
21 .unwrap_or_else(compile_error)
22 .into()
23}
24
25#[proc_macro_derive(Resources, attributes(resource))]
26pub fn derive_resources(input: TokenStream) -> TokenStream {
27 let input = parse_macro_input!(input as DeriveInput);
28
29 resources::expand_derive_resources(&input)
30 .unwrap_or_else(compile_error)
31 .into()
32}
33
34#[proc_macro_derive(TransformFeedback)]
35pub fn derive_transform_feedback(input: TokenStream) -> TokenStream {
36 let input = parse_macro_input!(input as DeriveInput);
37
38 transform_feedback::expand_derive_transform_feedback(&input).into()
39}
40
41#[proc_macro_derive(Vertex, attributes(vertex_attribute))]
42pub fn derive_vertex(input: TokenStream) -> TokenStream {
43 let input = parse_macro_input!(input as DeriveInput);
44
45 vertex::expand_derive_vertex(&input)
46 .unwrap_or_else(compile_error)
47 .into()
48}
49
50fn compile_error(message: String) -> proc_macro2::TokenStream {
51 quote! {
52 compile_error!(#message);
53 }
54}