sdf_macros/
lib.rs

1mod ast;
2mod generator;
3mod package;
4
5use proc_macro::TokenStream;
6use syn::{parse_macro_input, spanned::Spanned, Error, Item, ItemFn};
7
8use crate::ast::{SdfOperatorFn, SdfBindgenConfig};
9use crate::package::PkgConfig;
10
11#[proc_macro_attribute]
12pub fn sdf(args: TokenStream, input: TokenStream) -> TokenStream {
13    let sdf_bindgen_config = parse_macro_input!(args as SdfBindgenConfig);
14
15    let input = parse_macro_input!(input as Item);
16
17    match input {
18        Item::Fn(item_fn) => sdf_operator_fn(sdf_bindgen_config, item_fn),
19        _ => Error::new(input.span(), "macro supports only functions")
20            .into_compile_error()
21            .into(),
22    }
23}
24
25fn sdf_operator_fn(bindgen_config: SdfBindgenConfig, func: ItemFn) -> TokenStream {
26    let sdf_fn = match SdfOperatorFn::from_ast(&func, bindgen_config.kind()) {
27        Ok(sdf_fn) => sdf_fn,
28        Err(e) => return e.into_compile_error().into(),
29    };
30
31    generator::generate_operator(&sdf_fn, &bindgen_config).into()
32}
33
34#[proc_macro]
35pub fn sdf_package(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
36    syn::parse_macro_input!(input as PkgConfig)
37        .expand()
38        .unwrap_or_else(Error::into_compile_error)
39        .into()
40}