rs_taskflow_derive/
lib.rs1mod 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 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 result.into()
106}