rs_taskflow_derive/
lib.rs

1mod derive_task_helper;
2mod gen_connect_tasks_helper;
3mod gen_task_output_helper;
4mod gen_task_traits_helper;
5
6use quote::quote;
7
8#[proc_macro]
9pub fn generate_task_input_iface_traits(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
10    // println!("{:?}", input);
11    let options = syn::parse_macro_input!(input as gen_task_traits_helper::TaskTraitOptions);
12
13    let mut result = quote! {};
14    for i in 0..options.get_num() {
15        let (new_trait, new_trait_param, base_trait, function_ident) =
16            gen_task_traits_helper::generate_iface_trait_components(&options, i);
17
18        result.extend(quote! {
19            pub trait #new_trait: #base_trait {
20                fn #function_ident(&mut self, task_input: TaskInputHandle<#new_trait_param>);
21            }
22        });
23    }
24
25    result.into()
26}
27
28#[proc_macro]
29pub fn generate_task_output_iface_traits(
30    input: proc_macro::TokenStream,
31) -> proc_macro::TokenStream {
32    let options = syn::parse_macro_input!(input as gen_task_traits_helper::TaskTraitOptions);
33
34    let mut result = quote! {};
35    for i in 0..options.get_num() {
36        let (new_trait, new_trait_param, base_trait, function_ident) =
37            gen_task_traits_helper::generate_iface_trait_components(&options, i);
38        result.extend(quote! {
39            pub trait #new_trait: #base_trait {
40                fn #function_ident(task: &dyn ExecutableTask) -> Option<&#new_trait_param>;
41            }
42        });
43    }
44
45    result.into()
46}
47
48#[proc_macro]
49pub fn generate_connect_tasks_funcs(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
50    let options = syn::parse_macro_input!(input as gen_connect_tasks_helper::TaskFlowOptions);
51
52    let mut result = quote! {};
53    for i in 0..options.get_num_ports() {
54        for j in 0..options.get_num_ports() {
55            let func = gen_connect_tasks_helper::generate_connect_tasks_func(i, j);
56            result.extend(func);
57        }
58    }
59
60    result.into()
61}
62
63#[proc_macro]
64pub fn generate_get_task_output_funcs(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
65    let options = syn::parse_macro_input!(input as gen_connect_tasks_helper::TaskFlowOptions);
66
67    let mut result = quote! {};
68    for i in 0..options.get_num_ports() {
69        let func = gen_task_output_helper::generate_get_task_output_func(i);
70        result.extend(func);
71    }
72
73    result.into()
74}
75
76#[proc_macro_attribute]
77pub fn derive_task(
78    args: proc_macro::TokenStream,
79    input: proc_macro::TokenStream,
80) -> proc_macro::TokenStream {
81    let struct_options = syn::parse_macro_input!(input as derive_task_helper::TaskStructOptions);
82    let iface_options = syn::parse_macro_input!(args as derive_task_helper::TaskInterfaceOptions);
83
84    let mut result = quote! {};
85    result.extend(derive_task_helper::generate_task_struct_impls(
86        &struct_options,
87        &iface_options,
88    ));
89    for i in 0..iface_options.get_num_inputs() {
90        result.extend(derive_task_helper::generate_task_input_impl(
91            &struct_options,
92            &iface_options,
93            i,
94        ));
95    }
96    for i in 0..iface_options.get_num_outputs() {
97        result.extend(derive_task_helper::generate_task_output_impl(
98            &struct_options,
99            &iface_options,
100            i,
101        ));
102    }
103
104    // println!("output: {}", result);
105    result.into()
106}