my_wgsl_macros/
lib.rs

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}