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}