1mod definition;
2mod fn_args;
3mod fn_returns;
4mod var;
5
6extern crate proc_macro;
7
8use crate::definition::generate_arrow_fn;
9use proc_macro::TokenStream;
10use proc_macro_error::proc_macro_error;
11use quote::quote;
12use syn::{Ident, ItemFn, Token, parse_macro_input, punctuated::Punctuated};
13
14#[proc_macro_error]
15#[proc_macro_attribute]
16pub fn def_arrow(attr: TokenStream, item: TokenStream) -> TokenStream {
17 let args = parse_macro_input!(attr with Punctuated::<Ident, Token![,]>::parse_terminated);
19 let mut iter = args.into_iter();
20 let obj_type = iter.next().expect("expected ObjType");
21 let arr_type = iter.next().expect("expected ArrType");
22 let fn_name = iter.next().expect("expected new function name");
23
24 let input_fn: ItemFn = parse_macro_input!(item as ItemFn);
26
27 let generated_fn = generate_arrow_fn(
29 input_fn.clone(),
30 obj_type.clone(),
31 arr_type.clone(),
32 fn_name,
33 );
34
35 let input_fn = var::expand_var_macros(input_fn, obj_type.clone(), arr_type.clone());
37
38 let out = quote! {
40 #[state_macro::stateful(&std::rc::Rc<std::cell::RefCell<open_hypergraphs::lax::OpenHypergraph<#obj_type, #arr_type>>>)]
42 #input_fn
43
44 #generated_fn
46 };
47
48 out.into()
49}