open_coroutine_macros/
lib.rs1#![deny(
2 anonymous_parameters,
5 bare_trait_objects,
6 missing_copy_implementations,
8 missing_debug_implementations,
9 missing_docs, single_use_lifetimes, trivial_casts, trivial_numeric_casts,
13 unstable_features,
16 unused_extern_crates,
17 unused_import_braces,
18 unused_qualifications,
19 unused_results,
20 variant_size_differences,
21
22 warnings, clippy::all,
25 clippy::pedantic,
27 clippy::cargo,
29 unreachable_pub,
30)]
31#![allow(
32 clippy::blanket_clippy_restriction_lints, clippy::implicit_return, clippy::module_name_repetitions, clippy::multiple_crate_versions, clippy::missing_errors_doc, clippy::missing_panics_doc, clippy::panic_in_result_fn,
40 clippy::shadow_same, clippy::shadow_reuse, clippy::exhaustive_enums,
43 clippy::exhaustive_structs,
44 clippy::indexing_slicing,
45 clippy::separated_literal_suffix, clippy::single_char_lifetime_names, )]
48use proc_macro::TokenStream;
51use quote::quote;
52use syn::{parse_macro_input, ItemFn, LitBool, LitInt};
53
54#[proc_macro_attribute]
56pub fn main(args: TokenStream, func: TokenStream) -> TokenStream {
57 let mut event_loop_size = usize::MAX;
58 let mut stack_size = usize::MAX;
59 let mut min_size = usize::MAX;
60 let mut max_size = usize::MAX;
61 let mut keep_alive_time = u64::MAX;
62 let mut min_memory_count = usize::MAX;
63 let mut memory_keep_alive_time = u64::MAX;
64 let mut hook = true;
65 if !args.is_empty() {
66 let tea_parser = syn::meta::parser(|meta| {
67 if meta.path.is_ident("event_loop_size") {
68 event_loop_size = meta.value()?.parse::<LitInt>()?.base10_parse()?;
69 } else if meta.path.is_ident("stack_size") {
70 stack_size = meta.value()?.parse::<LitInt>()?.base10_parse()?;
71 } else if meta.path.is_ident("min_size") {
72 min_size = meta.value()?.parse::<LitInt>()?.base10_parse()?;
73 } else if meta.path.is_ident("max_size") {
74 max_size = meta.value()?.parse::<LitInt>()?.base10_parse()?;
75 } else if meta.path.is_ident("keep_alive_time") {
76 keep_alive_time = meta.value()?.parse::<LitInt>()?.base10_parse()?;
77 } else if meta.path.is_ident("min_memory_count") {
78 min_memory_count = meta.value()?.parse::<LitInt>()?.base10_parse()?;
79 } else if meta.path.is_ident("memory_keep_alive_time") {
80 memory_keep_alive_time = meta.value()?.parse::<LitInt>()?.base10_parse()?;
81 } else if meta.path.is_ident("hook") {
82 hook = meta.value()?.parse::<LitBool>()?.value();
83 }
84 Ok(())
85 });
86 parse_macro_input!(args with tea_parser);
87 }
88
89 let func = parse_macro_input!(func as ItemFn);
90 let func_vis = &func.vis; let func_block = &func.block; let func_decl = func.sig;
94 let func_name = &func_decl.ident; let func_generics = &func_decl.generics;
96 let func_inputs = &func_decl.inputs;
97 let func_output = &func_decl.output;
98
99 let caller = quote! {
100 #func_vis fn #func_name #func_generics(#func_inputs) #func_output {
102 let mut open_coroutine_config = open_coroutine::Config::default();
103 if #event_loop_size != usize::MAX {
104 open_coroutine_config.set_event_loop_size(#event_loop_size);
105 }
106 if #stack_size != usize::MAX {
107 open_coroutine_config.set_stack_size(#stack_size);
108 }
109 if #min_size != usize::MAX {
110 open_coroutine_config.set_min_size(#min_size);
111 }
112 if #max_size != usize::MAX {
113 open_coroutine_config.set_max_size(#max_size);
114 }
115 if #keep_alive_time != u64::MAX {
116 open_coroutine_config.set_keep_alive_time(#keep_alive_time);
117 }
118 if #min_memory_count != usize::MAX {
119 open_coroutine_config.set_min_memory_count(#min_memory_count);
120 }
121 if #memory_keep_alive_time != u64::MAX {
122 open_coroutine_config.set_memory_keep_alive_time(#memory_keep_alive_time);
123 }
124 if #hook != true {
125 open_coroutine_config.set_hook(#hook);
126 }
127 open_coroutine::init(open_coroutine_config);
128 let _open_coroutine_result = #func_block;
129 open_coroutine::shutdown();
130 _open_coroutine_result
131 }
132 };
133 caller.into()
134}