#![doc(html_root_url = "https://docs.rs/tokio-macros/0.2.3")] #![allow(clippy::needless_doctest_main)] #![warn( missing_debug_implementations, missing_docs, rust_2018_idioms, unreachable_pub )] #![deny(intra_doc_link_resolution_failure)] #![doc(test( no_crate_inject, attr(deny(warnings, rust_2018_idioms), allow(dead_code, unused_variables)) ))] //! Macros for use with Tokio // This `extern` is required for older `rustc` versions but newer `rustc` // versions warn about the unused `extern crate`. #[allow(unused_extern_crates)] extern crate proc_macro; mod entry; mod select; use proc_macro::TokenStream; /// Marks async function to be executed by selected runtime. /// /// ## Options: /// /// /// - `core_threads=n` - Sets core threads to `n` (requires `rt-threaded` feature). /// - `max_threads=n` - Sets max threads to `n` (requires `rt-core` or `rt-threaded` feature). /// /// ## Function arguments: /// /// Arguments are allowed for any functions aside from `main` which is special /// /// ## Usage /// /// ### Using default /// /// ```rust /// #[tokio::main] /// async fn main() { /// println!("Hello world"); /// } /// ``` /// /// ### Set number of core threads /// /// ```rust /// #[tokio::main(core_threads = 1)] /// async fn main() { /// println!("Hello world"); /// } /// ``` #[proc_macro_attribute] #[cfg(not(test))] // Work around for rust-lang/rust#62127 pub fn main_threaded(args: TokenStream, item: TokenStream) -> TokenStream { entry::main(args, item, true) } /// Marks async function to be executed by selected runtime. /// /// ## Options: /// /// - `basic_scheduler` - All tasks are executed on the current thread. /// - `threaded_scheduler` - Uses the multi-threaded scheduler. Used by default (requires `rt-threaded` feature). /// /// ## Function arguments: /// /// Arguments are allowed for any functions aside from `main` which is special /// /// ## Usage /// /// ### Using default /// /// ```rust /// #[tokio::main] /// async fn main() { /// println!("Hello world"); /// } /// ``` /// /// ### Select runtime /// /// ```rust /// #[tokio::main(basic_scheduler)] /// async fn main() { /// println!("Hello world"); /// } /// ``` #[proc_macro_attribute] #[cfg(not(test))] // Work around for rust-lang/rust#62127 pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { entry::old::main(args, item) } /// Marks async function to be executed by selected runtime. /// /// ## Options: /// /// - `max_threads=n` - Sets max threads to `n`. /// /// ## Function arguments: /// /// Arguments are allowed for any functions aside from `main` which is special /// /// ## Usage /// /// ### Using default /// /// ```rust /// #[tokio::main] /// async fn main() { /// println!("Hello world"); /// } /// ``` #[proc_macro_attribute] #[cfg(not(test))] // Work around for rust-lang/rust#62127 pub fn main_basic(args: TokenStream, item: TokenStream) -> TokenStream { entry::main(args, item, false) } /// Marks async function to be executed by runtime, suitable to test environment /// /// ## Options: /// /// - `core_threads=n` - Sets core threads to `n` (requires `rt-threaded` feature). /// - `max_threads=n` - Sets max threads to `n` (requires `rt-core` or `rt-threaded` feature). /// /// ## Usage /// /// ### Select runtime /// /// ```no_run /// #[tokio::test(core_threads = 1)] /// async fn my_test() { /// assert!(true); /// } /// ``` /// /// ### Using default /// /// ```no_run /// #[tokio::test] /// async fn my_test() { /// assert!(true); /// } /// ``` #[proc_macro_attribute] pub fn test_threaded(args: TokenStream, item: TokenStream) -> TokenStream { entry::test(args, item, true) } /// Marks async function to be executed by runtime, suitable to test environment /// /// ## Options: /// /// - `basic_scheduler` - All tasks are executed on the current thread. Used by default. /// - `threaded_scheduler` - Use multi-threaded scheduler (requires `rt-threaded` feature). /// /// ## Usage /// /// ### Select runtime /// /// ```no_run /// #[tokio::test(threaded_scheduler)] /// async fn my_test() { /// assert!(true); /// } /// ``` /// /// ### Using default /// /// ```no_run /// #[tokio::test] /// async fn my_test() { /// assert!(true); /// } /// ``` #[proc_macro_attribute] pub fn test(args: TokenStream, item: TokenStream) -> TokenStream { entry::old::test(args, item) } /// Marks async function to be executed by runtime, suitable to test environment /// /// ## Options: /// /// - `max_threads=n` - Sets max threads to `n`. /// /// ## Usage /// /// ```no_run /// #[tokio::test] /// async fn my_test() { /// assert!(true); /// } /// ``` #[proc_macro_attribute] pub fn test_basic(args: TokenStream, item: TokenStream) -> TokenStream { entry::test(args, item, false) } /// Implementation detail of the `select!` macro. This macro is **not** intended /// to be used as part of the public API and is permitted to change. #[proc_macro] #[doc(hidden)] pub fn select_priv_declare_output_enum(input: TokenStream) -> TokenStream { select::declare_output_enum(input) }