From 2ec9c0957e07f215c52f72598c538cac6c562661 Mon Sep 17 00:00:00 2001 From: Polycarbohydrate <169401794+Polycarbohydrate@users.noreply.github.com> Date: Fri, 7 Mar 2025 19:49:35 -0500 Subject: [PATCH 1/2] Async updates and reformatting for new exercise - Renamed/ordered the directories for macros, clippy, and conversions, shifting them all one up in numerical order to fit async as number 21 - Added the 21_async directories in exercises and solutions - Added async1.rs in the 21_async directory in exercises and solutions - Added async to the info.toml in rustlings-macros and reordered the rest of the exercises in there as well - Created an exercise for async1 and its solution --- exercises/21_async/README.md | 16 ++++++++ exercises/21_async/async1.rs | 34 ++++++++++++++++ exercises/{21_macros => 22_macros}/README.md | 0 exercises/{21_macros => 22_macros}/macros1.rs | 0 exercises/{21_macros => 22_macros}/macros2.rs | 0 exercises/{21_macros => 22_macros}/macros3.rs | 0 exercises/{21_macros => 22_macros}/macros4.rs | 0 exercises/{22_clippy => 23_clippy}/README.md | 0 exercises/{22_clippy => 23_clippy}/clippy1.rs | 0 exercises/{22_clippy => 23_clippy}/clippy2.rs | 0 exercises/{22_clippy => 23_clippy}/clippy3.rs | 0 .../README.md | 0 .../as_ref_mut.rs | 0 .../from_into.rs | 0 .../from_str.rs | 0 .../try_from_into.rs | 0 .../using_as.rs | 0 rustlings-macros/info.toml | 40 +++++++++++++------ solutions/21_async/async1.rs | 30 ++++++++++++++ solutions/{21_macros => 22_macros}/macros1.rs | 0 solutions/{21_macros => 22_macros}/macros2.rs | 0 solutions/{21_macros => 22_macros}/macros3.rs | 0 solutions/{21_macros => 22_macros}/macros4.rs | 0 solutions/{22_clippy => 23_clippy}/clippy1.rs | 0 solutions/{22_clippy => 23_clippy}/clippy2.rs | 0 solutions/{22_clippy => 23_clippy}/clippy3.rs | 0 .../as_ref_mut.rs | 0 .../from_into.rs | 0 .../from_str.rs | 0 .../try_from_into.rs | 0 .../using_as.rs | 0 31 files changed, 108 insertions(+), 12 deletions(-) create mode 100644 exercises/21_async/README.md create mode 100644 exercises/21_async/async1.rs rename exercises/{21_macros => 22_macros}/README.md (100%) rename exercises/{21_macros => 22_macros}/macros1.rs (100%) rename exercises/{21_macros => 22_macros}/macros2.rs (100%) rename exercises/{21_macros => 22_macros}/macros3.rs (100%) rename exercises/{21_macros => 22_macros}/macros4.rs (100%) rename exercises/{22_clippy => 23_clippy}/README.md (100%) rename exercises/{22_clippy => 23_clippy}/clippy1.rs (100%) rename exercises/{22_clippy => 23_clippy}/clippy2.rs (100%) rename exercises/{22_clippy => 23_clippy}/clippy3.rs (100%) rename exercises/{23_conversions => 24_conversions}/README.md (100%) rename exercises/{23_conversions => 24_conversions}/as_ref_mut.rs (100%) rename exercises/{23_conversions => 24_conversions}/from_into.rs (100%) rename exercises/{23_conversions => 24_conversions}/from_str.rs (100%) rename exercises/{23_conversions => 24_conversions}/try_from_into.rs (100%) rename exercises/{23_conversions => 24_conversions}/using_as.rs (100%) create mode 100644 solutions/21_async/async1.rs rename solutions/{21_macros => 22_macros}/macros1.rs (100%) rename solutions/{21_macros => 22_macros}/macros2.rs (100%) rename solutions/{21_macros => 22_macros}/macros3.rs (100%) rename solutions/{21_macros => 22_macros}/macros4.rs (100%) rename solutions/{22_clippy => 23_clippy}/clippy1.rs (100%) rename solutions/{22_clippy => 23_clippy}/clippy2.rs (100%) rename solutions/{22_clippy => 23_clippy}/clippy3.rs (100%) rename solutions/{23_conversions => 24_conversions}/as_ref_mut.rs (100%) rename solutions/{23_conversions => 24_conversions}/from_into.rs (100%) rename solutions/{23_conversions => 24_conversions}/from_str.rs (100%) rename solutions/{23_conversions => 24_conversions}/try_from_into.rs (100%) rename solutions/{23_conversions => 24_conversions}/using_as.rs (100%) diff --git a/exercises/21_async/README.md b/exercises/21_async/README.md new file mode 100644 index 0000000000..547fb29b28 --- /dev/null +++ b/exercises/21_async/README.md @@ -0,0 +1,16 @@ +# Async (Asynchronous Programming) + +Asynchronous programming allows a program to perform tasks concurrently +without blocking the main execution thread. It is particularly useful +for I/O-bound operations, such as network requests or file reading, +where waiting for a response can be done in the background. +In Rust, asynchronous functions are defined using the async keyword +and are executed with the help of an asynchronous runtime like tokio. +This approach improves the efficiency and responsiveness of applications +by enabling them to handle multiple tasks simultaneously. + +## Further information + +- [Asynchronous Programming in Rust](https://doc.rust-lang.org/book/ch17-00-async-await.html) +- [Learn Tokio](https://tokio.rs/tokio/tutorial/) +- [Tokio Documentation](https://docs.rs/tokio/latest/tokio/) \ No newline at end of file diff --git a/exercises/21_async/async1.rs b/exercises/21_async/async1.rs new file mode 100644 index 0000000000..7bd30d6550 --- /dev/null +++ b/exercises/21_async/async1.rs @@ -0,0 +1,34 @@ +// Modify delayed_hello to return the string "Hello, world!" +// after waiting for 1 second to pass the test and fix the +// compiler error. + +use tokio::time::{sleep, Duration}; + +// TODO: Change the function signature to fix the compiler error +fn delayed_hello() -> String { + // TODO: Return the string "Hello, world!" after waiting for 1 second + // ... + + "Hello, world!".to_string() +} + +#[tokio::main] +async fn main() { + // You can experiment optionally here +} + +#[cfg(test)] +mod tests { + use super::*; + use tokio::time::Duration; + + #[tokio::test] + async fn test_delayed_hello() { + let start = std::time::Instant::now(); + let result = delayed_hello().await; + let duration = start.elapsed(); + assert_eq!(result, "Hello, world!"); + assert!(duration >= Duration::from_secs(1)); + println!("Test passed!"); + } +} \ No newline at end of file diff --git a/exercises/21_macros/README.md b/exercises/22_macros/README.md similarity index 100% rename from exercises/21_macros/README.md rename to exercises/22_macros/README.md diff --git a/exercises/21_macros/macros1.rs b/exercises/22_macros/macros1.rs similarity index 100% rename from exercises/21_macros/macros1.rs rename to exercises/22_macros/macros1.rs diff --git a/exercises/21_macros/macros2.rs b/exercises/22_macros/macros2.rs similarity index 100% rename from exercises/21_macros/macros2.rs rename to exercises/22_macros/macros2.rs diff --git a/exercises/21_macros/macros3.rs b/exercises/22_macros/macros3.rs similarity index 100% rename from exercises/21_macros/macros3.rs rename to exercises/22_macros/macros3.rs diff --git a/exercises/21_macros/macros4.rs b/exercises/22_macros/macros4.rs similarity index 100% rename from exercises/21_macros/macros4.rs rename to exercises/22_macros/macros4.rs diff --git a/exercises/22_clippy/README.md b/exercises/23_clippy/README.md similarity index 100% rename from exercises/22_clippy/README.md rename to exercises/23_clippy/README.md diff --git a/exercises/22_clippy/clippy1.rs b/exercises/23_clippy/clippy1.rs similarity index 100% rename from exercises/22_clippy/clippy1.rs rename to exercises/23_clippy/clippy1.rs diff --git a/exercises/22_clippy/clippy2.rs b/exercises/23_clippy/clippy2.rs similarity index 100% rename from exercises/22_clippy/clippy2.rs rename to exercises/23_clippy/clippy2.rs diff --git a/exercises/22_clippy/clippy3.rs b/exercises/23_clippy/clippy3.rs similarity index 100% rename from exercises/22_clippy/clippy3.rs rename to exercises/23_clippy/clippy3.rs diff --git a/exercises/23_conversions/README.md b/exercises/24_conversions/README.md similarity index 100% rename from exercises/23_conversions/README.md rename to exercises/24_conversions/README.md diff --git a/exercises/23_conversions/as_ref_mut.rs b/exercises/24_conversions/as_ref_mut.rs similarity index 100% rename from exercises/23_conversions/as_ref_mut.rs rename to exercises/24_conversions/as_ref_mut.rs diff --git a/exercises/23_conversions/from_into.rs b/exercises/24_conversions/from_into.rs similarity index 100% rename from exercises/23_conversions/from_into.rs rename to exercises/24_conversions/from_into.rs diff --git a/exercises/23_conversions/from_str.rs b/exercises/24_conversions/from_str.rs similarity index 100% rename from exercises/23_conversions/from_str.rs rename to exercises/24_conversions/from_str.rs diff --git a/exercises/23_conversions/try_from_into.rs b/exercises/24_conversions/try_from_into.rs similarity index 100% rename from exercises/23_conversions/try_from_into.rs rename to exercises/24_conversions/try_from_into.rs diff --git a/exercises/23_conversions/using_as.rs b/exercises/24_conversions/using_as.rs similarity index 100% rename from exercises/23_conversions/using_as.rs rename to exercises/24_conversions/using_as.rs diff --git a/rustlings-macros/info.toml b/rustlings-macros/info.toml index e705598187..46a8c4f9bc 100644 --- a/rustlings-macros/info.toml +++ b/rustlings-macros/info.toml @@ -1079,11 +1079,27 @@ original sending end. Related section in The Book: https://doc.rust-lang.org/book/ch16-02-message-passing.html""" +# ASYNC + +[[exercises]] +name = "async1" +dir = "21_async" +hint = """ +Remember what keyword is used to define an asynchronous function. The function +returns a `Future` that can be awaited. + +A keyword is used to wait for the result of a `Future`. It can only +be used inside an asyncronous function. + +For documentation on 'tokio::sleep', see: +https://docs.rs/tokio/latest/tokio/time/fn.sleep.html""" + + # MACROS [[exercises]] name = "macros1" -dir = "21_macros" +dir = "22_macros" test = false hint = """ When you call a macro, you need to add something special compared to a regular @@ -1091,7 +1107,7 @@ function call.""" [[exercises]] name = "macros2" -dir = "21_macros" +dir = "22_macros" test = false hint = """ Macros don't quite play by the same rules as the rest of Rust, in terms of @@ -1102,7 +1118,7 @@ Unlike other things in Rust, the order of "where you define a macro" versus [[exercises]] name = "macros3" -dir = "21_macros" +dir = "22_macros" test = false hint = """ In order to use a macro outside of its module, you need to do something @@ -1110,7 +1126,7 @@ special to the module to lift the macro out into its parent.""" [[exercises]] name = "macros4" -dir = "21_macros" +dir = "22_macros" test = false hint = """ You only need to add a single character to make this compile. @@ -1127,7 +1143,7 @@ https://veykril.github.io/tlborm/""" [[exercises]] name = "clippy1" -dir = "22_clippy" +dir = "23_clippy" test = false strict_clippy = true hint = """ @@ -1144,7 +1160,7 @@ appropriate replacement constant from `std::f32::consts`.""" [[exercises]] name = "clippy2" -dir = "22_clippy" +dir = "23_clippy" test = false strict_clippy = true hint = """ @@ -1157,7 +1173,7 @@ https://doc.rust-lang.org/std/option/#iterating-over-option""" [[exercises]] name = "clippy3" -dir = "22_clippy" +dir = "23_clippy" test = false strict_clippy = true hint = "No hints this time!" @@ -1166,20 +1182,20 @@ hint = "No hints this time!" [[exercises]] name = "using_as" -dir = "23_conversions" +dir = "24_conversions" hint = """ Use the `as` operator to cast one of the operands in the last line of the `average` function into the expected return type.""" [[exercises]] name = "from_into" -dir = "23_conversions" +dir = "24_conversions" hint = """ Follow the steps provided right before the `From` implementation.""" [[exercises]] name = "from_str" -dir = "23_conversions" +dir = "24_conversions" hint = """ The implementation of `FromStr` should return an `Ok` with a `Person` object, or an `Err` with an error if the string is not valid. @@ -1196,7 +1212,7 @@ https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/reen [[exercises]] name = "try_from_into" -dir = "23_conversions" +dir = "24_conversions" hint = """ Is there an implementation of `TryFrom` in the standard library that can both do the required integer conversion and check the range of the input? @@ -1206,6 +1222,6 @@ types?""" [[exercises]] name = "as_ref_mut" -dir = "23_conversions" +dir = "24_conversions" hint = """ Add `AsRef` or `AsMut` as a trait bound to the functions.""" diff --git a/solutions/21_async/async1.rs b/solutions/21_async/async1.rs new file mode 100644 index 0000000000..fa1ea933f8 --- /dev/null +++ b/solutions/21_async/async1.rs @@ -0,0 +1,30 @@ +use tokio::time::{sleep, Duration}; + +// Change the function signature to be async and return a Future +async fn delayed_hello() -> String { + // Wait for 1 second + sleep(Duration::from_secs(1)).await; + + "Hello, world!".to_string() +} + +#[tokio::main] +async fn main() { + // You can experiment optionally here +} + +#[cfg(test)] +mod tests { + use super::*; + use tokio::time::Duration; + + #[tokio::test] + async fn test_delayed_hello() { + let start = std::time::Instant::now(); + let result = delayed_hello().await; + let duration = start.elapsed(); + assert_eq!(result, "Hello, world!"); + assert!(duration >= Duration::from_secs(1)); + println!("Test passed!"); + } +} \ No newline at end of file diff --git a/solutions/21_macros/macros1.rs b/solutions/22_macros/macros1.rs similarity index 100% rename from solutions/21_macros/macros1.rs rename to solutions/22_macros/macros1.rs diff --git a/solutions/21_macros/macros2.rs b/solutions/22_macros/macros2.rs similarity index 100% rename from solutions/21_macros/macros2.rs rename to solutions/22_macros/macros2.rs diff --git a/solutions/21_macros/macros3.rs b/solutions/22_macros/macros3.rs similarity index 100% rename from solutions/21_macros/macros3.rs rename to solutions/22_macros/macros3.rs diff --git a/solutions/21_macros/macros4.rs b/solutions/22_macros/macros4.rs similarity index 100% rename from solutions/21_macros/macros4.rs rename to solutions/22_macros/macros4.rs diff --git a/solutions/22_clippy/clippy1.rs b/solutions/23_clippy/clippy1.rs similarity index 100% rename from solutions/22_clippy/clippy1.rs rename to solutions/23_clippy/clippy1.rs diff --git a/solutions/22_clippy/clippy2.rs b/solutions/23_clippy/clippy2.rs similarity index 100% rename from solutions/22_clippy/clippy2.rs rename to solutions/23_clippy/clippy2.rs diff --git a/solutions/22_clippy/clippy3.rs b/solutions/23_clippy/clippy3.rs similarity index 100% rename from solutions/22_clippy/clippy3.rs rename to solutions/23_clippy/clippy3.rs diff --git a/solutions/23_conversions/as_ref_mut.rs b/solutions/24_conversions/as_ref_mut.rs similarity index 100% rename from solutions/23_conversions/as_ref_mut.rs rename to solutions/24_conversions/as_ref_mut.rs diff --git a/solutions/23_conversions/from_into.rs b/solutions/24_conversions/from_into.rs similarity index 100% rename from solutions/23_conversions/from_into.rs rename to solutions/24_conversions/from_into.rs diff --git a/solutions/23_conversions/from_str.rs b/solutions/24_conversions/from_str.rs similarity index 100% rename from solutions/23_conversions/from_str.rs rename to solutions/24_conversions/from_str.rs diff --git a/solutions/23_conversions/try_from_into.rs b/solutions/24_conversions/try_from_into.rs similarity index 100% rename from solutions/23_conversions/try_from_into.rs rename to solutions/24_conversions/try_from_into.rs diff --git a/solutions/23_conversions/using_as.rs b/solutions/24_conversions/using_as.rs similarity index 100% rename from solutions/23_conversions/using_as.rs rename to solutions/24_conversions/using_as.rs From ad19fae161af832ba8effb41254f464bb10d2b1c Mon Sep 17 00:00:00 2001 From: Polycarbohydrate <169401794+Polycarbohydrate@users.noreply.github.com> Date: Fri, 7 Mar 2025 19:57:02 -0500 Subject: [PATCH 2/2] Added newline to pass fmt job Added new line to end of README to pass the format job --- exercises/21_async/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/21_async/README.md b/exercises/21_async/README.md index 547fb29b28..8bdaeb7dfd 100644 --- a/exercises/21_async/README.md +++ b/exercises/21_async/README.md @@ -13,4 +13,4 @@ by enabling them to handle multiple tasks simultaneously. - [Asynchronous Programming in Rust](https://doc.rust-lang.org/book/ch17-00-async-await.html) - [Learn Tokio](https://tokio.rs/tokio/tutorial/) -- [Tokio Documentation](https://docs.rs/tokio/latest/tokio/) \ No newline at end of file +- [Tokio Documentation](https://docs.rs/tokio/latest/tokio/)