1use proc_macro2::TokenStream;
2
3macro_rules! parse_macro_input {
4 ($token_stream:ident as $ty:ty) => {
5 match syn::parse2::<$ty>($token_stream) {
6 Ok(input) => input,
7 Err(err) => return err.to_compile_error().into(),
8 }
9 };
10}
11
12mod args;
13mod auto_repr;
14mod r#match;
15mod metal;
16mod repr;
17mod vertex;
18mod vulkan;
19mod webgpu;
21
22pub fn arguments_derive(input: TokenStream, mev: &TokenStream) -> TokenStream {
23 let input = parse_macro_input!(input as syn::DeriveInput);
24
25 let metal_tokens = match metal::arguments::derive(&input, mev) {
26 Ok(tokens) => tokens,
27 Err(err) => err.to_compile_error(),
28 };
29
30 let vulkan_tokens = match vulkan::arguments::derive(&input, mev) {
31 Ok(tokens) => tokens,
32 Err(err) => err.to_compile_error(),
33 };
34
35 let webgpu_tokens = match webgpu::arguments::derive(&input, mev) {
36 Ok(tokens) => tokens,
37 Err(err) => err.to_compile_error(),
38 };
39 quote::quote! {
40 #mev::with_metal! { #metal_tokens }
41 #mev::with_vulkan! { #vulkan_tokens }
42 #mev::with_webgpu! { #webgpu_tokens }
43 }
44}
45
46pub fn derive_repr(input: TokenStream, mev: &TokenStream) -> TokenStream {
47 let input = parse_macro_input!(input as syn::DeriveInput);
48
49 match repr::derive(&input, mev) {
50 Ok(tokens) => tokens,
51 Err(err) => err.to_compile_error(),
52 }
53}
54
55pub fn derive_auto_repr(input: TokenStream, mev: &TokenStream) -> TokenStream {
56 let input = parse_macro_input!(input as syn::DeriveInput);
57
58 match auto_repr::derive(&input, mev) {
59 Ok(tokens) => tokens,
60 Err(err) => err.to_compile_error(),
61 }
62}
63
64pub fn match_backend(input: TokenStream, mev: &TokenStream) -> TokenStream {
65 r#match::match_backend(input, mev)
66}
67
68pub fn derive_vertex(input: TokenStream, mev: &TokenStream) -> TokenStream {
69 let input = parse_macro_input!(input as syn::DeriveInput);
70
71 match vertex::derive(&input, mev) {
72 Ok(tokens) => tokens,
73 Err(err) => err.to_compile_error(),
74 }
75}