Skip to main content

fluvio_smartstream_derive/
lib.rs

1use proc_macro::TokenStream;
2use syn::{AttributeArgs, DeriveInput, ItemFn, parse_macro_input};
3use crate::ast::{SmartStreamConfig, SmartStreamFn, SmartStreamKind};
4mod ast;
5mod generator;
6
7#[proc_macro_attribute]
8pub fn smartstream(args: TokenStream, input: TokenStream) -> TokenStream {
9    use crate::generator::generate_smartstream;
10
11    let args = parse_macro_input!(args as AttributeArgs);
12    let func = parse_macro_input!(input as ItemFn);
13
14    let config = match SmartStreamConfig::from_ast(&args) {
15        Ok(config) => config,
16        Err(e) => return e.into_compile_error().into(),
17    };
18    let func = match SmartStreamFn::from_ast(&func) {
19        Ok(func) => func,
20        Err(e) => return e.into_compile_error().into(),
21    };
22    let output = generate_smartstream(&config, &func);
23
24    output.into()
25}
26
27/// Custom derive for creating an struct that can be used as extra params in smartstreams functions.
28/// This assumes the struct implements Default and that all fields implement FromStr.
29///
30#[proc_macro_derive(SmartOpt)]
31pub fn smartopt_derive(input: TokenStream) -> TokenStream {
32    use crate::generator::opt::impl_smart_opt;
33    let input = syn::parse_macro_input!(input as DeriveInput);
34
35    impl_smart_opt(input).unwrap_or_else(|err| err.into_compile_error().into())
36}