fluvio_smartmodule_derive/
lib.rs1mod ast;
2mod util;
3mod generator;
4
5use proc_macro::TokenStream;
6use syn::{DeriveInput, ItemFn, parse_macro_input};
7
8use crate::ast::{SmartModuleConfig, SmartModuleFn, SmartModuleKind};
9
10#[proc_macro_attribute]
11pub fn smartmodule(args: TokenStream, input: TokenStream) -> TokenStream {
12 use crate::generator::generate_smartmodule;
13
14 let mut config = SmartModuleConfig::default();
15 let config_parser = syn::meta::parser(|meta| config.parse(meta));
16 parse_macro_input!(args with config_parser);
17
18 let func = parse_macro_input!(input as ItemFn);
19
20 let func = match SmartModuleFn::from_ast(&func) {
21 Ok(func) => func,
22 Err(e) => return e.into_compile_error().into(),
23 };
24 let output = generate_smartmodule(&config, &func);
25
26 output.into()
27}
28
29#[proc_macro_derive(SmartOpt)]
33pub fn smartopt_derive(input: TokenStream) -> TokenStream {
34 use crate::generator::opt::impl_smart_opt;
35 let input = syn::parse_macro_input!(input as DeriveInput);
36
37 impl_smart_opt(input).unwrap_or_else(|err| err.into_compile_error().into())
38}