summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouman <douman@gmx.se>2019-09-24 16:03:26 +0200
committerDouman <douman@gmx.se>2019-10-01 13:15:46 +0200
commita1d1eb5eb352f722eb8f7ed6be5963127da59b21 (patch)
tree4521812113ad38f14ac901aa2e0a9dac05fb5fec
parent5efe31f2ed3c797e8055306a05faa3d7e786e7b6 (diff)
macros: Allow arguments in non-main functions
-rw-r--r--build-tests/tests/fail/macros_invalid_input.rs3
-rw-r--r--build-tests/tests/fail/macros_invalid_input.stderr34
-rw-r--r--tokio-macros/src/lib.rs17
3 files changed, 24 insertions, 30 deletions
diff --git a/build-tests/tests/fail/macros_invalid_input.rs b/build-tests/tests/fail/macros_invalid_input.rs
index 827507eb..8396a71c 100644
--- a/build-tests/tests/fail/macros_invalid_input.rs
+++ b/build-tests/tests/fail/macros_invalid_input.rs
@@ -3,9 +3,6 @@ use build_tests::tokio;
#[tokio::main]
fn main_is_not_async() {}
-#[tokio::main]
-async fn main_fn_has_args(_x: u8) {}
-
#[tokio::main(foo)]
async fn main_attr_has_unknown_args() {}
diff --git a/build-tests/tests/fail/macros_invalid_input.stderr b/build-tests/tests/fail/macros_invalid_input.stderr
index 2f136125..7aa90499 100644
--- a/build-tests/tests/fail/macros_invalid_input.stderr
+++ b/build-tests/tests/fail/macros_invalid_input.stderr
@@ -4,44 +4,38 @@ error: the async keyword is missing from the function declaration
4 | fn main_is_not_async() {}
| ^^
-error: the main function cannot accept arguments
- --> $DIR/macros_invalid_input.rs:7:27
- |
-7 | async fn main_fn_has_args(_x: u8) {}
- | ^^^^^^
-
error: Unknown attribute foo is specified
- --> $DIR/macros_invalid_input.rs:9:15
+ --> $DIR/macros_invalid_input.rs:6:15
|
-9 | #[tokio::main(foo)]
+6 | #[tokio::main(foo)]
| ^^^
error: Must have specified ident
- --> $DIR/macros_invalid_input.rs:12:15
- |
-12 | #[tokio::main(multi_thread::bar)]
- | ^^^^^^^^^^^^^^^^^
+ --> $DIR/macros_invalid_input.rs:9:15
+ |
+9 | #[tokio::main(multi_thread::bar)]
+ | ^^^^^^^^^^^^^^^^^
error: the async keyword is missing from the function declaration
- --> $DIR/macros_invalid_input.rs:16:1
+ --> $DIR/macros_invalid_input.rs:13:1
|
-16 | fn test_is_not_async() {}
+13 | fn test_is_not_async() {}
| ^^
error: the test function cannot accept arguments
- --> $DIR/macros_invalid_input.rs:19:27
+ --> $DIR/macros_invalid_input.rs:16:27
|
-19 | async fn test_fn_has_args(_x: u8) {}
+16 | async fn test_fn_has_args(_x: u8) {}
| ^^^^^^
error: unexpected token
- --> $DIR/macros_invalid_input.rs:21:15
+ --> $DIR/macros_invalid_input.rs:18:15
|
-21 | #[tokio::test(foo)]
+18 | #[tokio::test(foo)]
| ^^^
error: second test attribute is supplied
- --> $DIR/macros_invalid_input.rs:25:1
+ --> $DIR/macros_invalid_input.rs:22:1
|
-25 | #[test]
+22 | #[test]
| ^^^^^^^
diff --git a/tokio-macros/src/lib.rs b/tokio-macros/src/lib.rs
index c7138552..07adfa0d 100644
--- a/tokio-macros/src/lib.rs
+++ b/tokio-macros/src/lib.rs
@@ -25,6 +25,10 @@ use quote::quote;
/// - `single_thread` - Uses `current_thread`.
/// - `multi_thread` - Uses multi-threaded runtime. Used by default.
///
+/// ## Function arguments:
+///
+/// Arguments are allowed for any functions aside from `main` which is special
+///
/// ## Usage
///
/// ### Select runtime
@@ -57,6 +61,7 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
let ret = &input.sig.output;
let name = &input.sig.ident;
+ let inputs = &input.sig.inputs;
let body = &input.block;
let attrs = &input.attrs;
@@ -65,7 +70,7 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
return syn::Error::new_spanned(input.sig.fn_token, msg)
.to_compile_error()
.into();
- } else if !input.sig.inputs.is_empty() {
+ } else if name == "main" && !inputs.is_empty() {
let msg = "the main function cannot accept arguments";
return syn::Error::new_spanned(&input.sig.inputs, msg)
.to_compile_error()
@@ -95,16 +100,14 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
let result = match runtime {
RuntimeType::Multi => quote! {
#(#attrs)*
- fn #name() #ret {
- let mut rt = tokio::runtime::Runtime::new().unwrap();
- rt.block_on(async { #body })
+ fn #name(#inputs) #ret {
+ tokio::runtime::Runtime::new().unwrap().block_on(async { #body })
}
},
RuntimeType::Single => quote! {
#(#attrs)*
- fn #name() #ret {
- let mut rt = tokio::runtime::current_thread::Runtime::new().unwrap();
- rt.block_on(async { #body })
+ fn #name(#inputs) #ret {
+ tokio::runtime::current_thread::Runtime::new().unwrap().block_on(async { #body })
}
},
RuntimeType::Auto => quote! {