open_coroutine_macros/
lib.rs#![deny(
anonymous_parameters,
bare_trait_objects,
missing_copy_implementations,
missing_debug_implementations,
missing_docs, single_use_lifetimes, trivial_casts, trivial_numeric_casts,
unstable_features,
unused_extern_crates,
unused_import_braces,
unused_qualifications,
unused_results,
variant_size_differences,
warnings, clippy::all,
clippy::pedantic,
clippy::cargo,
unreachable_pub,
)]
#![allow(
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,
clippy::shadow_same, clippy::shadow_reuse, clippy::exhaustive_enums,
clippy::exhaustive_structs,
clippy::indexing_slicing,
clippy::separated_literal_suffix, clippy::single_char_lifetime_names, )]
#[macro_use]
extern crate quote;
#[macro_use]
extern crate syn;
use proc_macro::TokenStream;
use syn::{ItemFn, LitBool, LitInt};
#[proc_macro_attribute]
pub fn main(args: TokenStream, func: TokenStream) -> TokenStream {
let mut event_loop_size = usize::MAX;
let mut stack_size = usize::MAX;
let mut min_size = usize::MAX;
let mut max_size = usize::MAX;
let mut keep_alive_time = u64::MAX;
let mut hook = true;
if !args.is_empty() {
let tea_parser = syn::meta::parser(|meta| {
if meta.path.is_ident("event_loop_size") {
event_loop_size = meta.value()?.parse::<LitInt>()?.base10_parse()?;
} else if meta.path.is_ident("stack_size") {
stack_size = meta.value()?.parse::<LitInt>()?.base10_parse()?;
} else if meta.path.is_ident("min_size") {
min_size = meta.value()?.parse::<LitInt>()?.base10_parse()?;
} else if meta.path.is_ident("max_size") {
max_size = meta.value()?.parse::<LitInt>()?.base10_parse()?;
} else if meta.path.is_ident("keep_alive_time") {
keep_alive_time = meta.value()?.parse::<LitInt>()?.base10_parse()?;
} else if meta.path.is_ident("hook") {
hook = meta.value()?.parse::<LitBool>()?.value();
}
Ok(())
});
parse_macro_input!(args with tea_parser);
}
let func = parse_macro_input!(func as ItemFn);
let func_vis = &func.vis; let func_block = &func.block; let func_decl = func.sig;
let func_name = &func_decl.ident; let func_generics = &func_decl.generics;
let func_inputs = &func_decl.inputs;
let func_output = &func_decl.output;
let caller = quote! {
#func_vis fn #func_name #func_generics(#func_inputs) #func_output {
let mut open_coroutine_config = open_coroutine::Config::default();
if #event_loop_size != usize::MAX {
open_coroutine_config.set_event_loop_size(#event_loop_size);
}
if #stack_size != usize::MAX {
open_coroutine_config.set_stack_size(#stack_size);
}
if #min_size != usize::MAX {
open_coroutine_config.set_min_size(#min_size);
}
if #max_size != usize::MAX {
open_coroutine_config.set_max_size(#max_size);
}
if #keep_alive_time != u64::MAX {
open_coroutine_config.set_keep_alive_time(#keep_alive_time);
}
if #hook != true {
open_coroutine_config.set_hook(#hook);
}
open_coroutine::init(open_coroutine_config);
let _open_coroutine_result = #func_block;
open_coroutine::shutdown();
_open_coroutine_result
}
};
caller.into()
}