fluvio_smartmodule_derive/
lib.rs

1mod 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/// Custom derive for creating an struct that can be used as extra params in smartmodules functions.
30/// This assumes the struct implements Default and that all fields implement FromStr.
31///
32#[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}