1use my_wgsl_syn::{
2 compatible::WgslCompatibleTokenGenerator,
3 externs::{ExternConst, ExternType},
4 item::WgslItemMod,
5};
6use proc_macro::TokenStream;
7use proc_macro2::Span as Span2;
8use quote::ToTokens;
9use syn::parse_macro_input;
10
11#[proc_macro_derive(WgslCompatible, attributes(wgsl))]
12pub fn wgsl_compatible(item: TokenStream) -> TokenStream {
13 if let Ok(item_struct) = syn::parse::<syn::ItemStruct>(item) {
14 match WgslCompatibleTokenGenerator::new(&item_struct) {
15 Ok(generator) => generator.into_token_stream(),
16 Err(e) => e.into_compile_error(),
17 }
18 .into()
19 } else {
20 syn::Error::new(Span2::call_site(), "expected a struct")
21 .into_compile_error()
22 .into()
23 }
24}
25
26#[proc_macro_attribute]
27pub fn wgsl_mod(_attr: TokenStream, item: TokenStream) -> TokenStream {
28 let module = parse_macro_input!(item as WgslItemMod);
29 module.into_token_stream().into()
30}
31
32#[proc_macro]
33pub fn extern_type(item: TokenStream) -> TokenStream {
34 parse_macro_input!(item as ExternType)
35 .into_token_stream()
36 .into()
37}
38
39#[proc_macro]
40pub fn extern_const(item: TokenStream) -> TokenStream {
41 parse_macro_input!(item as ExternConst)
42 .into_token_stream()
43 .into()
44}