From 54571a5fca835a2e59567b8a2bb636417b0c59c6 Mon Sep 17 00:00:00 2001 From: Rahat Ahmed Date: Sat, 7 Dec 2019 23:25:13 -0800 Subject: [PATCH 0001/1293] fix(iterators2): Remove reference to missing iterators2.rs --- exercises/standard_library_types/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/standard_library_types/README.md b/exercises/standard_library_types/README.md index 45288023..7f20b77b 100644 --- a/exercises/standard_library_types/README.md +++ b/exercises/standard_library_types/README.md @@ -1,5 +1,5 @@ For the Arc exercise check out the chapter [Shared-State Concurrency](https://doc.rust-lang.org/book/ch16-03-shared-state.html) of the Rust Book. For the Iterator exercise check out the chapters [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html) of the Rust Book and the [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/). -Do not adjust your monitors-- iterators 1 and 2 are indeed missing. Iterator 3 is a bit challenging so we're leaving space for some exercises to lead up to it! +Do not adjust your monitors-- iterators1.rs is indeed missing. iterators3.rs is a bit challenging so we're leaving space for some exercises to lead up to it! From fe10e06c3733ddb4a21e90d09bf79bfe618e97ce Mon Sep 17 00:00:00 2001 From: marisa Date: Mon, 16 Dec 2019 13:05:25 +0100 Subject: [PATCH 0002/1293] fix(tests1): Change test command Closes #243. --- exercises/tests/tests1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/tests/tests1.rs b/exercises/tests/tests1.rs index b37cefa3..f3e36f29 100644 --- a/exercises/tests/tests1.rs +++ b/exercises/tests/tests1.rs @@ -1,7 +1,7 @@ // tests1.rs // Tests are important to ensure that your code does what you think it should do. // Tests can be run on this file with the following command: -// rustlings run --test exercises/tests/tests1.rs +// rustlings run exercises/tests/tests1.rs // This test has a problem with it -- make the test compile! Make the test // pass! Make the test fail! Execute `rustlings hint tests1` for hints :) From 0c85dc1193978b5165491b99cc4922caf8d14a65 Mon Sep 17 00:00:00 2001 From: Abdou Seck Date: Mon, 16 Dec 2019 08:34:30 -0500 Subject: [PATCH 0003/1293] feat: Add type conversion and parsing exercises --- exercises/conversions/README.md | 20 +++++++ exercises/conversions/as_ref_mut.rs | 36 +++++++++++++ exercises/conversions/from_into.rs | 72 ++++++++++++++++++++++++++ exercises/conversions/from_str.rs | 48 +++++++++++++++++ exercises/conversions/try_from_into.rs | 70 +++++++++++++++++++++++++ exercises/conversions/using_as.rs | 16 ++++++ info.toml | 40 ++++++++++++++ 7 files changed, 302 insertions(+) create mode 100644 exercises/conversions/README.md create mode 100644 exercises/conversions/as_ref_mut.rs create mode 100644 exercises/conversions/from_into.rs create mode 100644 exercises/conversions/from_str.rs create mode 100644 exercises/conversions/try_from_into.rs create mode 100644 exercises/conversions/using_as.rs diff --git a/exercises/conversions/README.md b/exercises/conversions/README.md new file mode 100644 index 00000000..114bd428 --- /dev/null +++ b/exercises/conversions/README.md @@ -0,0 +1,20 @@ +### Type conversions + + +Rust offers a multitude of ways to convert a value of a given type into another type. + +The simplest form of type conversion is a type cast expression. It is denoted with the binary operator `as`. For instance, `println!("{}", 1 + 1.0);` would not compile, since `1` is an integer while `1.0` is a float. However, `println!("{}", 1 as f32 + 1.0)` should compile. The exercise [`using_as`](using_as.rs) tries to cover this. + +Rust also offers traits that facilitate type conversions upon implementation. These traits can be found under the [`convert`](https://doc.rust-lang.org/std/convert/index.html) module. +The traits are the following: +- `From` and `Into` covered in [`from_into`](from_into.rs) +- `TryFrom` and `TryInto` covered in [`try_from_into`](try_from_into.rs) +- `AsRef` and `AsMut` covered in [`as_ref_mut`](as_ref_mut.rs) + +Furthermore, the `std::str` module offers a trait called [`FromStr`](https://doc.rust-lang.org/std/str/trait.FromStr.html) which helps with converting strings into target types via the `parse` method on strings. If properly implemented for a given type `Person`, then `let p: Person = "Mark,20".parse().unwrap()` should both compile and run without panicking. + +These should be the main ways ***within the standard library*** to convert data into your desired types. + +#### Book Sections + +These are not directly covered in the book, but the standard library has great documentation for [conversions here](https://doc.rust-lang.org/std/convert/index.html). The `FromStr` trait is also covered [here](https://doc.rust-lang.org/std/str/trait.FromStr.html). \ No newline at end of file diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs new file mode 100644 index 00000000..9d92fff6 --- /dev/null +++ b/exercises/conversions/as_ref_mut.rs @@ -0,0 +1,36 @@ +// AsRef and AsMut allow for cheap reference-to-reference conversions. +// Read more about them at https://doc.rust-lang.org/std/convert/trait.AsRef.html +// and https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively. + +// Obtain the number of bytes (not characters) in the given argument +// Add the AsRef trait appropriately as a trait bound +fn byte_counter(arg: T) -> usize { + arg.as_ref().as_bytes().len() +} + +// Obtain the number of characters (not bytes) in the given argument +// Add the AsRef trait appropriately as a trait bound +fn char_counter(arg: T) -> usize { + arg.as_ref().chars().collect::>().len() +} + +fn main() { + let s = "CafΓ© au lait"; + println!("{}", char_counter(s)); + println!("{}", byte_counter(s)); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn different_counts() { + let s = "CafΓ© au lait"; + assert_ne!(char_counter(s), byte_counter(s)); + } + fn same_counts() { + let s = "Cafe au lait"; + assert_eq!(char_counter(s), byte_counter(s)); + } +} \ No newline at end of file diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs new file mode 100644 index 00000000..c988ee8d --- /dev/null +++ b/exercises/conversions/from_into.rs @@ -0,0 +1,72 @@ +// The From trait is used for value-to-value conversions. +// If From is implemented correctly for a type, the Into trait should work conversely. +// You can read more about it at https://doc.rust-lang.org/std/convert/trait.From.html +#[derive(Debug)] +struct Person { + name: String, + age: usize, +} + +// We implement the Default trait to use it as a fallback +// when the provided string is not convertible into a Person object +impl Default for Person { + fn default() -> Person { + Person { + name: String::from("John"), + age: 30, + } + } +} + +// Your task is to complete this implementation +// in order for the line `let p = Person::from("Mark,20")` to compile +// Please note that you'll need to parse the age component into a `usize` +// with something like `"4".parse::()`. The outcome of this needs to +// be handled appropriately. +// +// Steps: +// 1. If the length of the provided string is 0, then return the default of Person +// 2. Split the given string on the commas present in it +// 3. Extract the first element from the split operation and use it as the name +// 4. Extract the other element from the split operation and parse it into a `usize` as the age +// If while parsing the age, something goes wrong, then return the default of Person +// Otherwise, then return an instantiated Person onject with the results +impl From<&str> for Person { + fn from(s: &str) -> Person { + } +} + +fn main() { + // Use the `from` function + let p1 = Person::from("Mark,20"); + // Since From is implemented for Person, we should be able to use Into + let p2: Person = "Gerald,70".into(); + println!("{:?}", p1); + println!("{:?}", p2); +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_default() { + // Test that the default person is 30 year old John + let dp = Person::default(); + assert_eq!(dp.name, "John"); + assert_eq!(dp.age, 30); + } + #[test] + fn test_bad_convert() { + // Test that John is returned when bad string is provided + let p = Person::from(""); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 30); + } + #[test] + fn test_good_convert() { + // Test that "Mark,20" works + let p = Person::from("Mark,20"); + assert_eq!(p.name, "Mark"); + assert_eq!(p.age, 20); + } +} diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs new file mode 100644 index 00000000..247ae143 --- /dev/null +++ b/exercises/conversions/from_str.rs @@ -0,0 +1,48 @@ +// This does practically the same thing that TryFrom<&str> does. +// Additionally, upon implementing FromStr, you can use the `parse` method +// on strings to generate an object of the implementor type. +// You can read more about it at https://doc.rust-lang.org/std/str/trait.FromStr.html +use std::str::FromStr; + +#[derive(Debug)] +struct Person { + name: String, + age: usize, +} + +// Steps: +// 1. If the length of the provided string is 0, then return an error +// 2. Split the given string on the commas present in it +// 3. Extract the first element from the split operation and use it as the name +// 4. Extract the other element from the split operation and parse it into a `usize` as the age +// If while parsing the age, something goes wrong, then return an error +// Otherwise, then return a Result of a Person object +impl FromStr for Person { + type Err = String; + fn from_str(s: &str) -> Result { + } +} + +fn main() { + let p = "Mark,20".parse::().unwrap(); + println!("{:?}", p); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty_input() { + assert!("".parse::().is_err()); + } + #[test] + fn good_input() { + assert!("John,32".parse::().is_ok()); + } + #[test] + #[should_panic] + fn missing_age() { + "John".parse::().unwrap(); + } +} \ No newline at end of file diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs new file mode 100644 index 00000000..ff77089a --- /dev/null +++ b/exercises/conversions/try_from_into.rs @@ -0,0 +1,70 @@ +// TryFrom is a simple and safe type conversion that may fail in a controlled way under some circumstances. +// Basically, this is the same as From. The main difference is that this should return a Result type +// instead of the target type itself. +// You can read more about it at https://doc.rust-lang.org/std/convert/trait.TryFrom.html +use std::convert::{TryInto, TryFrom}; + +#[derive(Debug)] +struct Person { + name: String, + age: usize, +} + +// Your task is to complete this implementation +// in order for the line `let p = Person::try_from("Mark,20")` to compile +// and return an Ok result of inner type Person. +// Please note that you'll need to parse the age component into a `usize` +// with something like `"4".parse::()`. The outcome of this needs to +// be handled appropriately. +// +// Steps: +// 1. If the length of the provided string is 0, then return an error +// 2. Split the given string on the commas present in it +// 3. Extract the first element from the split operation and use it as the name +// 4. Extract the other element from the split operation and parse it into a `usize` as the age +// If while parsing the age, something goes wrong, then return an error +// Otherwise, then return a Result of a Person object +impl TryFrom<&str> for Person { + type Error = String; + fn try_from(s: &str) -> Result { + } +} + +fn main() { + // Use the `from` function + let p1 = Person::try_from("Mark,20"); + // Since From is implemented for Person, we should be able to use Into + let p2: Result = "Gerald,70".try_into(); + println!("{:?}", p1); + println!("{:?}", p2); +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_bad_convert() { + // Test that John is returned when bad string is provided + let p = Person::try_from(""); + assert!(p.is_err()); + } + #[test] + fn test_good_convert() { + // Test that "Mark,20" works + let p = Person::try_from("Mark,20"); + assert!(p.is_ok()); + let p = p.unwrap(); + assert_eq!(p.name, "Mark"); + assert_eq!(p.age, 20); + } + #[test] + #[should_panic] + fn test_panic_empty_input() { + let p: Person = "".try_into().unwrap(); + } + #[test] + #[should_panic] + fn test_panic_bad_age() { + let p = Person::try_from("Mark,twenty").unwrap(); + } +} \ No newline at end of file diff --git a/exercises/conversions/using_as.rs b/exercises/conversions/using_as.rs new file mode 100644 index 00000000..37eb69f2 --- /dev/null +++ b/exercises/conversions/using_as.rs @@ -0,0 +1,16 @@ +// Type casting in Rust is done via the usage of the `as` operator. +// Please note that the `as` operator is not only used when type casting. +// It also helps with renaming imports. + +// The goal is to make sure that the division does not fail to compile +fn average(values: &[f64]) -> f64 { + let total = values + .iter() + .fold(0.0, |a, b| a + b); + total / values.len() +} + +fn main() { + let values = [3.5, 0.3, 13.0, 11.7]; + println!("{}", average(&values)); +} \ No newline at end of file diff --git a/info.toml b/info.toml index 99628d18..3ca1824b 100644 --- a/info.toml +++ b/info.toml @@ -610,3 +610,43 @@ answers and don't understand why they work and yours doesn't. If you've learned from the sample solutions, I encourage you to come back to this exercise and try it again in a few days to reinforce what you've learned :)""" + +# TYPE CONVERSIONS + +[[exercises]] +name = "using_as" +path = "exercises/conversions/using_as.rs" +mode = "compile" +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" +path = "exercises/conversions/from_into.rs" +mode = "test" +hint = """ +Follow the steps provided right before the `From` implementation""" + +[[exercises]] +name = "try_from_into" +path = "exercises/conversions/try_from_into.rs" +mode = "test" +hint = """ +Follow the steps provided right before the `From` implementation. +You can also use the example at https://doc.rust-lang.org/std/convert/trait.TryFrom.html""" + +[[exercises]] +name = "as_ref_mut" +path = "exercises/conversions/as_ref_mut.rs" +mode = "test" +hint = """ +Add AsRef as a trait bound to the functions.""" + +[[exercises]] +name = "from_str" +path = "exercises/conversions/from_str.rs" +mode = "test" +hint = """ +If you've already solved try_from_into.rs, then this is almost a copy-paste. +Otherwise, go ahead and solve try_from_into.rs first.""" \ No newline at end of file From fc26b5e151b985ff5e369b3ef4049c0b01f11b0c Mon Sep 17 00:00:00 2001 From: Abdou Seck Date: Mon, 16 Dec 2019 11:33:00 -0500 Subject: [PATCH 0004/1293] I AM NOT DONE comment in conversions exercise files --- exercises/conversions/as_ref_mut.rs | 2 ++ exercises/conversions/from_into.rs | 1 + exercises/conversions/from_str.rs | 1 + exercises/conversions/try_from_into.rs | 1 + exercises/conversions/using_as.rs | 1 + 5 files changed, 6 insertions(+) diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index 9d92fff6..8a907031 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -2,12 +2,14 @@ // Read more about them at https://doc.rust-lang.org/std/convert/trait.AsRef.html // and https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively. +// I AM NOT DONE // Obtain the number of bytes (not characters) in the given argument // Add the AsRef trait appropriately as a trait bound fn byte_counter(arg: T) -> usize { arg.as_ref().as_bytes().len() } +// I AM NOT DONE // Obtain the number of characters (not bytes) in the given argument // Add the AsRef trait appropriately as a trait bound fn char_counter(arg: T) -> usize { diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs index c988ee8d..666f234b 100644 --- a/exercises/conversions/from_into.rs +++ b/exercises/conversions/from_into.rs @@ -18,6 +18,7 @@ impl Default for Person { } } +// I AM NOT DONE // Your task is to complete this implementation // in order for the line `let p = Person::from("Mark,20")` to compile // Please note that you'll need to parse the age component into a `usize` diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 247ae143..3c889d73 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -10,6 +10,7 @@ struct Person { age: usize, } +// I AM NOT DONE // Steps: // 1. If the length of the provided string is 0, then return an error // 2. Split the given string on the commas present in it diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index ff77089a..255d2e1f 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -10,6 +10,7 @@ struct Person { age: usize, } +// I AM NOT DONE // Your task is to complete this implementation // in order for the line `let p = Person::try_from("Mark,20")` to compile // and return an Ok result of inner type Person. diff --git a/exercises/conversions/using_as.rs b/exercises/conversions/using_as.rs index 37eb69f2..54f96515 100644 --- a/exercises/conversions/using_as.rs +++ b/exercises/conversions/using_as.rs @@ -2,6 +2,7 @@ // Please note that the `as` operator is not only used when type casting. // It also helps with renaming imports. +// I AM NOT DONE // The goal is to make sure that the division does not fail to compile fn average(values: &[f64]) -> f64 { let total = values From 2021a1ac7d06fd70fd76f01c72ecc4584b7f73c2 Mon Sep 17 00:00:00 2001 From: Socrates Date: Sun, 22 Dec 2019 14:16:04 +0200 Subject: [PATCH 0005/1293] Update README.md Added an essential step to Windows installation process (Setting ExecutionPolicy to RemoteSigned because it wouldn't install otherwise). --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2796a6f8..7e760315 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,13 @@ This will install Rustlings and give you access to the `rustlings` command. Run ## Windows -You can run: +First, set `ExecutionPolicy` to `RemoteSigned`: + +```ps +Set-ExecutionPolicy RemoteSigned +``` + +Then, you can run: ```ps Invoke-WebRequest https://git.io/rustlings-win | Select-Object -ExpandProperty Content | Out-File $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 From dfdf8093ebbd4145864995627b812780de52f902 Mon Sep 17 00:00:00 2001 From: dmitri-mamrukov <37354211+dmitri-mamrukov@users.noreply.github.com> Date: Mon, 23 Dec 2019 21:37:09 -0500 Subject: [PATCH 0006/1293] Enable a test and improve per clippy's suggestion. --- exercises/conversions/as_ref_mut.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index 8a907031..5e80e508 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -13,7 +13,7 @@ fn byte_counter(arg: T) -> usize { // Obtain the number of characters (not bytes) in the given argument // Add the AsRef trait appropriately as a trait bound fn char_counter(arg: T) -> usize { - arg.as_ref().chars().collect::>().len() + arg.as_ref().chars().count() } fn main() { @@ -31,8 +31,10 @@ mod tests { let s = "CafΓ© au lait"; assert_ne!(char_counter(s), byte_counter(s)); } + + #[test] fn same_counts() { let s = "Cafe au lait"; assert_eq!(char_counter(s), byte_counter(s)); } -} \ No newline at end of file +} From d25ee55a3205882d35782e370af855051b39c58c Mon Sep 17 00:00:00 2001 From: Kate Hart Date: Sun, 22 Dec 2019 12:27:38 -0800 Subject: [PATCH 0007/1293] feat: Show a completion message when watching The completion message is shown only once all exercises succeed and are not annotated with "I AM NOT DONE." The watch command will also exit closes #251 --- src/main.rs | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index ebb61d6e..dd060aca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ use crate::exercise::{Exercise, ExerciseList}; use crate::run::run; use crate::verify::verify; use clap::{crate_version, App, Arg, SubCommand}; +use console::Emoji; use notify::DebouncedEvent; use notify::{RecommendedWatcher, RecursiveMode, Watcher}; use std::ffi::OsStr; @@ -102,7 +103,21 @@ fn main() { } if matches.subcommand_matches("watch").is_some() { - watch(&exercises).unwrap(); + if watch(&exercises).is_ok() { + println!( + "{emoji} All exercises completed! {emoji}", + emoji = Emoji("πŸŽ‰", "β˜…") + ); + println!(""); + println!("We hope you enjoyed learning about the various aspects of Rust!"); + println!( + "If you noticed any issues, please don't hesitate to report them to our repo." + ); + println!("You can also contribute your own exercises to help the greater community!"); + println!(""); + println!("Before reporting an issue or contributing, please read our guidelines:"); + println!("https://github.com/rust-lang/rustlings/blob/master/CONTRIBUTING.md"); + } } if matches.subcommand_name().is_none() { @@ -144,10 +159,12 @@ fn watch(exercises: &[Exercise]) -> notify::Result<()> { watcher.watch(Path::new("./exercises"), RecursiveMode::Recursive)?; clear_screen(); - let verify_result = verify(exercises.iter()); let to_owned_hint = |t: &Exercise| t.hint.to_owned(); - let failed_exercise_hint = Arc::new(Mutex::new(verify_result.map_err(to_owned_hint).err())); + let failed_exercise_hint = match verify(exercises.iter()) { + Ok(_) => return Ok(()), + Err(exercise) => Arc::new(Mutex::new(Some(to_owned_hint(exercise)))), + }; spawn_watch_shell(&failed_exercise_hint); loop { match rx.recv() { @@ -159,9 +176,13 @@ fn watch(exercises: &[Exercise]) -> notify::Result<()> { .iter() .skip_while(|e| !filepath.ends_with(&e.path)); clear_screen(); - let verify_result = verify(pending_exercises); - let mut failed_exercise_hint = failed_exercise_hint.lock().unwrap(); - *failed_exercise_hint = verify_result.map_err(to_owned_hint).err(); + match verify(pending_exercises) { + Ok(_) => return Ok(()), + Err(exercise) => { + let mut failed_exercise_hint = failed_exercise_hint.lock().unwrap(); + *failed_exercise_hint = Some(to_owned_hint(exercise)); + } + } } } _ => {} From fd57f8f2c1da2af8ddbebbccec214e6f40f4dbab Mon Sep 17 00:00:00 2001 From: gnodarse Date: Sun, 29 Dec 2019 19:15:32 -0500 Subject: [PATCH 0008/1293] Created consistent money unit --- exercises/functions/functions4.rs | 2 +- exercises/test1.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/functions/functions4.rs b/exercises/functions/functions4.rs index 6bf46f08..58637e4c 100644 --- a/exercises/functions/functions4.rs +++ b/exercises/functions/functions4.rs @@ -2,7 +2,7 @@ // Make me compile! Execute `rustlings hint functions4` for hints :) // This store is having a sale where if the price is an even number, you get -// 10 (money unit) off, but if it's an odd number, it's 3 (money unit) less. +// 10 Rustbucks off, but if it's an odd number, it's 3 Rustbucks off. // I AM NOT DONE diff --git a/exercises/test1.rs b/exercises/test1.rs index 3e13ce55..8b5b8fdd 100644 --- a/exercises/test1.rs +++ b/exercises/test1.rs @@ -3,7 +3,7 @@ // - Variables // - Functions -// Mary is buying apples. One apple usually costs 2 dollars, but if you buy +// Mary is buying apples. One apple usually costs 2 Rustbucks, but if you buy // more than 40 at once, each apple only costs 1! Write a function that calculates // the price of an order of apples given the order amount. No hints this time! From 32a9cf7b8d333250729eadee311584a51718f76a Mon Sep 17 00:00:00 2001 From: Harrison Metzger Date: Sat, 11 Jan 2020 02:42:45 -0600 Subject: [PATCH 0009/1293] fix: Update deps to version compatable with aarch64-pc-windows --- Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f8832d74..33a17a38 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,9 +6,9 @@ edition = "2018" [dependencies] clap = "2.32.0" -indicatif = "0.9.0" -console = "0.6.2" -notify = "4.0.0" +indicatif = "0.10.3" +console = "0.7.7" +notify = "4.0.15" toml = "0.4.10" regex = "1.1.6" serde = {version = "1.0.10", features = ["derive"]} From 0c73609e6f2311295e95d6f96f8c747cfc4cba03 Mon Sep 17 00:00:00 2001 From: Torben Jonas Date: Tue, 14 Jan 2020 21:06:43 +0100 Subject: [PATCH 0010/1293] feat: Add variables5.rs exercise closes #260 --- exercises/variables/variables5.rs | 11 +++++++++++ info.toml | 14 ++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 exercises/variables/variables5.rs diff --git a/exercises/variables/variables5.rs b/exercises/variables/variables5.rs new file mode 100644 index 00000000..47a68a55 --- /dev/null +++ b/exercises/variables/variables5.rs @@ -0,0 +1,11 @@ +// variables5.rs +// Make me compile! Execute the command `rustlings hint variables5` if you want a hint :) + +// I AM NOT DONE + +fn main() { + let number = "3"; + println!("Number {}", number); + number = 3; + println!("Number {}", number); +} diff --git a/info.toml b/info.toml index 3ca1824b..2e6b0b41 100644 --- a/info.toml +++ b/info.toml @@ -41,6 +41,20 @@ value. We can't print out something that isn't there; try giving x a value! This is an error that can cause bugs that's very easy to make in any programming language -- thankfully the Rust compiler has caught this for us!""" +[[exercises]] +name = "variables5" +path = "exercises/variables/variables5.rs" +mode = "compile" +hint = """ +In variables3 we already learned how to make an immutable variable mutable +using a special keyword. Unfortunately this doesn't help us much in this exercise +because we want to assign a different typed value to an existing variable. Sometimes +you may also like to reuse existing variable names because you are just converting +values to different types like in this exercise. +Fortunately Rust has a powerful solution to this problem: 'Shadowing'! +You can read more about 'Shadowing' in the book's section 'Variables and Mutability'. +Try to solve this exercise afterwards using this technique.""" + # IF [[exercises]] From ade52ffb739987287ddd5705944c8777705faed9 Mon Sep 17 00:00:00 2001 From: Paul Bissex Date: Sat, 25 Jan 2020 03:24:14 -0500 Subject: [PATCH 0011/1293] Fixed mangled sentence from book; edited for clarity --- exercises/enums/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exercises/enums/README.md b/exercises/enums/README.md index 220ac28d..a090a43e 100644 --- a/exercises/enums/README.md +++ b/exercises/enums/README.md @@ -1,6 +1,8 @@ ### Enums -Rust allows you to define a type called `enums` which allow you to enumerate possible values. In combination with enums, we have the concept of `pattern matching` in Rust, which makes it easy to run different code for different values of an enumeration. Enums, while available in many languages, Rust's enums are most similar to `algebraic data types` in functional languages, such as F#, OCaml, and Haskell. +Rust allows you to define types called "enums" which enumerate possible values. +Enums are a feature in many languages, but their capabilities differ in each language. Rust’s enums are most similar to algebraic data types in functional languages, such as F#, OCaml, and Haskell. +Useful in combination with enums is Rust's "pattern matching" facility, which makes it easy to run different code for different values of an enumeration. #### Book Sections From 39fa7ae8b70ad468da49b06f11b2383135a63bcf Mon Sep 17 00:00:00 2001 From: Jason Tsai Date: Wed, 29 Jan 2020 13:42:36 +0800 Subject: [PATCH 0012/1293] chore: Correct test command in tests1.rs comment --- exercises/tests/tests1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/tests/tests1.rs b/exercises/tests/tests1.rs index f3e36f29..50586a19 100644 --- a/exercises/tests/tests1.rs +++ b/exercises/tests/tests1.rs @@ -1,7 +1,7 @@ // tests1.rs // Tests are important to ensure that your code does what you think it should do. // Tests can be run on this file with the following command: -// rustlings run exercises/tests/tests1.rs +// rustlings run tests1 // This test has a problem with it -- make the test compile! Make the test // pass! Make the test fail! Execute `rustlings hint tests1` for hints :) From 43dc31193afddc15c78d2ceb57f7c68da90e8a46 Mon Sep 17 00:00:00 2001 From: Roberto Vidal Date: Thu, 20 Feb 2020 20:11:53 +0100 Subject: [PATCH 0013/1293] refactor: exercise evaluation Exercise evaluation (compilation + execution) now uses Results Success/failure messages are standardized --- src/exercise.rs | 76 ++++++++++++++++++++++++++++------ src/main.rs | 3 ++ src/run.rs | 54 ++++++++++++------------ src/ui.rs | 23 +++++++++++ src/verify.rs | 106 ++++++++++++++++++++++++------------------------ 5 files changed, 168 insertions(+), 94 deletions(-) create mode 100644 src/ui.rs diff --git a/src/exercise.rs b/src/exercise.rs index b6c28da4..d72eeb50 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -4,7 +4,7 @@ use std::fmt::{self, Display, Formatter}; use std::fs::{remove_file, File}; use std::io::Read; use std::path::PathBuf; -use std::process::{self, Command, Output}; +use std::process::{self, Command}; const RUSTC_COLOR_ARGS: &[&str] = &["--color", "always"]; const I_AM_DONE_REGEX: &str = r"(?m)^\s*///?\s*I\s+AM\s+NOT\s+DONE"; @@ -47,9 +47,34 @@ pub struct ContextLine { pub important: bool, } +pub struct CompiledExercise<'a> { + exercise: &'a Exercise, + _handle: FileHandle, +} + +impl<'a> CompiledExercise<'a> { + pub fn run(&self) -> Result { + self.exercise.run() + } +} + +#[derive(Debug)] +pub struct ExerciseOutput { + pub stdout: String, + pub stderr: String, +} + +struct FileHandle; + +impl Drop for FileHandle { + fn drop(&mut self) { + clean(); + } +} + impl Exercise { - pub fn compile(&self) -> Output { - match self.mode { + pub fn compile(&self) -> Result { + let cmd = match self.mode { Mode::Compile => Command::new("rustc") .args(&[self.path.to_str().unwrap(), "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) @@ -59,17 +84,37 @@ impl Exercise { .args(RUSTC_COLOR_ARGS) .output(), } - .expect("Failed to run 'compile' command.") + .expect("Failed to run 'compile' command."); + + if cmd.status.success() { + Ok(CompiledExercise { + exercise: &self, + _handle: FileHandle, + }) + } else { + clean(); + Err(ExerciseOutput { + stdout: String::from_utf8_lossy(&cmd.stdout).to_string(), + stderr: String::from_utf8_lossy(&cmd.stderr).to_string(), + }) + } } - pub fn run(&self) -> Output { - Command::new(&temp_file()) + fn run(&self) -> Result { + let cmd = Command::new(&temp_file()) .output() - .expect("Failed to run 'run' command") - } + .expect("Failed to run 'run' command"); - pub fn clean(&self) { - let _ignored = remove_file(&temp_file()); + let output = ExerciseOutput { + stdout: String::from_utf8_lossy(&cmd.stdout).to_string(), + stderr: String::from_utf8_lossy(&cmd.stderr).to_string(), + }; + + if cmd.status.success() { + Ok(output) + } else { + Err(output) + } } pub fn state(&self) -> State { @@ -121,6 +166,10 @@ impl Display for Exercise { } } +fn clean() { + let _ignored = remove_file(&temp_file()); +} + #[cfg(test)] mod test { use super::*; @@ -131,11 +180,12 @@ mod test { File::create(&temp_file()).unwrap(); let exercise = Exercise { name: String::from("example"), - path: PathBuf::from("example.rs"), - mode: Mode::Test, + path: PathBuf::from("tests/fixture/state/pending_exercise.rs"), + mode: Mode::Compile, hint: String::from(""), }; - exercise.clean(); + let compiled = exercise.compile().unwrap(); + drop(compiled); assert!(!Path::new(&temp_file()).exists()); } diff --git a/src/main.rs b/src/main.rs index dd060aca..4fd60831 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,9 @@ use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; +#[macro_use] +mod ui; + mod exercise; mod run; mod verify; diff --git a/src/run.rs b/src/run.rs index 1484351a..cfde7ab6 100644 --- a/src/run.rs +++ b/src/run.rs @@ -1,6 +1,5 @@ use crate::exercise::{Exercise, Mode}; use crate::verify::test; -use console::{style, Emoji}; use indicatif::ProgressBar; pub fn run(exercise: &Exercise) -> Result<(), ()> { @@ -11,42 +10,41 @@ pub fn run(exercise: &Exercise) -> Result<(), ()> { Ok(()) } -pub fn compile_and_run(exercise: &Exercise) -> Result<(), ()> { +fn compile_and_run(exercise: &Exercise) -> Result<(), ()> { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); - let compilecmd = exercise.compile(); + let compilation_result = exercise.compile(); + let compilation = match compilation_result { + Ok(compilation) => compilation, + Err(output) => { + progress_bar.finish_and_clear(); + warn!( + "Compilation of {} failed!, Compiler error message:\n", + exercise + ); + println!("{}", output.stderr); + return Err(()); + } + }; + progress_bar.set_message(format!("Running {}...", exercise).as_str()); - if compilecmd.status.success() { - let runcmd = exercise.run(); - progress_bar.finish_and_clear(); + let result = compilation.run(); + progress_bar.finish_and_clear(); - if runcmd.status.success() { - println!("{}", String::from_utf8_lossy(&runcmd.stdout)); - let formatstr = format!("{} Successfully ran {}", Emoji("βœ…", "βœ“"), exercise); - println!("{}", style(formatstr).green()); - exercise.clean(); + match result { + Ok(output) => { + println!("{}", output.stdout); + success!("Successfully ran {}", exercise); Ok(()) - } else { - println!("{}", String::from_utf8_lossy(&runcmd.stdout)); - println!("{}", String::from_utf8_lossy(&runcmd.stderr)); + } + Err(output) => { + println!("{}", output.stdout); + println!("{}", output.stderr); - let formatstr = format!("{} Ran {} with errors", Emoji("⚠️ ", "!"), exercise); - println!("{}", style(formatstr).red()); - exercise.clean(); + warn!("Ran {} with errors", exercise); Err(()) } - } else { - progress_bar.finish_and_clear(); - let formatstr = format!( - "{} Compilation of {} failed! Compiler error message:\n", - Emoji("⚠️ ", "!"), - exercise - ); - println!("{}", style(formatstr).red()); - println!("{}", String::from_utf8_lossy(&compilecmd.stderr)); - exercise.clean(); - Err(()) } } diff --git a/src/ui.rs b/src/ui.rs new file mode 100644 index 00000000..38cbaa40 --- /dev/null +++ b/src/ui.rs @@ -0,0 +1,23 @@ +macro_rules! warn { + ($fmt:literal, $ex:expr) => {{ + use console::{style, Emoji}; + let formatstr = format!($fmt, $ex); + println!( + "{} {}", + style(Emoji("⚠️ ", "!")).red(), + style(formatstr).red() + ); + }}; +} + +macro_rules! success { + ($fmt:literal, $ex:expr) => {{ + use console::{style, Emoji}; + let formatstr = format!($fmt, $ex); + println!( + "{} {}", + style(Emoji("βœ…", "βœ“")).green(), + style(formatstr).green() + ); + }}; +} diff --git a/src/verify.rs b/src/verify.rs index 3796bbde..3d148960 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -1,11 +1,11 @@ use crate::exercise::{Exercise, Mode, State}; -use console::{style, Emoji}; +use console::style; use indicatif::ProgressBar; pub fn verify<'a>(start_at: impl IntoIterator) -> Result<(), &'a Exercise> { for exercise in start_at { let compile_result = match exercise.mode { - Mode::Test => compile_and_test_interactively(&exercise), + Mode::Test => compile_and_test(&exercise, RunMode::Interactive), Mode::Compile => compile_only(&exercise), }; if !compile_result.unwrap_or(false) { @@ -15,8 +15,13 @@ pub fn verify<'a>(start_at: impl IntoIterator) -> Result<() Ok(()) } +enum RunMode { + Interactive, + NonInteractive, +} + pub fn test(exercise: &Exercise) -> Result<(), ()> { - compile_and_test(exercise, true)?; + compile_and_test(exercise, RunMode::NonInteractive)?; Ok(()) } @@ -24,69 +29,64 @@ fn compile_only(exercise: &Exercise) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); - let compile_output = exercise.compile(); + let compilation_result = exercise.compile(); progress_bar.finish_and_clear(); - if compile_output.status.success() { - let formatstr = format!("{} Successfully compiled {}!", Emoji("βœ…", "βœ“"), exercise); - println!("{}", style(formatstr).green()); - exercise.clean(); - Ok(prompt_for_completion(&exercise)) - } else { - let formatstr = format!( - "{} Compilation of {} failed! Compiler error message:\n", - Emoji("⚠️ ", "!"), - exercise - ); - println!("{}", style(formatstr).red()); - println!("{}", String::from_utf8_lossy(&compile_output.stderr)); - exercise.clean(); - Err(()) + + match compilation_result { + Ok(_) => { + success!("Successfully compiled {}!", exercise); + Ok(prompt_for_completion(&exercise)) + } + Err(output) => { + warn!( + "Compilation of {} failed! Compiler error message:\n", + exercise + ); + println!("{}", output.stderr); + Err(()) + } } } -fn compile_and_test_interactively(exercise: &Exercise) -> Result { - compile_and_test(exercise, false) -} - -fn compile_and_test(exercise: &Exercise, skip_prompt: bool) -> Result { +fn compile_and_test(exercise: &Exercise, run_mode: RunMode) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Testing {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); - let compile_output = exercise.compile(); - if compile_output.status.success() { - progress_bar.set_message(format!("Running {}...", exercise).as_str()); + let compilation_result = exercise.compile(); - let runcmd = exercise.run(); - progress_bar.finish_and_clear(); - - if runcmd.status.success() { - let formatstr = format!("{} Successfully tested {}!", Emoji("βœ…", "βœ“"), exercise); - println!("{}", style(formatstr).green()); - exercise.clean(); - Ok(skip_prompt || prompt_for_completion(exercise)) - } else { - let formatstr = format!( - "{} Testing of {} failed! Please try again. Here's the output:", - Emoji("⚠️ ", "!"), + let compilation = match compilation_result { + Ok(compilation) => compilation, + Err(output) => { + progress_bar.finish_and_clear(); + warn!( + "Compiling of {} failed! Please try again. Here's the output:", exercise ); - println!("{}", style(formatstr).red()); - println!("{}", String::from_utf8_lossy(&runcmd.stdout)); - exercise.clean(); + println!("{}", output.stderr); + return Err(()); + } + }; + + let result = compilation.run(); + progress_bar.finish_and_clear(); + + match result { + Ok(_) => { + if let RunMode::Interactive = run_mode { + Ok(prompt_for_completion(&exercise)) + } else { + Ok(true) + } + } + Err(output) => { + warn!( + "Testing of {} failed! Please try again. Here's the output:", + exercise + ); + println!("{}", output.stdout); Err(()) } - } else { - progress_bar.finish_and_clear(); - let formatstr = format!( - "{} Compiling of {} failed! Please try again. Here's the output:", - Emoji("⚠️ ", "!"), - exercise - ); - println!("{}", style(formatstr).red()); - println!("{}", String::from_utf8_lossy(&compile_output.stderr)); - exercise.clean(); - Err(()) } } From 17d0951e66fda8e11b204d5c4c41a0d5e22e78f7 Mon Sep 17 00:00:00 2001 From: Quinten Johnson Date: Fri, 21 Feb 2020 11:52:47 -0600 Subject: [PATCH 0014/1293] fix(installation): make fatal errors more obvious --- install.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/install.sh b/install.sh index 9cd6048d..85bdad79 100755 --- a/install.sh +++ b/install.sh @@ -7,7 +7,7 @@ if [ -x "$(command -v git)" ] then echo "SUCCESS: Git is installed" else - echo "WARNING: Git does not seem to be installed." + echo "ERROR: Git does not seem to be installed." echo "Please download Git using your package manager or over https://git-scm.com/!" exit 1 fi @@ -16,7 +16,7 @@ if [ -x "$(command -v rustc)" ] then echo "SUCCESS: Rust is installed" else - echo "WARNING: Rust does not seem to be installed." + echo "ERROR: Rust does not seem to be installed." echo "Please download Rust using https://rustup.rs!" exit 1 fi @@ -25,7 +25,7 @@ if [ -x "$(command -v cargo)" ] then echo "SUCCESS: Cargo is installed" else - echo "WARNING: Cargo does not seem to be installed." + echo "ERROR: Cargo does not seem to be installed." echo "Please download Rust and Cargo using https://rustup.rs!" exit 1 fi @@ -75,7 +75,7 @@ MinRustVersion=1.31 vercomp $RustVersion $MinRustVersion if [ $? -eq 2 ] then - echo "WARNING: Rust version is too old: $RustVersion - needs at least $MinRustVersion" + echo "ERROR: Rust version is too old: $RustVersion - needs at least $MinRustVersion" echo "Please update Rust with 'rustup update'" exit 1 else From bec8e3a644cbd88db1c73ea5f1d8a364f4a34016 Mon Sep 17 00:00:00 2001 From: sjmann Date: Sat, 22 Feb 2020 13:04:37 +0000 Subject: [PATCH 0015/1293] reworded missing exercise explanation --- exercises/standard_library_types/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/standard_library_types/README.md b/exercises/standard_library_types/README.md index 7f20b77b..94231b83 100644 --- a/exercises/standard_library_types/README.md +++ b/exercises/standard_library_types/README.md @@ -1,5 +1,5 @@ For the Arc exercise check out the chapter [Shared-State Concurrency](https://doc.rust-lang.org/book/ch16-03-shared-state.html) of the Rust Book. For the Iterator exercise check out the chapters [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html) of the Rust Book and the [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/). -Do not adjust your monitors-- iterators1.rs is indeed missing. iterators3.rs is a bit challenging so we're leaving space for some exercises to lead up to it! +Do not adjust your monitors-- iterators1.rs is indeed missing. Iterators is a challenging topic, so we're leaving space for a simpler exercice! From a3f70124dcc99ad5ec5f1ec73d8718644a8aa07e Mon Sep 17 00:00:00 2001 From: sjmann Date: Sat, 22 Feb 2020 14:28:07 +0000 Subject: [PATCH 0016/1293] fixed typo --- exercises/standard_library_types/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/standard_library_types/README.md b/exercises/standard_library_types/README.md index 94231b83..d138d874 100644 --- a/exercises/standard_library_types/README.md +++ b/exercises/standard_library_types/README.md @@ -1,5 +1,5 @@ For the Arc exercise check out the chapter [Shared-State Concurrency](https://doc.rust-lang.org/book/ch16-03-shared-state.html) of the Rust Book. For the Iterator exercise check out the chapters [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html) of the Rust Book and the [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/). -Do not adjust your monitors-- iterators1.rs is indeed missing. Iterators is a challenging topic, so we're leaving space for a simpler exercice! +Do not adjust your monitors-- iterators1.rs is indeed missing. Iterators is a challenging topic, so we're leaving space for a simpler exercise! From b559cdd73f32c0d0cfc1feda39f82b3e3583df17 Mon Sep 17 00:00:00 2001 From: sjmann Date: Tue, 25 Feb 2020 09:48:50 +0000 Subject: [PATCH 0017/1293] added traits exercises --- exercises/traits/traits1.rs | 44 +++++++++++++++++++++++++++++++++++++ exercises/traits/traits2.rs | 35 +++++++++++++++++++++++++++++ info.toml | 22 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 exercises/traits/traits1.rs create mode 100644 exercises/traits/traits2.rs diff --git a/exercises/traits/traits1.rs b/exercises/traits/traits1.rs new file mode 100644 index 00000000..8253ef80 --- /dev/null +++ b/exercises/traits/traits1.rs @@ -0,0 +1,44 @@ +// traits1.rs +// Time to implement some traits! +// +// Your task is to implement the trait +// `AppendBar' for the type `String'. +// +// The trait AppendBar has only one function, +// which appends "Bar" to any object +// implementing this trait. + +// I AM NOT DONE +trait AppendBar { + fn append_bar(self) -> Self; +} + +impl AppendBar for String { + //Add your code here + +} + +fn main() { + let s = String::from("Foo"); + let s = s.append_bar(); + println!("s: {}", s); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn is_FooBar() { + assert_eq!(String::from("Foo").append_bar(), String::from("FooBar")); + } + + #[test] + fn is_BarBar() { + assert_eq!( + String::from("").append_bar().append_bar(), + String::from("BarBar") + ); + } + +} \ No newline at end of file diff --git a/exercises/traits/traits2.rs b/exercises/traits/traits2.rs new file mode 100644 index 00000000..84c35f7c --- /dev/null +++ b/exercises/traits/traits2.rs @@ -0,0 +1,35 @@ +// traits2.rs +// +// Your task is to implement the trait +// `AppendBar' for a vector of strings. +// +// To implement this trait, consider for +// a moment what it means to 'append "Bar"' +// to a vector of strings. +// +// No boiler plate code this time, +// you can do this! Hints at the bottom. + +// I AM NOT DONE + +trait AppendBar { + fn append_bar(self) -> Self; +} + +//TODO: Add your code here + + + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn is_vec_pop_eq_bar() { + let mut foo = vec![String::from("Foo")].append_bar(); + assert_eq!(foo.pop().unwrap(), String::from("Bar")); + assert_eq!(foo.pop().unwrap(), String::from("Foo")); + } + +} \ No newline at end of file diff --git a/info.toml b/info.toml index 2e6b0b41..178a6f42 100644 --- a/info.toml +++ b/info.toml @@ -586,6 +586,28 @@ multiply the values into a mutable variable. Or you might write code more functionally with recursion and a match clause. But you can also use ranges and iterators to solve this in rust.""" +# TRAITS + +[[exercises]] +name = "traits1" +path = "exercises/traits/traits1.rs" +mode = "test" +hint = """ +A discussion about Traits in Rust can be found at: +https://doc.rust-lang.org/1.30.0/book/second-edition/ch10-02-traits.html +""" + +[[exercises]] +name = "traits2" +path = "exercises/traits/traits2.rs" +mode = "test" +hint = """ +Notice how the trait takes ownership of 'self',and returns `Self'. +Try mutating the incoming string vector. + +Vectors provide suitable methods for adding an element at the end. See +the documentation at: https://doc.rust-lang.org/std/vec/struct.Vec.html""" + # THREADS [[exercises]] From dc84aacc65392172164b728813449ecda8c3b6e6 Mon Sep 17 00:00:00 2001 From: Steven Mann Date: Tue, 25 Feb 2020 11:00:09 +0000 Subject: [PATCH 0018/1293] remove confusing comment wording --- exercises/traits/traits2.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/traits/traits2.rs b/exercises/traits/traits2.rs index 84c35f7c..7f5014d0 100644 --- a/exercises/traits/traits2.rs +++ b/exercises/traits/traits2.rs @@ -8,7 +8,7 @@ // to a vector of strings. // // No boiler plate code this time, -// you can do this! Hints at the bottom. +// you can do this! // I AM NOT DONE @@ -32,4 +32,4 @@ mod tests { assert_eq!(foo.pop().unwrap(), String::from("Foo")); } -} \ No newline at end of file +} From 8b971ffab6079a706ac925f5917f987932b55c07 Mon Sep 17 00:00:00 2001 From: Stig Johan Berggren Date: Tue, 25 Feb 2020 14:13:10 +0100 Subject: [PATCH 0019/1293] Enable test for exercise test4 --- exercises/test4.rs | 11 ++++++++--- info.toml | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/exercises/test4.rs b/exercises/test4.rs index c543a648..f3875cfb 100644 --- a/exercises/test4.rs +++ b/exercises/test4.rs @@ -7,8 +7,13 @@ // I AM NOT DONE -fn main() { - if my_macro!("world!") != "Hello world!" { - panic!("Oh no! Wrong output!"); +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_my_macro() { + assert_eq!(my_macro!("world!"), "Hello world!"); } } + diff --git a/info.toml b/info.toml index 2e6b0b41..4b89029c 100644 --- a/info.toml +++ b/info.toml @@ -369,7 +369,7 @@ The way macros are written, it wants to see something between each [[exercises]] name = "test4" path = "exercises/test4.rs" -mode = "compile" +mode = "test" hint = "No hints this time ;)" # MOVE SEMANTICS From a45486f2d05ce1081fab5709f629ae765368509b Mon Sep 17 00:00:00 2001 From: Stig Johan Berggren Date: Tue, 25 Feb 2020 14:18:31 +0100 Subject: [PATCH 0020/1293] Add a second test case --- exercises/test4.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/exercises/test4.rs b/exercises/test4.rs index f3875cfb..ad1f6ac5 100644 --- a/exercises/test4.rs +++ b/exercises/test4.rs @@ -12,8 +12,12 @@ mod tests { use super::*; #[test] - fn test_my_macro() { + fn test_my_macro_world() { assert_eq!(my_macro!("world!"), "Hello world!"); } -} + #[test] + fn test_my_macro_goodbye() { + assert_eq!(my_macro!("goodbye!"), "Hello goodbye!"); + } +} From 6eb62fa2cef6fecebbcb5bc5ac3bd1676fe04fe1 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 25 Feb 2020 23:00:19 +0100 Subject: [PATCH 0021/1293] 2.2.0 --- CHANGELOG.md | 30 ++++++++++ Cargo.lock | 153 +++++++++++++++++++-------------------------------- Cargo.toml | 2 +- README.md | 2 +- 4 files changed, 88 insertions(+), 99 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d54cbdf..6c20aede 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,33 @@ + +## 2.2.0 (2020-02-25) + + +#### Bug Fixes + +* Update deps to version compatable with aarch64-pc-windows (#263) ([19a93428](https://github.com/rust-lang/rustlings/commit/19a93428b3c73d994292671f829bdc8e5b7b3401)) +* **docs:** + * Added a necessary step to Windows installation process (#242) ([3906efcd](https://github.com/rust-lang/rustlings/commit/3906efcd52a004047b460ed548037093de3f523f)) + * Fixed mangled sentence from book; edited for clarity (#266) ([ade52ff](https://github.com/rust-lang/rustlings/commit/ade52ffb739987287ddd5705944c8777705faed9)) + * Updated iterators readme to account for iterators4 exercise (#273) ([bec8e3a](https://github.com/rust-lang/rustlings/commit/bec8e3a644cbd88db1c73ea5f1d8a364f4a34016)) +* **installation:** make fatal errors more obvious (#272) ([17d0951e](https://github.com/rust-lang/rustlings/commit/17d0951e66fda8e11b204d5c4c41a0d5e22e78f7)) +* **iterators2:** + * Remove reference to missing iterators2.rs (#245) ([419f7797](https://github.com/rust-lang/rustlings/commit/419f7797f294e4ce6a2b883199731b5bde77d262)) +* **as_ref_mut:** Enable a test and improve per clippy's suggestion (#256) ([dfdf809](https://github.com/rust-lang/rustlings/commit/dfdf8093ebbd4145864995627b812780de52f902)) +* **tests1:** + * Change test command ([fe10e06c](https://github.com/rust-lang/rustlings/commit/fe10e06c3733ddb4a21e90d09bf79bfe618e97ce) + * Correct test command in tests1.rs comment (#263) ([39fa7ae](https://github.com/rust-lang/rustlings/commit/39fa7ae8b70ad468da49b06f11b2383135a63bcf)) + +#### Features + +* Add variables5.rs exercise (#264) ([0c73609e](https://github.com/rust-lang/rustlings/commit/0c73609e6f2311295e95d6f96f8c747cfc4cba03)) +* Show a completion message when watching (#253) ([d25ee55a](https://github.com/rust-lang/rustlings/commit/d25ee55a3205882d35782e370af855051b39c58c)) +* Add type conversion and parsing exercises (#249) ([0c85dc11](https://github.com/rust-lang/rustlings/commit/0c85dc1193978b5165491b99cc4922caf8d14a65)) +* Created consistent money unit (#258) ([fd57f8f](https://github.com/rust-lang/rustlings/commit/fd57f8f2c1da2af8ddbebbccec214e6f40f4dbab)) +* Enable test for exercise test4 (#276) ([8b971ff](https://github.com/rust-lang/rustlings/commit/8b971ffab6079a706ac925f5917f987932b55c07)) +* Added traits exercises (#274 but specifically #216, which originally added + this :heart:) ([b559cdd](https://github.com/rust-lang/rustlings/commit/b559cdd73f32c0d0cfc1feda39f82b3e3583df17)) + + ## 2.1.0 (2019-11-27) diff --git a/Cargo.lock b/Cargo.lock index af159a82..9cbe5a1e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,13 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -[[package]] -name = "aho-corasick" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "aho-corasick" version = "0.7.3" @@ -21,7 +13,7 @@ name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -42,7 +34,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -74,17 +66,6 @@ dependencies = [ "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "clicolors-control" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "clicolors-control" version = "1.0.0" @@ -93,7 +74,7 @@ dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -106,23 +87,7 @@ dependencies = [ [[package]] name = "console" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "clicolors-control 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "console" -version = "0.7.5" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -134,7 +99,22 @@ dependencies = [ "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "console" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "clicolors-control 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -219,18 +199,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "indicatif" -version = "0.9.0" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "console 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "console 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "number_prefix 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "inotify" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -269,11 +250,6 @@ dependencies = [ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "lazy_static" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "lazy_static" version = "1.3.0" @@ -356,7 +332,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -366,20 +342,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "notify" -version = "4.0.12" +version = "4.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "filetime 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "fsevent 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "fsevent-sys 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "inotify 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "inotify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -390,6 +365,14 @@ dependencies = [ "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "number_prefix" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "numtoa" version = "0.1.0" @@ -417,7 +400,7 @@ dependencies = [ "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -477,7 +460,7 @@ dependencies = [ "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -525,7 +508,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -538,7 +521,7 @@ dependencies = [ "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -579,18 +562,6 @@ dependencies = [ "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "regex" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "regex" version = "1.1.6" @@ -603,14 +574,6 @@ dependencies = [ "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "regex-syntax" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "regex-syntax" version = "0.6.6" @@ -629,14 +592,14 @@ dependencies = [ [[package]] name = "rustlings" -version = "2.1.0" +version = "2.2.0" dependencies = [ "assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "console 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "console 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indicatif 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "notify 4.0.12 (registry+https://github.com/rust-lang/crates.io-index)", + "indicatif 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", + "notify 4.0.15 (registry+https://github.com/rust-lang/crates.io-index)", "predicates 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", @@ -806,7 +769,7 @@ version = "2.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -817,7 +780,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -839,7 +802,7 @@ name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -857,7 +820,6 @@ dependencies = [ ] [metadata] -"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" "checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2dc477793bd82ec39799b6f6b3df64938532fdf2ab0d49ef817eac65856a5a1e" @@ -866,11 +828,10 @@ dependencies = [ "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" -"checksum clicolors-control 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f84dec9bc083ce2503908cd305af98bd363da6f54bf8d4bf0ac14ee749ad5d1" "checksum clicolors-control 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "73abfd4c73d003a674ce5d2933fca6ce6c42480ea84a5ffe0a2dc39ed56300f9" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum console 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd48adf136733979b49e15bc3b4c43cc0d3c85ece7bd08e6daa414c6fcb13e6" -"checksum console 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2bf3720d3f3fc30b721ef1ae54e13af3264af4af39dc476a8de56a6ee1e2184b" +"checksum console 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8ca57c2c14b8a2bf3105bc9d15574aad80babf6a9c44b1058034cdf8bd169628" +"checksum console 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b147390a412132d75d10dd3b7b175a69cf5fd95032f7503c7091b8831ba10242" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90b2c9496c001e8cb61827acdefad780795c42264c137744cae6f7d9e3450abd" "checksum escargot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ceb9adbf9874d5d028b5e4c5739d22b71988252b25c9c98fe7cf9738bee84597" @@ -882,13 +843,12 @@ dependencies = [ "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" -"checksum indicatif 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a29b2fa6f00010c268bface64c18bb0310aaa70d46a195d5382d288c477fb016" -"checksum inotify 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "40b54539f3910d6f84fbf9a643efd6e3aa6e4f001426c0329576128255994718" +"checksum indicatif 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "40ecd1e2ee08e6c255ce890f5a99d17000850e664e7acf119fb03b25b0575bfe" +"checksum inotify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24e40d6fd5d64e2082e0c796495c8ef5ad667a96d03e5aaa0becfd9d47bcbfb8" "checksum inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e74a1aa87c59aeff6ef2cc2fa62d41bc43f54952f55652656b18a02fd5e356c0" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "6281b86796ba5e4366000be6e9e18bf35580adf9e63fbe2294aadb587613a319" @@ -900,8 +860,9 @@ dependencies = [ "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum normalize-line-endings 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2e0a1a39eab95caf4f5556da9289b9e68f0aafac901b2ce80daaf020d3b733a8" -"checksum notify 4.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = "3572d71f13ea8ed41867accd971fd564aa75934cf7a1fae03ddb8c74a8a49943" +"checksum notify 4.0.15 (registry+https://github.com/rust-lang/crates.io-index)" = "80ae4a7688d1fab81c5bf19c64fc8db920be8d519ce6336ed4e7efe024724dbd" "checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" +"checksum number_prefix 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dbf9993e59c894e3c08aa1c2712914e9e6bf1fcbfc6bef283e2183df345a4fee" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" @@ -923,9 +884,7 @@ dependencies = [ "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384" "checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" -"checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" "checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" @@ -953,7 +912,7 @@ dependencies = [ "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" +"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" diff --git a/Cargo.toml b/Cargo.toml index 33a17a38..f9f6073d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "2.1.0" +version = "2.2.0" authors = ["Marisa ", "Carol (Nichols || Goulding) Date: Wed, 26 Feb 2020 10:43:13 +0000 Subject: [PATCH 0022/1293] chore: update gitignore to ignore pdb files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 52fe4a79..4cf87f2f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target/ **/*.rs.bk .DS_Store +*.pdb \ No newline at end of file From 1e2fd9c92f8cd6e389525ca1a999fca4c90b5921 Mon Sep 17 00:00:00 2001 From: Mario Reder Date: Fri, 14 Feb 2020 15:25:03 +0100 Subject: [PATCH 0023/1293] feat: Add clippy lints - adds a new 'clippy' category for exercises - clippy exercises should throw no warnings - install script now also installs clippy is related to https://github.com/rust-lang/rust-clippy/issues/2604 --- .gitignore | 4 +++- exercises/clippy/README.md | 8 ++++++++ exercises/clippy/clippy1.rs | 15 +++++++++++++++ exercises/clippy/clippy2.rs | 13 +++++++++++++ info.toml | 16 ++++++++++++++++ install.ps1 | 13 +++++++++---- install.sh | 21 ++++++++++++--------- src/exercise.rs | 32 +++++++++++++++++++++++++++++++- src/run.rs | 1 + src/verify.rs | 2 ++ 10 files changed, 110 insertions(+), 15 deletions(-) create mode 100644 exercises/clippy/README.md create mode 100644 exercises/clippy/clippy1.rs create mode 100644 exercises/clippy/clippy2.rs diff --git a/.gitignore b/.gitignore index 4cf87f2f..de87c1e7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ target/ **/*.rs.bk .DS_Store -*.pdb \ No newline at end of file +*.pdb +exercises/clippy/Cargo.toml +exercises/clippy/Cargo.lock diff --git a/exercises/clippy/README.md b/exercises/clippy/README.md new file mode 100644 index 00000000..60a12fe5 --- /dev/null +++ b/exercises/clippy/README.md @@ -0,0 +1,8 @@ +### Clippy + +The Clippy tool is a collection of lints to analyze your code so you can catch common mistakes and improve your Rust code. + +If you used the installation script for Rustlings, Clippy should be already installed. +If not you can install it manually via `rustup component add clippy`. + +For more information about Clippy lints, please see [their documentation page](https://rust-lang.github.io/rust-clippy/master/). diff --git a/exercises/clippy/clippy1.rs b/exercises/clippy/clippy1.rs new file mode 100644 index 00000000..2b4c6354 --- /dev/null +++ b/exercises/clippy/clippy1.rs @@ -0,0 +1,15 @@ +// clippy1.rs +// The Clippy tool is a collection of lints to analyze your code +// so you can catch common mistakes and improve your Rust code. +// +// Execute `rustlings hint clippy1` for hints :) + +// I AM NOT DONE + +fn main() { + let x = 1.2331f64; + let y = 1.2332f64; + if y != x { + println!("Success!"); + } +} diff --git a/exercises/clippy/clippy2.rs b/exercises/clippy/clippy2.rs new file mode 100644 index 00000000..37af9ed0 --- /dev/null +++ b/exercises/clippy/clippy2.rs @@ -0,0 +1,13 @@ +// clippy2.rs +// Make me compile! Execute `rustlings hint clippy2` for hints :) + +// I AM NOT DONE + +fn main() { + let mut res = 42; + let option = Some(12); + for x in option { + res += x; + } + println!("{}", res); +} diff --git a/info.toml b/info.toml index b1c6db53..82c22b7a 100644 --- a/info.toml +++ b/info.toml @@ -529,6 +529,22 @@ hint = """ It should be doing some checking, returning an `Err` result if those checks fail, and only returning an `Ok` result if those checks determine that everything is... okay :)""" +# CLIPPY + +[[exercises]] +name = "clippy1" +path = "exercises/clippy/clippy1.rs" +mode = "clippy" +hint = """ +Floating point calculations are usually imprecise, so asking if two values are exactly equal is asking for trouble""" + +[[exercises]] +name = "clippy2" +path = "exercises/clippy/clippy2.rs" +mode = "clippy" +hint = """ +`for` loops over Option values are more clearly expressed as an `if let`""" + # STANDARD LIBRARY TYPES [[exercises]] diff --git a/install.ps1 b/install.ps1 index f6446100..04ea4a08 100644 --- a/install.ps1 +++ b/install.ps1 @@ -72,14 +72,19 @@ if (!($LASTEXITCODE -eq 0)) { # but anyone running pwsh 5 will have to pass the argument. $version = Invoke-WebRequest -UseBasicParsing https://api.github.com/repos/rust-lang/rustlings/releases/latest ` | ConvertFrom-Json | Select-Object -ExpandProperty tag_name -Write-Host "Checking out version $version..." -Set-Location $path -git checkout -q tags/$version Write-Host "Installing the 'rustlings' executable..." -cargo install --force --path . +cargo install --force --git https://github.com/rust-lang/rustlings --tag $version if (!(Get-Command rustlings -ErrorAction SilentlyContinue)) { Write-Host "WARNING: Please check that you have '~/.cargo/bin' in your PATH environment variable!" } +# Checking whether Clippy is installed. +# Due to a bug in Cargo, this must be done with Rustup: https://github.com/rust-lang/rustup/issues/1514 +$clippy = (rustup component list | Select-String "clippy" | Select-String "installed") | Out-String +if (!$clippy) { + Write-Host "Installing the 'cargo-clippy' executable..." + rustup component add clippy +} + Write-Host "All done! Run 'rustlings' to get started." diff --git a/install.sh b/install.sh index 85bdad79..10750617 100755 --- a/install.sh +++ b/install.sh @@ -82,21 +82,24 @@ else echo "SUCCESS: Rust is up to date" fi -Path=${1:-rustlings/} -echo "Cloning Rustlings at $Path..." -git clone -q https://github.com/rust-lang/rustlings $Path - Version=$(curl -s https://api.github.com/repos/rust-lang/rustlings/releases/latest | python -c "import json,sys;obj=json.load(sys.stdin);print(obj['tag_name']);") -echo "Checking out version $Version..." -cd $Path -git checkout -q tags/$Version +CargoBin="${CARGO_HOME:-$HOME/.cargo}/bin" echo "Installing the 'rustlings' executable..." -cargo install --force --path . +cargo install --force --git https://github.com/rust-lang/rustlings --tag $Version if ! [ -x "$(command -v rustlings)" ] then - echo "WARNING: Please check that you have '~/.cargo/bin' in your PATH environment variable!" + echo "WARNING: Please check that you have '$CargoBin' in your PATH environment variable!" +fi + +# Checking whether Clippy is installed. +# Due to a bug in Cargo, this must be done with Rustup: https://github.com/rust-lang/rustup/issues/1514 +Clippy=$(rustup component list | grep "clippy" | grep "installed") +if [ -z "$Clippy" ] +then + echo "Installing the 'cargo-clippy' executable..." + rustup component add clippy fi echo "All done! Run 'rustlings' to get started." diff --git a/src/exercise.rs b/src/exercise.rs index d72eeb50..30b18643 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -1,7 +1,7 @@ use regex::Regex; use serde::Deserialize; use std::fmt::{self, Display, Formatter}; -use std::fs::{remove_file, File}; +use std::fs::{self, remove_file, File}; use std::io::Read; use std::path::PathBuf; use std::process::{self, Command}; @@ -9,6 +9,7 @@ use std::process::{self, Command}; const RUSTC_COLOR_ARGS: &[&str] = &["--color", "always"]; const I_AM_DONE_REGEX: &str = r"(?m)^\s*///?\s*I\s+AM\s+NOT\s+DONE"; const CONTEXT: usize = 2; +const CLIPPY_CARGO_TOML_PATH: &str = "./exercises/clippy/Cargo.toml"; fn temp_file() -> String { format!("./temp_{}", process::id()) @@ -19,6 +20,7 @@ fn temp_file() -> String { pub enum Mode { Compile, Test, + Clippy, } #[derive(Deserialize)] @@ -83,6 +85,34 @@ impl Exercise { .args(&["--test", self.path.to_str().unwrap(), "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) .output(), + Mode::Clippy => { + let cargo_toml = format!( + r#"[package] +name = "{}" +version = "0.0.1" +edition = "2018" +[[bin]] +name = "{}" +path = "{}.rs""#, + self.name, self.name, self.name + ); + fs::write(CLIPPY_CARGO_TOML_PATH, cargo_toml) + .expect("Failed to write πŸ“Ž Clippy πŸ“Ž Cargo.toml file."); + // Due to an issue with Clippy, a cargo clean is required to catch all lints. + // See https://github.com/rust-lang/rust-clippy/issues/2604 + // This is already fixed on master branch. See this issue to track merging into Cargo: + // https://github.com/rust-lang/rust-clippy/issues/3837 + Command::new("cargo") + .args(&["clean", "--manifest-path", CLIPPY_CARGO_TOML_PATH]) + .args(RUSTC_COLOR_ARGS) + .output() + .expect("Failed to run 'cargo clean'"); + Command::new("cargo") + .args(&["clippy", "--manifest-path", CLIPPY_CARGO_TOML_PATH]) + .args(RUSTC_COLOR_ARGS) + .args(&["--", "-D", "warnings"]) + .output() + } } .expect("Failed to run 'compile' command."); diff --git a/src/run.rs b/src/run.rs index cfde7ab6..ebb0ae64 100644 --- a/src/run.rs +++ b/src/run.rs @@ -6,6 +6,7 @@ pub fn run(exercise: &Exercise) -> Result<(), ()> { match exercise.mode { Mode::Test => test(exercise)?, Mode::Compile => compile_and_run(exercise)?, + Mode::Clippy => compile_and_run(exercise)?, } Ok(()) } diff --git a/src/verify.rs b/src/verify.rs index 3d148960..229aa6d9 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -7,6 +7,7 @@ pub fn verify<'a>(start_at: impl IntoIterator) -> Result<() let compile_result = match exercise.mode { Mode::Test => compile_and_test(&exercise, RunMode::Interactive), Mode::Compile => compile_only(&exercise), + Mode::Clippy => compile_only(&exercise), }; if !compile_result.unwrap_or(false) { return Err(exercise); @@ -99,6 +100,7 @@ fn prompt_for_completion(exercise: &Exercise) -> bool { let success_msg = match exercise.mode { Mode::Compile => "The code is compiling!", Mode::Test => "The code is compiling, and the tests pass!", + Mode::Clippy => "The code is compiling, and πŸ“Ž Clippy πŸ“Ž is happy!", }; println!(""); From 3d9b03c52b8dc51b140757f6fd25ad87b5782ef5 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 27 Feb 2020 19:19:31 +0100 Subject: [PATCH 0024/1293] fix: Re-add cloning the repo to install scripts --- install.ps1 | 6 +++++- install.sh | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/install.ps1 b/install.ps1 index 04ea4a08..6504e69e 100644 --- a/install.ps1 +++ b/install.ps1 @@ -73,8 +73,12 @@ if (!($LASTEXITCODE -eq 0)) { $version = Invoke-WebRequest -UseBasicParsing https://api.github.com/repos/rust-lang/rustlings/releases/latest ` | ConvertFrom-Json | Select-Object -ExpandProperty tag_name +Write-Host "Checking out version $version..." +Set-Location $path +git checkout -q tags/$version + Write-Host "Installing the 'rustlings' executable..." -cargo install --force --git https://github.com/rust-lang/rustlings --tag $version +cargo install --force --path . if (!(Get-Command rustlings -ErrorAction SilentlyContinue)) { Write-Host "WARNING: Please check that you have '~/.cargo/bin' in your PATH environment variable!" } diff --git a/install.sh b/install.sh index 10750617..7abb4064 100755 --- a/install.sh +++ b/install.sh @@ -82,11 +82,19 @@ else echo "SUCCESS: Rust is up to date" fi +Path=${1:-rustlings/} +echo "Cloning Rustlings at $Path..." +git clone -q https://github.com/rust-lang/rustlings $Path + Version=$(curl -s https://api.github.com/repos/rust-lang/rustlings/releases/latest | python -c "import json,sys;obj=json.load(sys.stdin);print(obj['tag_name']);") CargoBin="${CARGO_HOME:-$HOME/.cargo}/bin" +echo "Checking out version $Version..." +cd $Path +git checkout -q tags/$Version + echo "Installing the 'rustlings' executable..." -cargo install --force --git https://github.com/rust-lang/rustlings --tag $Version +cargo install --force --path . if ! [ -x "$(command -v rustlings)" ] then From 8b9479071c0ac4f5dc1318358d7d7e3a19ce98e2 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 27 Feb 2020 19:22:55 +0100 Subject: [PATCH 0025/1293] 2.2.1 --- CHANGELOG.md | 11 +++++++++++ Cargo.toml | 2 +- README.md | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c20aede..af5b41c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ + +### 2.2.1 (2020-02-27) + +#### Bug Fixes + +* Re-add cloning the repo to install scripts ([3d9b03c5](https://github.com/rust-lang/rustlings/commit/3d9b03c52b8dc51b140757f6fd25ad87b5782ef5)) + +#### Features + +* Add clippy lints (#269) ([1e2fd9c9](https://github.com/rust-lang/rustlings/commit/1e2fd9c92f8cd6e389525ca1a999fca4c90b5921)) + ## 2.2.0 (2020-02-25) diff --git a/Cargo.toml b/Cargo.toml index f9f6073d..4e6ea2ba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "2.2.0" +version = "2.2.1" authors = ["Marisa ", "Carol (Nichols || Goulding) Date: Fri, 28 Feb 2020 00:09:08 +0000 Subject: [PATCH 0026/1293] feat: added new exercises for generics --- exercises/generics/README.md | 7 +++++ exercises/generics/generics1.rs | 10 ++++++++ exercises/generics/generics2.rs | 28 ++++++++++++++++++++ exercises/generics/generics3.rs | 45 +++++++++++++++++++++++++++++++++ info.toml | 32 +++++++++++++++++++++++ 5 files changed, 122 insertions(+) create mode 100644 exercises/generics/README.md create mode 100644 exercises/generics/generics1.rs create mode 100644 exercises/generics/generics2.rs create mode 100644 exercises/generics/generics3.rs diff --git a/exercises/generics/README.md b/exercises/generics/README.md new file mode 100644 index 00000000..7105f06f --- /dev/null +++ b/exercises/generics/README.md @@ -0,0 +1,7 @@ +### Generics + +In this section you'll learn about saving yourself many lines of code with generics! + +### Book Sections + +- [Generic Data Types](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html) \ No newline at end of file diff --git a/exercises/generics/generics1.rs b/exercises/generics/generics1.rs new file mode 100644 index 00000000..d075a4d2 --- /dev/null +++ b/exercises/generics/generics1.rs @@ -0,0 +1,10 @@ +// This shopping list program isn't compiling! +// Use your knowledge of generics to fix it. + +// I AM NOT DONE + +fn main() { + let mut shopping_list: Vec = Vec::new(); + shopping_list.push("milk"); +} + diff --git a/exercises/generics/generics2.rs b/exercises/generics/generics2.rs new file mode 100644 index 00000000..7b9bfc4f --- /dev/null +++ b/exercises/generics/generics2.rs @@ -0,0 +1,28 @@ +// This powerful wrapper provides the ability to store a positive integer value. +// Rewrite it using generics so that it supports wrapping ANY type. +struct Wrapper { + value: u32 +} + +impl Wrapper { + pub fn new(value: u32) -> Self { + Wrapper { value } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn store_u32_in_wrapper() { + assert_eq!(Wrapper::new(42).value, 42); + } + + #[test] + fn store_str_in_wrapper() { + // TODO: Delete this assert and uncomment the one below once you have finished the exercise. + assert!(false); + // assert_eq!(Wrapper::new("Foo").value, "Foo"); + } +} \ No newline at end of file diff --git a/exercises/generics/generics3.rs b/exercises/generics/generics3.rs new file mode 100644 index 00000000..e19142d2 --- /dev/null +++ b/exercises/generics/generics3.rs @@ -0,0 +1,45 @@ +// An imaginary magical school has a new report card generation system written in rust! +// Currently the system only supports creating report cards where the student's grade +// is represented numerically (e.g. 1.0 -> 5.5). However, the school also issues alphabetical grades +// (A+ -> F-) and needs to be able to print both types of report card! + +// Make the necessary code changes to support alphabetical report cards, thereby making the second +// test pass. + +pub struct ReportCard { + pub grade: f32, + pub student_name: String, + pub student_age: u8, +} + +impl ReportCard { + pub fn print(&self) -> String { + format!("{} ({}) - achieved a grade of {}", &self.student_name, &self.student_age, &self.grade) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn generate_numeric_report_card() { + let report_card = ReportCard { + grade: 2.1, + student_name: "Tom Wriggle".to_string(), + student_age: 12, + }; + assert_eq!(report_card.print(), "Tom Wriggle (12) - achieved a grade of 2.1"); + } + + #[test] + fn generate_alphabetic_report_card() { + // TODO: Make sure to change the grade here after you finish the exercise. + let report_card = ReportCard { + grade: 2.1, + student_name: "Gary Plotter".to_string(), + student_age: 11, + }; + assert_eq!(report_card.print(), "Gary Plotter (11) - achieved a grade of A+"); + } +} \ No newline at end of file diff --git a/info.toml b/info.toml index 178a6f42..8c8b1a54 100644 --- a/info.toml +++ b/info.toml @@ -608,6 +608,38 @@ Try mutating the incoming string vector. Vectors provide suitable methods for adding an element at the end. See the documentation at: https://doc.rust-lang.org/std/vec/struct.Vec.html""" +# Generics + +[[exercises]] +name = "generics1" +path = "exercises/generics/generics1.rs" +mode = "compile" +hint = """ +Vectors in rust make use of generics to create dynamically sized arrays of any type. +You need to tell the compiler what type we are pushing onto this vector.""" + +[[exercises]] +name = "generics2" +path = "exercises/generics/generics2.rs" +mode = "test" +hint = """ +Think carefully about what we need to do here. Currently we are wrapping only values of +type 'u32'. Maybe we need to update the explicit references to this data type somehow? +""" + +[[exercises]] +name = "generics3" +path = "exercises/generics/generics3_solution.rs" +mode = "test" +hint = """ +To find the best solution to this challenge you're going to need to think back to your +knowledge of traits, specifically Trait Bound Syntax - you may also need this: "use std::fmt::Display;" + +This is definitely harder than the last two exercises! You need to think about not only making the +ReportCard struct generic, but also the correct property - you will need to change the implementation +of the struct slightly too...you can do it! +""" + # THREADS [[exercises]] From 5b6e23c323a320ca8306c7645bead2132590624e Mon Sep 17 00:00:00 2001 From: sjmann Date: Fri, 28 Feb 2020 00:29:30 +0000 Subject: [PATCH 0027/1293] removed artifact from manual testing --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index d0ed053e..aff47ea1 100644 --- a/info.toml +++ b/info.toml @@ -645,7 +645,7 @@ type 'u32'. Maybe we need to update the explicit references to this data type so [[exercises]] name = "generics3" -path = "exercises/generics/generics3_solution.rs" +path = "exercises/generics/generics3.rs" mode = "test" hint = """ To find the best solution to this challenge you're going to need to think back to your From 0f8001ea449c278faea0e731b49a5eb3dcd28634 Mon Sep 17 00:00:00 2001 From: sjmann Date: Fri, 28 Feb 2020 00:31:55 +0000 Subject: [PATCH 0028/1293] add I AM NOT DONE comments --- exercises/generics/generics2.rs | 2 ++ exercises/generics/generics3.rs | 1 + 2 files changed, 3 insertions(+) diff --git a/exercises/generics/generics2.rs b/exercises/generics/generics2.rs index 7b9bfc4f..1fe5041f 100644 --- a/exercises/generics/generics2.rs +++ b/exercises/generics/generics2.rs @@ -1,5 +1,7 @@ // This powerful wrapper provides the ability to store a positive integer value. // Rewrite it using generics so that it supports wrapping ANY type. + +// I AM NOT DONE struct Wrapper { value: u32 } diff --git a/exercises/generics/generics3.rs b/exercises/generics/generics3.rs index e19142d2..cd3232a4 100644 --- a/exercises/generics/generics3.rs +++ b/exercises/generics/generics3.rs @@ -6,6 +6,7 @@ // Make the necessary code changes to support alphabetical report cards, thereby making the second // test pass. +// I AM NOT DONE pub struct ReportCard { pub grade: f32, pub student_name: String, From 135e5d47a7c395aece6f6022117fb20c82f2d3d4 Mon Sep 17 00:00:00 2001 From: Sanjay K Date: Thu, 5 Mar 2020 15:52:54 -0500 Subject: [PATCH 0029/1293] feat: added excercise for option --- Cargo.lock | 2 +- exercises/option/README.md | 9 +++++++++ exercises/option/option1.rs | 23 +++++++++++++++++++++++ info.toml | 16 +++++++++++++++- 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 exercises/option/README.md create mode 100644 exercises/option/option1.rs diff --git a/Cargo.lock b/Cargo.lock index 9cbe5a1e..a08dee50 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -592,7 +592,7 @@ dependencies = [ [[package]] name = "rustlings" -version = "2.2.0" +version = "2.2.1" dependencies = [ "assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/exercises/option/README.md b/exercises/option/README.md new file mode 100644 index 00000000..d17b79cc --- /dev/null +++ b/exercises/option/README.md @@ -0,0 +1,9 @@ +### Option + +#### Book Sections + +To learn about Option, check out these links: + +- [Option Enum Format](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-enum-definitions) +- [Option Module Documentation](https://doc.rust-lang.org/std/option/) +- [Option Enum Documentation](https://doc.rust-lang.org/std/option/enum.Option.html) diff --git a/exercises/option/option1.rs b/exercises/option/option1.rs new file mode 100644 index 00000000..eb32ccb5 --- /dev/null +++ b/exercises/option/option1.rs @@ -0,0 +1,23 @@ +//option1.rs +//Make me compile! Execute `rustlings hint option1` for hints + +//I AM NOT DONE + +//you can modify anything EXCEPT for this function's sig +fn print_number(maybe_number: Option) { + println!("printing: {}", *maybe_number); +} + +fn main() { + print_number(13); + print_number(99); + + let mut numbers: [Option; 5]; + for iter in 0..5 { + let number_to_add: u16 = { + ((iter * 5) + 2) / (4 * 16); + }; + + numbers[iter] = number_to_add; + } +} \ No newline at end of file diff --git a/info.toml b/info.toml index 82c22b7a..44905510 100644 --- a/info.toml +++ b/info.toml @@ -701,4 +701,18 @@ path = "exercises/conversions/from_str.rs" mode = "test" hint = """ If you've already solved try_from_into.rs, then this is almost a copy-paste. -Otherwise, go ahead and solve try_from_into.rs first.""" \ No newline at end of file +Otherwise, go ahead and solve try_from_into.rs first.""" + +[[exercises]] +name = "option1" +path = "exercises/option/option1.rs" +mode = "compile" +hint = """ +Check out some functions of Option: +is_some +is_none +unwrap + +and: +pattern matching +""" \ No newline at end of file From bc22ec382f843347333ef1301fc1bad773657f38 Mon Sep 17 00:00:00 2001 From: skim Date: Tue, 10 Mar 2020 15:21:37 -0700 Subject: [PATCH 0030/1293] adds additional test to meet exercise rules --- exercises/conversions/from_into.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs index 666f234b..58b860e9 100644 --- a/exercises/conversions/from_into.rs +++ b/exercises/conversions/from_into.rs @@ -70,4 +70,11 @@ mod tests { assert_eq!(p.name, "Mark"); assert_eq!(p.age, 20); } + #[test] + fn test_bad_age() { + // Test that "Mark.twenty" will return the default person due to an error in parsing age + let p = Person::from("Mark,twenty"); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 30); + } } From 6d3a412d4768a06dc69b5f1c9d5ebc9bc7f42650 Mon Sep 17 00:00:00 2001 From: Sanjay K Date: Wed, 11 Mar 2020 13:44:10 -0400 Subject: [PATCH 0031/1293] Update option1.rs --- exercises/option/option1.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/option/option1.rs b/exercises/option/option1.rs index eb32ccb5..c5b67b80 100644 --- a/exercises/option/option1.rs +++ b/exercises/option/option1.rs @@ -5,7 +5,7 @@ //you can modify anything EXCEPT for this function's sig fn print_number(maybe_number: Option) { - println!("printing: {}", *maybe_number); + println!("printing: {}", maybe_number.unwrap()); } fn main() { @@ -20,4 +20,4 @@ fn main() { numbers[iter] = number_to_add; } -} \ No newline at end of file +} From 9788496a8588592e99d66ca9f5428531ce7f3155 Mon Sep 17 00:00:00 2001 From: Sanjay K Date: Wed, 11 Mar 2020 13:44:41 -0400 Subject: [PATCH 0032/1293] Update option1.rs --- exercises/option/option1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/option/option1.rs b/exercises/option/option1.rs index c5b67b80..91da0bee 100644 --- a/exercises/option/option1.rs +++ b/exercises/option/option1.rs @@ -15,7 +15,7 @@ fn main() { let mut numbers: [Option; 5]; for iter in 0..5 { let number_to_add: u16 = { - ((iter * 5) + 2) / (4 * 16); + ((iter * 5) + 2) / (4 * 16) }; numbers[iter] = number_to_add; From 30e6af60690c326fb5d3a9b7335f35c69c09137d Mon Sep 17 00:00:00 2001 From: Vincent Jousse Date: Thu, 26 Mar 2020 15:22:22 +0100 Subject: [PATCH 0033/1293] Don't hardcode documentation version for traits --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 82c22b7a..7bd3f794 100644 --- a/info.toml +++ b/info.toml @@ -610,7 +610,7 @@ path = "exercises/traits/traits1.rs" mode = "test" hint = """ A discussion about Traits in Rust can be found at: -https://doc.rust-lang.org/1.30.0/book/second-edition/ch10-02-traits.html +https://doc.rust-lang.org/book/ch10-02-traits.html """ [[exercises]] From 6deee7e3e92ac717e356b99180acaaf03a54b750 Mon Sep 17 00:00:00 2001 From: Sanjay K Date: Thu, 2 Apr 2020 08:40:59 -0400 Subject: [PATCH 0034/1293] fixed spacing --- exercises/option/option1.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exercises/option/option1.rs b/exercises/option/option1.rs index eb32ccb5..e81620d9 100644 --- a/exercises/option/option1.rs +++ b/exercises/option/option1.rs @@ -1,9 +1,9 @@ -//option1.rs -//Make me compile! Execute `rustlings hint option1` for hints +// option1.rs +// Make me compile! Execute `rustlings hint option1` for hints -//I AM NOT DONE +// I AM NOT DONE -//you can modify anything EXCEPT for this function's sig +// you can modify anything EXCEPT for this function's sig fn print_number(maybe_number: Option) { println!("printing: {}", *maybe_number); } From 3f8171475cd1a660bc6fe1798de8442c0db9efff Mon Sep 17 00:00:00 2001 From: Sanjay K Date: Sun, 5 Apr 2020 09:45:07 -0400 Subject: [PATCH 0035/1293] updated info.toml --- info.toml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/info.toml b/info.toml index 44905510..d8eaef5f 100644 --- a/info.toml +++ b/info.toml @@ -520,6 +520,20 @@ function `unwrap_or`. Or use an `if let` statement on the result of `pop()` to both destructure a `Some` value and only print out something if we have a value!""" +[[exercises]] +name = "option1" +path = "exercises/option/option1.rs" +mode = "compile" +hint = """ +Check out some functions of Option: +is_some +is_none +unwrap + +and: +pattern matching +""" + [[exercises]] name = "result1" path = "exercises/error_handling/result1.rs" @@ -701,18 +715,4 @@ path = "exercises/conversions/from_str.rs" mode = "test" hint = """ If you've already solved try_from_into.rs, then this is almost a copy-paste. -Otherwise, go ahead and solve try_from_into.rs first.""" - -[[exercises]] -name = "option1" -path = "exercises/option/option1.rs" -mode = "compile" -hint = """ -Check out some functions of Option: -is_some -is_none -unwrap - -and: -pattern matching -""" \ No newline at end of file +Otherwise, go ahead and solve try_from_into.rs first.""" \ No newline at end of file From 3b6d5c3aaa27a242a832799eb66e96897d26fde3 Mon Sep 17 00:00:00 2001 From: Roberto Vidal Date: Wed, 26 Feb 2020 20:38:44 +0100 Subject: [PATCH 0036/1293] feature: makes "compile" exercise print output, resolves #270 When running "compile"-mode exercises in interactive `verify` mode, we print their output when we prompt the learner if they want to continue. This improves the "experimentation" experience, since trying different things does produce a visible change. --- exercises/primitive_types/primitive_types4.rs | 3 - src/verify.rs | 98 +++++++++++++------ tests/integration_tests.rs | 2 +- 3 files changed, 67 insertions(+), 36 deletions(-) diff --git a/exercises/primitive_types/primitive_types4.rs b/exercises/primitive_types/primitive_types4.rs index 10b553e9..d0c23361 100644 --- a/exercises/primitive_types/primitive_types4.rs +++ b/exercises/primitive_types/primitive_types4.rs @@ -8,7 +8,4 @@ fn slice_out_of_array() { let a = [1, 2, 3, 4, 5]; - let nice_slice = ??? - - assert_eq!([2, 3, 4], nice_slice) } diff --git a/src/verify.rs b/src/verify.rs index 229aa6d9..c9a7b6b8 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -1,4 +1,4 @@ -use crate::exercise::{Exercise, Mode, State}; +use crate::exercise::{CompiledExercise, Exercise, Mode, State}; use console::style; use indicatif::ProgressBar; @@ -6,7 +6,7 @@ pub fn verify<'a>(start_at: impl IntoIterator) -> Result<() for exercise in start_at { let compile_result = match exercise.mode { Mode::Test => compile_and_test(&exercise, RunMode::Interactive), - Mode::Compile => compile_only(&exercise), + Mode::Compile => compile_and_run_interactively(&exercise), Mode::Clippy => compile_only(&exercise), }; if !compile_result.unwrap_or(false) { @@ -30,23 +30,37 @@ fn compile_only(exercise: &Exercise) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); - let compilation_result = exercise.compile(); + + let _ = compile(&exercise, &progress_bar)?; progress_bar.finish_and_clear(); - match compilation_result { - Ok(_) => { - success!("Successfully compiled {}!", exercise); - Ok(prompt_for_completion(&exercise)) - } + success!("Successfully compiled {}!", exercise); + Ok(prompt_for_completion(&exercise, None)) +} + +fn compile_and_run_interactively(exercise: &Exercise) -> Result { + let progress_bar = ProgressBar::new_spinner(); + progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); + progress_bar.enable_steady_tick(100); + + let compilation = compile(&exercise, &progress_bar)?; + + progress_bar.set_message(format!("Running {}...", exercise).as_str()); + let result = compilation.run(); + progress_bar.finish_and_clear(); + + let output = match result { + Ok(output) => output, Err(output) => { - warn!( - "Compilation of {} failed! Compiler error message:\n", - exercise - ); - println!("{}", output.stderr); - Err(()) + warn!("Ran {} with errors", exercise); + println!("{}", output.stdout); + return Err(()); } - } + }; + + success!("Successfully ran {}!", exercise); + + Ok(prompt_for_completion(&exercise, Some(output.stdout))) } fn compile_and_test(exercise: &Exercise, run_mode: RunMode) -> Result { @@ -54,28 +68,15 @@ fn compile_and_test(exercise: &Exercise, run_mode: RunMode) -> Result progress_bar.set_message(format!("Testing {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); - let compilation_result = exercise.compile(); - - let compilation = match compilation_result { - Ok(compilation) => compilation, - Err(output) => { - progress_bar.finish_and_clear(); - warn!( - "Compiling of {} failed! Please try again. Here's the output:", - exercise - ); - println!("{}", output.stderr); - return Err(()); - } - }; - + let compilation = compile(exercise, &progress_bar)?; let result = compilation.run(); progress_bar.finish_and_clear(); match result { Ok(_) => { + success!("Successfully tested {}", &exercise); if let RunMode::Interactive = run_mode { - Ok(prompt_for_completion(&exercise)) + Ok(prompt_for_completion(&exercise, None)) } else { Ok(true) } @@ -91,7 +92,27 @@ fn compile_and_test(exercise: &Exercise, run_mode: RunMode) -> Result } } -fn prompt_for_completion(exercise: &Exercise) -> bool { +fn compile<'a, 'b>( + exercise: &'a Exercise, + progress_bar: &'b ProgressBar, +) -> Result, ()> { + let compilation_result = exercise.compile(); + + match compilation_result { + Ok(compilation) => Ok(compilation), + Err(output) => { + progress_bar.finish_and_clear(); + warn!( + "Compiling of {} failed! Please try again. Here's the output:", + exercise + ); + println!("{}", output.stderr); + Err(()) + } + } +} + +fn prompt_for_completion(exercise: &Exercise, prompt_output: Option) -> bool { let context = match exercise.state() { State::Done => return true, State::Pending(context) => context, @@ -106,6 +127,15 @@ fn prompt_for_completion(exercise: &Exercise) -> bool { println!(""); println!("πŸŽ‰ πŸŽ‰ {} πŸŽ‰ πŸŽ‰", success_msg); println!(""); + + if let Some(output) = prompt_output { + println!("Output:"); + println!("{}", separator()); + println!("{}", output); + println!("{}", separator()); + println!(""); + } + println!("You can keep working on this exercise,"); println!( "or jump into the next one by removing the {} comment:", @@ -129,3 +159,7 @@ fn prompt_for_completion(exercise: &Exercise) -> bool { false } + +fn separator() -> console::StyledObject<&'static str> { + style("====================").bold() +} diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 71317005..683e5640 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -31,7 +31,7 @@ fn verify_all_success() { } #[test] -fn verify_all_failure() { +fn verify_fails_if_some_fails() { Command::cargo_bin("rustlings") .unwrap() .arg("v") From dab90f7b91a6000fe874e3d664f244048e5fa342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Tue, 7 Apr 2020 17:00:45 +0200 Subject: [PATCH 0037/1293] Remove duplicate not done comment As indicated in #259 , I found it confusing to have 2 comments as the code wouldn't compile unless I solved both issues (I used the script from #281 to remove a comment and use `:wn` to go to next exercise, hence this tripped me). --- exercises/conversions/as_ref_mut.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index 5e80e508..2ab63acb 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -2,7 +2,6 @@ // Read more about them at https://doc.rust-lang.org/std/convert/trait.AsRef.html // and https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively. -// I AM NOT DONE // Obtain the number of bytes (not characters) in the given argument // Add the AsRef trait appropriately as a trait bound fn byte_counter(arg: T) -> usize { From 86b5c08b9bea1576127a7c5f599f5752072c087d Mon Sep 17 00:00:00 2001 From: Sanjay K Date: Tue, 7 Apr 2020 14:16:10 -0400 Subject: [PATCH 0038/1293] feat: Add Option2 exercise (#290) * added option2 * changed up the exercise, modified the help section * Update exercises/option/option2.rs Co-Authored-By: fmoko * Update exercises/option/option2.rs Co-Authored-By: fmoko * Update exercises/option/option2.rs Co-Authored-By: fmoko Co-authored-by: fmoko --- exercises/option/option2.rs | 25 +++++++++++++++++++++++++ info.toml | 15 +++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 exercises/option/option2.rs diff --git a/exercises/option/option2.rs b/exercises/option/option2.rs new file mode 100644 index 00000000..a55f734e --- /dev/null +++ b/exercises/option/option2.rs @@ -0,0 +1,25 @@ +// option2.rs +// Make me compile! Execute `rustlings hint option2` for hints + +// I AM NOT DONE + +fn main() { + let optional_value = Some(String::from("rustlings")); + // Make this an if let statement whose value is "Some" type + value = optional_value { + println!("the value of optional value is: {}", value); + } else { + println!("The optional value doesn't contain anything!"); + } + + let mut optional_values_vec: Vec> = Vec::new(); + for x in 1..10 { + optional_values_vec.push(Some(x)); + } + + // make this a while let statement - remember that vector.pop also adds another layer of Option + // You can stack `Option`'s into while let and if let + value = optional_values_vec.pop() { + println!("current value: {}", value); + } +} diff --git a/info.toml b/info.toml index ec8da2c8..04a90cf0 100644 --- a/info.toml +++ b/info.toml @@ -534,6 +534,21 @@ and: pattern matching """ +[[exercises]] +name = "option2" +path = "exercises/option/option2.rs" +mode = "compile" +hint = """ +check out: +https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html +https://doc.rust-lang.org/rust-by-example/flow_control/while_let.html + +Remember that Options can be stacked in if let and while let. +For example: Some(Some(variable)) = variable2 + + +""" + [[exercises]] name = "result1" path = "exercises/error_handling/result1.rs" From b3a3351e8e6a0bdee07077d7b0382953821649ae Mon Sep 17 00:00:00 2001 From: Roberto Vidal Date: Wed, 8 Apr 2020 10:42:35 +0200 Subject: [PATCH 0039/1293] fix: revert primitive_types4 (#296) --- exercises/primitive_types/primitive_types4.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/exercises/primitive_types/primitive_types4.rs b/exercises/primitive_types/primitive_types4.rs index d0c23361..10b553e9 100644 --- a/exercises/primitive_types/primitive_types4.rs +++ b/exercises/primitive_types/primitive_types4.rs @@ -8,4 +8,7 @@ fn slice_out_of_array() { let a = [1, 2, 3, 4, 5]; + let nice_slice = ??? + + assert_eq!([2, 3, 4], nice_slice) } From 60393999b842227c24595d11a336786504d8922d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Wed, 8 Apr 2020 11:00:11 +0200 Subject: [PATCH 0040/1293] remove bottom comment instead of top --- exercises/conversions/as_ref_mut.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index 2ab63acb..aa1e6239 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -2,13 +2,13 @@ // Read more about them at https://doc.rust-lang.org/std/convert/trait.AsRef.html // and https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively. +// I AM NOT DONE // Obtain the number of bytes (not characters) in the given argument // Add the AsRef trait appropriately as a trait bound fn byte_counter(arg: T) -> usize { arg.as_ref().as_bytes().len() } -// I AM NOT DONE // Obtain the number of characters (not bytes) in the given argument // Add the AsRef trait appropriately as a trait bound fn char_counter(arg: T) -> usize { From b049fa2c84dba0f0c8906ac44e28fd45fba51a71 Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 8 Apr 2020 11:54:23 +0200 Subject: [PATCH 0041/1293] feat(ci): add buildkite config --- buildkite.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 buildkite.yml diff --git a/buildkite.yml b/buildkite.yml new file mode 100644 index 00000000..91a0753c --- /dev/null +++ b/buildkite.yml @@ -0,0 +1,5 @@ +steps: + - label: "Test with stable" + command: rustup run stable cargo test + - label: "Test with beta" + command: rustup run beta cargo test From 495174ff7cb8782b25a4c67cb4d7a966ef468b83 Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 8 Apr 2020 12:10:02 +0200 Subject: [PATCH 0042/1293] chore: remove travis ci And add a buildkite build status badge --- .travis.yml | 11 ----------- README.md | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index d32179a6..00000000 --- a/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -language: rust -rust: - - stable - - beta - - nightly -script: cargo test --verbose -matrix: - allow_failures: - - rust: nightly - fast_finish: true -cache: cargo \ No newline at end of file diff --git a/README.md b/README.md index cadceb57..9dd3b2b3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -# rustlings πŸ¦€β€οΈ +# rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages! From 3ab084a421c0f140ae83bf1fc3f47b39342e7373 Mon Sep 17 00:00:00 2001 From: Rohan Jain Date: Wed, 8 Apr 2020 10:00:29 +0530 Subject: [PATCH 0043/1293] fix(run): compile clippy exercise files Additionally to running clippy, also compile the exercise file so that `rustling run clippy1` works after a successful completion of the exercise. closes #291 Signed-off-by: Rohan Jain --- src/exercise.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/exercise.rs b/src/exercise.rs index 30b18643..d1eaa1a6 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -98,6 +98,15 @@ path = "{}.rs""#, ); fs::write(CLIPPY_CARGO_TOML_PATH, cargo_toml) .expect("Failed to write πŸ“Ž Clippy πŸ“Ž Cargo.toml file."); + // To support the ability to run the clipy exercises, build + // an executable, in addition to running clippy. With a + // compilation failure, this would silently fail. But we expect + // clippy to reflect the same failure while compiling later. + Command::new("rustc") + .args(&[self.path.to_str().unwrap(), "-o", &temp_file()]) + .args(RUSTC_COLOR_ARGS) + .output() + .expect("Failed to compile!"); // Due to an issue with Clippy, a cargo clean is required to catch all lints. // See https://github.com/rust-lang/rust-clippy/issues/2604 // This is already fixed on master branch. See this issue to track merging into Cargo: From 2b80f6ed41c9086a197e5087fecab341e3680e34 Mon Sep 17 00:00:00 2001 From: fmoko Date: Sat, 11 Apr 2020 17:27:10 +0200 Subject: [PATCH 0044/1293] chore: Remove duplicate `option1` exercise --- info.toml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/info.toml b/info.toml index 04a90cf0..632e6ee7 100644 --- a/info.toml +++ b/info.toml @@ -509,17 +509,6 @@ https://doc.rust-lang.org/std/result/#results-must-be-used""" # OPTIONS / RESULTS -[[exercises]] -name = "option1" -path = "exercises/error_handling/option1.rs" -mode = "test" -hint = """ -Try using a `match` statement where the arms are `Some(thing)` and `None`. -Or set a default value to print out if you get `None` by using the -function `unwrap_or`. -Or use an `if let` statement on the result of `pop()` to both destructure -a `Some` value and only print out something if we have a value!""" - [[exercises]] name = "option1" path = "exercises/option/option1.rs" @@ -762,4 +751,4 @@ path = "exercises/conversions/from_str.rs" mode = "test" hint = """ If you've already solved try_from_into.rs, then this is almost a copy-paste. -Otherwise, go ahead and solve try_from_into.rs first.""" \ No newline at end of file +Otherwise, go ahead and solve try_from_into.rs first.""" From 2ff3f7ae13491cde7f68336fa746d2f07b5a9056 Mon Sep 17 00:00:00 2001 From: mokou Date: Sun, 12 Apr 2020 00:00:38 +0200 Subject: [PATCH 0045/1293] 3.0.0 --- CHANGELOG.md | 23 +++++++++++++++++++++++ Cargo.toml | 4 ++-- README.md | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af5b41c9..f72c9607 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ + +## 3.0.0 (2020-04-11) + +#### Breaking Changes + +* make "compile" exercises print output (#278) ([3b6d5c](https://github.com/fmoko/rustlings/commit/3b6d5c3aaa27a242a832799eb66e96897d26fde3)) + +#### Bug Fixes + +* **primitive_types:** revert primitive_types4 (#296) ([b3a3351e](https://github.com/rust-lang/rustlings/commit/b3a3351e8e6a0bdee07077d7b0382953821649ae)) +* **run:** compile clippy exercise files (#295) ([3ab084a4](https://github.com/rust-lang/rustlings/commit/3ab084a421c0f140ae83bf1fc3f47b39342e7373)) +* **conversions:** + * add additional test to meet exercise rules (#284) ([bc22ec3](https://github.com/fmoko/rustlings/commit/bc22ec382f843347333ef1301fc1bad773657f38)) + * remove duplicate not done comment (#292) ([dab90f](https://github.com/fmoko/rustlings/commit/dab90f7b91a6000fe874e3d664f244048e5fa342)) +* don't hardcode documentation version for traits (#288) ([30e6af](https://github.com/fmoko/rustlings/commit/30e6af60690c326fb5d3a9b7335f35c69c09137d)) + +#### Features + +* add Option2 exercise (#290) ([86b5c08b](https://github.com/rust-lang/rustlings/commit/86b5c08b9bea1576127a7c5f599f5752072c087d)) +* add excercise for option (#282) ([135e5d47](https://github.com/rust-lang/rustlings/commit/135e5d47a7c395aece6f6022117fb20c82f2d3d4)) +* add new exercises for generics (#280) ([76be5e4e](https://github.com/rust-lang/rustlings/commit/76be5e4e991160f5fd9093f03ee2ba260e8f7229)) +* **ci:** add buildkite config ([b049fa2c](https://github.com/rust-lang/rustlings/commit/b049fa2c84dba0f0c8906ac44e28fd45fba51a71)) + ### 2.2.1 (2020-02-27) diff --git a/Cargo.toml b/Cargo.toml index 4e6ea2ba..3481a886 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustlings" -version = "2.2.1" -authors = ["Marisa ", "Carol (Nichols || Goulding) ", "Carol (Nichols || Goulding) "] edition = "2018" [dependencies] diff --git a/README.md b/README.md index 9dd3b2b3..8884006d 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Basically: Clone the repository, checkout to the latest tag, run `cargo install` ```bash git clone https://github.com/rust-lang/rustlings cd rustlings -git checkout tags/2.2.1 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) +git checkout tags/3.0.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) cargo install --force --path . ``` From 9fd881443fafd165636292bf187987103de80fd0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:09:23 +0200 Subject: [PATCH 0046/1293] docs: add carols10cents as a contributor (#303) * docs: update README.md [skip ci] * docs: create .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 25 +++++++++++++++++++++++++ README.md | 22 ++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 .all-contributorsrc diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 00000000..d2212b61 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,25 @@ +{ + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "contributors": [ + { + "login": "carols10cents", + "name": "Carol (Nichols || Goulding)", + "avatar_url": "https://avatars2.githubusercontent.com/u/193874?v=4", + "profile": "http://carol-nichols.com", + "contributions": [ + "code", + "content" + ] + } + ], + "contributorsPerLine": 7, + "projectName": "rustlings", + "projectOwner": "fmoko", + "repoType": "github", + "repoHost": "https://github.com", + "skipCi": true +} diff --git a/README.md b/README.md index 8884006d..a482475a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) + +[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) + # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -126,3 +129,22 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md). `rustlings` was originally written by [Carol](https://github.com/carols10cents)! + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + +

Carol (Nichols || Goulding)

πŸ’» πŸ–‹
+ + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file From fe96de2e2da26a16a886e4fede9d8d3be9a652b0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:14:45 +0200 Subject: [PATCH 0047/1293] docs: add QuietMisdreavus as a contributor (#304) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index d2212b61..78ff688c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -14,6 +14,16 @@ "code", "content" ] + }, + { + "login": "QuietMisdreavus", + "name": "QuietMisdreavus", + "avatar_url": "https://avatars2.githubusercontent.com/u/5217170?v=4", + "profile": "https://twitter.com/QuietMisdreavus", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index a482475a..c0e8bf11 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -140,6 +140,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d +

Carol (Nichols || Goulding)

πŸ’» πŸ–‹

QuietMisdreavus

πŸ’» πŸ–‹
From 535e7a6a2869a3f4a78b45846e1b71d87335f8a6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:16:50 +0200 Subject: [PATCH 0048/1293] docs: add robertlugg as a contributor (#305) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 78ff688c..75c93998 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -24,6 +24,15 @@ "code", "content" ] + }, + { + "login": "robertlugg", + "name": "Robert M Lugg", + "avatar_url": "https://avatars0.githubusercontent.com/u/6054540?v=4", + "profile": "https://github.com/robertlugg", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index c0e8bf11..9ced051d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -141,6 +141,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Carol (Nichols || Goulding)

πŸ’» πŸ–‹
QuietMisdreavus

πŸ’» πŸ–‹ +
Robert M Lugg

πŸ–‹ From e2835de1378061de7e550403cb59a082da5b105c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:17:40 +0200 Subject: [PATCH 0049/1293] docs: add hynek as a contributor (#306) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 75c93998..2c131daf 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -33,6 +33,15 @@ "contributions": [ "content" ] + }, + { + "login": "hynek", + "name": "Hynek Schlawack", + "avatar_url": "https://avatars3.githubusercontent.com/u/41240?v=4", + "profile": "https://hynek.me/about/", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 9ced051d..a39ae1c0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-4-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -142,6 +142,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Carol (Nichols || Goulding)

πŸ’» πŸ–‹
QuietMisdreavus

πŸ’» πŸ–‹
Robert M Lugg

πŸ–‹ +
Hynek Schlawack

πŸ’» From a9dc10170105c6bf9aa18e6c808c97d1666748eb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:18:53 +0200 Subject: [PATCH 0050/1293] docs: add spacekookie as a contributor (#307) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2c131daf..72b53466 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -42,6 +42,15 @@ "contributions": [ "code" ] + }, + { + "login": "spacekookie", + "name": "Katharina Fey", + "avatar_url": "https://avatars0.githubusercontent.com/u/7669898?v=4", + "profile": "https://spacekookie.de", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index a39ae1c0..446e441d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-4-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-5-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -143,6 +143,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
QuietMisdreavus

πŸ’» πŸ–‹
Robert M Lugg

πŸ–‹
Hynek Schlawack

πŸ’» +
Katharina Fey

πŸ’» From 2e1bd5ef4e26d4ea5e3f2cd594fdfa7ae3075aa6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:20:06 +0200 Subject: [PATCH 0051/1293] docs: add lukabavdaz as a contributor (#308) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 72b53466..82f11921 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -51,6 +51,16 @@ "contributions": [ "code" ] + }, + { + "login": "lukabavdaz", + "name": "lukabavdaz", + "avatar_url": "https://avatars0.githubusercontent.com/u/9624558?v=4", + "profile": "https://github.com/lukabavdaz", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 446e441d..f79e65e5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-5-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-6-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -144,6 +144,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Robert M Lugg

πŸ–‹
Hynek Schlawack

πŸ’»
Katharina Fey

πŸ’» +
lukabavdaz

πŸ’» πŸ–‹ From 9a8762ba6eca283282840e23b018dd2f87270658 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:21:03 +0200 Subject: [PATCH 0052/1293] docs: add evestera as a contributor (#309) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 82f11921..b39b6c35 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -61,6 +61,15 @@ "code", "content" ] + }, + { + "login": "evestera", + "name": "Erik Vesteraas", + "avatar_url": "https://avatars2.githubusercontent.com/u/4187449?v=4", + "profile": "http://vestera.as", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index f79e65e5..ea9de264 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-6-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-7-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -145,6 +145,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Hynek Schlawack

πŸ’»
Katharina Fey

πŸ’»
lukabavdaz

πŸ’» πŸ–‹ +
Erik Vesteraas

πŸ’» From 44a4cf3b277e46c2f8475fb232f6e2514cf0b6a7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:21:37 +0200 Subject: [PATCH 0053/1293] docs: add Delet0r as a contributor (#310) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index b39b6c35..91a40b6e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -70,6 +70,15 @@ "contributions": [ "code" ] + }, + { + "login": "Delet0r", + "name": "delet0r", + "avatar_url": "https://avatars1.githubusercontent.com/u/23195618?v=4", + "profile": "https://github.com/Delet0r", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index ea9de264..2c5e4c9b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-7-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-8-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -147,6 +147,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
lukabavdaz

πŸ’» πŸ–‹
Erik Vesteraas

πŸ’» + +
delet0r

πŸ’» + From 3eb0fb5aa645ecdda350e60e4321b542b897b262 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:22:30 +0200 Subject: [PATCH 0054/1293] docs: add shaunbennett as a contributor (#311) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 91a40b6e..6562b0f9 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -79,6 +79,15 @@ "contributions": [ "code" ] + }, + { + "login": "shaunbennett", + "name": "Shaun Bennett", + "avatar_url": "https://avatars1.githubusercontent.com/u/10522375?v=4", + "profile": "http://phinary.ca", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 2c5e4c9b..5aa0029c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-8-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -149,6 +149,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
delet0r

πŸ’» +
Shaun Bennett

πŸ’» From b749314944f5812fa2872676c3cd7ffbb89d850b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:23:18 +0200 Subject: [PATCH 0055/1293] docs: add abagshaw as a contributor (#312) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6562b0f9..5449c41d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -88,6 +88,15 @@ "contributions": [ "code" ] + }, + { + "login": "abagshaw", + "name": "Andrew Bagshaw", + "avatar_url": "https://avatars2.githubusercontent.com/u/8594541?v=4", + "profile": "https://github.com/abagshaw", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 5aa0029c..da190408 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-10-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -150,6 +150,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
delet0r

πŸ’»
Shaun Bennett

πŸ’» +
Andrew Bagshaw

πŸ’» From 37687e9323acd64b726d55140ff07402c5933858 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:24:27 +0200 Subject: [PATCH 0056/1293] docs: add kisom as a contributor (#313) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5449c41d..736def53 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -97,6 +97,15 @@ "contributions": [ "code" ] + }, + { + "login": "kisom", + "name": "Kyle Isom", + "avatar_url": "https://avatars2.githubusercontent.com/u/175578?v=4", + "profile": "https://ai6ua.net/", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index da190408..69cf77ae 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-10-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-11-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -151,6 +151,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
delet0r

πŸ’»
Shaun Bennett

πŸ’»
Andrew Bagshaw

πŸ’» +
Kyle Isom

πŸ’» From e7841ba2ed85226acc1b0847eb1382a8cafb411b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:27:26 +0200 Subject: [PATCH 0057/1293] docs: add ColinPitrat as a contributor (#314) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 736def53..60fa649f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -106,6 +106,15 @@ "contributions": [ "code" ] + }, + { + "login": "ColinPitrat", + "name": "Colin Pitrat", + "avatar_url": "https://avatars3.githubusercontent.com/u/1541863?v=4", + "profile": "https://github.com/ColinPitrat", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 69cf77ae..ed6a6318 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-11-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-12-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -152,6 +152,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Shaun Bennett

πŸ’»
Andrew Bagshaw

πŸ’»
Kyle Isom

πŸ’» +
Colin Pitrat

πŸ’» From e79d7ea98112b243e93d2d849ab4e5918d289a88 Mon Sep 17 00:00:00 2001 From: fmoko Date: Sun, 12 Apr 2020 00:28:06 +0200 Subject: [PATCH 0058/1293] docs: increase contributors per line --- .all-contributorsrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 60fa649f..90741685 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -117,7 +117,7 @@ ] } ], - "contributorsPerLine": 7, + "contributorsPerLine": 10, "projectName": "rustlings", "projectOwner": "fmoko", "repoType": "github", From 348fe339b91c5a33a847d5b4ba52e7429240b356 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:28:52 +0200 Subject: [PATCH 0059/1293] docs: add zacanger as a contributor (#315) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 7 ++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 90741685..b480d77b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -115,6 +115,15 @@ "contributions": [ "code" ] + }, + { + "login": "zacanger", + "name": "Zac Anger", + "avatar_url": "https://avatars3.githubusercontent.com/u/12520493?v=4", + "profile": "https://zacanger.com", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index ed6a6318..7fea9095 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-12-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-13-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -146,13 +146,14 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Katharina Fey

πŸ’»
lukabavdaz

πŸ’» πŸ–‹
Erik Vesteraas

πŸ’» - -
delet0r

πŸ’»
Shaun Bennett

πŸ’»
Andrew Bagshaw

πŸ’» + +
Kyle Isom

πŸ’»
Colin Pitrat

πŸ’» +
Zac Anger

πŸ’» From b89cdef1203e5419977b7eaca836eaa1390406c3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:30:31 +0200 Subject: [PATCH 0060/1293] docs: add mgeier as a contributor (#316) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index b480d77b..67419e1d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -124,6 +124,15 @@ "contributions": [ "code" ] + }, + { + "login": "mgeier", + "name": "Matthias Geier", + "avatar_url": "https://avatars1.githubusercontent.com/u/705404?v=4", + "profile": "https://github.com/mgeier", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 7fea9095..ee4e212e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-13-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-14-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -154,6 +154,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Kyle Isom

πŸ’»
Colin Pitrat

πŸ’»
Zac Anger

πŸ’» +
Matthias Geier

πŸ’» From 491dc2e5ca4982198707586a734200596e870062 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:31:21 +0200 Subject: [PATCH 0061/1293] docs: add cjpearce as a contributor (#317) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 67419e1d..2adb9d4e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -133,6 +133,15 @@ "contributions": [ "code" ] + }, + { + "login": "cjpearce", + "name": "Chris Pearce", + "avatar_url": "https://avatars1.githubusercontent.com/u/3453268?v=4", + "profile": "https://github.com/cjpearce", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index ee4e212e..786f8c35 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-14-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-15-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -155,6 +155,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Colin Pitrat

πŸ’»
Zac Anger

πŸ’»
Matthias Geier

πŸ’» +
Chris Pearce

πŸ’» From cf3d5b44e6fe2132815f7703d714d2fd35ff28ea Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:32:07 +0200 Subject: [PATCH 0062/1293] docs: add yvan-sraka as a contributor (#318) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2adb9d4e..59cf429d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -142,6 +142,15 @@ "contributions": [ "code" ] + }, + { + "login": "yvan-sraka", + "name": "Yvan Sraka", + "avatar_url": "https://avatars2.githubusercontent.com/u/705213?v=4", + "profile": "https://yvan-sraka.github.io", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 786f8c35..e4c89255 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-15-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-16-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -156,6 +156,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Zac Anger

πŸ’»
Matthias Geier

πŸ’»
Chris Pearce

πŸ’» +
Yvan Sraka

πŸ’» From 52580cfd0ddc15d6d5646ec77e79b0435b2226b3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:32:56 +0200 Subject: [PATCH 0063/1293] docs: add dendi239 as a contributor (#319) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 59cf429d..c5ba7361 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -151,6 +151,15 @@ "contributions": [ "code" ] + }, + { + "login": "dendi239", + "name": "Denys Smirnov", + "avatar_url": "https://avatars3.githubusercontent.com/u/16478650?v=4", + "profile": "https://github.com/dendi239", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index e4c89255..3be84361 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-16-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-17-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -157,6 +157,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Matthias Geier

πŸ’»
Chris Pearce

πŸ’»
Yvan Sraka

πŸ’» +
Denys Smirnov

πŸ’» From 53bda94f7783071570759d33ea3c1f1e9d999a0a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:34:06 +0200 Subject: [PATCH 0064/1293] docs: add eddyp as a contributor (#320) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c5ba7361..6067d989 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -160,6 +160,15 @@ "contributions": [ "code" ] + }, + { + "login": "eddyp", + "name": "eddyp", + "avatar_url": "https://avatars2.githubusercontent.com/u/123772?v=4", + "profile": "https://github.com/eddyp", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 3be84361..c3dbb007 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-17-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-18-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -158,6 +158,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Chris Pearce

πŸ’»
Yvan Sraka

πŸ’»
Denys Smirnov

πŸ’» +
eddyp

πŸ’» From 8b59b9852f152dd72ebc7b4dcdea08a2ffe9a94b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:34:41 +0200 Subject: [PATCH 0065/1293] docs: add briankung as a contributor (#321) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6067d989..70e15032 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -169,6 +169,16 @@ "contributions": [ "code" ] + }, + { + "login": "briankung", + "name": "Brian Kung", + "avatar_url": "https://avatars1.githubusercontent.com/u/2836167?v=4", + "profile": "http://about.me/BrianKung", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index c3dbb007..3df10e58 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-18-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-19-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -159,6 +159,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Yvan Sraka

πŸ’»
Denys Smirnov

πŸ’»
eddyp

πŸ’» +
Brian Kung

πŸ’» πŸ–‹ From 95d02a23d083c448d2d3fb9204b7105032111cbd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:35:42 +0200 Subject: [PATCH 0066/1293] docs: add miller-time as a contributor (#322) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 70e15032..0ac067ed 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -179,6 +179,15 @@ "code", "content" ] + }, + { + "login": "miller-time", + "name": "Russell", + "avatar_url": "https://avatars3.githubusercontent.com/u/281039?v=4", + "profile": "https://rcousineau.gitlab.io", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 3df10e58..7d530187 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-19-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-20-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -160,6 +160,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Denys Smirnov

πŸ’»
eddyp

πŸ’»
Brian Kung

πŸ’» πŸ–‹ +
Russell

πŸ’» From 3f479be7e7f64eee1e7766a37ebd4b4a92babdee Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:36:55 +0200 Subject: [PATCH 0067/1293] docs: add danwilhelm as a contributor (#323) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0ac067ed..755aaa3a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -188,6 +188,15 @@ "contributions": [ "code" ] + }, + { + "login": "danwilhelm", + "name": "Dan Wilhelm", + "avatar_url": "https://avatars3.githubusercontent.com/u/6137185?v=4", + "profile": "http://danwilhelm.com", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 7d530187..8f0a8276 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-20-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-21-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -162,6 +162,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Brian Kung

πŸ’» πŸ–‹
Russell

πŸ’» + +
Dan Wilhelm

πŸ“– + From 74d32f0ccaaeb7fb736083456f40b7eb64249ae5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:37:45 +0200 Subject: [PATCH 0068/1293] docs: add Jesse-Cameron as a contributor (#324) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 755aaa3a..c10d3d67 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -197,6 +197,16 @@ "contributions": [ "doc" ] + }, + { + "login": "Jesse-Cameron", + "name": "Jesse", + "avatar_url": "https://avatars3.githubusercontent.com/u/3723654?v=4", + "profile": "https://github.com/Jesse-Cameron", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 8f0a8276..df67deb8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-21-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-22-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -164,6 +164,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Dan Wilhelm

πŸ“– +
Jesse

πŸ’» πŸ–‹ From 887d9193237a9315ce383f58b386c69594646125 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:38:25 +0200 Subject: [PATCH 0069/1293] docs: add MrFroop as a contributor (#325) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c10d3d67..3889347c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -207,6 +207,15 @@ "code", "content" ] + }, + { + "login": "MrFroop", + "name": "Fredrik JambrΓ©n", + "avatar_url": "https://avatars3.githubusercontent.com/u/196700?v=4", + "profile": "https://github.com/MrFroop", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index df67deb8..3873da9b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-22-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-23-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -165,6 +165,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Dan Wilhelm

πŸ“–
Jesse

πŸ’» πŸ–‹ +
Fredrik JambrΓ©n

πŸ’» From 7b6f14c25ada500d6c65a3369b292080a0e3274f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:39:14 +0200 Subject: [PATCH 0070/1293] docs: add petemcfarlane as a contributor (#326) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3889347c..cc475860 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -216,6 +216,15 @@ "contributions": [ "code" ] + }, + { + "login": "petemcfarlane", + "name": "Pete McFarlane", + "avatar_url": "https://avatars3.githubusercontent.com/u/3472717?v=4", + "profile": "https://github.com/petemcfarlane", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 3873da9b..a569c6bc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-23-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-24-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -166,6 +166,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Dan Wilhelm

πŸ“–
Jesse

πŸ’» πŸ–‹
Fredrik JambrΓ©n

πŸ’» +
Pete McFarlane

πŸ–‹ From 443600194c343db785ba9edefe68a29f174c54c9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:39:56 +0200 Subject: [PATCH 0071/1293] docs: add nkanderson as a contributor (#327) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index cc475860..c8fa97aa 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -225,6 +225,16 @@ "contributions": [ "content" ] + }, + { + "login": "nkanderson", + "name": "nkanderson", + "avatar_url": "https://avatars0.githubusercontent.com/u/4128825?v=4", + "profile": "https://github.com/nkanderson", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index a569c6bc..2d34f9c2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-24-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-25-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -167,6 +167,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Jesse

πŸ’» πŸ–‹
Fredrik JambrΓ©n

πŸ’»
Pete McFarlane

πŸ–‹ +
nkanderson

πŸ’» πŸ–‹ From c6bcb319f8512bf3ed0930f7277822ff18de1715 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:40:26 +0200 Subject: [PATCH 0072/1293] docs: add ajaxm as a contributor (#328) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c8fa97aa..b0ee2c0e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -235,6 +235,15 @@ "code", "content" ] + }, + { + "login": "ajaxm", + "name": "Ajax M", + "avatar_url": "https://avatars0.githubusercontent.com/u/13360138?v=4", + "profile": "https://github.com/ajaxm", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 2d34f9c2..5d923e3d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-25-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-26-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -168,6 +168,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Fredrik JambrΓ©n

πŸ’»
Pete McFarlane

πŸ–‹
nkanderson

πŸ’» πŸ–‹ +
Ajax M

πŸ“– From f907c710b2d415833e2bf91c7484830e2cfe4ef0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:41:21 +0200 Subject: [PATCH 0073/1293] docs: add Dylnuge as a contributor (#329) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index b0ee2c0e..df95ed4f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -244,6 +244,15 @@ "contributions": [ "doc" ] + }, + { + "login": "Dylnuge", + "name": "Dylan Nugent", + "avatar_url": "https://avatars2.githubusercontent.com/u/118624?v=4", + "profile": "https://dylnuge.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 5d923e3d..10743741 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-26-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-27-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -169,6 +169,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Pete McFarlane

πŸ–‹
nkanderson

πŸ’» πŸ–‹
Ajax M

πŸ“– +
Dylan Nugent

πŸ–‹ From d7bb220ba380178d53847861aba4ac0bb443820d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:42:30 +0200 Subject: [PATCH 0074/1293] docs: add vyaslav as a contributor (#330) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index df95ed4f..4650a5b1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -253,6 +253,16 @@ "contributions": [ "content" ] + }, + { + "login": "vyaslav", + "name": "vyaslav", + "avatar_url": "https://avatars0.githubusercontent.com/u/1385427?v=4", + "profile": "https://github.com/vyaslav", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 10743741..cac1ab41 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-27-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-28-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -170,6 +170,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
nkanderson

πŸ’» πŸ–‹
Ajax M

πŸ“–
Dylan Nugent

πŸ–‹ +
vyaslav

πŸ’» πŸ–‹ From 0b4576a0286ee77b63f0c9c0b59ddfdc2b277410 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:43:08 +0200 Subject: [PATCH 0075/1293] docs: add gdoenlen as a contributor (#331) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4650a5b1..810f2f73 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -263,6 +263,15 @@ "code", "content" ] + }, + { + "login": "gdoenlen", + "name": "George", + "avatar_url": "https://avatars1.githubusercontent.com/u/17297466?v=4", + "profile": "https://join.sfxd.org", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index cac1ab41..17d3a746 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-28-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-29-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -171,6 +171,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Ajax M

πŸ“–
Dylan Nugent

πŸ–‹
vyaslav

πŸ’» πŸ–‹ +
George

πŸ’» From f26ed591f313c81c63afbbcf0090fd607f445f75 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:43:54 +0200 Subject: [PATCH 0076/1293] docs: add nyxtom as a contributor (#332) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 810f2f73..7d43f4fe 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -272,6 +272,16 @@ "contributions": [ "code" ] + }, + { + "login": "nyxtom", + "name": "Thomas Holloway", + "avatar_url": "https://avatars2.githubusercontent.com/u/222763?v=4", + "profile": "https://github.com/nyxtom", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 17d3a746..ccdf8174 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-29-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-30-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -172,6 +172,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Dylan Nugent

πŸ–‹
vyaslav

πŸ’» πŸ–‹
George

πŸ’» +
Thomas Holloway

πŸ’» πŸ–‹ From 9bb5aa583fd0a5e88b919073585bf2688b3d427d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:44:27 +0200 Subject: [PATCH 0077/1293] docs: add workingjubilee as a contributor (#333) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7d43f4fe..0466208c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -282,6 +282,15 @@ "code", "content" ] + }, + { + "login": "workingjubilee", + "name": "Jubilee", + "avatar_url": "https://avatars1.githubusercontent.com/u/46493976?v=4", + "profile": "https://github.com/workingjubilee", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index ccdf8174..19fae227 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-30-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-31-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -174,6 +174,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
George

πŸ’»
Thomas Holloway

πŸ’» πŸ–‹ + +
Jubilee

πŸ’» + From 0d0c79a5cb4a476aea88b1e5f370659578f85172 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:45:01 +0200 Subject: [PATCH 0078/1293] docs: add WofWca as a contributor (#334) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0466208c..60acb225 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -291,6 +291,15 @@ "contributions": [ "code" ] + }, + { + "login": "WofWca", + "name": "WofWca", + "avatar_url": "https://avatars1.githubusercontent.com/u/39462442?v=4", + "profile": "https://github.com/WofWca", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 19fae227..153cc83a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-31-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-32-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -176,6 +176,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Jubilee

πŸ’» +
WofWca

πŸ’» From f07d1c94889461d72d12e6434bf58c8c5d29ccaa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:46:29 +0200 Subject: [PATCH 0079/1293] docs: add jrvidal as a contributor (#335) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 12 ++++++++++++ README.md | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 60acb225..2c32d976 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -300,6 +300,18 @@ "contributions": [ "code" ] + }, + { + "login": "jrvidal", + "name": "Roberto Vidal", + "avatar_url": "https://avatars0.githubusercontent.com/u/1636604?v=4", + "profile": "https://github.com/jrvidal", + "contributions": [ + "code", + "doc", + "ideas", + "maintenance" + ] } ], "contributorsPerLine": 10, diff --git a/README.md b/README.md index 153cc83a..3558f966 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-32-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-33-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -177,6 +177,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Jubilee

πŸ’»
WofWca

πŸ’» +
Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧 From 9ea089a5d9846ebc89d7826bda71d55352140f4d Mon Sep 17 00:00:00 2001 From: fmoko Date: Sun, 12 Apr 2020 00:47:24 +0200 Subject: [PATCH 0080/1293] docs: bump contributors per line down to 8 --- .all-contributorsrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2c32d976..6511d308 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -314,7 +314,7 @@ ] } ], - "contributorsPerLine": 10, + "contributorsPerLine": 8, "projectName": "rustlings", "projectOwner": "fmoko", "repoType": "github", From f26dca6d8ea560133ba7efb7db5a61eb37962960 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:48:12 +0200 Subject: [PATCH 0081/1293] docs: add jensim as a contributor (#336) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 17 ++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6511d308..3f6c252c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -312,6 +312,15 @@ "ideas", "maintenance" ] + }, + { + "login": "jensim", + "name": "Jens", + "avatar_url": "https://avatars0.githubusercontent.com/u/3663856?v=4", + "profile": "https://github.com/jensim", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 3558f966..42195cb7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-33-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-34-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -147,37 +147,40 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
lukabavdaz

πŸ’» πŸ–‹
Erik Vesteraas

πŸ’»
delet0r

πŸ’» -
Shaun Bennett

πŸ’» -
Andrew Bagshaw

πŸ’» +
Shaun Bennett

πŸ’» +
Andrew Bagshaw

πŸ’»
Kyle Isom

πŸ’»
Colin Pitrat

πŸ’»
Zac Anger

πŸ’»
Matthias Geier

πŸ’»
Chris Pearce

πŸ’»
Yvan Sraka

πŸ’» + +
Denys Smirnov

πŸ’»
eddyp

πŸ’»
Brian Kung

πŸ’» πŸ–‹
Russell

πŸ’» - -
Dan Wilhelm

πŸ“–
Jesse

πŸ’» πŸ–‹
Fredrik JambrΓ©n

πŸ’»
Pete McFarlane

πŸ–‹ + +
nkanderson

πŸ’» πŸ–‹
Ajax M

πŸ“–
Dylan Nugent

πŸ–‹
vyaslav

πŸ’» πŸ–‹
George

πŸ’»
Thomas Holloway

πŸ’» πŸ–‹ - -
Jubilee

πŸ’»
WofWca

πŸ’» + +
Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧 +
Jens

πŸ“– From a20f80623e217b416a51d7206552520562c303aa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:49:05 +0200 Subject: [PATCH 0082/1293] docs: add rahatarmanahmed as a contributor (#337) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3f6c252c..5c955fa3 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -321,6 +321,15 @@ "contributions": [ "doc" ] + }, + { + "login": "rahatarmanahmed", + "name": "Rahat Ahmed", + "avatar_url": "https://avatars3.githubusercontent.com/u/3174006?v=4", + "profile": "http://rahatah.me/d", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 42195cb7..0a807e79 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-34-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-35-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -181,6 +181,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧
Jens

πŸ“– +
Rahat Ahmed

πŸ“– From ad00c2cf51e2697daddc3126699e4c035914df3a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:49:57 +0200 Subject: [PATCH 0083/1293] docs: add AbdouSeck as a contributor (#338) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 11 +++++++++++ README.md | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5c955fa3..dc8ee98e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -330,6 +330,17 @@ "contributions": [ "doc" ] + }, + { + "login": "AbdouSeck", + "name": "Abdou Seck", + "avatar_url": "https://avatars2.githubusercontent.com/u/6490055?v=4", + "profile": "https://github.com/AbdouSeck", + "contributions": [ + "code", + "content", + "review" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 0a807e79..afc43b83 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-35-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-36-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -182,6 +182,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧
Jens

πŸ“–
Rahat Ahmed

πŸ“– +
Abdou Seck

πŸ’» πŸ–‹ πŸ‘€ From f509e479a14e06b7baea605b6e87c0bf8c6b0e7d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:51:02 +0200 Subject: [PATCH 0084/1293] docs: add Socratides as a contributor (#339) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index dc8ee98e..687d4db0 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -341,6 +341,15 @@ "content", "review" ] + }, + { + "login": "Socratides", + "name": "Socrates", + "avatar_url": "https://avatars3.githubusercontent.com/u/27732983?v=4", + "profile": "https://github.com/Socratides", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index afc43b83..f24f7859 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-36-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-37-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -183,6 +183,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Jens

πŸ“–
Rahat Ahmed

πŸ“–
Abdou Seck

πŸ’» πŸ–‹ πŸ‘€ +
Socrates

πŸ“– From 5f5a0465cb3e3f474241f5f4bd2a559f4fd687f8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:52:51 +0200 Subject: [PATCH 0085/1293] docs: add codehearts as a contributor (#341) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: fmoko --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 687d4db0..4555ee72 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -342,6 +342,15 @@ "review" ] }, + { + "login": "codehearts", + "name": "Katie", + "avatar_url": "https://avatars0.githubusercontent.com/u/2885412?v=4", + "profile": "https://codehearts.com", + "contributions": [ + "code" + ] + }, { "login": "Socratides", "name": "Socrates", diff --git a/README.md b/README.md index f24f7859..f531c8e3 100644 --- a/README.md +++ b/README.md @@ -183,6 +183,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Jens

πŸ“–
Rahat Ahmed

πŸ“–
Abdou Seck

πŸ’» πŸ–‹ πŸ‘€ +
Katie

πŸ’»
Socrates

πŸ“– From 5b72f478a7ee9cb282f31ef798f6b3a23205e8b0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:53:46 +0200 Subject: [PATCH 0086/1293] docs: add gnodarse as a contributor (#342) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4555ee72..b8ba6902 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -359,6 +359,15 @@ "contributions": [ "doc" ] + }, + { + "login": "gnodarse", + "name": "gnodarse", + "avatar_url": "https://avatars3.githubusercontent.com/u/46761795?v=4", + "profile": "https://github.com/gnodarse", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index f531c8e3..68b72934 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-37-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-39-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -185,6 +185,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Abdou Seck

πŸ’» πŸ–‹ πŸ‘€
Katie

πŸ’»
Socrates

πŸ“– +
gnodarse

πŸ–‹ From eface5ef4568cfd52e3855b5895f394be337a1e8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:54:28 +0200 Subject: [PATCH 0087/1293] docs: add harrisonmetz as a contributor (#343) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index b8ba6902..f80e1f4d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -368,6 +368,15 @@ "contributions": [ "content" ] + }, + { + "login": "harrisonmetz", + "name": "Harrison Metzger", + "avatar_url": "https://avatars1.githubusercontent.com/u/7883408?v=4", + "profile": "https://github.com/harrisonmetz", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 68b72934..5985e752 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-39-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-40-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -186,6 +186,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Katie

πŸ’»
Socrates

πŸ“–
gnodarse

πŸ–‹ +
Harrison Metzger

πŸ’» From e093af4c05514044a1223156400145185e42ef7f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:54:59 +0200 Subject: [PATCH 0088/1293] docs: add TorbenJ as a contributor (#344) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 5 ++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index f80e1f4d..c7beed8f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -377,6 +377,16 @@ "contributions": [ "code" ] + }, + { + "login": "TorbenJ", + "name": "Torben Jonas", + "avatar_url": "https://avatars2.githubusercontent.com/u/9077102?v=4", + "profile": "https://github.com/TorbenJ", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 5985e752..9dca8113 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-40-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-41-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -188,6 +188,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
gnodarse

πŸ–‹
Harrison Metzger

πŸ’» + +
Torben Jonas

πŸ’» πŸ–‹ + From f060f099d4fb4a1f9ea59c1879dd4651c9f317c8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:55:30 +0200 Subject: [PATCH 0089/1293] docs: add pbx as a contributor (#345) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c7beed8f..f2fc5636 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -387,6 +387,15 @@ "code", "content" ] + }, + { + "login": "pbx", + "name": "Paul Bissex", + "avatar_url": "https://avatars0.githubusercontent.com/u/641?v=4", + "profile": "http://paulbissex.com/", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 9dca8113..63a93d96 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-41-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-42-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -190,6 +190,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Torben Jonas

πŸ’» πŸ–‹ +
Paul Bissex

πŸ“– From 84e1f85be2646419513486b01b06cb8d199495c7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:56:40 +0200 Subject: [PATCH 0090/1293] docs: add sjmann as a contributor (#346) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index f2fc5636..db8f4116 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -396,6 +396,16 @@ "contributions": [ "doc" ] + }, + { + "login": "sjmann", + "name": "Steven Mann", + "avatar_url": "https://avatars0.githubusercontent.com/u/6589896?v=4", + "profile": "https://github.com/sjmann", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 63a93d96..048bea9d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-42-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-43-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -191,6 +191,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Torben Jonas

πŸ’» πŸ–‹
Paul Bissex

πŸ“– +
Steven Mann

πŸ’» πŸ–‹ From cd06b39a422e5df37e1618f928523974b247d465 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:57:18 +0200 Subject: [PATCH 0091/1293] docs: add Tarnadas as a contributor (#347) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index db8f4116..631d814b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -406,6 +406,16 @@ "code", "content" ] + }, + { + "login": "Tarnadas", + "name": "Mario Reder", + "avatar_url": "https://avatars2.githubusercontent.com/u/5855071?v=4", + "profile": "https://smmdb.net/", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 048bea9d..cc02fa88 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-43-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-44-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -192,6 +192,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Torben Jonas

πŸ’» πŸ–‹
Paul Bissex

πŸ“–
Steven Mann

πŸ’» πŸ–‹ +
Mario Reder

πŸ’» πŸ–‹ From b217961254931f025cf40c602d00cd73b0c41b0e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:57:55 +0200 Subject: [PATCH 0092/1293] docs: add sl4m as a contributor (#348) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 631d814b..c4a2a04a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -416,6 +416,15 @@ "code", "content" ] + }, + { + "login": "sl4m", + "name": "skim", + "avatar_url": "https://avatars0.githubusercontent.com/u/47347?v=4", + "profile": "https://keybase.io/skim", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index cc02fa88..ead806db 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-44-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-45-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -193,6 +193,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Paul Bissex

πŸ“–
Steven Mann

πŸ’» πŸ–‹
Mario Reder

πŸ’» πŸ–‹ +
skim

πŸ’» From 3f1209ce19b96b81cfcbb20510b474087c889c02 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 00:59:07 +0200 Subject: [PATCH 0093/1293] docs: add sanjaykdragon as a contributor (#349) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c4a2a04a..c41d91b4 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -425,6 +425,16 @@ "contributions": [ "code" ] + }, + { + "login": "sanjaykdragon", + "name": "Sanjay K", + "avatar_url": "https://avatars1.githubusercontent.com/u/10261698?v=4", + "profile": "https://github.com/sanjaykdragon", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index ead806db..1ea65944 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-45-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-46-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -194,6 +194,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Steven Mann

πŸ’» πŸ–‹
Mario Reder

πŸ’» πŸ–‹
skim

πŸ’» +
Sanjay K

πŸ’» πŸ–‹ From fafcffed25729769c1eb6e166ee99e55488c0c70 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2020 01:00:22 +0200 Subject: [PATCH 0094/1293] docs: add crodjer as a contributor (#350) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c41d91b4..3be4ec96 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -435,6 +435,15 @@ "code", "content" ] + }, + { + "login": "crodjer", + "name": "Rohan Jain", + "avatar_url": "https://avatars1.githubusercontent.com/u/343499?v=4", + "profile": "http://www.rohanjain.in", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 1ea65944..283e943f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-46-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-47-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -195,6 +195,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Mario Reder

πŸ’» πŸ–‹
skim

πŸ’»
Sanjay K

πŸ’» πŸ–‹ +
Rohan Jain

πŸ’» From cfb98a5617a4276080bcc431aef8d46cc6a67808 Mon Sep 17 00:00:00 2001 From: fmoko Date: Sun, 12 Apr 2020 01:03:28 +0200 Subject: [PATCH 0095/1293] docs: remove now obsolete credits section --- README.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/README.md b/README.md index 283e943f..ed88137d 100644 --- a/README.md +++ b/README.md @@ -125,11 +125,6 @@ If you are interested in improving or adding new ones, please feel free to contr See [CONTRIBUTING.md](./CONTRIBUTING.md). -## Credits - -`rustlings` was originally written by [Carol](https://github.com/carols10cents)! - - ## Contributors ✨ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -203,4 +198,4 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! From abd0ec379c642a8dffefbbfb60791a96ccc0988e Mon Sep 17 00:00:00 2001 From: Saurav <40655135+saurav-2104@users.noreply.github.com> Date: Sun, 12 Apr 2020 23:05:20 +0530 Subject: [PATCH 0096/1293] chore: update variables5.rs book link (#351) chore: update variables5.rs book link chore: update variables5.rs book link --- Cargo.lock | 2 +- info.toml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a08dee50..52c8ed45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -592,7 +592,7 @@ dependencies = [ [[package]] name = "rustlings" -version = "2.2.1" +version = "3.0.0" dependencies = [ "assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/info.toml b/info.toml index 632e6ee7..4fbf9fd8 100644 --- a/info.toml +++ b/info.toml @@ -52,7 +52,8 @@ because we want to assign a different typed value to an existing variable. Somet you may also like to reuse existing variable names because you are just converting values to different types like in this exercise. Fortunately Rust has a powerful solution to this problem: 'Shadowing'! -You can read more about 'Shadowing' in the book's section 'Variables and Mutability'. +You can read more about 'Shadowing' in the book's section 'Variables and Mutability': +https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#shadowing Try to solve this exercise afterwards using this technique.""" # IF From 59f56b24d965ef0ab4da74237d6ef828c2f4f848 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2020 10:12:51 +0200 Subject: [PATCH 0097/1293] docs: add saidaspen as a contributor (#353) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3be4ec96..d4a0857d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -444,6 +444,16 @@ "contributions": [ "code" ] + }, + { + "login": "saidaspen", + "name": "Said Aspen", + "avatar_url": "https://avatars1.githubusercontent.com/u/7727687?v=4", + "profile": "https://www.saidaspen.se", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index ed88137d..baaa88fa 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-47-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-48-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -191,6 +191,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
skim

πŸ’»
Sanjay K

πŸ’» πŸ–‹
Rohan Jain

πŸ’» +
Said Aspen

πŸ’» πŸ–‹ From 5999acd24a4f203292be36e0fd18d385887ec481 Mon Sep 17 00:00:00 2001 From: Said Aspen Date: Tue, 14 Apr 2020 10:13:20 +0200 Subject: [PATCH 0098/1293] feat: Add exercise variables6 covering const (#352) --- exercises/variables/variables6.rs | 9 +++++++++ info.toml | 15 +++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 exercises/variables/variables6.rs diff --git a/exercises/variables/variables6.rs b/exercises/variables/variables6.rs new file mode 100644 index 00000000..76afa859 --- /dev/null +++ b/exercises/variables/variables6.rs @@ -0,0 +1,9 @@ +// variables5.rs +// Make me compile! Execute the command `rustlings hint variables6` if you want a hint :) + +// I AM NOT DONE + +const NUMBER = 3; +fn main() { + println!("Number {}", NUMBER); +} diff --git a/info.toml b/info.toml index 4fbf9fd8..789b6124 100644 --- a/info.toml +++ b/info.toml @@ -56,6 +56,21 @@ You can read more about 'Shadowing' in the book's section 'Variables and Mutabil https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#shadowing Try to solve this exercise afterwards using this technique.""" +[[exercises]] +name = "variables6" +path = "exercises/variables/variables6.rs" +mode = "compile" +hint = """ +We know about variables and mutability, but there is another important type of +variable available; constants. +Constants are always immutable and they are declared with keyword 'const' rather +then keyword 'let'. +Constants types must also always be annotated. + +Read more about constants under 'Differences Between Variables and Constants' in the book's section 'Variables and Mutability': +https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html +""" + # IF [[exercises]] From 6c3cc2caf54d557aaa522baebb3a5bfabc450576 Mon Sep 17 00:00:00 2001 From: Ufuk Celebi Date: Wed, 15 Apr 2020 23:52:31 +0200 Subject: [PATCH 0099/1293] chore: delete orphaned `error_handling/option1.rs` `error_handling/option1.rs` has been replaced by `option/option1.rs` and is not referenced in `info.toml` any more. --- exercises/error_handling/option1.rs | 31 ----------------------------- 1 file changed, 31 deletions(-) delete mode 100644 exercises/error_handling/option1.rs diff --git a/exercises/error_handling/option1.rs b/exercises/error_handling/option1.rs deleted file mode 100644 index 5d81b150..00000000 --- a/exercises/error_handling/option1.rs +++ /dev/null @@ -1,31 +0,0 @@ -// option1.rs -// This example panics because the second time it calls `pop`, the `vec` -// is empty, so `pop` returns `None`, and `unwrap` panics if it's called -// on `None`. Handle this in a more graceful way than calling `unwrap`! -// Execute `rustlings hint option1` for hints :) - -// I AM NOT DONE - -pub fn pop_too_much() -> bool { - let mut list = vec![3]; - - let last = list.pop().unwrap(); - println!("The last item in the list is {:?}", last); - - let second_to_last = list.pop().unwrap(); - println!( - "The second-to-last item in the list is {:?}", - second_to_last - ); - true -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn should_not_panic() { - assert!(pop_too_much()); - } -} From a3a554aeedcbe1177e92157d1a39005cd542369e Mon Sep 17 00:00:00 2001 From: Said Aspen Date: Thu, 16 Apr 2020 16:21:36 +0200 Subject: [PATCH 0100/1293] Hints for structs1 and structs2 (#355) --- info.toml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/info.toml b/info.toml index 789b6124..faaef423 100644 --- a/info.toml +++ b/info.toml @@ -215,13 +215,22 @@ Now you have another tool in your toolbox!""" name = "structs1" path = "exercises/structs/structs1.rs" mode = "test" -hint = "No hints this time ;)" +hint = """ +Rust has more than one type of struct. Both variants are used to package related data together. +On the one hand, there are normal, or classic, structs. These are named collections of related data stored in fields. +The other variant is tuple structs. Basically just named tuples. +In this exercise you need to implement one of each kind. + +Read more about structs in The Book: https://doc.rust-lang.org/stable/book/ch05-00-structs.html""" [[exercises]] name = "structs2" path = "exercises/structs/structs2.rs" mode = "test" -hint = "No hints this time ;)" +hint = """ +Creating instances of structs is easy, all you need to do is assign some values to its fields. +There is however some shortcuts that can be taken when instantiating structs. +Have a look in The Book, to find out more: https://doc.rust-lang.org/stable/book/ch05-01-defining-structs.html#creating-instances-from-other-instances-with-struct-update-syntax""" # STRINGS From c9e4f2cfb4c48d0b7451263cfb43b9426438122d Mon Sep 17 00:00:00 2001 From: lebedevsergey Date: Fri, 17 Apr 2020 16:43:01 +0300 Subject: [PATCH 0101/1293] fix: confusing comment in conversions/try_from_into.rs Co-authored-by: Lebedev --- exercises/conversions/try_from_into.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index 255d2e1f..834dd932 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -45,7 +45,7 @@ mod tests { use super::*; #[test] fn test_bad_convert() { - // Test that John is returned when bad string is provided + // Test that error is returned when bad string is provided let p = Person::try_from(""); assert!(p.is_err()); } From 964c974a0274199d755073b917c2bc5da0c9b4f1 Mon Sep 17 00:00:00 2001 From: sjmann Date: Tue, 21 Apr 2020 13:34:25 +0100 Subject: [PATCH 0102/1293] fix: update generics2 closes #362 --- exercises/generics/generics2.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/exercises/generics/generics2.rs b/exercises/generics/generics2.rs index 1fe5041f..23025aaa 100644 --- a/exercises/generics/generics2.rs +++ b/exercises/generics/generics2.rs @@ -2,11 +2,11 @@ // Rewrite it using generics so that it supports wrapping ANY type. // I AM NOT DONE -struct Wrapper { +struct Wrapper { value: u32 } -impl Wrapper { +impl Wrapper { pub fn new(value: u32) -> Self { Wrapper { value } } @@ -23,8 +23,6 @@ mod tests { #[test] fn store_str_in_wrapper() { - // TODO: Delete this assert and uncomment the one below once you have finished the exercise. - assert!(false); - // assert_eq!(Wrapper::new("Foo").value, "Foo"); + assert_eq!(Wrapper::new("Foo").value, "Foo"); } } \ No newline at end of file From 630ff0e00b24bb5026fe248deb3a4818b9a38d4c Mon Sep 17 00:00:00 2001 From: Steven Mann Date: Tue, 21 Apr 2020 17:50:00 +0100 Subject: [PATCH 0103/1293] chore: add explanatory comment to clippy1 --- exercises/clippy/clippy1.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/exercises/clippy/clippy1.rs b/exercises/clippy/clippy1.rs index 2b4c6354..bdb5dd2c 100644 --- a/exercises/clippy/clippy1.rs +++ b/exercises/clippy/clippy1.rs @@ -2,6 +2,8 @@ // The Clippy tool is a collection of lints to analyze your code // so you can catch common mistakes and improve your Rust code. // +// For these exercises the code will fail to compile when there are clippy warnings +// check clippy's suggestions from the output to solve the exercise. // Execute `rustlings hint clippy1` for hints :) // I AM NOT DONE From 19fb1c240c25b7dc50fc64c48a60bdb5f28f6de6 Mon Sep 17 00:00:00 2001 From: apatniv Date: Tue, 21 Apr 2020 22:51:56 -0400 Subject: [PATCH 0104/1293] test: Add missing test case for from_str exercise --- exercises/conversions/from_str.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 3c889d73..7b4fdaca 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -39,7 +39,11 @@ mod tests { } #[test] fn good_input() { - assert!("John,32".parse::().is_ok()); + let p = "John,32".parse::(); + assert!(p.is_ok()); + let p = p.unwrap(); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 32); } #[test] #[should_panic] From 32721bbc83953ad9cad7784cce645892d74aa778 Mon Sep 17 00:00:00 2001 From: Aleksei Trifonov Date: Sat, 25 Apr 2020 11:25:41 +0300 Subject: [PATCH 0105/1293] chore: fix missing space in the hint for errorsn.rs --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index faaef423..71bb3ddb 100644 --- a/info.toml +++ b/info.toml @@ -501,7 +501,7 @@ mode = "test" hint = """ First hint: To figure out what type should go where the ??? is, take a look at the test helper function `test_with_str`, since it returns whatever -`read_and_validate` returns and`test_with_str` has its signature fully +`read_and_validate` returns and `test_with_str` has its signature fully specified. From b66e2e09622243e086a0f1258dd27e1a2d61c891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=ADdac=20Sement=C3=A9=20Fern=C3=A1ndez?= Date: Mon, 27 Apr 2020 20:17:26 +0200 Subject: [PATCH 0106/1293] feat: Added exercise structs3.rs --- exercises/structs/structs3.rs | 67 +++++++++++++++++++++++++++++++++++ info.toml | 13 +++++++ 2 files changed, 80 insertions(+) create mode 100644 exercises/structs/structs3.rs diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs new file mode 100644 index 00000000..77cc154b --- /dev/null +++ b/exercises/structs/structs3.rs @@ -0,0 +1,67 @@ +// structs3.rs +// Structs contain more than simply some data, they can also have logic, in this +// exercise we have defined the Package struct and we want to test some logic attached to it, +// make the code compile and the tests pass! If you have issues execute `rustlings hint structs3` + +// I AM NOT DONE + +#[derive(Debug)] +struct Package { + from: String, + to: String, + weight: f32 +} + +impl Package { + fn new(from: String, to: String, weight: f32) -> Package { + if weight <= 0.0 { + // Something goes here... + } else { + return Package {from, to, weight}; + } + } + + fn is_international(&self) -> ??? { + // Something goes here... + } + + fn get_fees(&self, cost_per_kg: f32) -> ??? { + // Something goes here... + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[should_panic] + fn fail_creating_weightless_package() { + let country_from = String::from("Spain"); + let country_to = String::from("Austria"); + + Package::new(country_from, country_to, -2.21); + } + + #[test] + fn create_international_package() { + let country_from = String::from("Spain"); + let country_to = String::from("Russia"); + + let package = Package::new(country_from, country_to, 1.2); + + assert!(package.is_international()); + } + + #[test] + fn calculate_transport_fees() { + let country_from = String::from("Spain"); + let country_to = String::from("Spain"); + + let country_fee = ???; + + let package = Package::new(country_from, country_to, 22.0); + + assert_eq!(package.get_fees(country_fee), 176.0); + } +} diff --git a/info.toml b/info.toml index 71bb3ddb..1d0701f8 100644 --- a/info.toml +++ b/info.toml @@ -232,6 +232,19 @@ Creating instances of structs is easy, all you need to do is assign some values There is however some shortcuts that can be taken when instantiating structs. Have a look in The Book, to find out more: https://doc.rust-lang.org/stable/book/ch05-01-defining-structs.html#creating-instances-from-other-instances-with-struct-update-syntax""" +[[exercises]] +name = "structs3" +path = "exercises/structs/structs3.rs" +mode = "test" +hint = """ +The new method needs to panic if the weight is physically impossible :), how do we do that in Rust? + +For is_international: What makes a package international? Seems related to the places it goes through right? + +For calculate_transport_fees: Bigger is more expensive usually, we don't have size, but something may fit the bill here :) + +Have a look in The Book, to find out more about method implementations: https://doc.rust-lang.org/book/ch05-03-method-syntax.html""" + # STRINGS [[exercises]] From 9cfb617d5b0451b4b51644a1298965390cda9884 Mon Sep 17 00:00:00 2001 From: Abdou Seck Date: Wed, 29 Apr 2020 15:08:34 -0400 Subject: [PATCH 0107/1293] fix(installation): Check if python is available while checking for git,rustc and cargo closes #374 --- install.sh | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 7abb4064..532728e3 100755 --- a/install.sh +++ b/install.sh @@ -30,6 +30,22 @@ else exit 1 fi +# Look up python installations, starting with 3 with a fallback of 2 +if [ -x "$(command -v python3)" ] +then + PY="$(command -v python3)" +elif [ -x "$(command -v python)" ] +then + PY="$(command -v python)" +elif [ -x "$(command -v python2)" ] +then + PY="$(command -v python2)" +else + echo "ERROR: No working python installation was found" + echo "Please install python and add it to the PATH variable" + exit 1 +fi + # Function that compares two versions strings v1 and v2 given in arguments (e.g 1.31 and 1.33.0). # Returns 1 if v1 > v2, 0 if v1 == v2, 2 if v1 < v2. function vercomp() { @@ -86,7 +102,7 @@ Path=${1:-rustlings/} echo "Cloning Rustlings at $Path..." git clone -q https://github.com/rust-lang/rustlings $Path -Version=$(curl -s https://api.github.com/repos/rust-lang/rustlings/releases/latest | python -c "import json,sys;obj=json.load(sys.stdin);print(obj['tag_name']);") +Version=$(curl -s https://api.github.com/repos/rust-lang/rustlings/releases/latest | ${PY} -c "import json,sys;obj=json.load(sys.stdin);print(obj['tag_name']);") CargoBin="${CARGO_HOME:-$HOME/.cargo}/bin" echo "Checking out version $Version..." From 959008284834bece0196a01e17ac69a7e3590116 Mon Sep 17 00:00:00 2001 From: Dan Wilhelm Date: Wed, 29 Apr 2020 19:11:54 -0700 Subject: [PATCH 0108/1293] fix: update iterator and macro text for typos and clarity - /macros/README.md: Typo "modules" => "macros" - iterators2.py: Reduce line length to <90-char width. - iterators4.py: Update 'fun' => 'challenge' as per PR#177 - rustlings hint iterators4: improve clarity --- exercises/macros/README.md | 2 +- exercises/standard_library_types/iterators2.rs | 10 ++++++---- exercises/standard_library_types/iterators4.rs | 6 +++--- info.toml | 8 ++++---- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/exercises/macros/README.md b/exercises/macros/README.md index ef9e4bdb..b48b880a 100644 --- a/exercises/macros/README.md +++ b/exercises/macros/README.md @@ -2,7 +2,7 @@ Rust's macro system is very powerful, but also kind of difficult to wrap your head around. We're not going to teach you how to write your own fully-featured -modules, instead we'll show you how to use and create them. +macros. Instead, we'll show you how to use and create them. #### Book Sections diff --git a/exercises/standard_library_types/iterators2.rs b/exercises/standard_library_types/iterators2.rs index a1274a2d..837725f0 100644 --- a/exercises/standard_library_types/iterators2.rs +++ b/exercises/standard_library_types/iterators2.rs @@ -1,8 +1,10 @@ // iterators2.rs -// In this module, you'll learn some of unique advantages that iterators can offer -// Step 1. Complete the `capitalize_first` function to pass the first two cases -// Step 2. Apply the `capitalize_first` function to a vector of strings, ensuring that it returns a vector of strings as well -// Step 3. Apply the `capitalize_first` function again to a list, but try and ensure it returns a single string +// In this module, you'll learn some of unique advantages that iterators can offer. +// Step 1. Complete the `capitalize_first` function to pass the first two cases. +// Step 2. Apply the `capitalize_first` function to a vector of strings. +// Ensure that it returns a vector of strings as well. +// Step 3. Apply the `capitalize_first` function again to a list. +// Try to ensure it returns a single string. // As always, there are hints if you execute `rustlings hint iterators2`! // I AM NOT DONE diff --git a/exercises/standard_library_types/iterators4.rs b/exercises/standard_library_types/iterators4.rs index b945613f..88862838 100644 --- a/exercises/standard_library_types/iterators4.rs +++ b/exercises/standard_library_types/iterators4.rs @@ -3,13 +3,13 @@ // I AM NOT DONE pub fn factorial(num: u64) -> u64 { - // Complete this function to return factorial of num + // Complete this function to return the factorial of num // Do not use: // - return - // For extra fun don't use: + // Try not to use: // - imperative style loops (for, while) // - additional variables - // For the most fun don't use: + // For an extra challenge, don't use: // - recursion // Execute `rustlings hint iterators4` for hints. } diff --git a/info.toml b/info.toml index 71bb3ddb..d7374aba 100644 --- a/info.toml +++ b/info.toml @@ -640,10 +640,10 @@ name = "iterators4" path = "exercises/standard_library_types/iterators4.rs" mode = "test" hint = """ -In an imperative language you might write a for loop to iterate through -multiply the values into a mutable variable. Or you might write code more -functionally with recursion and a match clause. But you can also use ranges -and iterators to solve this in rust.""" +In an imperative language, you might write a for loop that updates +a mutable variable. Or, you might write code utilizing recursion +and a match clause. In Rust you can take another functional +approach, computing the factorial elegantly with ranges and iterators.""" # TRAITS From 80390d8a03fa423f5435598b8002b2624c592991 Mon Sep 17 00:00:00 2001 From: Darren Meehan Date: Thu, 30 Apr 2020 08:13:41 +0100 Subject: [PATCH 0109/1293] docs: Remove outdated MacOS instructions The quoted file no longer exists --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index baaa88fa..db20330f 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,6 @@ Alternatively, for a first-time Rust learner, there's several other resources: _Note: If you're on MacOS, make sure you've installed Xcode and its developer tools by typing `xcode-select --install`._ -_Note: If you have Xcode 10+ installed, you also need to install the package file found at `/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg`._ - You will need to have Rust installed. You can get it by visiting https://rustup.rs. This'll also install Cargo, Rust's package/project manager. ## MacOS/Linux From a901499ededd3ce1995164700514fe4e9a0373ea Mon Sep 17 00:00:00 2001 From: Jihchi Lee Date: Thu, 30 Apr 2020 21:53:50 +0800 Subject: [PATCH 0110/1293] fix(from_into.rs): typo --- exercises/conversions/from_into.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs index 58b860e9..c5cba23e 100644 --- a/exercises/conversions/from_into.rs +++ b/exercises/conversions/from_into.rs @@ -31,7 +31,7 @@ impl Default for Person { // 3. Extract the first element from the split operation and use it as the name // 4. Extract the other element from the split operation and parse it into a `usize` as the age // If while parsing the age, something goes wrong, then return the default of Person -// Otherwise, then return an instantiated Person onject with the results +// Otherwise, then return an instantiated Person object with the results impl From<&str> for Person { fn from(s: &str) -> Person { } From c301814d6809ee65b58ea525c3ee74df19616595 Mon Sep 17 00:00:00 2001 From: Christofer Bertonha Date: Sat, 2 May 2020 18:30:11 +0200 Subject: [PATCH 0111/1293] chore: Remove deprecated description from error_handling/errorsn.rs --- exercises/error_handling/errorsn.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/exercises/error_handling/errorsn.rs b/exercises/error_handling/errorsn.rs index 30799430..1b985bf4 100644 --- a/exercises/error_handling/errorsn.rs +++ b/exercises/error_handling/errorsn.rs @@ -100,15 +100,12 @@ enum CreationError { impl fmt::Display for CreationError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str((self as &dyn error::Error).description()) + let description = match *self { + CreationError::Negative => "Number is negative", + CreationError::Zero => "Number is zero", + }; + f.write_str(description) } } -impl error::Error for CreationError { - fn description(&self) -> &str { - match *self { - CreationError::Negative => "Negative", - CreationError::Zero => "Zero", - } - } -} +impl error::Error for CreationError {} From 1da84b5f7c489f65bd683c244f13c7d1ee812df0 Mon Sep 17 00:00:00 2001 From: Rob Story Date: Thu, 30 Apr 2020 21:17:17 -0700 Subject: [PATCH 0112/1293] feat: Add if2 exercise --- exercises/if/if2.rs | 36 ++++++++++++++++++++++++++++++++++++ info.toml | 9 +++++++++ 2 files changed, 45 insertions(+) create mode 100644 exercises/if/if2.rs diff --git a/exercises/if/if2.rs b/exercises/if/if2.rs new file mode 100644 index 00000000..80effbdf --- /dev/null +++ b/exercises/if/if2.rs @@ -0,0 +1,36 @@ +// if2.rs + +// Step 1: Make me compile! +// Step 2: Get the bar_for_fuzz and default_to_baz tests passing! +// Execute the command `rustlings hint if2` if you want a hint :) + +// I AM NOT DONE + +pub fn fizz_if_foo(fizzish: &str) -> &str { + if fizzish == "fizz" { + "foo" + } else { + 1 + } +} + +// No test changes needed! +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn foo_for_fizz() { + assert_eq!(fizz_if_foo("fizz"), "foo") + } + + #[test] + fn bar_for_fuzz() { + assert_eq!(fizz_if_foo("fuzz"), "bar") + } + + #[test] + fn default_to_baz() { + assert_eq!(fizz_if_foo("literally anything"), "baz") + } +} diff --git a/info.toml b/info.toml index d7374aba..e852ad0c 100644 --- a/info.toml +++ b/info.toml @@ -87,6 +87,15 @@ Remember in Rust that: - `if`/`else` conditionals are expressions - Each condition is followed by a `{}` block.""" +[[exercises]] +name = "if2" +path = "exercises/if/if2.rs" +mode = "test" +hint = """ +For that first compiler error, it's important in Rust that each conditional +block return the same type! To get the tests passing, you will need a couple +conditions checking different input values.""" + # FUNCTIONS [[exercises]] From f6cffc7e487b42f15a6f958e49704c93a8d4465b Mon Sep 17 00:00:00 2001 From: Rob Story Date: Sat, 2 May 2020 16:39:37 -0700 Subject: [PATCH 0113/1293] fix(option1): Add cast to usize, as it is confusing in the context of an exercise about Option --- exercises/option/option1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/option/option1.rs b/exercises/option/option1.rs index 51c39f50..2a6c2f77 100644 --- a/exercises/option/option1.rs +++ b/exercises/option/option1.rs @@ -18,6 +18,6 @@ fn main() { ((iter * 5) + 2) / (4 * 16) }; - numbers[iter] = number_to_add; + numbers[iter as usize] = number_to_add; } } From 41f989135d79eba4602d4fde828698acf9a9f235 Mon Sep 17 00:00:00 2001 From: apatniv Date: Sat, 2 May 2020 20:41:11 -0400 Subject: [PATCH 0114/1293] Review Comments: Add other test cases --- exercises/conversions/from_into.rs | 38 +++++++++++++++++++++++++- exercises/conversions/from_str.rs | 34 ++++++++++++++++++++++- exercises/conversions/try_from_into.rs | 33 +++++++++++++++++++++- 3 files changed, 102 insertions(+), 3 deletions(-) diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs index 58b860e9..cfcfa309 100644 --- a/exercises/conversions/from_into.rs +++ b/exercises/conversions/from_into.rs @@ -29,7 +29,8 @@ impl Default for Person { // 1. If the length of the provided string is 0, then return the default of Person // 2. Split the given string on the commas present in it // 3. Extract the first element from the split operation and use it as the name -// 4. Extract the other element from the split operation and parse it into a `usize` as the age +// 4. If the name is empty, then return the default of Person +// 5. Extract the other element from the split operation and parse it into a `usize` as the age // If while parsing the age, something goes wrong, then return the default of Person // Otherwise, then return an instantiated Person onject with the results impl From<&str> for Person { @@ -77,4 +78,39 @@ mod tests { assert_eq!(p.name, "John"); assert_eq!(p.age, 30); } + + #[test] + fn test_missing_comma_and_age() { + let p: Person = Person::from("Mark"); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 30); + } + + #[test] + fn test_missing_age() { + let p: Person = Person::from("Mark,"); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 30); + } + + #[test] + fn test_missing_name() { + let p: Person = Person::from(",1"); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 30); + } + + #[test] + fn test_missing_name_and_age() { + let p: Person = Person::from(","); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 30); + } + + #[test] + fn test_missing_name_and_invalid_age() { + let p: Person = Person::from(",one"); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 30); + } } diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 7b4fdaca..14e9e09d 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -15,7 +15,8 @@ struct Person { // 1. If the length of the provided string is 0, then return an error // 2. Split the given string on the commas present in it // 3. Extract the first element from the split operation and use it as the name -// 4. Extract the other element from the split operation and parse it into a `usize` as the age +// 4. If the name is empty, then return an error +// 5. Extract the other element from the split operation and parse it into a `usize` as the age // If while parsing the age, something goes wrong, then return an error // Otherwise, then return a Result of a Person object impl FromStr for Person { @@ -48,6 +49,37 @@ mod tests { #[test] #[should_panic] fn missing_age() { + "John,".parse::().unwrap(); + } + + #[test] + #[should_panic] + fn invalid_age() { + "John,twenty".parse::().unwrap(); + } + + #[test] + #[should_panic] + fn missing_comma_and_age() { "John".parse::().unwrap(); } + + #[test] + #[should_panic] + fn missing_name() { + ",1".parse::().unwrap(); + } + + #[test] + #[should_panic] + fn missing_name_and_age() { + ",".parse::().unwrap(); + } + + #[test] + #[should_panic] + fn missing_name_and_invalid_age() { + ",one".parse::().unwrap(); + } + } \ No newline at end of file diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index 834dd932..9968075e 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -22,7 +22,8 @@ struct Person { // 1. If the length of the provided string is 0, then return an error // 2. Split the given string on the commas present in it // 3. Extract the first element from the split operation and use it as the name -// 4. Extract the other element from the split operation and parse it into a `usize` as the age +// 4. If the name is empty, then return an error. +// 5. Extract the other element from the split operation and parse it into a `usize` as the age // If while parsing the age, something goes wrong, then return an error // Otherwise, then return a Result of a Person object impl TryFrom<&str> for Person { @@ -68,4 +69,34 @@ mod tests { fn test_panic_bad_age() { let p = Person::try_from("Mark,twenty").unwrap(); } + + #[test] + #[should_panic] + fn test_missing_comma_and_age() { + let _: Person = "Mark".try_into().unwrap(); + } + + #[test] + #[should_panic] + fn test_missing_age() { + let _: Person = "Mark,".try_into().unwrap(); + } + + #[test] + #[should_panic] + fn test_missing_name() { + let _ : Person = ",1".try_into().unwrap(); + } + + #[test] + #[should_panic] + fn test_missing_name_and_age() { + let _: Person = ",".try_into().unwrap(); + } + + #[test] + #[should_panic] + fn test_missing_name_and_invalid_age() { + let _: Person = ",one".try_into().unwrap(); + } } \ No newline at end of file From 09e89bbcd3079ef440e24837f42b8a0b080eb20e Mon Sep 17 00:00:00 2001 From: Siobhan Jacobson Date: Mon, 4 May 2020 18:59:23 -0400 Subject: [PATCH 0115/1293] Update Message::Move in the enums3 test to take a Point. --- exercises/enums/enums3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs index bb7dfb43..4b0be975 100644 --- a/exercises/enums/enums3.rs +++ b/exercises/enums/enums3.rs @@ -53,7 +53,7 @@ mod tests { }; state.process(Message::ChangeColor(255, 0, 255)); state.process(Message::Echo(String::from("hello world"))); - state.process(Message::Move{ x: 10, y: 15 }); + state.process(Message::Move(Point{ x: 10, y: 15 })); state.process(Message::Quit); assert_eq!(state.color, (255, 0, 255)); From 2b20c8a0f5774d07c58d110d75879f33fc6273b5 Mon Sep 17 00:00:00 2001 From: Evan Carroll Date: Wed, 6 May 2020 14:12:15 -0500 Subject: [PATCH 0116/1293] fix(errorsn): Try harder to confine the user. (#388) --- exercises/error_handling/errorsn.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/exercises/error_handling/errorsn.rs b/exercises/error_handling/errorsn.rs index 1b985bf4..5fe212bf 100644 --- a/exercises/error_handling/errorsn.rs +++ b/exercises/error_handling/errorsn.rs @@ -2,8 +2,10 @@ // This is a bigger error exercise than the previous ones! // You can do it! :) // -// Edit the `read_and_validate` function so that it compiles and -// passes the tests... so many things could go wrong! +// Edit the `read_and_validate` function ONLY. Don't create any Errors +// that do not already exist. +// +// So many things could go wrong! // // - Reading from stdin could produce an io::Error // - Parsing the input could produce a num::ParseIntError @@ -30,6 +32,10 @@ fn read_and_validate(b: &mut dyn io::BufRead) -> Result Result> { let mut b = io::BufReader::new(s.as_bytes()); From 9f75554f2a30295996f03f0160b98c0458305502 Mon Sep 17 00:00:00 2001 From: Jawaad Mahmood Date: Sun, 10 May 2020 05:21:29 -0600 Subject: [PATCH 0117/1293] fix(options1): Add hint about Array Initialization (#389) --- info.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 89a669c5..c47041b8 100644 --- a/info.toml +++ b/info.toml @@ -561,13 +561,15 @@ name = "option1" path = "exercises/option/option1.rs" mode = "compile" hint = """ -Check out some functions of Option: +Hint 1: Check out some functions of Option: is_some is_none unwrap and: pattern matching + +Hint 2: There are no sensible defaults for the value of an Array; the values need to be filled before use. """ [[exercises]] From d6c0a688e6a96f93ad60d540d4b326f342fc0d45 Mon Sep 17 00:00:00 2001 From: Gaurang Tandon <1gaurangtandon@gmail.com> Date: Wed, 13 May 2020 16:08:14 +0530 Subject: [PATCH 0118/1293] fix(test2): name of type String and &str (#394) --- exercises/test2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/test2.rs b/exercises/test2.rs index d01606c1..acdcb95e 100644 --- a/exercises/test2.rs +++ b/exercises/test2.rs @@ -2,7 +2,7 @@ // This is a test for the following sections: // - Strings -// Ok, here are a bunch of values-- some are `Strings`, some are `&strs`. Your +// Ok, here are a bunch of values-- some are `String`s, some are `&str`s. Your // task is to call one of these two functions on each value depending on what // you think each value is. That is, add either `string_slice` or `string` // before the parentheses on each line. If you're right, it will compile! From 763aa6e378a586caae2d8d63755a85eeba227933 Mon Sep 17 00:00:00 2001 From: IkaR49 Date: Sat, 16 May 2020 00:02:57 +0300 Subject: [PATCH 0119/1293] feat: Rewrite try_from_into (#393) --- exercises/conversions/from_str.rs | 3 +- exercises/conversions/try_from_into.rs | 144 +++++++++++++++---------- info.toml | 5 +- 3 files changed, 91 insertions(+), 61 deletions(-) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 14e9e09d..014d0549 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -17,6 +17,7 @@ struct Person { // 3. Extract the first element from the split operation and use it as the name // 4. If the name is empty, then return an error // 5. Extract the other element from the split operation and parse it into a `usize` as the age +// with something like `"4".parse::()`. // If while parsing the age, something goes wrong, then return an error // Otherwise, then return a Result of a Person object impl FromStr for Person { @@ -82,4 +83,4 @@ mod tests { ",one".parse::().unwrap(); } -} \ No newline at end of file +} diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index 9968075e..dbdbe00e 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -5,98 +5,126 @@ use std::convert::{TryInto, TryFrom}; #[derive(Debug)] -struct Person { - name: String, - age: usize, +struct Color { + red: u8, + green: u8, + blue: u8, } // I AM NOT DONE + // Your task is to complete this implementation -// in order for the line `let p = Person::try_from("Mark,20")` to compile -// and return an Ok result of inner type Person. -// Please note that you'll need to parse the age component into a `usize` -// with something like `"4".parse::()`. The outcome of this needs to -// be handled appropriately. +// and return an Ok result of inner type Color. +// You need create implementation for a tuple of three integer, +// an array of three integer and slice of integer. // -// Steps: -// 1. If the length of the provided string is 0, then return an error -// 2. Split the given string on the commas present in it -// 3. Extract the first element from the split operation and use it as the name -// 4. If the name is empty, then return an error. -// 5. Extract the other element from the split operation and parse it into a `usize` as the age -// If while parsing the age, something goes wrong, then return an error -// Otherwise, then return a Result of a Person object -impl TryFrom<&str> for Person { +// Note, that implementation for tuple and array will be checked at compile-time, +// but slice implementation need check slice length! +// Also note, that chunk of correct rgb color must be integer in range 0..=255. + +// Tuple implementation +impl TryFrom<(i16, i16, i16)> for Color { type Error = String; - fn try_from(s: &str) -> Result { + fn try_from(tuple: (i16, i16, i16)) -> Result { + } +} + +// Array implementation +impl TryFrom<[i16; 3]> for Color { + type Error = String; + fn try_from(arr: [i16; 3]) -> Result { + } +} + +// Slice implementation +impl TryFrom<&[i16]> for Color { + type Error = String; + fn try_from(slice: &[i16]) -> Result { } } fn main() { // Use the `from` function - let p1 = Person::try_from("Mark,20"); - // Since From is implemented for Person, we should be able to use Into - let p2: Result = "Gerald,70".try_into(); - println!("{:?}", p1); - println!("{:?}", p2); + let c1 = Color::try_from((183, 65, 14)); + println!("{:?}", c1); + + // Since From is implemented for Color, we should be able to use Into + let c2: Result = [183, 65, 14].try_into(); + println!("{:?}", c2); + + let v = vec![183, 65, 14]; + // With slice we should use `from` function + let c3 = Color::try_from(&v[..]); + println!("{:?}", c3); + // or take slice within round brackets and use Into + let c4: Result = (&v[..]).try_into(); + println!("{:?}", c4); } #[cfg(test)] mod tests { use super::*; + #[test] - fn test_bad_convert() { - // Test that error is returned when bad string is provided - let p = Person::try_from(""); - assert!(p.is_err()); - } - #[test] - fn test_good_convert() { - // Test that "Mark,20" works - let p = Person::try_from("Mark,20"); - assert!(p.is_ok()); - let p = p.unwrap(); - assert_eq!(p.name, "Mark"); - assert_eq!(p.age, 20); + #[should_panic] + fn test_tuple_out_of_range_positive() { + let _ = Color::try_from((256, 1000, 10000)).unwrap(); } #[test] #[should_panic] - fn test_panic_empty_input() { - let p: Person = "".try_into().unwrap(); + fn test_tuple_out_of_range_negative() { + let _ = Color::try_from((-1, -10, -256)).unwrap(); } #[test] - #[should_panic] - fn test_panic_bad_age() { - let p = Person::try_from("Mark,twenty").unwrap(); + fn test_tuple_correct() { + let c: Color = (183, 65, 14).try_into().unwrap(); + assert_eq!(c.red, 183); + assert_eq!(c.green, 65); + assert_eq!(c.blue, 14); } #[test] #[should_panic] - fn test_missing_comma_and_age() { - let _: Person = "Mark".try_into().unwrap(); + fn test_array_out_of_range_positive() { + let _: Color = [1000, 10000, 256].try_into().unwrap(); + } + #[test] + #[should_panic] + fn test_array_out_of_range_negative() { + let _: Color = [-10, -256, -1].try_into().unwrap(); + } + #[test] + fn test_array_correct() { + let c: Color = [183, 65, 14].try_into().unwrap(); + assert_eq!(c.red, 183); + assert_eq!(c.green, 65); + assert_eq!(c.blue, 14); } #[test] #[should_panic] - fn test_missing_age() { - let _: Person = "Mark,".try_into().unwrap(); + fn test_slice_out_of_range_positive() { + let arr = [10000, 256, 1000]; + let _ = Color::try_from(&arr[..]).unwrap(); } - #[test] #[should_panic] - fn test_missing_name() { - let _ : Person = ",1".try_into().unwrap(); + fn test_slice_out_of_range_negative() { + let arr = [-256, -1, -10]; + let _ = Color::try_from(&arr[..]).unwrap(); + } + #[test] + fn test_slice_correct() { + let v = vec![183, 65, 14]; + let c = Color::try_from(&v[..]).unwrap(); + assert_eq!(c.red, 183); + assert_eq!(c.green, 65); + assert_eq!(c.blue, 14); } - #[test] #[should_panic] - fn test_missing_name_and_age() { - let _: Person = ",".try_into().unwrap(); + fn test_slice_excess_length() { + let v = vec![0, 0, 0, 0]; + let _ = Color::try_from(&v[..]).unwrap(); } - - #[test] - #[should_panic] - fn test_missing_name_and_invalid_age() { - let _: Person = ",one".try_into().unwrap(); - } -} \ No newline at end of file +} diff --git a/info.toml b/info.toml index c47041b8..7858d7cb 100644 --- a/info.toml +++ b/info.toml @@ -799,5 +799,6 @@ name = "from_str" path = "exercises/conversions/from_str.rs" mode = "test" hint = """ -If you've already solved try_from_into.rs, then this is almost a copy-paste. -Otherwise, go ahead and solve try_from_into.rs first.""" +The implementation of FromStr should return an Ok with a Person object, +or an Err with a string if the string is not valid. +This is a some like an `try_from_into` exercise.""" From 10967bce57682812dc0891a9f9757da1a9d87404 Mon Sep 17 00:00:00 2001 From: Stefan Kupresak Date: Sat, 16 May 2020 22:48:18 +0200 Subject: [PATCH 0120/1293] fix(option2): Add TODO to comments (#400) --- exercises/option/option2.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/option/option2.rs b/exercises/option/option2.rs index a55f734e..a1517d7c 100644 --- a/exercises/option/option2.rs +++ b/exercises/option/option2.rs @@ -5,7 +5,7 @@ fn main() { let optional_value = Some(String::from("rustlings")); - // Make this an if let statement whose value is "Some" type + // TODO: Make this an if let statement whose value is "Some" type value = optional_value { println!("the value of optional value is: {}", value); } else { @@ -17,7 +17,7 @@ fn main() { optional_values_vec.push(Some(x)); } - // make this a while let statement - remember that vector.pop also adds another layer of Option + // TODO: make this a while let statement - remember that vector.pop also adds another layer of Option // You can stack `Option`'s into while let and if let value = optional_values_vec.pop() { println!("current value: {}", value); From 010a04569282149cea7f7a76fc4d7f4c9f0f08dd Mon Sep 17 00:00:00 2001 From: Sanjay K Date: Tue, 19 May 2020 12:47:44 -0400 Subject: [PATCH 0121/1293] feat: renames test to quiz, fixes #244 BREAKING CHANGE * changed test to quiz: fixes issues in #244 * fixed info.toml: #244 * fixed naming related issues --- README.md | 2 +- exercises/{test1.rs => quiz1.rs} | 4 ++-- exercises/{test2.rs => quiz2.rs} | 4 ++-- exercises/{test3.rs => quiz3.rs} | 6 +++--- exercises/{test4.rs => quiz4.rs} | 6 +++--- info.toml | 18 +++++++++--------- 6 files changed, 20 insertions(+), 20 deletions(-) rename exercises/{test1.rs => quiz1.rs} (90%) rename exercises/{test2.rs => quiz2.rs} (93%) rename exercises/{test3.rs => quiz3.rs} (81%) rename exercises/{test4.rs => quiz4.rs} (74%) diff --git a/README.md b/README.md index db20330f..c5d399e0 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ rustlings hint myExercise1 ## Testing yourself -After every couple of sections, there will be a test that'll test your knowledge on a bunch of sections at once. These tests are found in `exercises/testN.rs`. +After every couple of sections, there will be a quiz that'll test your knowledge on a bunch of sections at once. These quizzes are found in `exercises/quizN.rs`. ## Completion diff --git a/exercises/test1.rs b/exercises/quiz1.rs similarity index 90% rename from exercises/test1.rs rename to exercises/quiz1.rs index 8b5b8fdd..5c5c355d 100644 --- a/exercises/test1.rs +++ b/exercises/quiz1.rs @@ -1,5 +1,5 @@ -// test1.rs -// This is a test for the following sections: +// quiz1.rs +// This is a quiz for the following sections: // - Variables // - Functions diff --git a/exercises/test2.rs b/exercises/quiz2.rs similarity index 93% rename from exercises/test2.rs rename to exercises/quiz2.rs index acdcb95e..8caeaa99 100644 --- a/exercises/test2.rs +++ b/exercises/quiz2.rs @@ -1,5 +1,5 @@ -// test2.rs -// This is a test for the following sections: +// quiz2.rs +// This is a quiz for the following sections: // - Strings // Ok, here are a bunch of values-- some are `String`s, some are `&str`s. Your diff --git a/exercises/test3.rs b/exercises/quiz3.rs similarity index 81% rename from exercises/test3.rs rename to exercises/quiz3.rs index f94c36f4..30596b9b 100644 --- a/exercises/test3.rs +++ b/exercises/quiz3.rs @@ -1,8 +1,8 @@ -// test3.rs -// This is a test for the following sections: +// quiz.rs +// This is a quiz for the following sections: // - Tests -// This test isn't testing our function -- make it do that in such a way that +// This quiz isn't testing our function -- make it do that in such a way that // the test passes. Then write a second test that tests that we get the result // we expect to get when we call `times_two` with a negative number. // No hints, you can do this :) diff --git a/exercises/test4.rs b/exercises/quiz4.rs similarity index 74% rename from exercises/test4.rs rename to exercises/quiz4.rs index ad1f6ac5..6c47480d 100644 --- a/exercises/test4.rs +++ b/exercises/quiz4.rs @@ -1,9 +1,9 @@ -// test4.rs -// This test covers the sections: +// quiz4.rs +// This quiz covers the sections: // - Modules // - Macros -// Write a macro that passes the test! No hints this time, you can do it! +// Write a macro that passes the quiz! No hints this time, you can do it! // I AM NOT DONE diff --git a/info.toml b/info.toml index 7858d7cb..e2aa82a7 100644 --- a/info.toml +++ b/info.toml @@ -149,8 +149,8 @@ They are not the same. There are two solutions: # TEST 1 [[exercises]] -name = "test1" -path = "exercises/test1.rs" +name = "quiz1" +path = "exercises/quiz1.rs" mode = "test" hint = "No hints this time ;)" @@ -280,8 +280,8 @@ string slice instead of a `String`, wouldn't it?? There is a way to add one char # TEST 2 [[exercises]] -name = "test2" -path = "exercises/test2.rs" +name = "quiz2" +path = "exercises/quiz2.rs" mode = "compile" hint = "No hints this time ;)" @@ -311,7 +311,7 @@ hint = "No hints this time ;)" # TESTS [[exercises]] -name = "tests1" +name = "quiz1" path = "exercises/tests/tests1.rs" mode = "test" hint = """ @@ -343,8 +343,8 @@ can negate the result of what you're doing using `!`, like `assert!(!having_fun( # TEST 3 [[exercises]] -name = "test3" -path = "exercises/test3.rs" +name = "quiz3" +path = "exercises/quiz3.rs" mode = "test" hint = "No hints this time ;)" @@ -414,8 +414,8 @@ The way macros are written, it wants to see something between each # TEST 4 [[exercises]] -name = "test4" -path = "exercises/test4.rs" +name = "quiz4" +path = "exercises/quiz4.rs" mode = "test" hint = "No hints this time ;)" From c7c3130507c987bf9d7312e6d9ac69908cad3a49 Mon Sep 17 00:00:00 2001 From: Jade McGough Date: Tue, 19 May 2020 23:31:28 -0700 Subject: [PATCH 0122/1293] chore: remove struct2 hint comment --- exercises/structs/structs2.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/exercises/structs/structs2.rs b/exercises/structs/structs2.rs index 0699137c..f9c6427d 100644 --- a/exercises/structs/structs2.rs +++ b/exercises/structs/structs2.rs @@ -1,6 +1,5 @@ // structs2.rs // Address all the TODOs to make the tests pass! -// No hints, just do it! // I AM NOT DONE From 06ef4cc654e75d22a526812919ee49b8956280bf Mon Sep 17 00:00:00 2001 From: Evan Carroll Date: Mon, 25 May 2020 03:09:11 -0500 Subject: [PATCH 0123/1293] fix: confine the user further in variable exercises We want to teach a specific lesson. To ensure that we do, let's try to provide more clarity on what the user should not do. --- exercises/variables/variables3.rs | 2 +- exercises/variables/variables5.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/variables/variables3.rs b/exercises/variables/variables3.rs index 07b1a521..30ec48ff 100644 --- a/exercises/variables/variables3.rs +++ b/exercises/variables/variables3.rs @@ -6,6 +6,6 @@ fn main() { let x = 3; println!("Number {}", x); - x = 5; + x = 5; // don't change this line println!("Number {}", x); } diff --git a/exercises/variables/variables5.rs b/exercises/variables/variables5.rs index 47a68a55..5b2c2fa3 100644 --- a/exercises/variables/variables5.rs +++ b/exercises/variables/variables5.rs @@ -4,7 +4,7 @@ // I AM NOT DONE fn main() { - let number = "3"; + let number = "3"; // don't change this line println!("Number {}", number); number = 3; println!("Number {}", number); From 7479a4737bdcac347322ad0883ca528c8675e720 Mon Sep 17 00:00:00 2001 From: AlexandruGG Date: Tue, 26 May 2020 21:46:24 +0100 Subject: [PATCH 0124/1293] feat: Add box1.rs exercise --- exercises/standard_library_types/README.md | 2 ++ exercises/standard_library_types/box1.rs | 35 ++++++++++++++++++++++ info.toml | 18 +++++++++++ 3 files changed, 55 insertions(+) create mode 100644 exercises/standard_library_types/box1.rs diff --git a/exercises/standard_library_types/README.md b/exercises/standard_library_types/README.md index d138d874..36b30c1f 100644 --- a/exercises/standard_library_types/README.md +++ b/exercises/standard_library_types/README.md @@ -1,3 +1,5 @@ +For the Box exercise check out the chapter [Using Box to Point to Data on the Heap](https://doc.rust-lang.org/book/ch15-01-box.html). + For the Arc exercise check out the chapter [Shared-State Concurrency](https://doc.rust-lang.org/book/ch16-03-shared-state.html) of the Rust Book. For the Iterator exercise check out the chapters [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html) of the Rust Book and the [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/). diff --git a/exercises/standard_library_types/box1.rs b/exercises/standard_library_types/box1.rs new file mode 100644 index 00000000..11156ea0 --- /dev/null +++ b/exercises/standard_library_types/box1.rs @@ -0,0 +1,35 @@ +// box1.rs +// +// At compile time, Rust needs to know how much space a type takes up. This becomes problematic +// for recursive types, where a value can have as part of itself another value of the same type. +// To get around the issue, we can use a `Box` - a smart pointer used to store data on the heap, +// which also allows us to wrap a recursive type. +// +// The recursive type we're implementing in this exercise is the `cons list` - a data structure +// frequently found in functional programming languages. Each item in a cons list contains two +// elements: the value of the current item and the next item. The last item is a value called `Nil`. +// +// Step 1: use a `Box` in the enum definition to make the code compile +// Step 2: create both empty and non-empty cons lists of by replacing `unimplemented!()` +// +// Execute `rustlings hint box1` for hints :) + +// I AM NOT DONE + +#[derive(PartialEq, Debug)] +enum List { + Cons(i32, List), + Nil, +} + +fn main() { + let empty_list = unimplemented!(); + println!("This is an empty cons list: {:?}", empty_list); + + let non_empty_list = unimplemented!(); + println!("This is a non-empty cons list: {:?}", non_empty_list); + + // Do not change these + assert_eq!(List::Nil, empty_list); + assert_ne!(empty_list, non_empty_list); +} diff --git a/info.toml b/info.toml index e2aa82a7..dcd93bf2 100644 --- a/info.toml +++ b/info.toml @@ -614,6 +614,24 @@ hint = """ # STANDARD LIBRARY TYPES +[[exercises]] +name = "box1" +path = "exercises/standard_library_types/box1.rs" +mode = "compile" +hint = """ +Step 1 +The compiler's message should help: since we cannot store the value of the actual type +when working with recursive types, we need to store a reference (pointer) to its value. +We should therefore place our `List` inside a `Box`. More details in the book here: +https://doc.rust-lang.org/book/ch15-01-box.html#enabling-recursive-types-with-boxes + +Step 2 +Creating an empty list should be fairly straightforward (hint: peek at the assertions). +For a non-empty list keep in mind that wee want to use our Cons "list builder". +Although the current list is one of integers (i32), feel free to change the definition +and try other types! +""" + [[exercises]] name = "arc1" path = "exercises/standard_library_types/arc1.rs" From cce6a4427718724a9096800754cd3abeca6a1580 Mon Sep 17 00:00:00 2001 From: Thomas Sauvajon Date: Wed, 27 May 2020 18:50:24 +1000 Subject: [PATCH 0125/1293] fix(option1): Don't add only zeros to the numbers array --- exercises/option/option1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/option/option1.rs b/exercises/option/option1.rs index 2a6c2f77..602ff1a9 100644 --- a/exercises/option/option1.rs +++ b/exercises/option/option1.rs @@ -15,7 +15,7 @@ fn main() { let mut numbers: [Option; 5]; for iter in 0..5 { let number_to_add: u16 = { - ((iter * 5) + 2) / (4 * 16) + ((iter * 1235) + 2) / (4 * 16) }; numbers[iter as usize] = number_to_add; From df81141d6fb3f43a7a035c4efc1150b6ede0b472 Mon Sep 17 00:00:00 2001 From: AlexandruGG Date: Wed, 27 May 2020 10:03:59 +0100 Subject: [PATCH 0126/1293] Address PR feedback: add tests --- exercises/standard_library_types/box1.rs | 38 +++++++++++++++++------- info.toml | 6 ++-- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/exercises/standard_library_types/box1.rs b/exercises/standard_library_types/box1.rs index 11156ea0..2248962e 100644 --- a/exercises/standard_library_types/box1.rs +++ b/exercises/standard_library_types/box1.rs @@ -12,24 +12,42 @@ // Step 1: use a `Box` in the enum definition to make the code compile // Step 2: create both empty and non-empty cons lists of by replacing `unimplemented!()` // +// Note: the tests should not be changed +// // Execute `rustlings hint box1` for hints :) // I AM NOT DONE #[derive(PartialEq, Debug)] -enum List { +pub enum List { Cons(i32, List), Nil, } fn main() { - let empty_list = unimplemented!(); - println!("This is an empty cons list: {:?}", empty_list); - - let non_empty_list = unimplemented!(); - println!("This is a non-empty cons list: {:?}", non_empty_list); - - // Do not change these - assert_eq!(List::Nil, empty_list); - assert_ne!(empty_list, non_empty_list); + println!("This is an empty cons list: {:?}", create_empty_list()); + println!("This is a non-empty cons list: {:?}", create_non_empty_list()); +} + +pub fn create_empty_list() -> List { + unimplemented!() +} + +pub fn create_non_empty_list() -> List { + unimplemented!() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_create_empty_list() { + assert_eq!(List::Nil, create_empty_list()) + } + + #[test] + fn test_create_non_empty_list() { + assert_ne!(create_empty_list(), create_non_empty_list()) + } } diff --git a/info.toml b/info.toml index dcd93bf2..842253c5 100644 --- a/info.toml +++ b/info.toml @@ -617,17 +617,17 @@ hint = """ [[exercises]] name = "box1" path = "exercises/standard_library_types/box1.rs" -mode = "compile" +mode = "test" hint = """ Step 1 The compiler's message should help: since we cannot store the value of the actual type when working with recursive types, we need to store a reference (pointer) to its value. -We should therefore place our `List` inside a `Box`. More details in the book here: +We should, therefore, place our `List` inside a `Box`. More details in the book here: https://doc.rust-lang.org/book/ch15-01-box.html#enabling-recursive-types-with-boxes Step 2 Creating an empty list should be fairly straightforward (hint: peek at the assertions). -For a non-empty list keep in mind that wee want to use our Cons "list builder". +For a non-empty list keep in mind that we want to use our Cons "list builder". Although the current list is one of integers (i32), feel free to change the definition and try other types! """ From 0311c03735ddbcd66fff951d8f31f89b29c893c0 Mon Sep 17 00:00:00 2001 From: Dan Wilhelm Date: Wed, 27 May 2020 23:38:38 -0700 Subject: [PATCH 0127/1293] chore: Limit generics3 lines to 90 chars --- exercises/generics/generics3.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/exercises/generics/generics3.rs b/exercises/generics/generics3.rs index cd3232a4..c76425c3 100644 --- a/exercises/generics/generics3.rs +++ b/exercises/generics/generics3.rs @@ -1,10 +1,11 @@ -// An imaginary magical school has a new report card generation system written in rust! +// An imaginary magical school has a new report card generation system written in Rust! // Currently the system only supports creating report cards where the student's grade -// is represented numerically (e.g. 1.0 -> 5.5). However, the school also issues alphabetical grades -// (A+ -> F-) and needs to be able to print both types of report card! +// is represented numerically (e.g. 1.0 -> 5.5). +// However, the school also issues alphabetical grades (A+ -> F-) and needs +// to be able to print both types of report card! -// Make the necessary code changes to support alphabetical report cards, thereby making the second -// test pass. +// Make the necessary code changes to support alphabetical report cards, thereby making +// the second test pass. // I AM NOT DONE pub struct ReportCard { @@ -15,7 +16,8 @@ pub struct ReportCard { impl ReportCard { pub fn print(&self) -> String { - format!("{} ({}) - achieved a grade of {}", &self.student_name, &self.student_age, &self.grade) + format!("{} ({}) - achieved a grade of {}", + &self.student_name, &self.student_age, &self.grade) } } From 500422d594bb75496b49e95ae104945dcd7c19a6 Mon Sep 17 00:00:00 2001 From: Allan Soares Duarte Date: Thu, 28 May 2020 04:33:15 -0300 Subject: [PATCH 0128/1293] chore: Update variables6.rs book link --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index e2aa82a7..66d60da2 100644 --- a/info.toml +++ b/info.toml @@ -68,7 +68,7 @@ then keyword 'let'. Constants types must also always be annotated. Read more about constants under 'Differences Between Variables and Constants' in the book's section 'Variables and Mutability': -https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html +https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#differences-between-variables-and-constants """ # IF From e81adc275240308ea49fe4f09f80977d5e6e4dce Mon Sep 17 00:00:00 2001 From: Dan Wilhelm Date: Thu, 28 May 2020 00:35:29 -0700 Subject: [PATCH 0129/1293] chore: Add Powershell reminder --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c5d399e0..67eff547 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ This will install Rustlings and give you access to the `rustlings` command. Run ## Windows -First, set `ExecutionPolicy` to `RemoteSigned`: +In Powershell, set `ExecutionPolicy` to `RemoteSigned`: ```ps Set-ExecutionPolicy RemoteSigned From 7e79c512225eb2a302db7f9b041c736b806e97f4 Mon Sep 17 00:00:00 2001 From: AlexandruGG Date: Thu, 28 May 2020 18:01:32 +0100 Subject: [PATCH 0130/1293] Add .idea to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index de87c1e7..6094e5c1 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ target/ *.pdb exercises/clippy/Cargo.toml exercises/clippy/Cargo.lock +.idea From 9d3f189b0e57152a74dcea5f06030a956adee826 Mon Sep 17 00:00:00 2001 From: Dan Wilhelm Date: Thu, 28 May 2020 14:51:20 -0700 Subject: [PATCH 0131/1293] chore: Fix PowerShell capitalization --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 67eff547..0fd6cd7f 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ This will install Rustlings and give you access to the `rustlings` command. Run ## Windows -In Powershell, set `ExecutionPolicy` to `RemoteSigned`: +In PowerShell, set `ExecutionPolicy` to `RemoteSigned`: ```ps Set-ExecutionPolicy RemoteSigned From 173bb14140c5530cbdb59e53ace3991a99d804af Mon Sep 17 00:00:00 2001 From: Dan Wilhelm Date: Thu, 28 May 2020 20:21:33 -0700 Subject: [PATCH 0132/1293] feat: Add traits README --- exercises/traits/README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 exercises/traits/README.md diff --git a/exercises/traits/README.md b/exercises/traits/README.md new file mode 100644 index 00000000..1ce46fe0 --- /dev/null +++ b/exercises/traits/README.md @@ -0,0 +1,20 @@ +### Traits + +A trait is a collection of methods. + +Data types can implement traits. To do so, the methods making up the trait are defined for the data type. For example, the `String` data type implements the `From<&str>` trait. This allows a user to write `String::from("hello")`. + +In this way, traits are somewhat similar to Java interfaces and C++ abstract classes. + +Some additional common Rust traits include: + ++ `Clone` (the `clone` method), ++ `Display` (which allows formatted display via `{}`), and ++ `Debug` (which allows formatted display via `{:?}`). + +Because traits indicate shared behavior between data types, they are useful when writing generics. + + +#### Book Sections + +- [Traits](https://doc.rust-lang.org/book/ch10-02-traits.html) \ No newline at end of file From 524e17df10db95f7b90a0f75cc8997182a8a4094 Mon Sep 17 00:00:00 2001 From: Alexx Roche Date: Wed, 3 Jun 2020 13:34:43 +0200 Subject: [PATCH 0133/1293] fix(variables6): minor typo (#419) Looks like this was cloned from variables5.rs --- exercises/variables/variables6.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/variables/variables6.rs b/exercises/variables/variables6.rs index 76afa859..98666914 100644 --- a/exercises/variables/variables6.rs +++ b/exercises/variables/variables6.rs @@ -1,4 +1,4 @@ -// variables5.rs +// variables6.rs // Make me compile! Execute the command `rustlings hint variables6` if you want a hint :) // I AM NOT DONE From 5563adbb890587fc48fbbc9c4028642687f1e85b Mon Sep 17 00:00:00 2001 From: Alexx Roche Date: Wed, 3 Jun 2020 20:06:35 +0200 Subject: [PATCH 0134/1293] fix: fix quiz naming inconsistency (#421) Inconsistent naming when compared with the other quiz files. --- exercises/quiz3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/quiz3.rs b/exercises/quiz3.rs index 30596b9b..a0cd3712 100644 --- a/exercises/quiz3.rs +++ b/exercises/quiz3.rs @@ -1,4 +1,4 @@ -// quiz.rs +// quiz3.rs // This is a quiz for the following sections: // - Tests From 0dd1c6ca6b389789e0972aa955fe17aa15c95f29 Mon Sep 17 00:00:00 2001 From: Alexx Roche Date: Wed, 3 Jun 2020 20:07:06 +0200 Subject: [PATCH 0135/1293] fix: rename quiz1 to tests1 in info (#420) `rustlings run tests1` wasn't working because of this typo. --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index d2c2ba50..2c871ad2 100644 --- a/info.toml +++ b/info.toml @@ -311,7 +311,7 @@ hint = "No hints this time ;)" # TESTS [[exercises]] -name = "quiz1" +name = "tests1" path = "exercises/tests/tests1.rs" mode = "test" hint = """ From 40741c5b0b1beee02cbd916a66ed7ecb4e0d63e1 Mon Sep 17 00:00:00 2001 From: Abdou Seck Date: Wed, 3 Jun 2020 17:18:48 -0400 Subject: [PATCH 0136/1293] Use .to_string rather than format macro --- src/verify.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/verify.rs b/src/verify.rs index c9a7b6b8..6e0e45ec 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -124,16 +124,16 @@ fn prompt_for_completion(exercise: &Exercise, prompt_output: Option) -> Mode::Clippy => "The code is compiling, and πŸ“Ž Clippy πŸ“Ž is happy!", }; - println!(""); + println!(); println!("πŸŽ‰ πŸŽ‰ {} πŸŽ‰ πŸŽ‰", success_msg); - println!(""); + println!(); if let Some(output) = prompt_output { println!("Output:"); println!("{}", separator()); println!("{}", output); println!("{}", separator()); - println!(""); + println!(); } println!("You can keep working on this exercise,"); @@ -141,12 +141,12 @@ fn prompt_for_completion(exercise: &Exercise, prompt_output: Option) -> "or jump into the next one by removing the {} comment:", style("`I AM NOT DONE`").bold() ); - println!(""); + println!(); for context_line in context { let formatted_line = if context_line.important { format!("{}", style(context_line.line).bold()) } else { - format!("{}", context_line.line) + context_line.line.to_string() }; println!( From 02a2fe48714a4546b28d38fb611e6bfce9f43cf6 Mon Sep 17 00:00:00 2001 From: Abdou Seck Date: Wed, 3 Jun 2020 17:19:28 -0400 Subject: [PATCH 0137/1293] Collapse nested if statements --- src/main.rs | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4fd60831..f3f7f071 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,8 +27,22 @@ fn main() { .version(crate_version!()) .author("Olivia Hugger, Carol Nichols") .about("Rustlings is a collection of small exercises to get you used to writing and reading Rust code") - .subcommand(SubCommand::with_name("verify").alias("v").about("Verifies all exercises according to the recommended order")) - .subcommand(SubCommand::with_name("watch").alias("w").about("Reruns `verify` when files were edited")) + .arg( + Arg::with_name("verbose") + .short("V") + .long("verbose") + .help("Show tests' standard output") + ) + .subcommand( + SubCommand::with_name("verify") + .alias("v") + .about("Verifies all exercises according to the recommended order") + ) + .subcommand( + SubCommand::with_name("watch") + .alias("w") + .about("Reruns `verify` when files were edited") + ) .subcommand( SubCommand::with_name("run") .alias("r") @@ -43,7 +57,7 @@ fn main() { ) .get_matches(); - if None == matches.subcommand_name() { + if matches.subcommand_name().is_none() { println!(); println!(r#" welcome to... "#); println!(r#" _ _ _ "#); @@ -105,22 +119,20 @@ fn main() { verify(&exercises).unwrap_or_else(|_| std::process::exit(1)); } - if matches.subcommand_matches("watch").is_some() { - if watch(&exercises).is_ok() { - println!( - "{emoji} All exercises completed! {emoji}", - emoji = Emoji("πŸŽ‰", "β˜…") - ); - println!(""); - println!("We hope you enjoyed learning about the various aspects of Rust!"); - println!( - "If you noticed any issues, please don't hesitate to report them to our repo." - ); - println!("You can also contribute your own exercises to help the greater community!"); - println!(""); - println!("Before reporting an issue or contributing, please read our guidelines:"); - println!("https://github.com/rust-lang/rustlings/blob/master/CONTRIBUTING.md"); - } + if matches.subcommand_matches("watch").is_some() && watch(&exercises).is_ok() { + println!( + "{emoji} All exercises completed! {emoji}", + emoji = Emoji("πŸŽ‰", "β˜…") + ); + println!(); + println!("We hope you enjoyed learning about the various aspects of Rust!"); + println!( + "If you noticed any issues, please don't hesitate to report them to our repo." + ); + println!("You can also contribute your own exercises to help the greater community!"); + println!(); + println!("Before reporting an issue or contributing, please read our guidelines:"); + println!("https://github.com/rust-lang/rustlings/blob/master/CONTRIBUTING.md"); } if matches.subcommand_name().is_none() { From 8ad5f9bf531a4848b1104b7b389a20171624c82f Mon Sep 17 00:00:00 2001 From: Abdou Seck Date: Thu, 4 Jun 2020 10:31:17 -0400 Subject: [PATCH 0138/1293] feat: Add a --nocapture option to display test harnesses' outputs This new feature can be accessed by invoking rustlings with --nocapture. Both unit and integration tests added. closes #262 BREAKING CHANGES: The following function take a new boolean argument: * `run` * `verify` * `test` * `compile_and_test` --- info.toml | 4 +-- src/exercise.rs | 44 +++++++++++++++++++++++++++- src/main.rs | 20 ++++++------- src/run.rs | 11 +++++-- src/verify.rs | 32 ++++++++++++++++---- tests/fixture/success/testSuccess.rs | 1 + tests/integration_tests.rs | 22 ++++++++++++++ 7 files changed, 113 insertions(+), 21 deletions(-) diff --git a/info.toml b/info.toml index 2c871ad2..2f0884c6 100644 --- a/info.toml +++ b/info.toml @@ -802,7 +802,7 @@ name = "try_from_into" path = "exercises/conversions/try_from_into.rs" mode = "test" hint = """ -Follow the steps provided right before the `From` implementation. +Follow the steps provided right before the `TryFrom` implementation. You can also use the example at https://doc.rust-lang.org/std/convert/trait.TryFrom.html""" [[exercises]] @@ -819,4 +819,4 @@ mode = "test" hint = """ The implementation of FromStr should return an Ok with a Person object, or an Err with a string if the string is not valid. -This is a some like an `try_from_into` exercise.""" +This is almost like the `try_from_into` exercise.""" diff --git a/src/exercise.rs b/src/exercise.rs index d1eaa1a6..177b7f38 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -11,15 +11,21 @@ const I_AM_DONE_REGEX: &str = r"(?m)^\s*///?\s*I\s+AM\s+NOT\s+DONE"; const CONTEXT: usize = 2; const CLIPPY_CARGO_TOML_PATH: &str = "./exercises/clippy/Cargo.toml"; +// Get a temporary file name that is hopefully unique to this process +#[inline] fn temp_file() -> String { format!("./temp_{}", process::id()) } +// The mode of the exercise. #[derive(Deserialize, Copy, Clone)] #[serde(rename_all = "lowercase")] pub enum Mode { + // Indicates that the exercise should be compiled as a binary Compile, + // Indicates that the exercise should be compiled as a test harness Test, + // Indicates that the exercise should be linted with clippy Clippy, } @@ -28,41 +34,60 @@ pub struct ExerciseList { pub exercises: Vec, } +// A representation of a rustlings exercise. +// This is deserialized from the accompanying info.toml file #[derive(Deserialize)] pub struct Exercise { + // Name of the exercise pub name: String, + // The path to the file containing the exercise's source code pub path: PathBuf, + // The mode of the exercise (Test, Compile, or Clippy) pub mode: Mode, + // The hint text associated with the exercise pub hint: String, } +// An enum to track of the state of an Exercise. +// An Exercise can be either Done or Pending #[derive(PartialEq, Debug)] pub enum State { + // The state of the exercise once it's been completed Done, + // The state of the exercise while it's not completed yet Pending(Vec), } +// The context information of a pending exercise #[derive(PartialEq, Debug)] pub struct ContextLine { + // The source code that is still pending completion pub line: String, + // The line number of the source code still pending completion pub number: usize, + // Whether or not this is important pub important: bool, } +// The result of compiling an exercise pub struct CompiledExercise<'a> { exercise: &'a Exercise, _handle: FileHandle, } impl<'a> CompiledExercise<'a> { + // Run the compiled exercise pub fn run(&self) -> Result { self.exercise.run() } } +// A representation of an already executed binary #[derive(Debug)] pub struct ExerciseOutput { + // The textual contents of the standard output of the binary pub stdout: String, + // The textual contents of the standard error of the binary pub stderr: String, } @@ -140,7 +165,11 @@ path = "{}.rs""#, } fn run(&self) -> Result { - let cmd = Command::new(&temp_file()) + let arg = match self.mode { + Mode::Test => "--show-output", + _ => "" + }; + let cmd = Command::new(&temp_file()).arg(arg) .output() .expect("Failed to run 'run' command"); @@ -205,6 +234,7 @@ impl Display for Exercise { } } +#[inline] fn clean() { let _ignored = remove_file(&temp_file()); } @@ -280,4 +310,16 @@ mod test { assert_eq!(exercise.state(), State::Done); } + + #[test] + fn test_exercise_with_output() { + let exercise = Exercise { + name: "finished_exercise".into(), + path: PathBuf::from("tests/fixture/success/testSuccess.rs"), + mode: Mode::Test, + hint: String::new(), + }; + let out = exercise.compile().unwrap().run().unwrap(); + assert!(out.stdout.contains("THIS TEST TOO SHALL PASS")); + } } diff --git a/src/main.rs b/src/main.rs index f3f7f071..9c64de2b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,10 +28,9 @@ fn main() { .author("Olivia Hugger, Carol Nichols") .about("Rustlings is a collection of small exercises to get you used to writing and reading Rust code") .arg( - Arg::with_name("verbose") - .short("V") - .long("verbose") - .help("Show tests' standard output") + Arg::with_name("nocapture") + .long("nocapture") + .help("Show outputs from the test exercises") ) .subcommand( SubCommand::with_name("verify") @@ -87,6 +86,7 @@ fn main() { let toml_str = &fs::read_to_string("info.toml").unwrap(); let exercises = toml::from_str::(toml_str).unwrap().exercises; + let verbose = matches.is_present("nocapture"); if let Some(ref matches) = matches.subcommand_matches("run") { let name = matches.value_of("name").unwrap(); @@ -98,7 +98,7 @@ fn main() { std::process::exit(1) }); - run(&exercise).unwrap_or_else(|_| std::process::exit(1)); + run(&exercise, verbose).unwrap_or_else(|_| std::process::exit(1)); } if let Some(ref matches) = matches.subcommand_matches("hint") { @@ -116,10 +116,10 @@ fn main() { } if matches.subcommand_matches("verify").is_some() { - verify(&exercises).unwrap_or_else(|_| std::process::exit(1)); + verify(&exercises, verbose).unwrap_or_else(|_| std::process::exit(1)); } - if matches.subcommand_matches("watch").is_some() && watch(&exercises).is_ok() { + if matches.subcommand_matches("watch").is_some() && watch(&exercises, verbose).is_ok() { println!( "{emoji} All exercises completed! {emoji}", emoji = Emoji("πŸŽ‰", "β˜…") @@ -161,7 +161,7 @@ fn spawn_watch_shell(failed_exercise_hint: &Arc>>) { }); } -fn watch(exercises: &[Exercise]) -> notify::Result<()> { +fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result<()> { /* Clears the terminal with an ANSI escape code. Works in UNIX and newer Windows terminals. */ fn clear_screen() { @@ -176,7 +176,7 @@ fn watch(exercises: &[Exercise]) -> notify::Result<()> { clear_screen(); let to_owned_hint = |t: &Exercise| t.hint.to_owned(); - let failed_exercise_hint = match verify(exercises.iter()) { + let failed_exercise_hint = match verify(exercises.iter(), verbose) { Ok(_) => return Ok(()), Err(exercise) => Arc::new(Mutex::new(Some(to_owned_hint(exercise)))), }; @@ -191,7 +191,7 @@ fn watch(exercises: &[Exercise]) -> notify::Result<()> { .iter() .skip_while(|e| !filepath.ends_with(&e.path)); clear_screen(); - match verify(pending_exercises) { + match verify(pending_exercises, verbose) { Ok(_) => return Ok(()), Err(exercise) => { let mut failed_exercise_hint = failed_exercise_hint.lock().unwrap(); diff --git a/src/run.rs b/src/run.rs index ebb0ae64..fdabb3e0 100644 --- a/src/run.rs +++ b/src/run.rs @@ -2,15 +2,22 @@ use crate::exercise::{Exercise, Mode}; use crate::verify::test; use indicatif::ProgressBar; -pub fn run(exercise: &Exercise) -> Result<(), ()> { +// Invoke the rust compiler on the path of the given exercise, +// and run the ensuing binary. +// The verbose argument helps determine whether or not to show +// the output from the test harnesses (if the mode of the exercise is test) +pub fn run(exercise: &Exercise, verbose: bool) -> Result<(), ()> { match exercise.mode { - Mode::Test => test(exercise)?, + Mode::Test => test(exercise, verbose)?, Mode::Compile => compile_and_run(exercise)?, Mode::Clippy => compile_and_run(exercise)?, } Ok(()) } +// Invoke the rust compiler on the path of the given exercise +// and run the ensuing binary. +// This is strictly for non-test binaries, so output is displayed fn compile_and_run(exercise: &Exercise) -> Result<(), ()> { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); diff --git a/src/verify.rs b/src/verify.rs index 6e0e45ec..fac04919 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -2,10 +2,18 @@ use crate::exercise::{CompiledExercise, Exercise, Mode, State}; use console::style; use indicatif::ProgressBar; -pub fn verify<'a>(start_at: impl IntoIterator) -> Result<(), &'a Exercise> { +// Verify that the provided container of Exercise objects +// can be compiled and run without any failures. +// Any such failures will be reported to the end user. +// If the Exercise being verified is a test, the verbose boolean +// determines whether or not the test harness outputs are displayed. +pub fn verify<'a>( + start_at: impl IntoIterator, + verbose: bool +) -> Result<(), &'a Exercise> { for exercise in start_at { let compile_result = match exercise.mode { - Mode::Test => compile_and_test(&exercise, RunMode::Interactive), + Mode::Test => compile_and_test(&exercise, RunMode::Interactive, verbose), Mode::Compile => compile_and_run_interactively(&exercise), Mode::Clippy => compile_only(&exercise), }; @@ -21,11 +29,13 @@ enum RunMode { NonInteractive, } -pub fn test(exercise: &Exercise) -> Result<(), ()> { - compile_and_test(exercise, RunMode::NonInteractive)?; +// Compile and run the resulting test harness of the given Exercise +pub fn test(exercise: &Exercise, verbose: bool) -> Result<(), ()> { + compile_and_test(exercise, RunMode::NonInteractive, verbose)?; Ok(()) } +// Invoke the rust compiler without running the resulting binary fn compile_only(exercise: &Exercise) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); @@ -38,6 +48,7 @@ fn compile_only(exercise: &Exercise) -> Result { Ok(prompt_for_completion(&exercise, None)) } +// Compile the given Exercise and run the resulting binary in an interactive mode fn compile_and_run_interactively(exercise: &Exercise) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); @@ -63,7 +74,11 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result { Ok(prompt_for_completion(&exercise, Some(output.stdout))) } -fn compile_and_test(exercise: &Exercise, run_mode: RunMode) -> Result { +// Compile the given Exercise as a test harness and display +// the output if verbose is set to true +fn compile_and_test( + exercise: &Exercise, run_mode: RunMode, verbose: bool +) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Testing {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); @@ -73,7 +88,10 @@ fn compile_and_test(exercise: &Exercise, run_mode: RunMode) -> Result progress_bar.finish_and_clear(); match result { - Ok(_) => { + Ok(output) => { + if verbose { + println!("{}", output.stdout); + } success!("Successfully tested {}", &exercise); if let RunMode::Interactive = run_mode { Ok(prompt_for_completion(&exercise, None)) @@ -92,6 +110,8 @@ fn compile_and_test(exercise: &Exercise, run_mode: RunMode) -> Result } } +// Compile the given Exercise and return an object with information +// about the state of the compilation fn compile<'a, 'b>( exercise: &'a Exercise, progress_bar: &'b ProgressBar, diff --git a/tests/fixture/success/testSuccess.rs b/tests/fixture/success/testSuccess.rs index 589057cc..7139b50b 100644 --- a/tests/fixture/success/testSuccess.rs +++ b/tests/fixture/success/testSuccess.rs @@ -1,4 +1,5 @@ #[test] fn passing() { + println!("THIS TEST TOO SHALL PASS"); assert!(true); } diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 683e5640..0f49b5a8 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -159,3 +159,25 @@ fn run_test_exercise_does_not_prompt() { .code(0) .stdout(predicates::str::contains("I AM NOT DONE").not()); } + +#[test] +fn run_single_test_success_with_output() { + Command::cargo_bin("rustlings") + .unwrap() + .args(&["--nocapture", "r", "testSuccess"]) + .current_dir("tests/fixture/success/") + .assert() + .code(0) + .stdout(predicates::str::contains("THIS TEST TOO SHALL PAS")); +} + +#[test] +fn run_single_test_success_without_output() { + Command::cargo_bin("rustlings") + .unwrap() + .args(&["r", "testSuccess"]) + .current_dir("tests/fixture/success/") + .assert() + .code(0) + .stdout(predicates::str::contains("THIS TEST TOO SHALL PAS").not()); +} \ No newline at end of file From 9e4fb1009f1c9e3433915c03e22c2af422e5c5fe Mon Sep 17 00:00:00 2001 From: Abdou Seck Date: Fri, 5 Jun 2020 16:33:14 -0400 Subject: [PATCH 0139/1293] fix(installation): Provide a backup git reference when tag can't be curl closes #423 If the parsed JSON data curled during a bash installation is not valid, use the repository's tag files as a backup. If those files don't exist somehow, then checkout the master branch and install it. --- install.sh | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/install.sh b/install.sh index 532728e3..c32f5126 100755 --- a/install.sh +++ b/install.sh @@ -102,12 +102,30 @@ Path=${1:-rustlings/} echo "Cloning Rustlings at $Path..." git clone -q https://github.com/rust-lang/rustlings $Path +cd $Path + Version=$(curl -s https://api.github.com/repos/rust-lang/rustlings/releases/latest | ${PY} -c "import json,sys;obj=json.load(sys.stdin);print(obj['tag_name']);") CargoBin="${CARGO_HOME:-$HOME/.cargo}/bin" +if [[ -z ${Version} ]] +then + echo "The latest tag version could not be fetched remotely." + echo "Using the local git repository..." + Version=$(ls -tr .git/refs/tags/ | tail -1) + if [[ -z ${Version} ]] + then + echo "No valid tag version found" + echo "Rustlings will be installed using the master branch" + Version="master" + else + Version="tags/${Version}" + fi +else + Version="tags/${Version}" +fi + echo "Checking out version $Version..." -cd $Path -git checkout -q tags/$Version +git checkout -q ${Version} echo "Installing the 'rustlings' executable..." cargo install --force --path . From bb2ca251106b27a7272d9a30872904dd1376654c Mon Sep 17 00:00:00 2001 From: Alexx Roche Date: Sat, 6 Jun 2020 12:07:39 +0200 Subject: [PATCH 0140/1293] fix(box1): fix comment typo (#426) Doesn't effect the code. --- exercises/standard_library_types/box1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/standard_library_types/box1.rs b/exercises/standard_library_types/box1.rs index 2248962e..f2654ce2 100644 --- a/exercises/standard_library_types/box1.rs +++ b/exercises/standard_library_types/box1.rs @@ -10,7 +10,7 @@ // elements: the value of the current item and the next item. The last item is a value called `Nil`. // // Step 1: use a `Box` in the enum definition to make the code compile -// Step 2: create both empty and non-empty cons lists of by replacing `unimplemented!()` +// Step 2: create both empty and non-empty cons lists by replacing `unimplemented!()` // // Note: the tests should not be changed // From 307252e9aeab91ac60af71a0609270de2434b7b3 Mon Sep 17 00:00:00 2001 From: millefalcon Date: Mon, 8 Jun 2020 07:51:34 -0400 Subject: [PATCH 0141/1293] Added example to show the AsRef working --- exercises/conversions/as_ref_mut.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index aa1e6239..963c0f2d 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -36,4 +36,16 @@ mod tests { let s = "Cafe au lait"; assert_eq!(char_counter(s), byte_counter(s)); } + + #[test] + fn different_counts_using_string() { + let s = String::from("CafΓ© au lait"); + assert_ne!(char_counter(s.clone()), byte_counter(s)); + } + + #[test] + fn same_counts_using_string() { + let s = String::from("Cafe au lait"); + assert_eq!(char_counter(s.clone()), byte_counter(s)); + } } From e6bd8021d9a7dd06feebc30c9d5f953901d7b419 Mon Sep 17 00:00:00 2001 From: Alexx Roche Date: Tue, 9 Jun 2020 13:54:18 +0200 Subject: [PATCH 0142/1293] fix(generics2): Guide students to the answer (#430) --- info.toml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/info.toml b/info.toml index 2c871ad2..4d961680 100644 --- a/info.toml +++ b/info.toml @@ -724,8 +724,10 @@ name = "generics2" path = "exercises/generics/generics2.rs" mode = "test" hint = """ -Think carefully about what we need to do here. Currently we are wrapping only values of -type 'u32'. Maybe we need to update the explicit references to this data type somehow? +Currently we are wrapping only values of type 'u32'. +Maybe we could update the explicit references to this data type somehow? + +If you are still stuck https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-method-definitions """ [[exercises]] From f47d3f422db69da93d7528ac472296d8962037ec Mon Sep 17 00:00:00 2001 From: tim bangma Date: Wed, 10 Jun 2020 04:51:03 -0400 Subject: [PATCH 0143/1293] docs: Update `Invoke-WebRequest` to `Start-BitsTransfer` (#373) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0fd6cd7f..6724f05a 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Set-ExecutionPolicy RemoteSigned Then, you can run: ```ps -Invoke-WebRequest https://git.io/rustlings-win | Select-Object -ExpandProperty Content | Out-File $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 +Start-BitsTransfer -Source https://git.io/rustlings-win -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 ``` To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. From 9ca08b8f2b09366e97896a4a8cf9ff3bb4d54380 Mon Sep 17 00:00:00 2001 From: Sebastien Caunes Date: Thu, 11 Jun 2020 11:44:47 -0500 Subject: [PATCH 0144/1293] fix : Use of integer for prices, therefore also for weight rename confusing "from" and "to" to sender_country and recipient_country as suggested --- exercises/structs/structs3.rs | 38 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index 77cc154b..5503ce15 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -7,17 +7,17 @@ #[derive(Debug)] struct Package { - from: String, - to: String, - weight: f32 + sender_country: String, + recipient_country: String, + weight_in_grams: i32, } impl Package { - fn new(from: String, to: String, weight: f32) -> Package { - if weight <= 0.0 { + fn new(sender_country: String, recipient_country: String, weight_in_grams: i32) -> Package { + if weight_in_grams <= 0 { // Something goes here... } else { - return Package {from, to, weight}; + return Package {sender_country, recipient_country, weight_in_grams}; } } @@ -25,8 +25,8 @@ impl Package { // Something goes here... } - fn get_fees(&self, cost_per_kg: f32) -> ??? { - // Something goes here... + fn get_fees(&self, cents_per_kg: i32) -> ??? { + // Something goes here... (beware of grams to kg conversion) } } @@ -37,31 +37,31 @@ mod tests { #[test] #[should_panic] fn fail_creating_weightless_package() { - let country_from = String::from("Spain"); - let country_to = String::from("Austria"); + let sender_country = String::from("Spain"); + let recipient_country = String::from("Austria"); - Package::new(country_from, country_to, -2.21); + Package::new(sender_country, recipient_country, -2210); } #[test] fn create_international_package() { - let country_from = String::from("Spain"); - let country_to = String::from("Russia"); + let sender_country = String::from("Spain"); + let recipient_country = String::from("Russia"); - let package = Package::new(country_from, country_to, 1.2); + let package = Package::new(sender_country, recipient_country, 1200); assert!(package.is_international()); } #[test] fn calculate_transport_fees() { - let country_from = String::from("Spain"); - let country_to = String::from("Spain"); + let sender_country = String::from("Spain"); + let recipient_country = String::from("Spain"); - let country_fee = ???; + let cents_per_kg = ???; - let package = Package::new(country_from, country_to, 22.0); + let package = Package::new(sender_country, recipient_country, 1500); - assert_eq!(package.get_fees(country_fee), 176.0); + assert_eq!(package.get_fees(cents_per_kg), 4500); } } From 113cdae2d4e4c55905e8056ad326ede7fd7de356 Mon Sep 17 00:00:00 2001 From: Alexx Roche Date: Sun, 14 Jun 2020 12:15:35 +0200 Subject: [PATCH 0145/1293] fix(arc1): Passively introduce attributes (#429) Ensure that std::sync::Arc is actually used, as this exercise can be compiled using things already learnt in previous exercises. --- exercises/standard_library_types/arc1.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/standard_library_types/arc1.rs b/exercises/standard_library_types/arc1.rs index 9784e84a..07932c63 100644 --- a/exercises/standard_library_types/arc1.rs +++ b/exercises/standard_library_types/arc1.rs @@ -6,6 +6,7 @@ // I AM NOT DONE +#![forbid(unused_imports)] // Do not change this, (or the next) line. use std::sync::Arc; use std::thread; From 55a9284665dc6ef5d9db6f73e76630f22d3ea43d Mon Sep 17 00:00:00 2001 From: mokou Date: Sun, 14 Jun 2020 14:48:51 +0200 Subject: [PATCH 0146/1293] chore: Move from master branch to main branch --- install.sh | 4 ++-- src/exercise.rs | 2 +- src/main.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/install.sh b/install.sh index c32f5126..a19c280a 100755 --- a/install.sh +++ b/install.sh @@ -115,8 +115,8 @@ then if [[ -z ${Version} ]] then echo "No valid tag version found" - echo "Rustlings will be installed using the master branch" - Version="master" + echo "Rustlings will be installed using the main branch" + Version="main" else Version="tags/${Version}" fi diff --git a/src/exercise.rs b/src/exercise.rs index 177b7f38..2108d81e 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -134,7 +134,7 @@ path = "{}.rs""#, .expect("Failed to compile!"); // Due to an issue with Clippy, a cargo clean is required to catch all lints. // See https://github.com/rust-lang/rust-clippy/issues/2604 - // This is already fixed on master branch. See this issue to track merging into Cargo: + // This is already fixed on Clippy's master branch. See this issue to track merging into Cargo: // https://github.com/rust-lang/rust-clippy/issues/3837 Command::new("cargo") .args(&["clean", "--manifest-path", CLIPPY_CARGO_TOML_PATH]) diff --git a/src/main.rs b/src/main.rs index 9c64de2b..aa67aca6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -132,7 +132,7 @@ fn main() { println!("You can also contribute your own exercises to help the greater community!"); println!(); println!("Before reporting an issue or contributing, please read our guidelines:"); - println!("https://github.com/rust-lang/rustlings/blob/master/CONTRIBUTING.md"); + println!("https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md"); } if matches.subcommand_name().is_none() { From ddd98ad75d3668fbb10eff74374148aa5ed2344d Mon Sep 17 00:00:00 2001 From: iamcastelli Date: Sat, 27 Jun 2020 15:58:53 +0400 Subject: [PATCH 0147/1293] fix: Change then to than `than` makes more grammatical sense than `then` in this context. --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index ee4ab2f6..46e353ff 100644 --- a/info.toml +++ b/info.toml @@ -64,7 +64,7 @@ hint = """ We know about variables and mutability, but there is another important type of variable available; constants. Constants are always immutable and they are declared with keyword 'const' rather -then keyword 'let'. +than keyword 'let'. Constants types must also always be annotated. Read more about constants under 'Differences Between Variables and Constants' in the book's section 'Variables and Mutability': From f9ccc6a289ca5fed784fd45878b163e633bfdba1 Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 8 Jul 2020 11:35:27 +0200 Subject: [PATCH 0148/1293] release: 4.0.0 --- CHANGELOG.md | 42 ++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 +- README.md | 2 +- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f72c9607..594987c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,45 @@ + +## 4.0.0 (2020-07-08) + +#### Breaking Changes + +* Add a --nocapture option to display test harnesses' outputs ([8ad5f9bf](https://github.com/rust-lang/rustlings/commit/8ad5f9bf531a4848b1104b7b389a20171624c82f) +* Rename test to quiz, fixes #244 ([010a0456](https://github.com/rust-lang/rustlings/commit/010a04569282149cea7f7a76fc4d7f4c9f0f08dd) + +#### Features + +* Add traits README ([173bb141](https://github.com/rust-lang/rustlings/commit/173bb14140c5530cbdb59e53ace3991a99d804af)) +* Add box1.rs exercise ([7479a473](https://github.com/rust-lang/rustlings/commit/7479a4737bdcac347322ad0883ca528c8675e720)) +* Rewrite try_from_into (#393) ([763aa6e3](https://github.com/rust-lang/rustlings/commit/763aa6e378a586caae2d8d63755a85eeba227933)) +* Add if2 exercise ([1da84b5f](https://github.com/rust-lang/rustlings/commit/1da84b5f7c489f65bd683c244f13c7d1ee812df0)) +* Added exercise structs3.rs ([b66e2e09](https://github.com/rust-lang/rustlings/commit/b66e2e09622243e086a0f1258dd27e1a2d61c891)) +* Add exercise variables6 covering const (#352) ([5999acd2](https://github.com/rust-lang/rustlings/commit/5999acd24a4f203292be36e0fd18d385887ec481)) + +#### Bug Fixes + +* Change then to than ([ddd98ad7](https://github.com/rust-lang/rustlings/commit/ddd98ad75d3668fbb10eff74374148aa5ed2344d)) +* rename quiz1 to tests1 in info (#420) ([0dd1c6ca](https://github.com/rust-lang/rustlings/commit/0dd1c6ca6b389789e0972aa955fe17aa15c95f29)) +* fix quiz naming inconsistency (#421) ([5563adbb](https://github.com/rust-lang/rustlings/commit/5563adbb890587fc48fbbc9c4028642687f1e85b)) +* confine the user further in variable exercises ([06ef4cc6](https://github.com/rust-lang/rustlings/commit/06ef4cc654e75d22a526812919ee49b8956280bf)) +* update iterator and macro text for typos and clarity ([95900828](https://github.com/rust-lang/rustlings/commit/959008284834bece0196a01e17ac69a7e3590116)) +* update generics2 closes #362 ([964c974a](https://github.com/rust-lang/rustlings/commit/964c974a0274199d755073b917c2bc5da0c9b4f1)) +* confusing comment in conversions/try_from_into.rs ([c9e4f2cf](https://github.com/rust-lang/rustlings/commit/c9e4f2cfb4c48d0b7451263cfb43b9426438122d)) +* **arc1:** Passively introduce attributes (#429) ([113cdae2](https://github.com/rust-lang/rustlings/commit/113cdae2d4e4c55905e8056ad326ede7fd7de356)) +* **box1:** fix comment typo (#426) ([bb2ca251](https://github.com/rust-lang/rustlings/commit/bb2ca251106b27a7272d9a30872904dd1376654c)) +* **errorsn:** Try harder to confine the user. (#388) ([2b20c8a0](https://github.com/rust-lang/rustlings/commit/2b20c8a0f5774d07c58d110d75879f33fc6273b5)) +* **from_into.rs:** typo ([a901499e](https://github.com/rust-lang/rustlings/commit/a901499ededd3ce1995164700514fe4e9a0373ea)) +* **generics2:** Guide students to the answer (#430) ([e6bd8021](https://github.com/rust-lang/rustlings/commit/e6bd8021d9a7dd06feebc30c9d5f953901d7b419)) +* **installation:** + * Provide a backup git reference when tag can't be curl ([9e4fb100](https://github.com/rust-lang/rustlings/commit/9e4fb1009f1c9e3433915c03e22c2af422e5c5fe)) + * Check if python is available while checking for git,rustc and cargo ([9cfb617d](https://github.com/rust-lang/rustlings/commit/9cfb617d5b0451b4b51644a1298965390cda9884)) +* **option1:** + * Don't add only zeros to the numbers array ([cce6a442](https://github.com/rust-lang/rustlings/commit/cce6a4427718724a9096800754cd3abeca6a1580)) + * Add cast to usize, as it is confusing in the context of an exercise about Option ([f6cffc7e](https://github.com/rust-lang/rustlings/commit/f6cffc7e487b42f15a6f958e49704c93a8d4465b)) +* **option2:** Add TODO to comments (#400) ([10967bce](https://github.com/rust-lang/rustlings/commit/10967bce57682812dc0891a9f9757da1a9d87404)) +* **options1:** Add hint about Array Initialization (#389) ([9f75554f](https://github.com/rust-lang/rustlings/commit/9f75554f2a30295996f03f0160b98c0458305502)) +* **test2:** name of type String and &str (#394) ([d6c0a688](https://github.com/rust-lang/rustlings/commit/d6c0a688e6a96f93ad60d540d4b326f342fc0d45)) +* **variables6:** minor typo (#419) ([524e17df](https://github.com/rust-lang/rustlings/commit/524e17df10db95f7b90a0f75cc8997182a8a4094)) + ## 3.0.0 (2020-04-11) diff --git a/Cargo.toml b/Cargo.toml index 3481a886..d4180da2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "3.0.0" +version = "4.0.0" authors = ["Marisa ", "Carol (Nichols || Goulding) "] edition = "2018" diff --git a/README.md b/README.md index 6724f05a..3e260122 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Basically: Clone the repository, checkout to the latest tag, run `cargo install` ```bash git clone https://github.com/rust-lang/rustlings cd rustlings -git checkout tags/3.0.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) +git checkout tags/4.0.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) cargo install --force --path . ``` From e823bef97063560170c6c286ae03e40fb50ea5b8 Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 8 Jul 2020 11:43:08 +0200 Subject: [PATCH 0149/1293] docs: Add missing closing brackets to changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 594987c1..0d984eb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,8 @@ #### Breaking Changes -* Add a --nocapture option to display test harnesses' outputs ([8ad5f9bf](https://github.com/rust-lang/rustlings/commit/8ad5f9bf531a4848b1104b7b389a20171624c82f) -* Rename test to quiz, fixes #244 ([010a0456](https://github.com/rust-lang/rustlings/commit/010a04569282149cea7f7a76fc4d7f4c9f0f08dd) +* Add a --nocapture option to display test harnesses' outputs ([8ad5f9bf](https://github.com/rust-lang/rustlings/commit/8ad5f9bf531a4848b1104b7b389a20171624c82f)) +* Rename test to quiz, fixes #244 ([010a0456](https://github.com/rust-lang/rustlings/commit/010a04569282149cea7f7a76fc4d7f4c9f0f08dd)) #### Features From 9f61db5dbe38538cf06571fcdd5f806e7901e83a Mon Sep 17 00:00:00 2001 From: Alexx Roche Date: Wed, 8 Jul 2020 11:51:12 +0200 Subject: [PATCH 0150/1293] feat: Remind the user of the hint option (#425) Suggestion from AbdouSeck https://github.com/rust-lang/rustlings/issues/424#issuecomment-639870331 for when the student's code has errors. --- src/verify.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/verify.rs b/src/verify.rs index fac04919..807bea9e 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -65,6 +65,7 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result { Err(output) => { warn!("Ran {} with errors", exercise); println!("{}", output.stdout); + println!("{}", output.stderr); return Err(()); } }; From 816b1f5e85d6cc6e72673813a85d0ada2a8f84af Mon Sep 17 00:00:00 2001 From: Alexx Roche Date: Wed, 8 Jul 2020 11:51:12 +0200 Subject: [PATCH 0151/1293] feat: Remind the user of the hint option (#425) Suggestion from AbdouSeck https://github.com/rust-lang/rustlings/issues/424#issuecomment-639870331 for when the student's code has errors. --- src/verify.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/verify.rs b/src/verify.rs index fac04919..807bea9e 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -65,6 +65,7 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result { Err(output) => { warn!("Ran {} with errors", exercise); println!("{}", output.stdout); + println!("{}", output.stderr); return Err(()); } }; From 4b6540c71adabad647de8a09e57295e7c7c7d794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?DEWA=20Kazuyuki/=E5=87=BA=E7=BE=BD=E5=92=8C=E4=B9=8B?= Date: Wed, 8 Jul 2020 18:56:43 +0900 Subject: [PATCH 0152/1293] fix(enums3): Update Message::ChangeColor to take a tuple. (#457) --- exercises/enums/enums3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs index 4b0be975..e9621b8e 100644 --- a/exercises/enums/enums3.rs +++ b/exercises/enums/enums3.rs @@ -51,7 +51,7 @@ mod tests { position: Point{ x: 0, y: 0 }, color: (0, 0, 0) }; - state.process(Message::ChangeColor(255, 0, 255)); + state.process(Message::ChangeColor((255, 0, 255))); state.process(Message::Echo(String::from("hello world"))); state.process(Message::Move(Point{ x: 10, y: 15 })); state.process(Message::Quit); From 106dbbc341bd7846745b37e2203e206abf83ed20 Mon Sep 17 00:00:00 2001 From: Philip Pokarowski <2538022+Nuc1eoN@users.noreply.github.com> Date: Thu, 9 Jul 2020 09:25:50 +0200 Subject: [PATCH 0153/1293] Update README.md (#464) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e260122..f1fc764c 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Then, same as above, run `rustlings` to get started. The exercises are sorted by topic and can be found in the subdirectory `rustlings/exercises/`. For every topic there is an additional README file with some resources to get you started on the topic. We really recommend that you have a look at them before you start. -The task is simple. Most exercises contain an error that keep it from compiling, and it's up to you to fix it! Some exercises are also run as tests, but rustlings handles them all the same. To run the exercises in the recommended order, execute: +The task is simple. Most exercises contain an error that keep them from compiling, and it's up to you to fix it! Some exercises are also run as tests, but rustlings handles them all the same. To run the exercises in the recommended order, execute: ```bash rustlings watch From bb5f404e35f0091b4beb691105e7ed2a94ce4a13 Mon Sep 17 00:00:00 2001 From: Benjamin Jones Date: Fri, 10 Jul 2020 19:01:38 -0700 Subject: [PATCH 0154/1293] chore: Alter whitespace for consistency * Add newline after "I AM DONE" in exercises for consistency * Remove trailing whitespace from exercises --- exercises/conversions/as_ref_mut.rs | 1 + exercises/conversions/from_into.rs | 4 +++- exercises/conversions/using_as.rs | 6 ++++-- exercises/generics/generics1.rs | 2 +- exercises/generics/generics2.rs | 5 +++-- exercises/generics/generics3.rs | 21 ++++++++++--------- exercises/primitive_types/primitive_types3.rs | 2 +- exercises/structs/structs3.rs | 6 +++--- exercises/traits/traits1.rs | 9 ++++---- exercises/traits/traits2.rs | 7 +++---- 10 files changed, 34 insertions(+), 29 deletions(-) diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index 963c0f2d..84f4a60c 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -3,6 +3,7 @@ // and https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively. // I AM NOT DONE + // Obtain the number of bytes (not characters) in the given argument // Add the AsRef trait appropriately as a trait bound fn byte_counter(arg: T) -> usize { diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs index 8fb9eb05..4f4da538 100644 --- a/exercises/conversions/from_into.rs +++ b/exercises/conversions/from_into.rs @@ -18,7 +18,6 @@ impl Default for Person { } } -// I AM NOT DONE // Your task is to complete this implementation // in order for the line `let p = Person::from("Mark,20")` to compile // Please note that you'll need to parse the age component into a `usize` @@ -33,6 +32,9 @@ impl Default for Person { // 5. Extract the other element from the split operation and parse it into a `usize` as the age // If while parsing the age, something goes wrong, then return the default of Person // Otherwise, then return an instantiated Person object with the results + +// I AM NOT DONE + impl From<&str> for Person { fn from(s: &str) -> Person { } diff --git a/exercises/conversions/using_as.rs b/exercises/conversions/using_as.rs index 54f96515..922abae0 100644 --- a/exercises/conversions/using_as.rs +++ b/exercises/conversions/using_as.rs @@ -1,9 +1,11 @@ // Type casting in Rust is done via the usage of the `as` operator. // Please note that the `as` operator is not only used when type casting. // It also helps with renaming imports. +// +// The goal is to make sure that the division does not fail to compile // I AM NOT DONE -// The goal is to make sure that the division does not fail to compile + fn average(values: &[f64]) -> f64 { let total = values .iter() @@ -14,4 +16,4 @@ fn average(values: &[f64]) -> f64 { fn main() { let values = [3.5, 0.3, 13.0, 11.7]; println!("{}", average(&values)); -} \ No newline at end of file +} diff --git a/exercises/generics/generics1.rs b/exercises/generics/generics1.rs index d075a4d2..1e6ae9d7 100644 --- a/exercises/generics/generics1.rs +++ b/exercises/generics/generics1.rs @@ -1,4 +1,4 @@ -// This shopping list program isn't compiling! +// This shopping list program isn't compiling! // Use your knowledge of generics to fix it. // I AM NOT DONE diff --git a/exercises/generics/generics2.rs b/exercises/generics/generics2.rs index 23025aaa..20c21279 100644 --- a/exercises/generics/generics2.rs +++ b/exercises/generics/generics2.rs @@ -2,6 +2,7 @@ // Rewrite it using generics so that it supports wrapping ANY type. // I AM NOT DONE + struct Wrapper { value: u32 } @@ -18,11 +19,11 @@ mod tests { #[test] fn store_u32_in_wrapper() { - assert_eq!(Wrapper::new(42).value, 42); + assert_eq!(Wrapper::new(42).value, 42); } #[test] fn store_str_in_wrapper() { assert_eq!(Wrapper::new("Foo").value, "Foo"); } -} \ No newline at end of file +} diff --git a/exercises/generics/generics3.rs b/exercises/generics/generics3.rs index c76425c3..760028ed 100644 --- a/exercises/generics/generics3.rs +++ b/exercises/generics/generics3.rs @@ -1,13 +1,14 @@ // An imaginary magical school has a new report card generation system written in Rust! -// Currently the system only supports creating report cards where the student's grade -// is represented numerically (e.g. 1.0 -> 5.5). -// However, the school also issues alphabetical grades (A+ -> F-) and needs +// Currently the system only supports creating report cards where the student's grade +// is represented numerically (e.g. 1.0 -> 5.5). +// However, the school also issues alphabetical grades (A+ -> F-) and needs // to be able to print both types of report card! -// Make the necessary code changes to support alphabetical report cards, thereby making +// Make the necessary code changes to support alphabetical report cards, thereby making // the second test pass. // I AM NOT DONE + pub struct ReportCard { pub grade: f32, pub student_name: String, @@ -16,7 +17,7 @@ pub struct ReportCard { impl ReportCard { pub fn print(&self) -> String { - format!("{} ({}) - achieved a grade of {}", + format!("{} ({}) - achieved a grade of {}", &self.student_name, &self.student_age, &self.grade) } } @@ -28,8 +29,8 @@ mod tests { #[test] fn generate_numeric_report_card() { let report_card = ReportCard { - grade: 2.1, - student_name: "Tom Wriggle".to_string(), + grade: 2.1, + student_name: "Tom Wriggle".to_string(), student_age: 12, }; assert_eq!(report_card.print(), "Tom Wriggle (12) - achieved a grade of 2.1"); @@ -39,10 +40,10 @@ mod tests { fn generate_alphabetic_report_card() { // TODO: Make sure to change the grade here after you finish the exercise. let report_card = ReportCard { - grade: 2.1, - student_name: "Gary Plotter".to_string(), + grade: 2.1, + student_name: "Gary Plotter".to_string(), student_age: 11, }; assert_eq!(report_card.print(), "Gary Plotter (11) - achieved a grade of A+"); } -} \ No newline at end of file +} diff --git a/exercises/primitive_types/primitive_types3.rs b/exercises/primitive_types/primitive_types3.rs index dfd6351c..aaa518be 100644 --- a/exercises/primitive_types/primitive_types3.rs +++ b/exercises/primitive_types/primitive_types3.rs @@ -1,5 +1,5 @@ // primitive_types3.rs -// Create an array with at least 100 elements in it where the ??? is. +// Create an array with at least 100 elements in it where the ??? is. // Execute `rustlings hint primitive_types3` for hints! // I AM NOT DONE diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index 5503ce15..883c803f 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -47,7 +47,7 @@ mod tests { fn create_international_package() { let sender_country = String::from("Spain"); let recipient_country = String::from("Russia"); - + let package = Package::new(sender_country, recipient_country, 1200); assert!(package.is_international()); @@ -59,9 +59,9 @@ mod tests { let recipient_country = String::from("Spain"); let cents_per_kg = ???; - + let package = Package::new(sender_country, recipient_country, 1500); - + assert_eq!(package.get_fees(cents_per_kg), 4500); } } diff --git a/exercises/traits/traits1.rs b/exercises/traits/traits1.rs index 8253ef80..2ef9e11b 100644 --- a/exercises/traits/traits1.rs +++ b/exercises/traits/traits1.rs @@ -1,21 +1,21 @@ // traits1.rs // Time to implement some traits! -// +// // Your task is to implement the trait // `AppendBar' for the type `String'. -// +// // The trait AppendBar has only one function, // which appends "Bar" to any object // implementing this trait. // I AM NOT DONE + trait AppendBar { fn append_bar(self) -> Self; } impl AppendBar for String { //Add your code here - } fn main() { @@ -40,5 +40,4 @@ mod tests { String::from("BarBar") ); } - -} \ No newline at end of file +} diff --git a/exercises/traits/traits2.rs b/exercises/traits/traits2.rs index 7f5014d0..b9a13a45 100644 --- a/exercises/traits/traits2.rs +++ b/exercises/traits/traits2.rs @@ -1,12 +1,12 @@ // traits2.rs -// +// // Your task is to implement the trait // `AppendBar' for a vector of strings. -// +// // To implement this trait, consider for // a moment what it means to 'append "Bar"' // to a vector of strings. -// +// // No boiler plate code this time, // you can do this! @@ -31,5 +31,4 @@ mod tests { assert_eq!(foo.pop().unwrap(), String::from("Bar")); assert_eq!(foo.pop().unwrap(), String::from("Foo")); } - } From c52be7dfcbfb99c40002f22efd32972915efebe1 Mon Sep 17 00:00:00 2001 From: Eli Blaney <5651165+eliblaney@users.noreply.github.com> Date: Sun, 12 Jul 2020 02:44:11 -0500 Subject: [PATCH 0155/1293] docs: Add uninstall info to README.md * docs: Add uninstall info to README.md * docs: Format commands as bash block --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index f1fc764c..47ac4b0e 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,17 @@ rustlings hint myExercise1 After every couple of sections, there will be a quiz that'll test your knowledge on a bunch of sections at once. These quizzes are found in `exercises/quizN.rs`. +## Continuing On + +Once you've completed Rustlings, put your new knowledge to good use! Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to. + +If you'd like to uninstall Rustlings, you can do so by invoking cargo and removing the rustlings directory: + +```bash +cargo uninstall rustlings +rm -r rustlings/ # or on Windows: rmdir /s rustlings +``` + ## Completion Rustlings isn't done; there are a couple of sections that are very experimental and don't have proper documentation. These include: From 523d18b873a319f7c09262f44bd40e2fab1830e5 Mon Sep 17 00:00:00 2001 From: Chad Dougherty Date: Mon, 13 Jul 2020 05:39:05 -0400 Subject: [PATCH 0156/1293] feat(try_from_into): Add insufficient length test (#469) --- exercises/conversions/try_from_into.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index dbdbe00e..9e452f28 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -127,4 +127,10 @@ mod tests { let v = vec![0, 0, 0, 0]; let _ = Color::try_from(&v[..]).unwrap(); } + #[test] + #[should_panic] + fn test_slice_insufficient_length() { + let v = vec![0, 0]; + let _ = Color::try_from(&v[..]).unwrap(); + } } From 4821a8be94af4f669042a06ab917934cfacd032f Mon Sep 17 00:00:00 2001 From: Ryan McQuen Date: Thu, 23 Jul 2020 10:20:21 -0700 Subject: [PATCH 0157/1293] feat: Add gitpod support (#473) --- .gitpod.yml | 7 +++++++ README.md | 6 ++++++ 2 files changed, 13 insertions(+) create mode 100644 .gitpod.yml diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 00000000..46b1a6a8 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,7 @@ +tasks: + - init: /workspace/rustlings/install.sh + command: /workspace/.cargo/bin/rustlings watch + +vscode: + extensions: + - rust-lang.rust@0.7.8:CvNqMTgDdt3UXt+6BCDTVg== diff --git a/README.md b/README.md index 47ac4b0e..7fba9d8c 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,12 @@ Start-BitsTransfer -Source https://git.io/rustlings-win -Destination $env:TMP/in To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. +## Browser: + +[Run on Repl.it](https://repl.it/github/rust-lang/rustlings) + +[Open in Gitpod](https://gitpod.io/#https://github.com/rust-lang/rustlings) + ## Manually Basically: Clone the repository, checkout to the latest tag, run `cargo install`. From 8f7b5bd00eb83542b959830ef55192d2d76db90a Mon Sep 17 00:00:00 2001 From: Ryan McQuen Date: Thu, 23 Jul 2020 10:21:15 -0700 Subject: [PATCH 0158/1293] feat: Add ability to run rustlings on repl.it (#471) Co-authored-by: fmoko --- .replit | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .replit diff --git a/.replit b/.replit new file mode 100644 index 00000000..8462a6fc --- /dev/null +++ b/.replit @@ -0,0 +1,2 @@ +language = "rust" +run = "[ -x ~/.cargo/bin/rustlings ] && ~/.cargo/bin/rustlings watch || ./install.sh" From 4f2468e14f574a93a2e9b688367b5752ed96ae7b Mon Sep 17 00:00:00 2001 From: Adi Vaknin Date: Thu, 23 Jul 2020 21:23:27 +0300 Subject: [PATCH 0159/1293] feat(cli): Added 'cls' command to 'watch' mode (#474) --- src/main.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index aa67aca6..0e1291c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -143,15 +143,18 @@ fn main() { fn spawn_watch_shell(failed_exercise_hint: &Arc>>) { let failed_exercise_hint = Arc::clone(failed_exercise_hint); - println!("Type 'hint' to get help"); + println!("Type 'hint' to get help or 'clear' to clear the screen"); thread::spawn(move || loop { let mut input = String::new(); match io::stdin().read_line(&mut input) { Ok(_) => { - if input.trim().eq("hint") { + let input = input.trim(); + if input.eq("hint") { if let Some(hint) = &*failed_exercise_hint.lock().unwrap() { println!("{}", hint); } + } else if input.eq("clear") { + println!("\x1B[2J\x1B[1;1H"); } else { println!("unknown command: {}", input); } From 38a615f407f439158dccc0cb20d36ee70fe33c27 Mon Sep 17 00:00:00 2001 From: Robby Date: Fri, 24 Jul 2020 19:23:01 +0800 Subject: [PATCH 0160/1293] chore: add .vscode to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6094e5c1..06de8710 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ target/ exercises/clippy/Cargo.toml exercises/clippy/Cargo.lock .idea +.vscode From 1cc40bc9ce95c23d56f6d91fa1c4deb646231fef Mon Sep 17 00:00:00 2001 From: Dany Marcoux Date: Mon, 3 Aug 2020 22:16:14 +0200 Subject: [PATCH 0161/1293] fix: Update rustlings version in Cargo.lock --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 52c8ed45..732a4b59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -592,7 +592,7 @@ dependencies = [ [[package]] name = "rustlings" -version = "3.0.0" +version = "4.0.0" dependencies = [ "assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", From 9642f5a3f686270a4f8f6ba969919ddbbc4f7fdd Mon Sep 17 00:00:00 2001 From: Mukund Bhudia Date: Tue, 4 Aug 2020 12:57:01 +0100 Subject: [PATCH 0162/1293] feat: Added iterators1.rs exercise --- exercises/standard_library_types/README.md | 2 -- .../standard_library_types/iterators1.rs | 24 +++++++++++++++++++ info.toml | 21 ++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 exercises/standard_library_types/iterators1.rs diff --git a/exercises/standard_library_types/README.md b/exercises/standard_library_types/README.md index 36b30c1f..8b53dd81 100644 --- a/exercises/standard_library_types/README.md +++ b/exercises/standard_library_types/README.md @@ -3,5 +3,3 @@ For the Box exercise check out the chapter [Using Box to Point to Data on the He For the Arc exercise check out the chapter [Shared-State Concurrency](https://doc.rust-lang.org/book/ch16-03-shared-state.html) of the Rust Book. For the Iterator exercise check out the chapters [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html) of the Rust Book and the [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/). -Do not adjust your monitors-- iterators1.rs is indeed missing. Iterators is a challenging topic, so we're leaving space for a simpler exercise! - diff --git a/exercises/standard_library_types/iterators1.rs b/exercises/standard_library_types/iterators1.rs new file mode 100644 index 00000000..3fd519d6 --- /dev/null +++ b/exercises/standard_library_types/iterators1.rs @@ -0,0 +1,24 @@ +// iterators1.rs +// +// Make me compile by filling in the `???`s +// +// When performing operations on elements within a collection, iterators are essential. +// This module helps you get familiar with the structure of using an iterator and +// how to go through elements within an iterable collection. +// +// Execute `rustlings hint iterators1` for hints :D + +// I AM NOT DONE + +fn main () { + let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"]; + + let mut my_iterable_fav_fruits = ???; // TODO: Step 1 + + assert_eq!(my_iterable_fav_fruits.next(), Some(&"banana")); + assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 2 + assert_eq!(my_iterable_fav_fruits.next(), Some(&"avocado")); + assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 2.1 + assert_eq!(my_iterable_fav_fruits.next(), Some(&"raspberry")); + assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 3 +} diff --git a/info.toml b/info.toml index 46e353ff..23f92bf5 100644 --- a/info.toml +++ b/info.toml @@ -644,6 +644,27 @@ inside the loop but still in the main thread. `child_numbers` should be a clone of the Arc of the numbers instead of a thread-local copy of the numbers.""" +[[exercises]] +name = "iterators1" +path = "exercises/standard_library_types/iterators1.rs" +mode = "compile" +hint = """ +Step 1: +We need to apply something to the collection `my_fav_fruits` before we start to go through +it. What could that be? Take a look at the struct definition for a vector for inspiration: +https://doc.rust-lang.org/std/vec/struct.Vec.html. + + +Step 2 & step 2.1: +Very similar to the lines above an below. You've got this! + + +Step 3: +An iterator goes through all elements in a collection, but what if we've run out of +elements? What should we expect here? If you're stuck, take a look at +https://doc.rust-lang.org/std/iter/trait.Iterator.html for some ideas. +""" + [[exercises]] name = "iterators2" path = "exercises/standard_library_types/iterators2.rs" From 3144d3ae63963eae6bc8469a48dc0e586d77596d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 10 Aug 2020 10:24:21 -0400 Subject: [PATCH 0163/1293] chore: Run rustfmt on exercises --- exercises/conversions/from_str.rs | 1 - exercises/conversions/try_from_into.rs | 2 +- exercises/conversions/using_as.rs | 4 +--- exercises/enums/enums2.rs | 4 ++-- exercises/enums/enums3.rs | 13 ++++++------- exercises/generics/generics1.rs | 1 - exercises/generics/generics2.rs | 2 +- exercises/generics/generics3.rs | 10 ++++++++-- exercises/macros/macros4.rs | 4 ++-- exercises/standard_library_types/box1.rs | 5 ++++- exercises/structs/structs3.rs | 6 +++++- exercises/traits/traits2.rs | 3 --- 12 files changed, 30 insertions(+), 25 deletions(-) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 014d0549..af9eee6d 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -82,5 +82,4 @@ mod tests { fn missing_name_and_invalid_age() { ",one".parse::().unwrap(); } - } diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index 9e452f28..b830c166 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -2,7 +2,7 @@ // Basically, this is the same as From. The main difference is that this should return a Result type // instead of the target type itself. // You can read more about it at https://doc.rust-lang.org/std/convert/trait.TryFrom.html -use std::convert::{TryInto, TryFrom}; +use std::convert::{TryFrom, TryInto}; #[derive(Debug)] struct Color { diff --git a/exercises/conversions/using_as.rs b/exercises/conversions/using_as.rs index 922abae0..b3c197f8 100644 --- a/exercises/conversions/using_as.rs +++ b/exercises/conversions/using_as.rs @@ -7,9 +7,7 @@ // I AM NOT DONE fn average(values: &[f64]) -> f64 { - let total = values - .iter() - .fold(0.0, |a, b| a + b); + let total = values.iter().fold(0.0, |a, b| a + b); total / values.len() } diff --git a/exercises/enums/enums2.rs b/exercises/enums/enums2.rs index 52ccb221..ec32d952 100644 --- a/exercises/enums/enums2.rs +++ b/exercises/enums/enums2.rs @@ -16,10 +16,10 @@ impl Message { fn main() { let messages = [ - Message::Move{ x: 10, y: 30 }, + Message::Move { x: 10, y: 30 }, Message::Echo(String::from("hello world")), Message::ChangeColor(200, 255, 255), - Message::Quit + Message::Quit, ]; for message in &messages { diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs index e9621b8e..178b40c4 100644 --- a/exercises/enums/enums3.rs +++ b/exercises/enums/enums3.rs @@ -9,13 +9,13 @@ enum Message { struct Point { x: u8, - y: u8 + y: u8, } struct State { color: (u8, u8, u8), position: Point, - quit: bool + quit: bool, } impl State { @@ -46,14 +46,14 @@ mod tests { #[test] fn test_match_message_call() { - let mut state = State{ + let mut state = State { quit: false, - position: Point{ x: 0, y: 0 }, - color: (0, 0, 0) + position: Point { x: 0, y: 0 }, + color: (0, 0, 0), }; state.process(Message::ChangeColor((255, 0, 255))); state.process(Message::Echo(String::from("hello world"))); - state.process(Message::Move(Point{ x: 10, y: 15 })); + state.process(Message::Move(Point { x: 10, y: 15 })); state.process(Message::Quit); assert_eq!(state.color, (255, 0, 255)); @@ -61,5 +61,4 @@ mod tests { assert_eq!(state.position.y, 15); assert_eq!(state.quit, true); } - } diff --git a/exercises/generics/generics1.rs b/exercises/generics/generics1.rs index 1e6ae9d7..967287ef 100644 --- a/exercises/generics/generics1.rs +++ b/exercises/generics/generics1.rs @@ -7,4 +7,3 @@ fn main() { let mut shopping_list: Vec = Vec::new(); shopping_list.push("milk"); } - diff --git a/exercises/generics/generics2.rs b/exercises/generics/generics2.rs index 20c21279..0cb59adc 100644 --- a/exercises/generics/generics2.rs +++ b/exercises/generics/generics2.rs @@ -4,7 +4,7 @@ // I AM NOT DONE struct Wrapper { - value: u32 + value: u32, } impl Wrapper { diff --git a/exercises/generics/generics3.rs b/exercises/generics/generics3.rs index 760028ed..5c745e25 100644 --- a/exercises/generics/generics3.rs +++ b/exercises/generics/generics3.rs @@ -33,7 +33,10 @@ mod tests { student_name: "Tom Wriggle".to_string(), student_age: 12, }; - assert_eq!(report_card.print(), "Tom Wriggle (12) - achieved a grade of 2.1"); + assert_eq!( + report_card.print(), + "Tom Wriggle (12) - achieved a grade of 2.1" + ); } #[test] @@ -44,6 +47,9 @@ mod tests { student_name: "Gary Plotter".to_string(), student_age: 11, }; - assert_eq!(report_card.print(), "Gary Plotter (11) - achieved a grade of A+"); + assert_eq!( + report_card.print(), + "Gary Plotter (11) - achieved a grade of A+" + ); } } diff --git a/exercises/macros/macros4.rs b/exercises/macros/macros4.rs index 3a748078..1b550f43 100644 --- a/exercises/macros/macros4.rs +++ b/exercises/macros/macros4.rs @@ -6,10 +6,10 @@ macro_rules! my_macro { () => { println!("Check out my macro!"); - } + }; ($val:expr) => { println!("Look at this other macro: {}", $val); - } + }; } fn main() { diff --git a/exercises/standard_library_types/box1.rs b/exercises/standard_library_types/box1.rs index f2654ce2..f312f3d6 100644 --- a/exercises/standard_library_types/box1.rs +++ b/exercises/standard_library_types/box1.rs @@ -26,7 +26,10 @@ pub enum List { fn main() { println!("This is an empty cons list: {:?}", create_empty_list()); - println!("This is a non-empty cons list: {:?}", create_non_empty_list()); + println!( + "This is a non-empty cons list: {:?}", + create_non_empty_list() + ); } pub fn create_empty_list() -> List { diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index 883c803f..36d46e90 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -17,7 +17,11 @@ impl Package { if weight_in_grams <= 0 { // Something goes here... } else { - return Package {sender_country, recipient_country, weight_in_grams}; + return Package { + sender_country, + recipient_country, + weight_in_grams, + }; } } diff --git a/exercises/traits/traits2.rs b/exercises/traits/traits2.rs index b9a13a45..916c3c4b 100644 --- a/exercises/traits/traits2.rs +++ b/exercises/traits/traits2.rs @@ -18,9 +18,6 @@ trait AppendBar { //TODO: Add your code here - - - #[cfg(test)] mod tests { use super::*; From 81f8c2f83c6bb5c239fd2e0cf856d1535692af3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 10 Aug 2020 10:42:54 -0400 Subject: [PATCH 0164/1293] chore: Run cargo fmt --- src/exercise.rs | 5 +++-- src/main.rs | 4 +--- src/verify.rs | 6 ++---- tests/integration_tests.rs | 2 +- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 2108d81e..e70538bb 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -167,9 +167,10 @@ path = "{}.rs""#, fn run(&self) -> Result { let arg = match self.mode { Mode::Test => "--show-output", - _ => "" + _ => "", }; - let cmd = Command::new(&temp_file()).arg(arg) + let cmd = Command::new(&temp_file()) + .arg(arg) .output() .expect("Failed to run 'run' command"); diff --git a/src/main.rs b/src/main.rs index 0e1291c3..b5814bfb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -126,9 +126,7 @@ fn main() { ); println!(); println!("We hope you enjoyed learning about the various aspects of Rust!"); - println!( - "If you noticed any issues, please don't hesitate to report them to our repo." - ); + println!("If you noticed any issues, please don't hesitate to report them to our repo."); println!("You can also contribute your own exercises to help the greater community!"); println!(); println!("Before reporting an issue or contributing, please read our guidelines:"); diff --git a/src/verify.rs b/src/verify.rs index 807bea9e..00e45c8c 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -9,7 +9,7 @@ use indicatif::ProgressBar; // determines whether or not the test harness outputs are displayed. pub fn verify<'a>( start_at: impl IntoIterator, - verbose: bool + verbose: bool, ) -> Result<(), &'a Exercise> { for exercise in start_at { let compile_result = match exercise.mode { @@ -77,9 +77,7 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result { // Compile the given Exercise as a test harness and display // the output if verbose is set to true -fn compile_and_test( - exercise: &Exercise, run_mode: RunMode, verbose: bool -) -> Result { +fn compile_and_test(exercise: &Exercise, run_mode: RunMode, verbose: bool) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Testing {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 0f49b5a8..2baf9b86 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -180,4 +180,4 @@ fn run_single_test_success_without_output() { .assert() .code(0) .stdout(predicates::str::contains("THIS TEST TOO SHALL PAS").not()); -} \ No newline at end of file +} From b4062ef6993e80dac107c4093ea85166ad3ee0fa Mon Sep 17 00:00:00 2001 From: seeplusplus Date: Sun, 16 Aug 2020 20:55:50 -0400 Subject: [PATCH 0165/1293] fix(arc1): index mod should equal thread count --- exercises/standard_library_types/arc1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/standard_library_types/arc1.rs b/exercises/standard_library_types/arc1.rs index 07932c63..4ad649f1 100644 --- a/exercises/standard_library_types/arc1.rs +++ b/exercises/standard_library_types/arc1.rs @@ -21,7 +21,7 @@ fn main() { let mut sum = 0; while i < child_numbers.len() { sum += child_numbers[i]; - i += 5; + i += 8; } println!("Sum of offset {} is {}", offset, sum); })); From dd54ccf6777873b75e01ad6fbcf247c7de21994d Mon Sep 17 00:00:00 2001 From: John Heath <6026956+CaribouJohn@users.noreply.github.com> Date: Mon, 24 Aug 2020 22:37:31 +0100 Subject: [PATCH 0166/1293] Make comments on example clearer I actually struggled because I overlooked the fact that I needed to change the 2.1 to "A+". So I wanted to make things clearer for future rustlings. --- exercises/generics/generics3.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/exercises/generics/generics3.rs b/exercises/generics/generics3.rs index 5c745e25..6f951450 100644 --- a/exercises/generics/generics3.rs +++ b/exercises/generics/generics3.rs @@ -4,8 +4,11 @@ // However, the school also issues alphabetical grades (A+ -> F-) and needs // to be able to print both types of report card! -// Make the necessary code changes to support alphabetical report cards, thereby making -// the second test pass. +// Make the necessary code changes in the struct ReportCard and the impl block +// to support alphabetical report cards. Change the Grade in the second test to "A+" +// to show that your changes allow alphabetical grades. + +// Execute 'rustlings hint generics3' for hints! // I AM NOT DONE From 101072ab9f8c80b40b8b88cb06cbe38aca2481c5 Mon Sep 17 00:00:00 2001 From: Antoine Barthelemy Date: Tue, 25 Aug 2020 16:38:41 +0200 Subject: [PATCH 0167/1293] fix(exercises): adding question mark to quiz2 Question marks added for consistency. closes #496 --- exercises/quiz2.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/exercises/quiz2.rs b/exercises/quiz2.rs index 8caeaa99..de0dce95 100644 --- a/exercises/quiz2.rs +++ b/exercises/quiz2.rs @@ -17,14 +17,14 @@ fn string(arg: String) { } fn main() { - ("blue"); - ("red".to_string()); - (String::from("hi")); - ("rust is fun!".to_owned()); - ("nice weather".into()); - (format!("Interpolation {}", "Station")); - (&String::from("abc")[0..1]); - (" hello there ".trim()); - ("Happy Monday!".to_string().replace("Mon", "Tues")); - ("mY sHiFt KeY iS sTiCkY".to_lowercase()); + ???("blue"); + ???("red".to_string()); + ???(String::from("hi")); + ???("rust is fun!".to_owned()); + ???("nice weather".into()); + ???(format!("Interpolation {}", "Station")); + ???(&String::from("abc")[0..1]); + ???(" hello there ".trim()); + ???("Happy Monday!".to_string().replace("Mon", "Tues")); + ???("mY sHiFt KeY iS sTiCkY".to_lowercase()); } From 6bb0b48b100fe4af5bddbcf639e8843350b62555 Mon Sep 17 00:00:00 2001 From: Samuel Batista <47303296+bhgsbatista@users.noreply.github.com> Date: Wed, 26 Aug 2020 22:17:03 -0400 Subject: [PATCH 0168/1293] Make macros4 not compile by default Did you mean this? I'm new to rust and this test passed right away, so unsure what the intention was. --- exercises/macros/macros4.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/macros/macros4.rs b/exercises/macros/macros4.rs index 1b550f43..3a748078 100644 --- a/exercises/macros/macros4.rs +++ b/exercises/macros/macros4.rs @@ -6,10 +6,10 @@ macro_rules! my_macro { () => { println!("Check out my macro!"); - }; + } ($val:expr) => { println!("Look at this other macro: {}", $val); - }; + } } fn main() { From ee7cdc66b31673c0fb02de0ce732812f855e69e8 Mon Sep 17 00:00:00 2001 From: Koalab99 <60042855+Koalab99@users.noreply.github.com> Date: Thu, 27 Aug 2020 19:51:19 +0200 Subject: [PATCH 0169/1293] chore: Removed extra whitespaces Co-authored-by: Corentin ARNOULD --- CHANGELOG.md | 4 ++-- exercises/enums/README.md | 4 ++-- exercises/error_handling/README.md | 4 ++-- exercises/generics/generics3.rs | 4 ++-- exercises/traits/README.md | 6 +++--- info.toml | 26 +++++++++++++------------- install.ps1 | 2 +- 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d984eb6..a96df52c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,14 +83,14 @@ * Update deps to version compatable with aarch64-pc-windows (#263) ([19a93428](https://github.com/rust-lang/rustlings/commit/19a93428b3c73d994292671f829bdc8e5b7b3401)) * **docs:** * Added a necessary step to Windows installation process (#242) ([3906efcd](https://github.com/rust-lang/rustlings/commit/3906efcd52a004047b460ed548037093de3f523f)) - * Fixed mangled sentence from book; edited for clarity (#266) ([ade52ff](https://github.com/rust-lang/rustlings/commit/ade52ffb739987287ddd5705944c8777705faed9)) + * Fixed mangled sentence from book; edited for clarity (#266) ([ade52ff](https://github.com/rust-lang/rustlings/commit/ade52ffb739987287ddd5705944c8777705faed9)) * Updated iterators readme to account for iterators4 exercise (#273) ([bec8e3a](https://github.com/rust-lang/rustlings/commit/bec8e3a644cbd88db1c73ea5f1d8a364f4a34016)) * **installation:** make fatal errors more obvious (#272) ([17d0951e](https://github.com/rust-lang/rustlings/commit/17d0951e66fda8e11b204d5c4c41a0d5e22e78f7)) * **iterators2:** * Remove reference to missing iterators2.rs (#245) ([419f7797](https://github.com/rust-lang/rustlings/commit/419f7797f294e4ce6a2b883199731b5bde77d262)) * **as_ref_mut:** Enable a test and improve per clippy's suggestion (#256) ([dfdf809](https://github.com/rust-lang/rustlings/commit/dfdf8093ebbd4145864995627b812780de52f902)) * **tests1:** - * Change test command ([fe10e06c](https://github.com/rust-lang/rustlings/commit/fe10e06c3733ddb4a21e90d09bf79bfe618e97ce) + * Change test command ([fe10e06c](https://github.com/rust-lang/rustlings/commit/fe10e06c3733ddb4a21e90d09bf79bfe618e97ce) * Correct test command in tests1.rs comment (#263) ([39fa7ae](https://github.com/rust-lang/rustlings/commit/39fa7ae8b70ad468da49b06f11b2383135a63bcf)) #### Features diff --git a/exercises/enums/README.md b/exercises/enums/README.md index a090a43e..091f5d04 100644 --- a/exercises/enums/README.md +++ b/exercises/enums/README.md @@ -1,8 +1,8 @@ ### Enums -Rust allows you to define types called "enums" which enumerate possible values. +Rust allows you to define types called "enums" which enumerate possible values. Enums are a feature in many languages, but their capabilities differ in each language. Rust’s enums are most similar to algebraic data types in functional languages, such as F#, OCaml, and Haskell. -Useful in combination with enums is Rust's "pattern matching" facility, which makes it easy to run different code for different values of an enumeration. +Useful in combination with enums is Rust's "pattern matching" facility, which makes it easy to run different code for different values of an enumeration. #### Book Sections diff --git a/exercises/error_handling/README.md b/exercises/error_handling/README.md index cf66c2be..77a58d18 100644 --- a/exercises/error_handling/README.md +++ b/exercises/error_handling/README.md @@ -1,5 +1,5 @@ For this exercise check out the sections: -- [Error Handling](https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html) -- [Generics](https://doc.rust-lang.org/book/ch10-01-syntax.html) +- [Error Handling](https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html) +- [Generics](https://doc.rust-lang.org/book/ch10-01-syntax.html) of the Rust Book. diff --git a/exercises/generics/generics3.rs b/exercises/generics/generics3.rs index 6f951450..64dd9bc1 100644 --- a/exercises/generics/generics3.rs +++ b/exercises/generics/generics3.rs @@ -4,8 +4,8 @@ // However, the school also issues alphabetical grades (A+ -> F-) and needs // to be able to print both types of report card! -// Make the necessary code changes in the struct ReportCard and the impl block -// to support alphabetical report cards. Change the Grade in the second test to "A+" +// Make the necessary code changes in the struct ReportCard and the impl block +// to support alphabetical report cards. Change the Grade in the second test to "A+" // to show that your changes allow alphabetical grades. // Execute 'rustlings hint generics3' for hints! diff --git a/exercises/traits/README.md b/exercises/traits/README.md index 1ce46fe0..8cd03ec4 100644 --- a/exercises/traits/README.md +++ b/exercises/traits/README.md @@ -1,6 +1,6 @@ ### Traits -A trait is a collection of methods. +A trait is a collection of methods. Data types can implement traits. To do so, the methods making up the trait are defined for the data type. For example, the `String` data type implements the `From<&str>` trait. This allows a user to write `String::from("hello")`. @@ -8,7 +8,7 @@ In this way, traits are somewhat similar to Java interfaces and C++ abstract cla Some additional common Rust traits include: -+ `Clone` (the `clone` method), ++ `Clone` (the `clone` method), + `Display` (which allows formatted display via `{}`), and + `Debug` (which allows formatted display via `{:?}`). @@ -17,4 +17,4 @@ Because traits indicate shared behavior between data types, they are useful when #### Book Sections -- [Traits](https://doc.rust-lang.org/book/ch10-02-traits.html) \ No newline at end of file +- [Traits](https://doc.rust-lang.org/book/ch10-02-traits.html) diff --git a/info.toml b/info.toml index 46e353ff..a64509e2 100644 --- a/info.toml +++ b/info.toml @@ -52,7 +52,7 @@ because we want to assign a different typed value to an existing variable. Somet you may also like to reuse existing variable names because you are just converting values to different types like in this exercise. Fortunately Rust has a powerful solution to this problem: 'Shadowing'! -You can read more about 'Shadowing' in the book's section 'Variables and Mutability': +You can read more about 'Shadowing' in the book's section 'Variables and Mutability': https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#shadowing Try to solve this exercise afterwards using this technique.""" @@ -61,13 +61,13 @@ name = "variables6" path = "exercises/variables/variables6.rs" mode = "compile" hint = """ -We know about variables and mutability, but there is another important type of -variable available; constants. -Constants are always immutable and they are declared with keyword 'const' rather +We know about variables and mutability, but there is another important type of +variable available; constants. +Constants are always immutable and they are declared with keyword 'const' rather than keyword 'let'. Constants types must also always be annotated. -Read more about constants under 'Differences Between Variables and Constants' in the book's section 'Variables and Mutability': +Read more about constants under 'Differences Between Variables and Constants' in the book's section 'Variables and Mutability': https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#differences-between-variables-and-constants """ @@ -237,8 +237,8 @@ name = "structs2" path = "exercises/structs/structs2.rs" mode = "test" hint = """ -Creating instances of structs is easy, all you need to do is assign some values to its fields. -There is however some shortcuts that can be taken when instantiating structs. +Creating instances of structs is easy, all you need to do is assign some values to its fields. +There is however some shortcuts that can be taken when instantiating structs. Have a look in The Book, to find out more: https://doc.rust-lang.org/stable/book/ch05-01-defining-structs.html#creating-instances-from-other-instances-with-struct-update-syntax""" [[exercises]] @@ -682,8 +682,8 @@ name = "iterators4" path = "exercises/standard_library_types/iterators4.rs" mode = "test" hint = """ -In an imperative language, you might write a for loop that updates -a mutable variable. Or, you might write code utilizing recursion +In an imperative language, you might write a for loop that updates +a mutable variable. Or, you might write code utilizing recursion and a match clause. In Rust you can take another functional approach, computing the factorial elegantly with ranges and iterators.""" @@ -703,10 +703,10 @@ name = "traits2" path = "exercises/traits/traits2.rs" mode = "test" hint = """ -Notice how the trait takes ownership of 'self',and returns `Self'. +Notice how the trait takes ownership of 'self',and returns `Self'. Try mutating the incoming string vector. -Vectors provide suitable methods for adding an element at the end. See +Vectors provide suitable methods for adding an element at the end. See the documentation at: https://doc.rust-lang.org/std/vec/struct.Vec.html""" # Generics @@ -724,7 +724,7 @@ name = "generics2" path = "exercises/generics/generics2.rs" mode = "test" hint = """ -Currently we are wrapping only values of type 'u32'. +Currently we are wrapping only values of type 'u32'. Maybe we could update the explicit references to this data type somehow? If you are still stuck https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-method-definitions @@ -735,7 +735,7 @@ name = "generics3" path = "exercises/generics/generics3.rs" mode = "test" hint = """ -To find the best solution to this challenge you're going to need to think back to your +To find the best solution to this challenge you're going to need to think back to your knowledge of traits, specifically Trait Bound Syntax - you may also need this: "use std::fmt::Display;" This is definitely harder than the last two exercises! You need to think about not only making the diff --git a/install.ps1 b/install.ps1 index 6504e69e..f7472ad1 100644 --- a/install.ps1 +++ b/install.ps1 @@ -35,7 +35,7 @@ if (Get-Command cargo -ErrorAction SilentlyContinue) { function vercomp($v1, $v2) { if ($v1 -eq $v2) { return 0 - } + } $v1 = $v1.Replace(".", "0") $v2 = $v2.Replace(".", "0") From 3286c5ec19ea5fb7ded81d047da5f8594108a490 Mon Sep 17 00:00:00 2001 From: Ryan McQuen Date: Mon, 7 Sep 2020 10:09:27 -0700 Subject: [PATCH 0170/1293] fix(using_as): Add test so that proper type is returned. (#512) --- exercises/conversions/using_as.rs | 11 +++++++++++ info.toml | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/exercises/conversions/using_as.rs b/exercises/conversions/using_as.rs index b3c197f8..821309ec 100644 --- a/exercises/conversions/using_as.rs +++ b/exercises/conversions/using_as.rs @@ -3,6 +3,7 @@ // It also helps with renaming imports. // // The goal is to make sure that the division does not fail to compile +// and returns the proper type. // I AM NOT DONE @@ -15,3 +16,13 @@ fn main() { let values = [3.5, 0.3, 13.0, 11.7]; println!("{}", average(&values)); } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn returns_proper_type_and_value() { + assert_eq!(average(&[3.5, 0.3, 13.0, 11.7]), 7.125); + } +} diff --git a/info.toml b/info.toml index a64509e2..2e90f138 100644 --- a/info.toml +++ b/info.toml @@ -787,7 +787,7 @@ what you've learned :)""" [[exercises]] name = "using_as" path = "exercises/conversions/using_as.rs" -mode = "compile" +mode = "test" hint = """ Use the `as` operator to cast one of the operands in the last line of the `average` function into the expected return type.""" From 8ff5fde88edb8f24253d7dc894501473cf701dbc Mon Sep 17 00:00:00 2001 From: Mukund Bhudia Date: Fri, 18 Sep 2020 10:40:11 +0100 Subject: [PATCH 0171/1293] Update info.toml for typo fix Co-authored-by: Andrew Marquez --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 23f92bf5..d800720b 100644 --- a/info.toml +++ b/info.toml @@ -656,7 +656,7 @@ https://doc.rust-lang.org/std/vec/struct.Vec.html. Step 2 & step 2.1: -Very similar to the lines above an below. You've got this! +Very similar to the lines above and below. You've got this! Step 3: From 114b54cbdb977234b39e5f180d937c14c78bb8b2 Mon Sep 17 00:00:00 2001 From: Jannek Squar Date: Sat, 19 Sep 2020 21:22:56 +0200 Subject: [PATCH 0172/1293] fix(structs3): Small adjustment of variable name Co-authored-by: Jannek --- exercises/structs/structs3.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index 36d46e90..06fcaf29 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -29,8 +29,8 @@ impl Package { // Something goes here... } - fn get_fees(&self, cents_per_kg: i32) -> ??? { - // Something goes here... (beware of grams to kg conversion) + fn get_fees(&self, cents_per_gram: i32) -> ??? { + // Something goes here... } } @@ -62,10 +62,10 @@ mod tests { let sender_country = String::from("Spain"); let recipient_country = String::from("Spain"); - let cents_per_kg = ???; + let cents_per_gram = ???; let package = Package::new(sender_country, recipient_country, 1500); - assert_eq!(package.get_fees(cents_per_kg), 4500); + assert_eq!(package.get_fees(cents_per_gram), 4500); } } From bec97b6c76bea09d3a326bb94f9375a5698095e6 Mon Sep 17 00:00:00 2001 From: Calvin Brown Date: Mon, 21 Sep 2020 15:23:19 -0500 Subject: [PATCH 0173/1293] Fixing test3 to have enough tests to make sure we test all cases --- exercises/tests/tests3.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/tests/tests3.rs b/exercises/tests/tests3.rs index 693b8aa5..06cf7ea7 100644 --- a/exercises/tests/tests3.rs +++ b/exercises/tests/tests3.rs @@ -18,4 +18,9 @@ mod tests { fn is_true_when_even() { assert!(); } + + #[test] + fn is_false_when_even() { + assert!(); + } } From 114cc2db21efed01e3779225751bdc5e2db4ad5a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:36:52 +0000 Subject: [PATCH 0174/1293] docs: update README.md [skip ci] --- README.md | 93 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 7fba9d8c..8ad71e62 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-48-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-49-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -149,64 +149,67 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d - - + + - - - - - + + + + + - - - - - - - - + + + + + + + + - - - - - - - + + + + + + + - - + + - - - - - + + + + + - - - - - - + + + + + + - + - - - - - - - - + + + + + + + + + + +

Carol (Nichols || Goulding)

πŸ’» πŸ–‹

QuietMisdreavus

πŸ’» πŸ–‹

Carol (Nichols || Goulding)

πŸ’» πŸ–‹

QuietMisdreavus

πŸ’» πŸ–‹

Robert M Lugg

πŸ–‹

Hynek Schlawack

πŸ’»

Katharina Fey

πŸ’»

lukabavdaz

πŸ’» πŸ–‹

Erik Vesteraas

πŸ’»

delet0r

πŸ’»

Hynek Schlawack

πŸ’»

Katharina Fey

πŸ’»

lukabavdaz

πŸ’» πŸ–‹

Erik Vesteraas

πŸ’»

delet0r

πŸ’»

Shaun Bennett

πŸ’»

Andrew Bagshaw

πŸ’»

Kyle Isom

πŸ’»

Colin Pitrat

πŸ’»

Zac Anger

πŸ’»

Matthias Geier

πŸ’»

Chris Pearce

πŸ’»

Yvan Sraka

πŸ’»

Shaun Bennett

πŸ’»

Andrew Bagshaw

πŸ’»

Kyle Isom

πŸ’»

Colin Pitrat

πŸ’»

Zac Anger

πŸ’»

Matthias Geier

πŸ’»

Chris Pearce

πŸ’»

Yvan Sraka

πŸ’»

Denys Smirnov

πŸ’»

eddyp

πŸ’»

Brian Kung

πŸ’» πŸ–‹

Russell

πŸ’»

Dan Wilhelm

πŸ“–

Jesse

πŸ’» πŸ–‹

Fredrik JambrΓ©n

πŸ’»

Denys Smirnov

πŸ’»

eddyp

πŸ’»

Brian Kung

πŸ’» πŸ–‹

Russell

πŸ’»

Dan Wilhelm

πŸ“–

Jesse

πŸ’» πŸ–‹

Fredrik JambrΓ©n

πŸ’»

Pete McFarlane

πŸ–‹

nkanderson

πŸ’» πŸ–‹

Ajax M

πŸ“–

nkanderson

πŸ’» πŸ–‹

Ajax M

πŸ“–

Dylan Nugent

πŸ–‹

vyaslav

πŸ’» πŸ–‹

George

πŸ’»

Thomas Holloway

πŸ’» πŸ–‹

Jubilee

πŸ’»

WofWca

πŸ’»

vyaslav

πŸ’» πŸ–‹

George

πŸ’»

Thomas Holloway

πŸ’» πŸ–‹

Jubilee

πŸ’»

WofWca

πŸ’»

Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧

Jens

πŸ“–

Rahat Ahmed

πŸ“–

Abdou Seck

πŸ’» πŸ–‹ πŸ‘€

Katie

πŸ’»

Socrates

πŸ“–

Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧

Jens

πŸ“–

Rahat Ahmed

πŸ“–

Abdou Seck

πŸ’» πŸ–‹ πŸ‘€

Katie

πŸ’»

Socrates

πŸ“–

gnodarse

πŸ–‹

Harrison Metzger

πŸ’»

Harrison Metzger

πŸ’»

Torben Jonas

πŸ’» πŸ–‹

Paul Bissex

πŸ“–

Steven Mann

πŸ’» πŸ–‹

Mario Reder

πŸ’» πŸ–‹

skim

πŸ’»

Sanjay K

πŸ’» πŸ–‹

Rohan Jain

πŸ’»

Said Aspen

πŸ’» πŸ–‹

Torben Jonas

πŸ’» πŸ–‹

Paul Bissex

πŸ“–

Steven Mann

πŸ’» πŸ–‹

Mario Reder

πŸ’» πŸ–‹

skim

πŸ’»

Sanjay K

πŸ’» πŸ–‹

Rohan Jain

πŸ’»

Said Aspen

πŸ’» πŸ–‹

Ufuk Celebi

πŸ’»
From 8f8a85303b60f111a4605a5bc77259b89c81c2f7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:36:53 +0000 Subject: [PATCH 0175/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index d4a0857d..12d21d7d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -454,11 +454,20 @@ "code", "content" ] + }, + { + "login": "uce", + "name": "Ufuk Celebi", + "avatar_url": "https://avatars3.githubusercontent.com/u/1756620?v=4", + "profile": "https://github.com/uce", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, "projectName": "rustlings", - "projectOwner": "fmoko", + "projectOwner": "rust-lang", "repoType": "github", "repoHost": "https://github.com", "skipCi": true From f5cb439fe61da52386d85e678ef6f3be507be546 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:38:59 +0000 Subject: [PATCH 0176/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ad71e62..83fdf978 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-49-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-50-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -210,6 +210,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Ufuk Celebi

πŸ’» +
lebedevsergey

πŸ“– From 6480fcaf7c89922c5a3ff1ad091ba0305c4d7404 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:39:00 +0000 Subject: [PATCH 0177/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 12d21d7d..e1d48a1c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -463,6 +463,15 @@ "contributions": [ "code" ] + }, + { + "login": "lebedevsergey", + "name": "lebedevsergey", + "avatar_url": "https://avatars2.githubusercontent.com/u/7325764?v=4", + "profile": "https://github.com/lebedevsergey", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From 77f407dd5ff6a3585f9b0236450f8429ca94efbd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:40:45 +0000 Subject: [PATCH 0178/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 83fdf978..522b6c4a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-50-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-51-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -211,6 +211,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Ufuk Celebi

πŸ’»
lebedevsergey

πŸ“– +
Aleksei Trifonov

πŸ–‹ From 98d6b15fc0e5480c6ddd8ffa125976131b3448e4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:40:46 +0000 Subject: [PATCH 0179/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e1d48a1c..91c9b8e1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -472,6 +472,15 @@ "contributions": [ "doc" ] + }, + { + "login": "avrong", + "name": "Aleksei Trifonov", + "avatar_url": "https://avatars2.githubusercontent.com/u/6342851?v=4", + "profile": "https://github.com/avrong", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From b6dd1af7d2d610dad159b114532fa42f2f19415f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:43:23 +0000 Subject: [PATCH 0180/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 522b6c4a..dbf5fba4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-51-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-52-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -212,6 +212,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Ufuk Celebi

πŸ’»
lebedevsergey

πŸ“–
Aleksei Trifonov

πŸ–‹ +
Darren Meehan

πŸ–‹ From 18b2d451cd5b2f28a06cd7bf6cc6aea2c293a4af Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:43:24 +0000 Subject: [PATCH 0181/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 91c9b8e1..3cc7fb61 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -481,6 +481,15 @@ "contributions": [ "content" ] + }, + { + "login": "Darrenmeehan", + "name": "Darren Meehan", + "avatar_url": "https://avatars2.githubusercontent.com/u/411136?v=4", + "profile": "https://drn.ie", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From f285ac22815550e77894ee523b2129c36b31da9b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:44:56 +0000 Subject: [PATCH 0182/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dbf5fba4..dd205688 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-52-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-53-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -213,6 +213,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
lebedevsergey

πŸ“–
Aleksei Trifonov

πŸ–‹
Darren Meehan

πŸ–‹ +
Jihchi Lee

πŸ–‹ From ca4f02607404edd380d8c565d6b7b6c611cea94a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:44:57 +0000 Subject: [PATCH 0183/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3cc7fb61..a0a56af4 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -490,6 +490,15 @@ "contributions": [ "content" ] + }, + { + "login": "jihchi", + "name": "Jihchi Lee", + "avatar_url": "https://avatars1.githubusercontent.com/u/87983?v=4", + "profile": "https://github.com/jihchi", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 062f18d3538c5a493d64a7a884f06be4ca6ffde5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:48:38 +0000 Subject: [PATCH 0184/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dd205688..96ad84e5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-53-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-54-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -214,6 +214,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Aleksei Trifonov

πŸ–‹
Darren Meehan

πŸ–‹
Jihchi Lee

πŸ–‹ +
Christofer Bertonha

πŸ–‹ From 00fbcd14f7f540b7a4f4591ec55dece83f5f35e0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:48:39 +0000 Subject: [PATCH 0185/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a0a56af4..edaa9f92 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -499,6 +499,15 @@ "contributions": [ "content" ] + }, + { + "login": "bertonha", + "name": "Christofer Bertonha", + "avatar_url": "https://avatars3.githubusercontent.com/u/1225902?v=4", + "profile": "https://github.com/bertonha", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From b6040e60619d07e149dc8205f854aee0ba7141e4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:49:56 +0000 Subject: [PATCH 0186/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 96ad84e5..1612a234 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-54-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-55-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -215,6 +215,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Darren Meehan

πŸ–‹
Jihchi Lee

πŸ–‹
Christofer Bertonha

πŸ–‹ +
Vivek Bharath Akupatni

πŸ’» ⚠️ From 83e7365fd8af52a9e97eaea6c8da8f0fd3e9f888 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:49:57 +0000 Subject: [PATCH 0187/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index edaa9f92..cb8f1bcd 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -508,6 +508,16 @@ "contributions": [ "content" ] + }, + { + "login": "apatniv", + "name": "Vivek Bharath Akupatni", + "avatar_url": "https://avatars2.githubusercontent.com/u/22565917?v=4", + "profile": "https://github.com/apatniv", + "contributions": [ + "code", + "test" + ] } ], "contributorsPerLine": 8, From 448d116a896f2f88ae7d5405fb83185499c29c4a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:50:50 +0000 Subject: [PATCH 0188/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1612a234..5a6d822c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-55-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-56-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -216,6 +216,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Jihchi Lee

πŸ–‹
Christofer Bertonha

πŸ–‹
Vivek Bharath Akupatni

πŸ’» ⚠️ +
DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹ From 144dec3fd3700283814b5a81bf8919fc50bc7da7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:50:51 +0000 Subject: [PATCH 0189/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index cb8f1bcd..4624f751 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -518,6 +518,16 @@ "code", "test" ] + }, + { + "login": "DiD92", + "name": "DΓ­dac SementΓ© FernΓ‘ndez", + "avatar_url": "https://avatars3.githubusercontent.com/u/6002416?v=4", + "profile": "https://github.com/DiD92", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 8, From 4a5e48e88fd416e78de0254d5283783c38ce9c9b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:52:28 +0000 Subject: [PATCH 0190/1293] docs: update README.md [skip ci] --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5a6d822c..3c2e1bc1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-56-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-57-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -218,6 +218,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Vivek Bharath Akupatni

πŸ’» ⚠️
DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹ + +
Rob Story

πŸ’» + From e66d2085b7bd087484b4baee0ad05fc8bbd419cc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:52:29 +0000 Subject: [PATCH 0191/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4624f751..ff82b615 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -528,6 +528,15 @@ "code", "content" ] + }, + { + "login": "wrobstory", + "name": "Rob Story", + "avatar_url": "https://avatars3.githubusercontent.com/u/2601457?v=4", + "profile": "https://github.com/wrobstory", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 909b297ae303cd29cea91e5d9d51b95e8f6ebd27 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:54:53 +0000 Subject: [PATCH 0192/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c2e1bc1..72e2f934 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-57-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-58-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -220,6 +220,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Rob Story

πŸ’» +
Siobhan Jacobson

πŸ’» From 5996bd57ea82d93e1976a2df9e7c35a4cf6e86f8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:54:54 +0000 Subject: [PATCH 0193/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ff82b615..4f0b6413 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -537,6 +537,15 @@ "contributions": [ "code" ] + }, + { + "login": "siobhanjacobson", + "name": "Siobhan Jacobson", + "avatar_url": "https://avatars2.githubusercontent.com/u/28983835?v=4", + "profile": "https://github.com/siobhanjacobson", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 08e9c7aa2ff34b3d1b0ba8fefdf2e5521efc32cc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:56:17 +0000 Subject: [PATCH 0194/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 72e2f934..0b98b94c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-58-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-59-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -221,6 +221,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Rob Story

πŸ’»
Siobhan Jacobson

πŸ’» +
Evan Carroll

πŸ–‹ From 599a44f90f51f2cb66e0ea8cec5814440d97ef31 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:56:18 +0000 Subject: [PATCH 0195/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4f0b6413..071e42dc 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -546,6 +546,15 @@ "contributions": [ "code" ] + }, + { + "login": "EvanCarroll", + "name": "Evan Carroll", + "avatar_url": "https://avatars2.githubusercontent.com/u/19922?v=4", + "profile": "https://www.linkedin.com/in/evancarroll/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From dc94fcc6e8299bd6a090fcbaf2ea0d661d36a0fa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:57:32 +0000 Subject: [PATCH 0196/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b98b94c..c09c993f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-59-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-60-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -222,6 +222,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Rob Story

πŸ’»
Siobhan Jacobson

πŸ’»
Evan Carroll

πŸ–‹ +
Jawaad Mahmood

πŸ–‹ From 19a0c1f3cb45dd03e100580167489d9bf8a4889b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:57:33 +0000 Subject: [PATCH 0197/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 071e42dc..df3a9da7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -555,6 +555,15 @@ "contributions": [ "content" ] + }, + { + "login": "jmahmood", + "name": "Jawaad Mahmood", + "avatar_url": "https://avatars3.githubusercontent.com/u/95606?v=4", + "profile": "http://www.jawaadmahmood.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 8f28bcf7040d484e929da0446f91e95be9d44f7d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 09:04:32 +0000 Subject: [PATCH 0198/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c09c993f..df6bfea3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-60-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-61-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -223,6 +223,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Siobhan Jacobson

πŸ’»
Evan Carroll

πŸ–‹
Jawaad Mahmood

πŸ–‹ +
Gaurang Tandon

πŸ–‹ From c7eabe61bb3cc83fd483d04a318f1b5ea41387bd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 09:04:33 +0000 Subject: [PATCH 0199/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index df3a9da7..bbf53864 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -564,6 +564,15 @@ "contributions": [ "content" ] + }, + { + "login": "GaurangTandon", + "name": "Gaurang Tandon", + "avatar_url": "https://avatars1.githubusercontent.com/u/6308683?v=4", + "profile": "https://github.com/GaurangTandon", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 79c3ada49b95aba73644a5148ad3518a4adb9fe7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 09:31:41 +0000 Subject: [PATCH 0200/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index df6bfea3..6cb0535c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-61-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-62-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -224,6 +224,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Evan Carroll

πŸ–‹
Jawaad Mahmood

πŸ–‹
Gaurang Tandon

πŸ–‹ +
Stefan Kupresak

πŸ–‹ From 01f4bb86c3f8e3633ae65172d46fd822967aef54 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2020 09:31:42 +0000 Subject: [PATCH 0201/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index bbf53864..65302ad7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -573,6 +573,15 @@ "contributions": [ "content" ] + }, + { + "login": "dev-cyprium", + "name": "Stefan Kupresak", + "avatar_url": "https://avatars1.githubusercontent.com/u/6002628?v=4", + "profile": "https://github.com/dev-cyprium", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 2933f51949283c80190aca0a0ae06ee723263cc1 Mon Sep 17 00:00:00 2001 From: Greg Leonard <45019882+greg-el@users.noreply.github.com> Date: Fri, 25 Sep 2020 12:39:52 +0100 Subject: [PATCH 0202/1293] chore: Change point to comma in from_into.rs A typo in the fn test_bad_age() hint message had a point rather than comma Prev: // Test that "Mark.twenty" Current: // Test that "Mark,twenty" --- exercises/conversions/from_into.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs index 4f4da538..f24cf61b 100644 --- a/exercises/conversions/from_into.rs +++ b/exercises/conversions/from_into.rs @@ -75,7 +75,7 @@ mod tests { } #[test] fn test_bad_age() { - // Test that "Mark.twenty" will return the default person due to an error in parsing age + // Test that "Mark,twenty" will return the default person due to an error in parsing age let p = Person::from("Mark,twenty"); assert_eq!(p.name, "John"); assert_eq!(p.age, 30); From 9f38b54a2dfe5901605ee57541666033c6682e2b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 25 Sep 2020 13:43:01 +0200 Subject: [PATCH 0203/1293] docs: add greg-el as a contributor * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 65302ad7..98a7e9f0 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -582,6 +582,15 @@ "contributions": [ "content" ] + }, + { + "login": "greg-el", + "name": "Greg Leonard", + "avatar_url": "https://avatars3.githubusercontent.com/u/45019882?v=4", + "profile": "https://github.com/greg-el", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 6cb0535c..cfe7598c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-62-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-63-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -225,6 +225,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Jawaad Mahmood

πŸ–‹
Gaurang Tandon

πŸ–‹
Stefan Kupresak

πŸ–‹ +
Greg Leonard

πŸ–‹ From c03e1e6c6c7c619e241f23b328db2f2dcffa3d0f Mon Sep 17 00:00:00 2001 From: Alexx Roche Date: Sun, 27 Sep 2020 21:57:51 +0200 Subject: [PATCH 0204/1293] chore: fixed test name --- src/exercise.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exercise.rs b/src/exercise.rs index e70538bb..b07d7a11 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -315,7 +315,7 @@ mod test { #[test] fn test_exercise_with_output() { let exercise = Exercise { - name: "finished_exercise".into(), + name: "exercise_with_output".into(), path: PathBuf::from("tests/fixture/success/testSuccess.rs"), mode: Mode::Test, hint: String::new(), From 2ec0bdfd99928e05dc8aa1d2464f498ee22dadf9 Mon Sep 17 00:00:00 2001 From: Yashodhan Joshi Date: Thu, 1 Oct 2020 08:31:42 +0530 Subject: [PATCH 0205/1293] fix(variables5) : make shadowing more prominent closes #375 --- exercises/variables/variables5.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/variables/variables5.rs b/exercises/variables/variables5.rs index 5b2c2fa3..da37ae99 100644 --- a/exercises/variables/variables5.rs +++ b/exercises/variables/variables5.rs @@ -4,8 +4,8 @@ // I AM NOT DONE fn main() { - let number = "3"; // don't change this line - println!("Number {}", number); + let number = "T-H-R-E-E"; + println!("Spell a Number : {}", number); number = 3; - println!("Number {}", number); + println!("Number plus two is : {}", number + 2); } From 5382cd696acd8bde16a9029510fc838ec0594e29 Mon Sep 17 00:00:00 2001 From: jieniu$ Date: Thu, 1 Oct 2020 20:12:24 -0600 Subject: [PATCH 0206/1293] docs: Fix grammatical errors in Readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cfe7598c..b091cf8d 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Greetings and welcome to `rustlings`. This project contains small exercises to g _...looking for the old, web-based version of Rustlings? Try [here](https://github.com/rust-lang/rustlings/tree/rustlings-1)_ -Alternatively, for a first-time Rust learner, there's several other resources: +Alternatively, for a first-time Rust learner, there are several other resources: - [The Book](https://doc.rust-lang.org/book/index.html) - The most comprehensive resource for learning Rust, but a bit theoretical sometimes. You will be using this along with Rustlings! - [Rust By Example](https://doc.rust-lang.org/rust-by-example/index.html) - Learn Rust by solving little exercises! It's almost like `rustlings`, but online @@ -76,7 +76,7 @@ Then, same as above, run `rustlings` to get started. The exercises are sorted by topic and can be found in the subdirectory `rustlings/exercises/`. For every topic there is an additional README file with some resources to get you started on the topic. We really recommend that you have a look at them before you start. -The task is simple. Most exercises contain an error that keep them from compiling, and it's up to you to fix it! Some exercises are also run as tests, but rustlings handles them all the same. To run the exercises in the recommended order, execute: +The task is simple. Most exercises contain an error that keeps them from compiling, and it's up to you to fix it! Some exercises are also run as tests, but rustlings handles them all the same. To run the exercises in the recommended order, execute: ```bash rustlings watch From 89c07b5e437d6a33728bb12b4a0cef44a1c1d3c9 Mon Sep 17 00:00:00 2001 From: mokou Date: Mon, 5 Oct 2020 18:42:26 +0200 Subject: [PATCH 0207/1293] release: 4.1.0 --- CHANGELOG.md | 23 +++++++++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 2 +- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a96df52c..1d156aa6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ + +## 4.1.0 (2020-10-05) + +#### Bug Fixes + +* Update rustlings version in Cargo.lock ([1cc40bc9](https://github.com/rust-lang/rustlings/commit/1cc40bc9ce95c23d56f6d91fa1c4deb646231fef)) +* **arc1:** index mod should equal thread count ([b4062ef6](https://github.com/rust-lang/rustlings/commit/b4062ef6993e80dac107c4093ea85166ad3ee0fa)) +* **enums3:** Update Message::ChangeColor to take a tuple. (#457) ([4b6540c7](https://github.com/rust-lang/rustlings/commit/4b6540c71adabad647de8a09e57295e7c7c7d794)) +* **exercises:** adding question mark to quiz2 ([101072ab](https://github.com/rust-lang/rustlings/commit/101072ab9f8c80b40b8b88cb06cbe38aca2481c5)) +* **generics3:** clarify grade change ([47f7672c](https://github.com/rust-lang/rustlings/commit/47f7672c0307732056e7426e81d351f0dd7e22e5)) +* **structs3:** Small adjustment of variable name ([114b54cb](https://github.com/rust-lang/rustlings/commit/114b54cbdb977234b39e5f180d937c14c78bb8b2)) +* **using_as:** Add test so that proper type is returned. (#512) ([3286c5ec](https://github.com/rust-lang/rustlings/commit/3286c5ec19ea5fb7ded81d047da5f8594108a490)) + +#### Features + +* Added iterators1.rs exercise ([9642f5a3](https://github.com/rust-lang/rustlings/commit/9642f5a3f686270a4f8f6ba969919ddbbc4f7fdd)) +* Add ability to run rustlings on repl.it (#471) ([8f7b5bd0](https://github.com/rust-lang/rustlings/commit/8f7b5bd00eb83542b959830ef55192d2d76db90a)) +* Add gitpod support (#473) ([4821a8be](https://github.com/rust-lang/rustlings/commit/4821a8be94af4f669042a06ab917934cfacd032f)) +* Remind the user of the hint option (#425) ([816b1f5e](https://github.com/rust-lang/rustlings/commit/816b1f5e85d6cc6e72673813a85d0ada2a8f84af)) +* Remind the user of the hint option (#425) ([9f61db5d](https://github.com/rust-lang/rustlings/commit/9f61db5dbe38538cf06571fcdd5f806e7901e83a)) +* **cli:** Added 'cls' command to 'watch' mode (#474) ([4f2468e1](https://github.com/rust-lang/rustlings/commit/4f2468e14f574a93a2e9b688367b5752ed96ae7b)) +* **try_from_into:** Add insufficient length test (#469) ([523d18b8](https://github.com/rust-lang/rustlings/commit/523d18b873a319f7c09262f44bd40e2fab1830e5)) + ## 4.0.0 (2020-07-08) diff --git a/Cargo.lock b/Cargo.lock index 732a4b59..cdc1af35 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -592,7 +592,7 @@ dependencies = [ [[package]] name = "rustlings" -version = "4.0.0" +version = "4.1.0" dependencies = [ "assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index d4180da2..68142845 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "4.0.0" +version = "4.1.0" authors = ["Marisa ", "Carol (Nichols || Goulding) "] edition = "2018" diff --git a/README.md b/README.md index b091cf8d..efad42b8 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Basically: Clone the repository, checkout to the latest tag, run `cargo install` ```bash git clone https://github.com/rust-lang/rustlings cd rustlings -git checkout tags/4.0.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) +git checkout tags/4.1.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) cargo install --force --path . ``` From e1fdfbb062e655b8cb4ddb770abe3f13cc606ec3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 9 Oct 2020 00:15:53 +0000 Subject: [PATCH 0208/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index efad42b8..3433e8e2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-63-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-64-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -226,6 +226,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Gaurang Tandon

πŸ–‹
Stefan Kupresak

πŸ–‹
Greg Leonard

πŸ–‹ +
Ryan McQuen

πŸ’» From 29dd0b1e410715fee8b18eee54da67405d2c0625 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 9 Oct 2020 00:15:54 +0000 Subject: [PATCH 0209/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 98a7e9f0..92c3af81 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -591,6 +591,15 @@ "contributions": [ "content" ] + }, + { + "login": "ryanpcmcquen", + "name": "Ryan McQuen", + "avatar_url": "https://avatars3.githubusercontent.com/u/772937?v=4", + "profile": "https://ryanpcmcquen.org", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 18e0bfef1de53071e353ba1ec5837002ff7290e6 Mon Sep 17 00:00:00 2001 From: Ryan McQuen Date: Sat, 10 Oct 2020 04:11:57 -0700 Subject: [PATCH 0210/1293] fix(quiz3): Second test is for odd numbers, not even. (#553) --- exercises/tests/tests3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/tests/tests3.rs b/exercises/tests/tests3.rs index 06cf7ea7..3424f940 100644 --- a/exercises/tests/tests3.rs +++ b/exercises/tests/tests3.rs @@ -20,7 +20,7 @@ mod tests { } #[test] - fn is_false_when_even() { + fn is_false_when_odd() { assert!(); } } From 2b1fb2b739bf9ad8d6b7b12af25fee173011bfc4 Mon Sep 17 00:00:00 2001 From: Axel Viala Date: Sat, 10 Oct 2020 16:04:19 +0200 Subject: [PATCH 0211/1293] feat(primitive_types6): Add a test (#548) Co-authored-by: Annika <56906084+AnnikaCodes@users.noreply.github.com> Co-authored-by: fmoko --- exercises/primitive_types/primitive_types6.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/exercises/primitive_types/primitive_types6.rs b/exercises/primitive_types/primitive_types6.rs index 2bc817e9..5c6c5a43 100644 --- a/exercises/primitive_types/primitive_types6.rs +++ b/exercises/primitive_types/primitive_types6.rs @@ -1,11 +1,16 @@ // primitive_types6.rs // Use a tuple index to access the second element of `numbers`. -// You can put this right into the `println!` where the ??? is. +// You can put the expression for the second element where ??? is so that the test passes. // Execute `rustlings hint primitive_types6` for hints! // I AM NOT DONE -fn main() { +#[test] +fn indexing_tuple() { let numbers = (1, 2, 3); - println!("The second number is {}", ???); + /// Replace below ??? with the tuple indexing syntax. + let second = ???; + + assert_eq!(2, second + "This is not the 2nd number in the tuple!") } From ded1474bbb05870beac061f1bdac26ef98035d0d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 10 Oct 2020 16:07:15 +0200 Subject: [PATCH 0212/1293] docs: add darnuria as a contributor (#554) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 92c3af81..8bec2408 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -600,6 +600,15 @@ "contributions": [ "code" ] + }, + { + "login": "darnuria", + "name": "Axel Viala", + "avatar_url": "https://avatars1.githubusercontent.com/u/2827553?v=4", + "profile": "https://darnuria.eu", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 3433e8e2..1e4e9532 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-64-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-65-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -228,6 +228,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Greg Leonard

πŸ–‹
Ryan McQuen

πŸ’» + +
Axel Viala

πŸ’» + From cc5b9b772a219cc114a31e762bdf0eaa63cb3221 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 10 Oct 2020 17:08:22 +0200 Subject: [PATCH 0213/1293] docs: add AnnikaCodes as a contributor (#557) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: fmoko --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8bec2408..56e4d53f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -601,6 +601,15 @@ "code" ] }, + { + "login": "AnnikaCodes", + "name": "Annika", + "avatar_url": "https://avatars3.githubusercontent.com/u/56906084?v=4", + "profile": "https://github.com/AnnikaCodes", + "contributions": [ + "review" + ] + }, { "login": "darnuria", "name": "Axel Viala", diff --git a/README.md b/README.md index 1e4e9532..a618abb5 100644 --- a/README.md +++ b/README.md @@ -229,6 +229,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Ryan McQuen

πŸ’» +
Annika

πŸ‘€
Axel Viala

πŸ’» From e6bde22f9c65e1da07602021d759ab702f7317d4 Mon Sep 17 00:00:00 2001 From: Rastamo <42067541+Rastamo@users.noreply.github.com> Date: Sun, 11 Oct 2020 14:00:03 +0200 Subject: [PATCH 0214/1293] chore: primitive_types6 mode changed to test (#559) primitive_types6 exercise was changed to test yesterday, but info.toml file wasn't updated. I think this change should fix it. --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 28bf24d6..2d0abdb1 100644 --- a/info.toml +++ b/info.toml @@ -210,7 +210,7 @@ of the tuple. You can do it!!""" [[exercises]] name = "primitive_types6" path = "exercises/primitive_types/primitive_types6.rs" -mode = "compile" +mode = "test" hint = """ While you could use a destructuring `let` for the tuple here, try indexing into it instead, as explained in the last example of the From 4fb230daf1251444fcf29e085cee222a91f8a37e Mon Sep 17 00:00:00 2001 From: Matthew Smillie Date: Tue, 13 Oct 2020 23:18:41 -0700 Subject: [PATCH 0215/1293] fix(primitive_types6): missing comma in test --- exercises/primitive_types/primitive_types6.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/primitive_types/primitive_types6.rs b/exercises/primitive_types/primitive_types6.rs index 5c6c5a43..0fa42b27 100644 --- a/exercises/primitive_types/primitive_types6.rs +++ b/exercises/primitive_types/primitive_types6.rs @@ -11,6 +11,6 @@ fn indexing_tuple() { /// Replace below ??? with the tuple indexing syntax. let second = ???; - assert_eq!(2, second + assert_eq!(2, second, "This is not the 2nd number in the tuple!") } From 472d8592d65c8275332a20dfc269e7ac0d41bc88 Mon Sep 17 00:00:00 2001 From: Matthew Smillie Date: Tue, 13 Oct 2020 23:20:17 -0700 Subject: [PATCH 0216/1293] fix(primitive_types6): remove 'unused doc comment' warning --- exercises/primitive_types/primitive_types6.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/primitive_types/primitive_types6.rs b/exercises/primitive_types/primitive_types6.rs index 0fa42b27..b8c9b82b 100644 --- a/exercises/primitive_types/primitive_types6.rs +++ b/exercises/primitive_types/primitive_types6.rs @@ -8,7 +8,7 @@ #[test] fn indexing_tuple() { let numbers = (1, 2, 3); - /// Replace below ??? with the tuple indexing syntax. + // Replace below ??? with the tuple indexing syntax. let second = ???; assert_eq!(2, second, From 5643ef05bc81e4a840e9456f4406a769abbe1392 Mon Sep 17 00:00:00 2001 From: Roberto Vidal Date: Fri, 30 Oct 2020 14:39:28 +0100 Subject: [PATCH 0217/1293] fix: more unique temp_file --- src/exercise.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index b07d7a11..283b2b90 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -11,10 +11,15 @@ const I_AM_DONE_REGEX: &str = r"(?m)^\s*///?\s*I\s+AM\s+NOT\s+DONE"; const CONTEXT: usize = 2; const CLIPPY_CARGO_TOML_PATH: &str = "./exercises/clippy/Cargo.toml"; -// Get a temporary file name that is hopefully unique to this process +// Get a temporary file name that is hopefully unique #[inline] fn temp_file() -> String { - format!("./temp_{}", process::id()) + let thread_id: String = format!("{:?}", std::thread::current().id()) + .chars() + .filter(|c| c.is_alphanumeric()) + .collect(); + + format!("./temp_{}_{}", process::id(), thread_id) } // The mode of the exercise. From 0c12fa31c57c03c6287458a0a8aca7afd057baf6 Mon Sep 17 00:00:00 2001 From: sazid Date: Mon, 26 Oct 2020 12:54:32 +0600 Subject: [PATCH 0218/1293] feat: Add Vec exercises --- exercises/collections/README.md | 20 +++++++++++++++++ exercises/collections/vec1.rs | 25 ++++++++++++++++++++++ exercises/collections/vec2.rs | 38 +++++++++++++++++++++++++++++++++ info.toml | 30 ++++++++++++++++++++++++++ 4 files changed, 113 insertions(+) create mode 100644 exercises/collections/README.md create mode 100644 exercises/collections/vec1.rs create mode 100644 exercises/collections/vec2.rs diff --git a/exercises/collections/README.md b/exercises/collections/README.md new file mode 100644 index 00000000..9ded29a0 --- /dev/null +++ b/exercises/collections/README.md @@ -0,0 +1,20 @@ +### Collections + +Rust’s standard library includes a number of very useful data +structures called collections. Most other data types represent one +specific value, but collections can contain multiple values. Unlike +the built-in array and tuple types, the data these collections point +to is stored on the heap, which means the amount of data does not need +to be known at compile time and can grow or shrink as the program +runs. + +This exercise will get you familiar with two fundamental data +structures that are used very often in Rust programs: + +* A *vector* allows you to store a variable number of values next to + each other. +* A *hash map* allows you to associate a value with a particular key. + You may also know this by the names *map* in C++, *dictionary* in + Python or an *associative array* in other languages. + +[Rust book chapter](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html) diff --git a/exercises/collections/vec1.rs b/exercises/collections/vec1.rs new file mode 100644 index 00000000..ac3d9f1a --- /dev/null +++ b/exercises/collections/vec1.rs @@ -0,0 +1,25 @@ +// vec1.rs +// Your task is to create a `Vec` which holds the exact same elements +// as in the array `a`. +// Make me compile and pass the test! +// Execute the command `rustlings hint collections1` if you need hints. + +// I AM NOT DONE + +fn array_and_vec() -> ([i32; 4], Vec) { + let a = [10, 20, 30, 40]; // a plain array + let v = // TODO: declare your vector here with the macro for vectors + + (a, v) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_array_and_vec_similarity() { + let (a, v) = array_and_vec(); + assert!(a.iter().zip(v.iter()).all(|(x, y)| x == y)); + } +} diff --git a/exercises/collections/vec2.rs b/exercises/collections/vec2.rs new file mode 100644 index 00000000..ec6cfc00 --- /dev/null +++ b/exercises/collections/vec2.rs @@ -0,0 +1,38 @@ +// vec2.rs +// A Vec of even numbers is given. Your task is to complete the loop +// so that each number in the Vec is multiplied by 2. +// +// Make me pass the test! +// +// Execute the command `rustlings hint collections2` if you need +// hints. + +// I AM NOT DONE + +fn vec_loop(mut v: Vec) -> Vec { + for i in v.iter_mut() { + // TODO: Fill this up so that each element in the Vec `v` is + // multiplied by 2. + } + + // At this point, `v` should be equal to [4, 8, 12, 16, 20]. + v +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_vec_loop() { + let v: Vec = (1..).filter(|x| x % 2 == 0).take(5).collect(); + let ans = vec_loop(v.clone()); + + assert_eq!( + ans, + v.iter() + .map(|x| x * 2) + .collect::>() + ); + } +} diff --git a/info.toml b/info.toml index 2d0abdb1..56605a7b 100644 --- a/info.toml +++ b/info.toml @@ -370,6 +370,36 @@ its internal structure (the `fruits` and `veggies` modules and associated constants). It's almost there except for one keyword missing for each constant.""" +# COLLECTIONS + +[[exercises]] +name = "collections1" +path = "exercises/collections/vec1.rs" +mode = "test" +hint = """ +In Rust, there are two ways to define a Vector. + +1. One way is to use the `Vec::new()` function to create a new vector + and fill it with the `push()` method. + +2. The second way, which is simpler is to use the `vec![]` macro and + define your elements inside the square brackets. + +Check this chapter: https://doc.rust-lang.org/stable/book/ch08-01-vectors.html +of the Rust book to learn more. +""" + +[[exercises]] +name = "collections2" +path = "exercises/collections/vec2.rs" +mode = "test" +hint = """ +Hint 1: `i` is each element from the Vec as they are being iterated. + Can you try multiplying this? + +Hint 2: Check the suggestion from the compiler error ;) +""" + # MACROS [[exercises]] From 633c00cf8071e1e82959a3010452a32f34f29fc9 Mon Sep 17 00:00:00 2001 From: sazid Date: Mon, 26 Oct 2020 18:08:48 +0600 Subject: [PATCH 0219/1293] feat: Add HashMap exercises --- exercises/collections/hashmap1.rs | 46 +++++++++++++++++ exercises/collections/hashmap2.rs | 83 +++++++++++++++++++++++++++++++ info.toml | 22 ++++++++ 3 files changed, 151 insertions(+) create mode 100644 exercises/collections/hashmap1.rs create mode 100644 exercises/collections/hashmap2.rs diff --git a/exercises/collections/hashmap1.rs b/exercises/collections/hashmap1.rs new file mode 100644 index 00000000..b1dc0bbd --- /dev/null +++ b/exercises/collections/hashmap1.rs @@ -0,0 +1,46 @@ +// hashmap1.rs +// A basket of fruits in the form of a hash map needs to be defined. +// The key represents the name of the fruit and the value represents +// how many of that particular fruit is in the basket. You have to put +// at least three different types of fruits (e.g apple, banana, mango) +// in the basket and the total count of all the fruits should be at +// least five. +// +// Make me compile and pass the tests! +// +// Execute the command `rustlings hint collections3` if you need +// hints. + +// I AM NOT DONE + +use std::collections::HashMap; + +fn fruit_basket() -> HashMap { + let mut basket = // TODO: declare your hash map here. + + // Two bananas are already given for you :) + basket.insert(String::from("banana"), 2); + + // TODO: Put more fruits in your basket here. + + basket +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn at_least_three_types_of_fruits() { + let basket = fruit_basket(); + assert!(basket.len() >= 3); + } + + #[test] + fn at_least_five_fruits() { + let basket = fruit_basket(); + assert!(basket + .values() + .sum::() >= 5); + } +} diff --git a/exercises/collections/hashmap2.rs b/exercises/collections/hashmap2.rs new file mode 100644 index 00000000..7e25be7c --- /dev/null +++ b/exercises/collections/hashmap2.rs @@ -0,0 +1,83 @@ +// hashmap2.rs + +// A basket of fruits in the form of a hash map is given. The key +// represents the name of the fruit and the value represents how many +// of that particular fruit is in the basket. You have to put *MORE +// THAN 11* fruits in the basket. Three types of fruits - Apple (4), +// Mango (2) and Lichi (5) are already given in the basket. You are +// not allowed to insert any more of these fruits! +// +// Make me pass the tests! +// +// Execute the command `rustlings hint collections4` if you need +// hints. + +// I AM NOT DONE + +use std::collections::HashMap; + +#[derive(Hash, PartialEq, Eq)] +enum Fruit { + Apple, + Banana, + Mango, + Lichi, + Pineapple, +} + +fn fruit_basket(basket: &mut HashMap) { + let fruit_kinds = vec![ + Fruit::Apple, + Fruit::Banana, + Fruit::Mango, + Fruit::Lichi, + Fruit::Pineapple, + ]; + + for fruit in fruit_kinds { + // TODO: Put new fruits if not already present. Note that you + // are not allowed to put any type of fruit that's already + // present! + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn get_fruit_basket() -> HashMap { + let mut basket = HashMap::::new(); + basket.insert(Fruit::Apple, 4); + basket.insert(Fruit::Mango, 2); + basket.insert(Fruit::Lichi, 5); + + basket + } + + #[test] + fn test_given_fruits_are_not_modified() { + let mut basket = get_fruit_basket(); + fruit_basket(&mut basket); + assert_eq!(*basket.get(&Fruit::Apple).unwrap(), 4); + assert_eq!(*basket.get(&Fruit::Mango).unwrap(), 2); + assert_eq!(*basket.get(&Fruit::Lichi).unwrap(), 5); + } + + #[test] + fn at_least_five_types_of_fruits() { + let mut basket = get_fruit_basket(); + fruit_basket(&mut basket); + let count_fruit_kinds = basket.len(); + assert!(count_fruit_kinds == 5); + } + + #[test] + fn greater_than_eleven_fruits() { + let mut basket = get_fruit_basket(); + fruit_basket(&mut basket); + let count = basket + .values() + .sum::(); + assert!(count > 11); + } +} diff --git a/info.toml b/info.toml index 56605a7b..c52702f7 100644 --- a/info.toml +++ b/info.toml @@ -400,6 +400,28 @@ Hint 1: `i` is each element from the Vec as they are being iterated. Hint 2: Check the suggestion from the compiler error ;) """ +[[exercises]] +name = "collections3" +path = "exercises/collections/hashmap1.rs" +mode = "test" +hint = """ +Hint 1: Take a look at the return type of the function to figure out + the type for the `basket`. + +Hint 2: Number of fruits should be at least 5. And you have to put + at least three different types of fruits. +""" + +[[exercises]] +name = "collections4" +path = "exercises/collections/hashmap2.rs" +mode = "test" +hint = """ +Use the `entry()` and `or_insert()` methods of `HashMap` to achieve this. + +Learn more at https://doc.rust-lang.org/stable/book/ch08-03-hash-maps.html#only-inserting-a-value-if-the-key-has-no-value +""" + # MACROS [[exercises]] From 535a8c82432b68b83cca3e8a42a7c9e26a09c6cd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2020 19:29:36 +0000 Subject: [PATCH 0220/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a618abb5..81962273 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-65-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-67-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -231,6 +231,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Annika

πŸ‘€
Axel Viala

πŸ’» +
Mohammed Sazid Al Rashid

πŸ–‹ πŸ’» From 51631f4c2e4246ddfa6be07a00cf597f51bca647 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2020 19:29:37 +0000 Subject: [PATCH 0221/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 56e4d53f..f383a3ae 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -618,6 +618,16 @@ "contributions": [ "code" ] + }, + { + "login": "sazid", + "name": "Mohammed Sazid Al Rashid", + "avatar_url": "https://avatars1.githubusercontent.com/u/2370167?v=4", + "profile": "https://sazid.github.io", + "contributions": [ + "content", + "code" + ] } ], "contributorsPerLine": 8, From 21bfb2d4777429c87d8d3b5fbf0ce66006dcd034 Mon Sep 17 00:00:00 2001 From: Caleb Webber Date: Thu, 5 Nov 2020 03:59:25 -0500 Subject: [PATCH 0222/1293] fix(installation): Update the MinRustVersion closes #577df Co-authored-by: Caleb Webber --- install.ps1 | 2 +- install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/install.ps1 b/install.ps1 index f7472ad1..32167f06 100644 --- a/install.ps1 +++ b/install.ps1 @@ -53,7 +53,7 @@ function vercomp($v1, $v2) { } $rustVersion = $(rustc --version).Split(" ")[1] -$minRustVersion = "1.31" +$minRustVersion = "1.39" if ((vercomp $rustVersion $minRustVersion) -eq 2) { Write-Host "WARNING: Rust version is too old: $rustVersion - needs at least $minRustVersion" Write-Host "Please update Rust with 'rustup update'" diff --git a/install.sh b/install.sh index a19c280a..e986e741 100755 --- a/install.sh +++ b/install.sh @@ -87,7 +87,7 @@ function vercomp() { } RustVersion=$(rustc --version | cut -d " " -f 2) -MinRustVersion=1.31 +MinRustVersion=1.39 vercomp $RustVersion $MinRustVersion if [ $? -eq 2 ] then From 68e646f8aa04b4297fe205472334132cdf001bbc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2020 10:03:43 +0100 Subject: [PATCH 0223/1293] docs: add seeplusplus as a contributor --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index f383a3ae..84b2365e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -628,6 +628,15 @@ "content", "code" ] + }, + { + "login": "seeplusplus", + "name": "Caleb Webber", + "avatar_url": "https://avatars1.githubusercontent.com/u/17479099?v=4", + "profile": "https://codingthemsoftly.com", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 81962273..75a403f5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-67-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-68-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) @@ -232,6 +232,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Annika

πŸ‘€
Axel Viala

πŸ’»
Mohammed Sazid Al Rashid

πŸ–‹ πŸ’» +
Caleb Webber

🚧 From d61b4e5a13b44d72d004082f523fa1b6b24c1aca Mon Sep 17 00:00:00 2001 From: Caleb Webber Date: Thu, 5 Nov 2020 19:29:16 -0500 Subject: [PATCH 0224/1293] fix: log error output when inotify limit is exceeded closes #472 --- src/main.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index b5814bfb..d0299e33 100644 --- a/src/main.rs +++ b/src/main.rs @@ -119,7 +119,12 @@ fn main() { verify(&exercises, verbose).unwrap_or_else(|_| std::process::exit(1)); } - if matches.subcommand_matches("watch").is_some() && watch(&exercises, verbose).is_ok() { + if matches.subcommand_matches("watch").is_some() { + if let Err(e) = watch(&exercises, verbose) { + println!("Error: Could not watch your progess. Error message was {:?}.", e); + println!("Most likely you've run out of disk space or your 'inotify limit' has been reached."); + std::process::exit(1); + } println!( "{emoji} All exercises completed! {emoji}", emoji = Emoji("πŸŽ‰", "β˜…") From 197d3a3d8961b2465579218a6749b2b2cefa8ddd Mon Sep 17 00:00:00 2001 From: JP Date: Sat, 7 Nov 2020 13:54:14 +0100 Subject: [PATCH 0225/1293] fix(iterators2): Update description (#578) grammar fix in the description --- exercises/standard_library_types/iterators2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/standard_library_types/iterators2.rs b/exercises/standard_library_types/iterators2.rs index 837725f0..84d14ae6 100644 --- a/exercises/standard_library_types/iterators2.rs +++ b/exercises/standard_library_types/iterators2.rs @@ -1,5 +1,5 @@ // iterators2.rs -// In this module, you'll learn some of unique advantages that iterators can offer. +// In this module, you'll learn some of the unique advantages that iterators can offer. // Step 1. Complete the `capitalize_first` function to pass the first two cases. // Step 2. Apply the `capitalize_first` function to a vector of strings. // Ensure that it returns a vector of strings as well. From 95ccd92616ae79ba287cce221101e0bbe4f68cdc Mon Sep 17 00:00:00 2001 From: fiplox <56274824+fiplox@users.noreply.github.com> Date: Sat, 7 Nov 2020 14:01:39 +0100 Subject: [PATCH 0226/1293] feat(try_from_into): Add tests (#571) Co-authored-by: Volodymyr Patuta <6977238-fiplox@users.noreply.gitlab.com> --- exercises/conversions/try_from_into.rs | 93 ++++++++++++++++---------- 1 file changed, 56 insertions(+), 37 deletions(-) diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index b830c166..cd14daf7 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -4,7 +4,7 @@ // You can read more about it at https://doc.rust-lang.org/std/convert/trait.TryFrom.html use std::convert::{TryFrom, TryInto}; -#[derive(Debug)] +#[derive(Debug, PartialEq)] struct Color { red: u8, green: u8, @@ -25,22 +25,19 @@ struct Color { // Tuple implementation impl TryFrom<(i16, i16, i16)> for Color { type Error = String; - fn try_from(tuple: (i16, i16, i16)) -> Result { - } + fn try_from(tuple: (i16, i16, i16)) -> Result {} } // Array implementation impl TryFrom<[i16; 3]> for Color { type Error = String; - fn try_from(arr: [i16; 3]) -> Result { - } + fn try_from(arr: [i16; 3]) -> Result {} } // Slice implementation impl TryFrom<&[i16]> for Color { type Error = String; - fn try_from(slice: &[i16]) -> Result { - } + fn try_from(slice: &[i16]) -> Result {} } fn main() { @@ -66,71 +63,93 @@ mod tests { use super::*; #[test] - #[should_panic] fn test_tuple_out_of_range_positive() { - let _ = Color::try_from((256, 1000, 10000)).unwrap(); + assert!(Color::try_from((256, 1000, 10000)).is_err()); } #[test] - #[should_panic] fn test_tuple_out_of_range_negative() { - let _ = Color::try_from((-1, -10, -256)).unwrap(); + assert!(Color::try_from((-1, -10, -256)).is_err()); + } + #[test] + fn test_tuple_sum() { + assert!(Color::try_from((-1, 255, 255)).is_err()); } #[test] fn test_tuple_correct() { - let c: Color = (183, 65, 14).try_into().unwrap(); - assert_eq!(c.red, 183); - assert_eq!(c.green, 65); - assert_eq!(c.blue, 14); + let c: Result = (183, 65, 14).try_into(); + assert_eq!( + c, + Ok(Color { + red: 183, + green: 65, + blue: 14 + }) + ); } - #[test] - #[should_panic] fn test_array_out_of_range_positive() { - let _: Color = [1000, 10000, 256].try_into().unwrap(); + let c: Color = [1000, 10000, 256].try_into(); + assert!(c.is_err()); } #[test] - #[should_panic] fn test_array_out_of_range_negative() { - let _: Color = [-10, -256, -1].try_into().unwrap(); + let c: Color = [-10, -256, -1].try_into(); + assert!(c.is_err()); } #[test] + fn test_array_sum() { + let c: Color = [-1, 255, 255].try_into(); + assert!(c.is_err()); + } + #[test] + #[test] fn test_array_correct() { - let c: Color = [183, 65, 14].try_into().unwrap(); - assert_eq!(c.red, 183); - assert_eq!(c.green, 65); - assert_eq!(c.blue, 14); + let c: Result = [183, 65, 14].try_into(); + assert_eq!( + c, + Ok(Color { + red: 183, + green: 65, + blue: 14 + }) + ); } - #[test] - #[should_panic] fn test_slice_out_of_range_positive() { let arr = [10000, 256, 1000]; - let _ = Color::try_from(&arr[..]).unwrap(); + assert!(Color::try_from(&arr[..]).is_err()); } #[test] - #[should_panic] fn test_slice_out_of_range_negative() { let arr = [-256, -1, -10]; - let _ = Color::try_from(&arr[..]).unwrap(); + assert!(Color::try_from(&arr[..]).is_err()); + } + #[test] + fn test_slice_sum() { + let arr = [-1, 255, 255]; + assert!(Color::try_from(&arr[..]).is_err()); } #[test] fn test_slice_correct() { let v = vec![183, 65, 14]; - let c = Color::try_from(&v[..]).unwrap(); - assert_eq!(c.red, 183); - assert_eq!(c.green, 65); - assert_eq!(c.blue, 14); + let c: Result = Color::try_from(&v[..]); + assert_eq!( + c, + Ok(Color { + red: 183, + green: 65, + blue: 14 + }) + ); } #[test] - #[should_panic] fn test_slice_excess_length() { let v = vec![0, 0, 0, 0]; - let _ = Color::try_from(&v[..]).unwrap(); + assert!(Color::try_from(&v[..]).is_err()); } #[test] - #[should_panic] fn test_slice_insufficient_length() { let v = vec![0, 0]; - let _ = Color::try_from(&v[..]).unwrap(); + assert!(Color::try_from(&v[..]).is_err()); } } From 964b2a331de2c98c1038fd859ac7e7c0e956236a Mon Sep 17 00:00:00 2001 From: mokou Date: Sat, 7 Nov 2020 14:21:10 +0100 Subject: [PATCH 0227/1293] release: 4.2.0 --- CHANGELOG.md | 21 +++++++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 2 +- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d156aa6..d58d4e6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ + +## 4.2.0 (2020-11-07) + +#### Features + +* Add HashMap exercises ([633c00cf](https://github.com/rust-lang/rustlings/commit/633c00cf8071e1e82959a3010452a32f34f29fc9)) +* Add Vec exercises ([0c12fa31](https://github.com/rust-lang/rustlings/commit/0c12fa31c57c03c6287458a0a8aca7afd057baf6)) +* **primitive_types6:** Add a test (#548) ([2b1fb2b7](https://github.com/rust-lang/rustlings/commit/2b1fb2b739bf9ad8d6b7b12af25fee173011bfc4)) +* **try_from_into:** Add tests (#571) ([95ccd926](https://github.com/rust-lang/rustlings/commit/95ccd92616ae79ba287cce221101e0bbe4f68cdc)) + +#### Bug Fixes + +* log error output when inotify limit is exceeded ([d61b4e5a](https://github.com/rust-lang/rustlings/commit/d61b4e5a13b44d72d004082f523fa1b6b24c1aca)) +* more unique temp_file ([5643ef05](https://github.com/rust-lang/rustlings/commit/5643ef05bc81e4a840e9456f4406a769abbe1392)) +* **installation:** Update the MinRustVersion ([21bfb2d4](https://github.com/rust-lang/rustlings/commit/21bfb2d4777429c87d8d3b5fbf0ce66006dcd034)) +* **iterators2:** Update description (#578) ([197d3a3d](https://github.com/rust-lang/rustlings/commit/197d3a3d8961b2465579218a6749b2b2cefa8ddd)) +* **primitive_types6:** + * remove 'unused doc comment' warning ([472d8592](https://github.com/rust-lang/rustlings/commit/472d8592d65c8275332a20dfc269e7ac0d41bc88)) + * missing comma in test ([4fb230da](https://github.com/rust-lang/rustlings/commit/4fb230daf1251444fcf29e085cee222a91f8a37e)) +* **quiz3:** Second test is for odd numbers, not even. (#553) ([18e0bfef](https://github.com/rust-lang/rustlings/commit/18e0bfef1de53071e353ba1ec5837002ff7290e6)) + ## 4.1.0 (2020-10-05) diff --git a/Cargo.lock b/Cargo.lock index cdc1af35..9f90e0a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -592,7 +592,7 @@ dependencies = [ [[package]] name = "rustlings" -version = "4.1.0" +version = "4.2.0" dependencies = [ "assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 68142845..ebce25eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "4.1.0" +version = "4.2.0" authors = ["Marisa ", "Carol (Nichols || Goulding) "] edition = "2018" diff --git a/README.md b/README.md index 75a403f5..59ee6328 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Basically: Clone the repository, checkout to the latest tag, run `cargo install` ```bash git clone https://github.com/rust-lang/rustlings cd rustlings -git checkout tags/4.1.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) +git checkout tags/4.2.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) cargo install --force --path . ``` From 9334783da31d821cc59174fbe8320df95828926c Mon Sep 17 00:00:00 2001 From: Brock <58987761+13r0ck@users.noreply.github.com> Date: Sun, 8 Nov 2020 02:31:45 -0700 Subject: [PATCH 0228/1293] fix(structs1): Adjust wording (#573) Co-authored-by: fmoko --- info.toml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/info.toml b/info.toml index c52702f7..cc12c99d 100644 --- a/info.toml +++ b/info.toml @@ -225,12 +225,13 @@ name = "structs1" path = "exercises/structs/structs1.rs" mode = "test" hint = """ -Rust has more than one type of struct. Both variants are used to package related data together. -On the one hand, there are normal, or classic, structs. These are named collections of related data stored in fields. -The other variant is tuple structs. Basically just named tuples. -In this exercise you need to implement one of each kind. +Rust has more than one type of struct. Three actually, all variants are used to package related data together. +There are normal (or classic) structs. These are named collections of related data stored in fields. +Tuple structs are basically just named tuples. +Finally, Unit structs. These don't have and fields and are useful for generics. -Read more about structs in The Book: https://doc.rust-lang.org/stable/book/ch05-00-structs.html""" +In this exercise you need to complete and implement one of each kind. +Read more about structs in The Book: https://doc.rust-lang.org/book/ch05-01-defining-structs.html""" [[exercises]] name = "structs2" From 96347df9df294f01153b29d9ad4ba361f665c755 Mon Sep 17 00:00:00 2001 From: JP Date: Sun, 8 Nov 2020 19:30:40 +0100 Subject: [PATCH 0229/1293] fix(try_from_into): Update description (#584) Description update --- exercises/conversions/try_from_into.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index cd14daf7..38ce2db7 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -15,12 +15,12 @@ struct Color { // Your task is to complete this implementation // and return an Ok result of inner type Color. -// You need create implementation for a tuple of three integer, -// an array of three integer and slice of integer. +// You need to create an implementation for a tuple of three integers, +// an array of three integers and a slice of integers. // -// Note, that implementation for tuple and array will be checked at compile-time, -// but slice implementation need check slice length! -// Also note, that chunk of correct rgb color must be integer in range 0..=255. +// Note that the implementation for tuple and array will be checked at compile time, +// but the slice implementation needs to check the slice length! +// Also note that correct RGB color values must be integers in the 0..=255 range. // Tuple implementation impl TryFrom<(i16, i16, i16)> for Color { From 838f9f30083d0b23fd67503dcf0fbeca498e6647 Mon Sep 17 00:00:00 2001 From: Caleb Webber Date: Tue, 10 Nov 2020 12:36:19 -0500 Subject: [PATCH 0230/1293] feat: add "rustlings list" command --- src/main.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main.rs b/src/main.rs index d0299e33..d04ad8f6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,6 +54,11 @@ fn main() { .about("Returns a hint for the current exercise") .arg(Arg::with_name("name").required(true).index(1)), ) + .subcommand( + SubCommand::with_name("list") + .alias("l") + .about("Lists the exercises available in rustlings") + ) .get_matches(); if matches.subcommand_name().is_none() { @@ -88,6 +93,9 @@ fn main() { let exercises = toml::from_str::(toml_str).unwrap().exercises; let verbose = matches.is_present("nocapture"); + if matches.subcommand_matches("list").is_some() { + exercises.iter().for_each(|e| println!("{}", e.name)); + } if let Some(ref matches) = matches.subcommand_matches("run") { let name = matches.value_of("name").unwrap(); From fa9f522b7f043d7ef73a39f003a9272dfe72c4f4 Mon Sep 17 00:00:00 2001 From: Brock <58987761+13r0ck@users.noreply.github.com> Date: Wed, 11 Nov 2020 15:06:14 -0700 Subject: [PATCH 0231/1293] feat: Crab? (#586) Crab? --- src/main.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main.rs b/src/main.rs index d04ad8f6..35f8df4d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -138,6 +138,26 @@ fn main() { emoji = Emoji("πŸŽ‰", "β˜…") ); println!(); + println!("+----------------------------------------------------+"); + println!("| You made it to the Fe-nish line! |"); + println!("+-------------------------- ------------------------+"); + println!(" \\/ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); + println!(" β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ "); + println!(" β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); + println!(); println!("We hope you enjoyed learning about the various aspects of Rust!"); println!("If you noticed any issues, please don't hesitate to report them to our repo."); println!("You can also contribute your own exercises to help the greater community!"); From 4f4cfcf3c36c8718c7c170c9c3a6935e6ef0618c Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Wed, 11 Nov 2020 21:02:00 -0800 Subject: [PATCH 0232/1293] fix(try_from_into): type error --- exercises/conversions/try_from_into.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index 38ce2db7..897b364e 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -88,17 +88,17 @@ mod tests { } #[test] fn test_array_out_of_range_positive() { - let c: Color = [1000, 10000, 256].try_into(); + let c: Result = [1000, 10000, 256].try_into(); assert!(c.is_err()); } #[test] fn test_array_out_of_range_negative() { - let c: Color = [-10, -256, -1].try_into(); + let c: Result = [-10, -256, -1].try_into(); assert!(c.is_err()); } #[test] fn test_array_sum() { - let c: Color = [-1, 255, 255].try_into(); + let c: Result = [-1, 255, 255].try_into(); assert!(c.is_err()); } #[test] From d6d57bfbb8190edef5fcd7ecb4a20c8944ca87b1 Mon Sep 17 00:00:00 2001 From: fmoko Date: Thu, 12 Nov 2020 09:50:39 +0100 Subject: [PATCH 0233/1293] docs: Remove buildkite badge from README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 59ee6328..fd45d945 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![All Contributors](https://img.shields.io/badge/all_contributors-68-orange.svg?style=flat-square)](#contributors-) -# rustlings πŸ¦€β€οΈ [![Build status](https://badge.buildkite.com/7af93d81dc522c67a1ec8e33ff5705861b1cb36360b774807f.svg)](https://buildkite.com/mokou/rustlings) +# rustlings πŸ¦€β€οΈ Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages! From af7ad27f89d3e981076705cd7dd36ee0e6dcaaa6 Mon Sep 17 00:00:00 2001 From: fmoko Date: Thu, 12 Nov 2020 09:50:55 +0100 Subject: [PATCH 0234/1293] chore: Remove buildkite build file --- buildkite.yml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 buildkite.yml diff --git a/buildkite.yml b/buildkite.yml deleted file mode 100644 index 91a0753c..00000000 --- a/buildkite.yml +++ /dev/null @@ -1,5 +0,0 @@ -steps: - - label: "Test with stable" - command: rustup run stable cargo test - - label: "Test with beta" - command: rustup run beta cargo test From 9b6c629397b24b944f484f5b2bbd8144266b5695 Mon Sep 17 00:00:00 2001 From: Jacob Tinkhauser <75188781+tinkhauser@users.noreply.github.com> Date: Sun, 29 Nov 2020 01:35:14 +0000 Subject: [PATCH 0235/1293] fix(vec1): Have test compare every element in a and v The previous test would stop comparing elements in array a and vec v upon reaching the last element of either. This resulted in the test passing even if v did not contain all the elements in a. This change to the test fixes that bug and should only pass if all the elements in a and v are present and equal. --- exercises/collections/vec1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/collections/vec1.rs b/exercises/collections/vec1.rs index ac3d9f1a..f6bc837c 100644 --- a/exercises/collections/vec1.rs +++ b/exercises/collections/vec1.rs @@ -20,6 +20,6 @@ mod tests { #[test] fn test_array_and_vec_similarity() { let (a, v) = array_and_vec(); - assert!(a.iter().zip(v.iter()).all(|(x, y)| x == y)); + assert_eq!(a, v[..]); } } From 04f1d079aa42a2f49af694bc92c67d731d31a53f Mon Sep 17 00:00:00 2001 From: Christos Kontas Date: Thu, 3 Dec 2020 17:48:30 +0100 Subject: [PATCH 0236/1293] feat(try_from_into): remove duplicate annotation --- exercises/conversions/try_from_into.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index 897b364e..e405c3f4 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -102,7 +102,6 @@ mod tests { assert!(c.is_err()); } #[test] - #[test] fn test_array_correct() { let c: Result = [183, 65, 14].try_into(); assert_eq!( From 033bf1198fc8bfce1b570e49da7cde010aa552e3 Mon Sep 17 00:00:00 2001 From: JuliaCao Date: Mon, 7 Dec 2020 06:37:19 -0800 Subject: [PATCH 0237/1293] feat: match exercise order to book chapters (#541) Added exercise to book chapter mapping table to exercise README --- exercises/README.md | 23 ++ info.toml | 634 ++++++++++++++++++++------------------------ 2 files changed, 304 insertions(+), 353 deletions(-) create mode 100644 exercises/README.md diff --git a/exercises/README.md b/exercises/README.md new file mode 100644 index 00000000..725edd7b --- /dev/null +++ b/exercises/README.md @@ -0,0 +1,23 @@ +# Exercise to Book Chapter mapping + +| Exercise | Book Chapter | +|------------------------|--------------| +| variables | Β§3.1 | +| functions | Β§3.3 | +| if | Β§3.5 | +| move_semantics | Β§4.1 | +| primitive_types | Β§4.3 | +| structs | Β§5.1 | +| enums | Β§6 | +| modules | Β§7.2 | +| strings | Β§8.2 | +| error_handling | Β§9 | +| generics | Β§10 | +| option | Β§10.1 | +| traits | Β§10.2 | +| tests | Β§11.1 | +| standard_library_types | Β§13.2 | +| threads | Β§16.1 | +| macros | Β§19.6 | +| clippy | n/a | +| conversions | n/a | diff --git a/info.toml b/info.toml index cc12c99d..1b2eec21 100644 --- a/info.toml +++ b/info.toml @@ -71,31 +71,6 @@ Read more about constants under 'Differences Between Variables and Constants' in https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#differences-between-variables-and-constants """ -# IF - -[[exercises]] -name = "if1" -path = "exercises/if/if1.rs" -mode = "test" -hint = """ -It's possible to do this in one line if you would like! -Some similar examples from other languages: -- In C(++) this would be: `a > b ? a : b` -- In Python this would be: `a if a > b else b` -Remember in Rust that: -- the `if` condition does not need to be surrounded by parentheses -- `if`/`else` conditionals are expressions -- Each condition is followed by a `{}` block.""" - -[[exercises]] -name = "if2" -path = "exercises/if/if2.rs" -mode = "test" -hint = """ -For that first compiler error, it's important in Rust that each conditional -block return the same type! To get the tests passing, you will need a couple -conditions checking different input values.""" - # FUNCTIONS [[exercises]] @@ -146,6 +121,31 @@ They are not the same. There are two solutions: 1. Add a `return` ahead of `num * num;` 2. remove `;`, make it to be `num * num`""" +# IF + +[[exercises]] +name = "if1" +path = "exercises/if/if1.rs" +mode = "test" +hint = """ +It's possible to do this in one line if you would like! +Some similar examples from other languages: +- In C(++) this would be: `a > b ? a : b` +- In Python this would be: `a if a > b else b` +Remember in Rust that: +- the `if` condition does not need to be surrounded by parentheses +- `if`/`else` conditionals are expressions +- Each condition is followed by a `{}` block.""" + +[[exercises]] +name = "if2" +path = "exercises/if/if2.rs" +mode = "test" +hint = """ +For that first compiler error, it's important in Rust that each conditional +block return the same type! To get the tests passing, you will need a couple +conditions checking different input values.""" + # TEST 1 [[exercises]] @@ -154,6 +154,62 @@ path = "exercises/quiz1.rs" mode = "test" hint = "No hints this time ;)" +# MOVE SEMANTICS + +[[exercises]] +name = "move_semantics1" +path = "exercises/move_semantics/move_semantics1.rs" +mode = "compile" +hint = """ +So you've got the "cannot borrow immutable local variable `vec1` as mutable" error on line 13, +right? The fix for this is going to be adding one keyword, and the addition is NOT on line 13 +where the error is.""" + +[[exercises]] +name = "move_semantics2" +path = "exercises/move_semantics/move_semantics2.rs" +mode = "compile" +hint = """ +So `vec0` is being *moved* into the function `fill_vec` when we call it on +line 10, which means it gets dropped at the end of `fill_vec`, which means we +can't use `vec0` again on line 13 (or anywhere else in `main` after the +`fill_vec` call for that matter). We could fix this in a few ways, try them +all! +1. Make another, separate version of the data that's in `vec0` and pass that + to `fill_vec` instead. +2. Make `fill_vec` borrow its argument instead of taking ownership of it, + and then copy the data within the function in order to return an owned + `Vec` +3. Make `fill_vec` *mutably* borrow its argument (which will need to be + mutable), modify it directly, then not return anything. Then you can get rid + of `vec1` entirely -- note that this will change what gets printed by the + first `println!`""" + +[[exercises]] +name = "move_semantics3" +path = "exercises/move_semantics/move_semantics3.rs" +mode = "compile" +hint = """ +The difference between this one and the previous ones is that the first line +of `fn fill_vec` that had `let mut vec = vec;` is no longer there. You can, +instead of adding that line back, add `mut` in one place that will change +an existing binding to be a mutable binding instead of an immutable one :)""" + +[[exercises]] +name = "move_semantics4" +path = "exercises/move_semantics/move_semantics4.rs" +mode = "compile" +hint = """ +Stop reading whenever you feel like you have enough direction :) Or try +doing one step and then fixing the compiler errors that result! +So the end goal is to: + - get rid of the first line in main that creates the new vector + - so then `vec0` doesn't exist, so we can't pass it to `fill_vec` + - we don't want to pass anything to `fill_vec`, so its signature should + reflect that it does not take any arguments + - since we're not creating a new vec in `main` anymore, we need to create + a new vec in `fill_vec`, similarly to the way we did in `main`""" + # PRIMITIVE TYPES [[exercises]] @@ -255,6 +311,51 @@ For calculate_transport_fees: Bigger is more expensive usually, we don't have si Have a look in The Book, to find out more about method implementations: https://doc.rust-lang.org/book/ch05-03-method-syntax.html""" +# ENUMS + +[[exercises]] +name = "enums1" +path = "exercises/enums/enums1.rs" +mode = "compile" +hint = """ +Hint: The declaration of the enumeration type has not been defined yet.""" + +[[exercises]] +name = "enums2" +path = "exercises/enums/enums2.rs" +mode = "compile" +hint = """ +Hint: you can create enumerations that have different variants with different types +such as no data, anonymous structs, a single string, tuples, ...etc""" + +[[exercises]] +name = "enums3" +path = "exercises/enums/enums3.rs" +mode = "test" +hint = "No hints this time ;)" + +# MODULES + +[[exercises]] +name = "modules1" +path = "exercises/modules/modules1.rs" +mode = "compile" +hint = """ +Everything is private in Rust by default-- but there's a keyword we can use +to make something public! The compiler error should point to the thing that +needs to be public.""" + +[[exercises]] +name = "modules2" +path = "exercises/modules/modules2.rs" +mode = "compile" +hint = """ +The delicious_snacks module is trying to present an external +interface (the `fruit` and `veggie` constants) that is different than +its internal structure (the `fruits` and `veggies` modules and +associated constants). It's almost there except for one keyword missing for +each constant.""" + # STRINGS [[exercises]] @@ -286,248 +387,6 @@ path = "exercises/quiz2.rs" mode = "compile" hint = "No hints this time ;)" -# ENUMS - -[[exercises]] -name = "enums1" -path = "exercises/enums/enums1.rs" -mode = "compile" -hint = """ -Hint: The declaration of the enumeration type has not been defined yet.""" - -[[exercises]] -name = "enums2" -path = "exercises/enums/enums2.rs" -mode = "compile" -hint = """ -Hint: you can create enumerations that have different variants with different types -such as no data, anonymous structs, a single string, tuples, ...etc""" - -[[exercises]] -name = "enums3" -path = "exercises/enums/enums3.rs" -mode = "test" -hint = "No hints this time ;)" - -# TESTS - -[[exercises]] -name = "tests1" -path = "exercises/tests/tests1.rs" -mode = "test" -hint = """ -You don't even need to write any code to test -- you can just test values and run that, even -though you wouldn't do that in real life :) `assert!` is a macro that needs an argument. -Depending on the value of the argument, `assert!` will do nothing (in which case the test will -pass) or `assert!` will panic (in which case the test will fail). So try giving different values -to `assert!` and see which ones compile, which ones pass, and which ones fail :)""" - -[[exercises]] -name = "tests2" -path = "exercises/tests/tests2.rs" -mode = "test" -hint = """ -Like the previous exercise, you don't need to write any code to get this test to compile and -run. `assert_eq!` is a macro that takes two arguments and compares them. Try giving it two -values that are equal! Try giving it two arguments that are different! Try giving it two values -that are of different types! Try switching which argument comes first and which comes second!""" - -[[exercises]] -name = "tests3" -path = "exercises/tests/tests3.rs" -mode = "test" -hint = """ -You can call a function right where you're passing arguments to `assert!` -- so you could do -something like `assert!(having_fun())`. If you want to check that you indeed get false, you -can negate the result of what you're doing using `!`, like `assert!(!having_fun())`.""" - -# TEST 3 - -[[exercises]] -name = "quiz3" -path = "exercises/quiz3.rs" -mode = "test" -hint = "No hints this time ;)" - -# MODULES - -[[exercises]] -name = "modules1" -path = "exercises/modules/modules1.rs" -mode = "compile" -hint = """ -Everything is private in Rust by default-- but there's a keyword we can use -to make something public! The compiler error should point to the thing that -needs to be public.""" - -[[exercises]] -name = "modules2" -path = "exercises/modules/modules2.rs" -mode = "compile" -hint = """ -The delicious_snacks module is trying to present an external -interface (the `fruit` and `veggie` constants) that is different than -its internal structure (the `fruits` and `veggies` modules and -associated constants). It's almost there except for one keyword missing for -each constant.""" - -# COLLECTIONS - -[[exercises]] -name = "collections1" -path = "exercises/collections/vec1.rs" -mode = "test" -hint = """ -In Rust, there are two ways to define a Vector. - -1. One way is to use the `Vec::new()` function to create a new vector - and fill it with the `push()` method. - -2. The second way, which is simpler is to use the `vec![]` macro and - define your elements inside the square brackets. - -Check this chapter: https://doc.rust-lang.org/stable/book/ch08-01-vectors.html -of the Rust book to learn more. -""" - -[[exercises]] -name = "collections2" -path = "exercises/collections/vec2.rs" -mode = "test" -hint = """ -Hint 1: `i` is each element from the Vec as they are being iterated. - Can you try multiplying this? - -Hint 2: Check the suggestion from the compiler error ;) -""" - -[[exercises]] -name = "collections3" -path = "exercises/collections/hashmap1.rs" -mode = "test" -hint = """ -Hint 1: Take a look at the return type of the function to figure out - the type for the `basket`. - -Hint 2: Number of fruits should be at least 5. And you have to put - at least three different types of fruits. -""" - -[[exercises]] -name = "collections4" -path = "exercises/collections/hashmap2.rs" -mode = "test" -hint = """ -Use the `entry()` and `or_insert()` methods of `HashMap` to achieve this. - -Learn more at https://doc.rust-lang.org/stable/book/ch08-03-hash-maps.html#only-inserting-a-value-if-the-key-has-no-value -""" - -# MACROS - -[[exercises]] -name = "macros1" -path = "exercises/macros/macros1.rs" -mode = "compile" -hint = """ -When you call a macro, you need to add something special compared to a -regular function call. If you're stuck, take a look at what's inside -`my_macro`.""" - -[[exercises]] -name = "macros2" -path = "exercises/macros/macros2.rs" -mode = "compile" -hint = """ -Macros don't quite play by the same rules as the rest of Rust, in terms of -what's available where. - -Unlike other things in Rust, the order of "where you define a macro" versus -"where you use it" actually matters.""" - -[[exercises]] -name = "macros3" -path = "exercises/macros/macros3.rs" -mode = "compile" -hint = """ -In order to use a macro outside of its module, you need to do something -special to the module to lift the macro out into its parent. - -The same trick also works on "extern crate" statements for crates that have -exported macros, if you've seen any of those around.""" - -[[exercises]] -name = "macros4" -path = "exercises/macros/macros4.rs" -mode = "compile" -hint = """ -You only need to add a single character to make this compile. -The way macros are written, it wants to see something between each -"macro arm", so it can separate them.""" -# TEST 4 - -[[exercises]] -name = "quiz4" -path = "exercises/quiz4.rs" -mode = "test" -hint = "No hints this time ;)" - -# MOVE SEMANTICS - -[[exercises]] -name = "move_semantics1" -path = "exercises/move_semantics/move_semantics1.rs" -mode = "compile" -hint = """ -So you've got the "cannot borrow immutable local variable `vec1` as mutable" error on line 13, -right? The fix for this is going to be adding one keyword, and the addition is NOT on line 13 -where the error is.""" - -[[exercises]] -name = "move_semantics2" -path = "exercises/move_semantics/move_semantics2.rs" -mode = "compile" -hint = """ -So `vec0` is being *moved* into the function `fill_vec` when we call it on -line 10, which means it gets dropped at the end of `fill_vec`, which means we -can't use `vec0` again on line 13 (or anywhere else in `main` after the -`fill_vec` call for that matter). We could fix this in a few ways, try them -all! -1. Make another, separate version of the data that's in `vec0` and pass that - to `fill_vec` instead. -2. Make `fill_vec` borrow its argument instead of taking ownership of it, - and then copy the data within the function in order to return an owned - `Vec` -3. Make `fill_vec` *mutably* borrow its argument (which will need to be - mutable), modify it directly, then not return anything. Then you can get rid - of `vec1` entirely -- note that this will change what gets printed by the - first `println!`""" - -[[exercises]] -name = "move_semantics3" -path = "exercises/move_semantics/move_semantics3.rs" -mode = "compile" -hint = """ -The difference between this one and the previous ones is that the first line -of `fn fill_vec` that had `let mut vec = vec;` is no longer there. You can, -instead of adding that line back, add `mut` in one place that will change -an existing binding to be a mutable binding instead of an immutable one :)""" - -[[exercises]] -name = "move_semantics4" -path = "exercises/move_semantics/move_semantics4.rs" -mode = "compile" -hint = """ -Stop reading whenever you feel like you have enough direction :) Or try -doing one step and then fixing the compiler errors that result! -So the end goal is to: - - get rid of the first line in main that creates the new vector - - so then `vec0` doesn't exist, so we can't pass it to `fill_vec` - - we don't want to pass anything to `fill_vec`, so its signature should - reflect that it does not take any arguments - - since we're not creating a new vec in `main` anymore, we need to create - a new vec in `fill_vec`, similarly to the way we did in `main`""" - # ERROR HANDLING [[exercises]] @@ -607,6 +466,40 @@ get a warning if you don't handle a `Result` that you get in your function. Read more about that in the `std::result` module docs: https://doc.rust-lang.org/std/result/#results-must-be-used""" +# Generics + +[[exercises]] +name = "generics1" +path = "exercises/generics/generics1.rs" +mode = "compile" +hint = """ +Vectors in rust make use of generics to create dynamically sized arrays of any type. +You need to tell the compiler what type we are pushing onto this vector.""" + +[[exercises]] +name = "generics2" +path = "exercises/generics/generics2.rs" +mode = "test" +hint = """ +Currently we are wrapping only values of type 'u32'. +Maybe we could update the explicit references to this data type somehow? + +If you are still stuck https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-method-definitions +""" + +[[exercises]] +name = "generics3" +path = "exercises/generics/generics3.rs" +mode = "test" +hint = """ +To find the best solution to this challenge you're going to need to think back to your +knowledge of traits, specifically Trait Bound Syntax - you may also need this: "use std::fmt::Display;" + +This is definitely harder than the last two exercises! You need to think about not only making the +ReportCard struct generic, but also the correct property - you will need to change the implementation +of the struct slightly too...you can do it! +""" + # OPTIONS / RESULTS [[exercises]] @@ -649,21 +542,67 @@ hint = """ It should be doing some checking, returning an `Err` result if those checks fail, and only returning an `Ok` result if those checks determine that everything is... okay :)""" -# CLIPPY +# TRAITS [[exercises]] -name = "clippy1" -path = "exercises/clippy/clippy1.rs" -mode = "clippy" +name = "traits1" +path = "exercises/traits/traits1.rs" +mode = "test" hint = """ -Floating point calculations are usually imprecise, so asking if two values are exactly equal is asking for trouble""" +A discussion about Traits in Rust can be found at: +https://doc.rust-lang.org/book/ch10-02-traits.html +""" [[exercises]] -name = "clippy2" -path = "exercises/clippy/clippy2.rs" -mode = "clippy" +name = "traits2" +path = "exercises/traits/traits2.rs" +mode = "test" hint = """ -`for` loops over Option values are more clearly expressed as an `if let`""" +Notice how the trait takes ownership of 'self',and returns `Self'. +Try mutating the incoming string vector. + +Vectors provide suitable methods for adding an element at the end. See +the documentation at: https://doc.rust-lang.org/std/vec/struct.Vec.html""" + +# TESTS + +[[exercises]] +name = "tests1" +path = "exercises/tests/tests1.rs" +mode = "test" +hint = """ +You don't even need to write any code to test -- you can just test values and run that, even +though you wouldn't do that in real life :) `assert!` is a macro that needs an argument. +Depending on the value of the argument, `assert!` will do nothing (in which case the test will +pass) or `assert!` will panic (in which case the test will fail). So try giving different values +to `assert!` and see which ones compile, which ones pass, and which ones fail :)""" + +[[exercises]] +name = "tests2" +path = "exercises/tests/tests2.rs" +mode = "test" +hint = """ +Like the previous exercise, you don't need to write any code to get this test to compile and +run. `assert_eq!` is a macro that takes two arguments and compares them. Try giving it two +values that are equal! Try giving it two arguments that are different! Try giving it two values +that are of different types! Try switching which argument comes first and which comes second!""" + +[[exercises]] +name = "tests3" +path = "exercises/tests/tests3.rs" +mode = "test" +hint = """ +You can call a function right where you're passing arguments to `assert!` -- so you could do +something like `assert!(having_fun())`. If you want to check that you indeed get false, you +can negate the result of what you're doing using `!`, like `assert!(!having_fun())`.""" + +# TEST 3 + +[[exercises]] +name = "quiz3" +path = "exercises/quiz3.rs" +mode = "test" +hint = "No hints this time ;)" # STANDARD LIBRARY TYPES @@ -697,27 +636,6 @@ inside the loop but still in the main thread. `child_numbers` should be a clone of the Arc of the numbers instead of a thread-local copy of the numbers.""" -[[exercises]] -name = "iterators1" -path = "exercises/standard_library_types/iterators1.rs" -mode = "compile" -hint = """ -Step 1: -We need to apply something to the collection `my_fav_fruits` before we start to go through -it. What could that be? Take a look at the struct definition for a vector for inspiration: -https://doc.rust-lang.org/std/vec/struct.Vec.html. - - -Step 2 & step 2.1: -Very similar to the lines above and below. You've got this! - - -Step 3: -An iterator goes through all elements in a collection, but what if we've run out of -elements? What should we expect here? If you're stuck, take a look at -https://doc.rust-lang.org/std/iter/trait.Iterator.html for some ideas. -""" - [[exercises]] name = "iterators2" path = "exercises/standard_library_types/iterators2.rs" @@ -761,62 +679,6 @@ a mutable variable. Or, you might write code utilizing recursion and a match clause. In Rust you can take another functional approach, computing the factorial elegantly with ranges and iterators.""" -# TRAITS - -[[exercises]] -name = "traits1" -path = "exercises/traits/traits1.rs" -mode = "test" -hint = """ -A discussion about Traits in Rust can be found at: -https://doc.rust-lang.org/book/ch10-02-traits.html -""" - -[[exercises]] -name = "traits2" -path = "exercises/traits/traits2.rs" -mode = "test" -hint = """ -Notice how the trait takes ownership of 'self',and returns `Self'. -Try mutating the incoming string vector. - -Vectors provide suitable methods for adding an element at the end. See -the documentation at: https://doc.rust-lang.org/std/vec/struct.Vec.html""" - -# Generics - -[[exercises]] -name = "generics1" -path = "exercises/generics/generics1.rs" -mode = "compile" -hint = """ -Vectors in rust make use of generics to create dynamically sized arrays of any type. -You need to tell the compiler what type we are pushing onto this vector.""" - -[[exercises]] -name = "generics2" -path = "exercises/generics/generics2.rs" -mode = "test" -hint = """ -Currently we are wrapping only values of type 'u32'. -Maybe we could update the explicit references to this data type somehow? - -If you are still stuck https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-method-definitions -""" - -[[exercises]] -name = "generics3" -path = "exercises/generics/generics3.rs" -mode = "test" -hint = """ -To find the best solution to this challenge you're going to need to think back to your -knowledge of traits, specifically Trait Bound Syntax - you may also need this: "use std::fmt::Display;" - -This is definitely harder than the last two exercises! You need to think about not only making the -ReportCard struct generic, but also the correct property - you will need to change the implementation -of the struct slightly too...you can do it! -""" - # THREADS [[exercises]] @@ -856,6 +718,72 @@ If you've learned from the sample solutions, I encourage you to come back to this exercise and try it again in a few days to reinforce what you've learned :)""" +# MACROS + +[[exercises]] +name = "macros1" +path = "exercises/macros/macros1.rs" +mode = "compile" +hint = """ +When you call a macro, you need to add something special compared to a +regular function call. If you're stuck, take a look at what's inside +`my_macro`.""" + +[[exercises]] +name = "macros2" +path = "exercises/macros/macros2.rs" +mode = "compile" +hint = """ +Macros don't quite play by the same rules as the rest of Rust, in terms of +what's available where. + +Unlike other things in Rust, the order of "where you define a macro" versus +"where you use it" actually matters.""" + +[[exercises]] +name = "macros3" +path = "exercises/macros/macros3.rs" +mode = "compile" +hint = """ +In order to use a macro outside of its module, you need to do something +special to the module to lift the macro out into its parent. + +The same trick also works on "extern crate" statements for crates that have +exported macros, if you've seen any of those around.""" + +[[exercises]] +name = "macros4" +path = "exercises/macros/macros4.rs" +mode = "compile" +hint = """ +You only need to add a single character to make this compile. +The way macros are written, it wants to see something between each +"macro arm", so it can separate them.""" + +# TEST 4 + +[[exercises]] +name = "quiz4" +path = "exercises/quiz4.rs" +mode = "test" +hint = "No hints this time ;)" + +# CLIPPY + +[[exercises]] +name = "clippy1" +path = "exercises/clippy/clippy1.rs" +mode = "clippy" +hint = """ +Floating point calculations are usually imprecise, so asking if two values are exactly equal is asking for trouble""" + +[[exercises]] +name = "clippy2" +path = "exercises/clippy/clippy2.rs" +mode = "clippy" +hint = """ +`for` loops over Option values are more clearly expressed as an `if let`""" + # TYPE CONVERSIONS [[exercises]] From 30644c9a062b825c0ea89435dc59f0cad86b110e Mon Sep 17 00:00:00 2001 From: Peter N Date: Tue, 8 Dec 2020 06:08:25 -0300 Subject: [PATCH 0238/1293] fix: gives a bit more context to magic number --- exercises/threads/threads1.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/threads/threads1.rs b/exercises/threads/threads1.rs index 1785e8ce..b475b4a1 100644 --- a/exercises/threads/threads1.rs +++ b/exercises/threads/threads1.rs @@ -1,7 +1,8 @@ // threads1.rs // Make this compile! Execute `rustlings hint threads1` for hints :) // The idea is the thread spawned on line 21 is completing jobs while the main thread is -// monitoring progress until 10 jobs are completed. If you see 6 lines +// monitoring progress until 10 jobs are completed. Because of the difference between the +// spawned threads' sleep time, and the waiting threads sleep time, when you see 6 lines // of "waiting..." and the program ends without timing out when running, // you've got it :) From 26110da7cadc4ab7614730c2d0b1e514a2763d3d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 8 Dec 2020 10:12:57 +0100 Subject: [PATCH 0239/1293] docs: add pcn as a contributor * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 84b2365e..388bf5ff 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -637,6 +637,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "pcn", + "name": "Peter N", + "avatar_url": "https://avatars2.githubusercontent.com/u/1056756?v=4", + "profile": "https://github.com/pcn", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index fd45d945..49ceb2c9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-68-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-69-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -233,6 +233,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Axel Viala

πŸ’»
Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»
Caleb Webber

🚧 +
Peter N

🚧 From 90cfb6ff28377531bfc34acb70547bdb13374f6b Mon Sep 17 00:00:00 2001 From: JuliaCao Date: Sat, 12 Dec 2020 10:21:23 -0800 Subject: [PATCH 0240/1293] fix: added missing exercises to info.toml --- exercises/README.md | 1 + info.toml | 63 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/exercises/README.md b/exercises/README.md index 725edd7b..0c715247 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -10,6 +10,7 @@ | structs | Β§5.1 | | enums | Β§6 | | modules | Β§7.2 | +| collections | Β§8.1 | | strings | Β§8.2 | | error_handling | Β§9 | | generics | Β§10 | diff --git a/info.toml b/info.toml index 1b2eec21..f1fc3981 100644 --- a/info.toml +++ b/info.toml @@ -356,6 +356,52 @@ its internal structure (the `fruits` and `veggies` modules and associated constants). It's almost there except for one keyword missing for each constant.""" +# COLLECTIONS + +[[exercises]] +name = "collections1" +path = "exercises/collections/vec1.rs" +mode = "test" +hint = """ +In Rust, there are two ways to define a Vector. +1. One way is to use the `Vec::new()` function to create a new vector + and fill it with the `push()` method. +2. The second way, which is simpler is to use the `vec![]` macro and + define your elements inside the square brackets. +Check this chapter: https://doc.rust-lang.org/stable/book/ch08-01-vectors.html +of the Rust book to learn more. +""" + +[[exercises]] +name = "collections2" +path = "exercises/collections/vec2.rs" +mode = "test" +hint = """ +Hint 1: `i` is each element from the Vec as they are being iterated. + Can you try multiplying this? +Hint 2: Check the suggestion from the compiler error ;) +""" + +[[exercises]] +name = "collections3" +path = "exercises/collections/hashmap1.rs" +mode = "test" +hint = """ +Hint 1: Take a look at the return type of the function to figure out + the type for the `basket`. +Hint 2: Number of fruits should be at least 5. And you have to put + at least three different types of fruits. +""" + +[[exercises]] +name = "collections4" +path = "exercises/collections/hashmap2.rs" +mode = "test" +hint = """ +Use the `entry()` and `or_insert()` methods of `HashMap` to achieve this. +Learn more at https://doc.rust-lang.org/stable/book/ch08-03-hash-maps.html#only-inserting-a-value-if-the-key-has-no-value +""" + # STRINGS [[exercises]] @@ -636,6 +682,23 @@ inside the loop but still in the main thread. `child_numbers` should be a clone of the Arc of the numbers instead of a thread-local copy of the numbers.""" +[[exercises]] +name = "iterators1" +path = "exercises/standard_library_types/iterators1.rs" +mode = "compile" +hint = """ +Step 1: +We need to apply something to the collection `my_fav_fruits` before we start to go through +it. What could that be? Take a look at the struct definition for a vector for inspiration: +https://doc.rust-lang.org/std/vec/struct.Vec.html. +Step 2 & step 2.1: +Very similar to the lines above and below. You've got this! +Step 3: +An iterator goes through all elements in a collection, but what if we've run out of +elements? What should we expect here? If you're stuck, take a look at +https://doc.rust-lang.org/std/iter/trait.Iterator.html for some ideas. +""" + [[exercises]] name = "iterators2" path = "exercises/standard_library_types/iterators2.rs" From bcf14cf677adb3a38a3ac3ca53f3c69f61153025 Mon Sep 17 00:00:00 2001 From: seancad <47405611+seancad@users.noreply.github.com> Date: Tue, 15 Dec 2020 00:32:46 -0700 Subject: [PATCH 0241/1293] fix: update structs README --- exercises/structs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/structs/README.md b/exercises/structs/README.md index afbc72c8..d2d7dc24 100644 --- a/exercises/structs/README.md +++ b/exercises/structs/README.md @@ -4,4 +4,4 @@ Rust has three struct types: a classic c struct, a tuple struct, and a unit stru #### Book Sections -- [Structures](https://doc.rust-lang.org/rust-by-example/custom_types/structs.html) +- [Structures](https://doc.rust-lang.org/book/ch05-01-defining-structs.html) From 4ac70a99aea688a629e5d7ef99bb8686fa7f6301 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 15 Dec 2020 08:33:47 +0100 Subject: [PATCH 0242/1293] docs: add seancad as a contributor * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 388bf5ff..1549aa45 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -646,6 +646,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "seancad", + "name": "seancad", + "avatar_url": "https://avatars1.githubusercontent.com/u/47405611?v=4", + "profile": "https://github.com/seancad", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 49ceb2c9..7a2c94c6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-69-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-70-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -234,6 +234,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»
Caleb Webber

🚧
Peter N

🚧 +
seancad

🚧 From 0ef95947cc30482e63a7045be6cc2fb6f6dcb4cc Mon Sep 17 00:00:00 2001 From: Axel Viala Date: Sun, 27 Dec 2020 12:36:38 +0100 Subject: [PATCH 0243/1293] fix(functions2): Change signature to trigger precise error message: (#605) Now trigger this error: ``` error: expected type, found `)` --> exercises/functions/functions2.rs:10:16 | 10 | fn call_me(num:) { | ^ expected type ``` --- exercises/functions/functions2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/functions/functions2.rs b/exercises/functions/functions2.rs index 108ba38b..5721a172 100644 --- a/exercises/functions/functions2.rs +++ b/exercises/functions/functions2.rs @@ -7,7 +7,7 @@ fn main() { call_me(3); } -fn call_me(num) { +fn call_me(num:) { for i in 0..num { println!("Ring! Call number {}", i + 1); } From 28020d0c54e795c465f59cb92954599de8834549 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 29 Dec 2020 11:23:08 +0100 Subject: [PATCH 0244/1293] docs: Add note on uninstalling to README --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 7a2c94c6..9512ac5c 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,24 @@ cargo uninstall rustlings rm -r rustlings/ # or on Windows: rmdir /s rustlings ``` +## Uninstalling Rustlings + +If you want to remove Rustlings from your system, there's two steps. First, you'll need to remove the exercises folder that the install script created +for you: + +``` bash +rm -rf rustlings # or your custom folder name, if you chose and or renamed it +``` + +Second, since Rustlings got installed via `cargo install`, it's only reasonable to assume that you can also remove it using Cargo, and +exactly that is the case. Run `cargo uninstall` to remove the `rustlings` binary: + +``` bash +cargo uninstall rustlings +``` + +Now you should be done! + ## Completion Rustlings isn't done; there are a couple of sections that are very experimental and don't have proper documentation. These include: From 44d39112ff122b29c9793fe52e605df1612c6490 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 29 Dec 2020 11:34:52 +0100 Subject: [PATCH 0245/1293] feat: Rewrite default out text This has been in place for a long time now, before we had an install script, so it ended up repeating a bunch of the same things that the install script does automatically. I rewrote it so that it gives more helpful information about how you're supposed to do Rustlings. Hopefully this will reduce the number of "I started Rustlings and it gave me an error" issues (no offense to anyone who opened one of those, it was pretty unclear that it _wasn't_ an error). --- default_out.txt | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/default_out.txt b/default_out.txt index 05267591..44b7734c 100644 --- a/default_out.txt +++ b/default_out.txt @@ -1,19 +1,25 @@ Thanks for installing Rustlings! -Is this your first time? +Is this your first time? Don't worry, Rustlings was made for beginners! We are +going to teach you a lot of things about Rust, but before we can get +started, here's a couple of notes about how Rustlings operates: -Let's make sure you're up to speed: -- You have Rust installed, preferably via `rustup` -- You have `~/.cargo/bin` added to your PATH variable -- You have cloned this repository (https://github.com/rust-lang/rustlings) -- You have installed Rust language support for your editor -- You have locally installed the `rustlings` command by running an - installation script or manually executing: +1. The central concept behind Rustlings is that you solve exercises. These + exercises usually have some sort of syntax error in them, which will cause + them to fail compliation or testing. Sometimes there's a logic error instead + of a syntax error. No matter what error, it's your job to find it and fix it! + You'll know when you fixed it because then, the exercise will compile and + Rustlings will be able to move on to the next exercise. +2. If you run Rustlings in watch mode (which we recommend), it'll automatically + start with the first exercise. Don't get confused by an error message popping + up as soon as you run Rustlings! This is part of the exercise that you're + supposed to solve, so open the exercise file in an editor and start your + detective work! +3. If you're stuck on an exercise, there is a helpful hint you can view by typing + 'hint' (in watch mode), or running `rustlings hint myexercise`. +4. If an exercise doesn't make sense to you, feel free to open an issue on GitHub! + (https://github.com/rust-lang/rustlings/issues/new). We look at every issue, + and sometimes, other learners do too so you can help each other out! -cargo install --force --path . - -If you've done all of this (or even most of it), congrats! You're ready -to start working with Rust. - -To get started, run `rustlings watch` in order to get the first exercise. -Make sure to have your editor open! +Got all that? Great! To get started, run `rustlings watch` in order to get the first +exercise. Make sure to have your editor open! From a303d508cf0c5bc20bb50bd388b2545bf80672ac Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 29 Dec 2020 11:39:26 +0100 Subject: [PATCH 0246/1293] release: 4.3.0 --- CHANGELOG.md | 23 ++ Cargo.lock | 590 +++++++++++++++++++++++++-------------------------- Cargo.toml | 2 +- README.md | 2 +- src/main.rs | 2 +- 5 files changed, 320 insertions(+), 299 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d58d4e6b..3988826e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ + +## 4.3.0 (2020-12-29) + +#### Features + +* Rewrite default out text ([44d39112](https://github.com/rust-lang/rustlings/commit/44d39112ff122b29c9793fe52e605df1612c6490)) +* match exercise order to book chapters (#541) ([033bf119](https://github.com/rust-lang/rustlings/commit/033bf1198fc8bfce1b570e49da7cde010aa552e3)) +* Crab? (#586) ([fa9f522b](https://github.com/rust-lang/rustlings/commit/fa9f522b7f043d7ef73a39f003a9272dfe72c4f4)) +* add "rustlings list" command ([838f9f30](https://github.com/rust-lang/rustlings/commit/838f9f30083d0b23fd67503dcf0fbeca498e6647)) +* **try_from_into:** remove duplicate annotation ([04f1d079](https://github.com/rust-lang/rustlings/commit/04f1d079aa42a2f49af694bc92c67d731d31a53f)) + +#### Bug Fixes + +* update structs README ([bcf14cf6](https://github.com/rust-lang/rustlings/commit/bcf14cf677adb3a38a3ac3ca53f3c69f61153025)) +* added missing exercises to info.toml ([90cfb6ff](https://github.com/rust-lang/rustlings/commit/90cfb6ff28377531bfc34acb70547bdb13374f6b)) +* gives a bit more context to magic number ([30644c9a](https://github.com/rust-lang/rustlings/commit/30644c9a062b825c0ea89435dc59f0cad86b110e)) +* **functions2:** Change signature to trigger precise error message: (#605) ([0ef95947](https://github.com/rust-lang/rustlings/commit/0ef95947cc30482e63a7045be6cc2fb6f6dcb4cc)) +* **structs1:** Adjust wording (#573) ([9334783d](https://github.com/rust-lang/rustlings/commit/9334783da31d821cc59174fbe8320df95828926c)) +* **try_from_into:** + * type error ([4f4cfcf3](https://github.com/rust-lang/rustlings/commit/4f4cfcf3c36c8718c7c170c9c3a6935e6ef0618c)) + * Update description (#584) ([96347df9](https://github.com/rust-lang/rustlings/commit/96347df9df294f01153b29d9ad4ba361f665c755)) +* **vec1:** Have test compare every element in a and v ([9b6c6293](https://github.com/rust-lang/rustlings/commit/9b6c629397b24b944f484f5b2bbd8144266b5695)) + ## 4.2.0 (2020-11-07) diff --git a/Cargo.lock b/Cargo.lock index 9f90e0a1..4a4313e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,917 +4,915 @@ name = "aho-corasick" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" dependencies = [ - "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", ] [[package]] name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "assert_cmd" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc477793bd82ec39799b6f6b3df64938532fdf2ab0d49ef817eac65856a5a1e" dependencies = [ - "escargot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "predicates 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "predicates-tree 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "escargot", + "predicates", + "predicates-core", + "predicates-tree", ] [[package]] name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" dependencies = [ - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "termion", + "winapi 0.3.8", ] [[package]] name = "autocfg" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" [[package]] name = "bitflags" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" [[package]] name = "cfg-if" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" [[package]] name = "clap" version = "2.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" dependencies = [ - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", ] [[package]] name = "clicolors-control" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73abfd4c73d003a674ce5d2933fca6ce6c42480ea84a5ffe0a2dc39ed56300f9" dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "atty", + "lazy_static", + "libc", + "winapi 0.3.8", ] [[package]] name = "cloudabi" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", ] [[package]] name = "console" version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca57c2c14b8a2bf3105bc9d15574aad80babf6a9c44b1058034cdf8bd169628" dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "clicolors-control 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "atty", + "clicolors-control", + "encode_unicode", + "lazy_static", + "libc", + "parking_lot", + "regex", + "termios", + "unicode-width", + "winapi 0.3.8", ] [[package]] name = "console" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b147390a412132d75d10dd3b7b175a69cf5fd95032f7503c7091b8831ba10242" dependencies = [ - "clicolors-control 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "clicolors-control", + "encode_unicode", + "lazy_static", + "libc", + "regex", + "termios", + "unicode-width", + "winapi 0.3.8", ] [[package]] name = "difference" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" [[package]] name = "encode_unicode" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90b2c9496c001e8cb61827acdefad780795c42264c137744cae6f7d9e3450abd" [[package]] name = "escargot" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ceb9adbf9874d5d028b5e4c5739d22b71988252b25c9c98fe7cf9738bee84597" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "log", + "serde", + "serde_json", ] [[package]] name = "filetime" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f8c63033fcba1f51ef744505b3cad42510432b904c062afa67ad7ece008429d" dependencies = [ - "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "redox_syscall", ] [[package]] name = "float-cmp" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134a8fa843d80a51a5b77d36d42bc2def9edcb0262c914861d08129fd1926600" dependencies = [ - "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits", ] [[package]] name = "fsevent" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fsevent-sys 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "fsevent-sys", ] [[package]] name = "fsevent-sys" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" dependencies = [ - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "fuchsia-cprng" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "fuchsia-zircon-sys", ] [[package]] name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "glob" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "indicatif" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd1e2ee08e6c255ce890f5a99d17000850e664e7acf119fb03b25b0575bfe" dependencies = [ - "console 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "number_prefix 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "console 0.8.0", + "lazy_static", + "number_prefix", + "parking_lot", + "regex", ] [[package]] name = "inotify" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e40d6fd5d64e2082e0c796495c8ef5ad667a96d03e5aaa0becfd9d47bcbfb8" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "inotify-sys", + "libc", ] [[package]] name = "inotify-sys" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e74a1aa87c59aeff6ef2cc2fa62d41bc43f54952f55652656b18a02fd5e356c0" dependencies = [ - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" dependencies = [ - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "winapi 0.2.8", ] [[package]] name = "itoa" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" [[package]] name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8", + "winapi-build", ] [[package]] name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" [[package]] name = "lazycell" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" [[package]] name = "libc" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6281b86796ba5e4366000be6e9e18bf35580adf9e63fbe2294aadb587613a319" [[package]] name = "lock_api" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" dependencies = [ - "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard", ] [[package]] name = "log" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" dependencies = [ - "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", ] [[package]] name = "memchr" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" [[package]] name = "mio" version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" dependencies = [ - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow", + "net2", + "slab", + "winapi 0.2.8", ] [[package]] name = "mio-extras" version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" dependencies = [ - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazycell", + "log", + "mio", + "slab", ] [[package]] name = "miow" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", ] [[package]] name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" dependencies = [ - "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "winapi 0.3.8", ] [[package]] name = "normalize-line-endings" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e0a1a39eab95caf4f5556da9289b9e68f0aafac901b2ce80daaf020d3b733a8" [[package]] name = "notify" version = "4.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80ae4a7688d1fab81c5bf19c64fc8db920be8d519ce6336ed4e7efe024724dbd" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "filetime 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "fsevent 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "fsevent-sys 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "inotify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "filetime", + "fsevent", + "fsevent-sys", + "inotify", + "libc", + "mio", + "mio-extras", + "walkdir", + "winapi 0.3.8", ] [[package]] name = "num-traits" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", ] [[package]] name = "number_prefix" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf9993e59c894e3c08aa1c2712914e9e6bf1fcbfc6bef283e2183df345a4fee" dependencies = [ - "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits", ] [[package]] name = "numtoa" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" [[package]] name = "parking_lot" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" dependencies = [ - "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "lock_api", + "parking_lot_core", + "rustc_version", ] [[package]] name = "parking_lot_core" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" dependencies = [ - "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "cloudabi", + "libc", + "rand", + "redox_syscall", + "rustc_version", + "smallvec", + "winapi 0.3.8", ] [[package]] name = "predicates" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e09015b0d3f5a0ec2d4428f7559bb7b3fff341b4e159fedd1d57fac8b939ff" dependencies = [ - "difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "float-cmp 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "normalize-line-endings 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "difference", + "float-cmp", + "normalize-line-endings", + "predicates-core", + "regex", ] [[package]] name = "predicates-core" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06075c3a3e92559ff8929e7a280684489ea27fe44805174c3ebd9328dcb37178" [[package]] name = "predicates-tree" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e63c4859013b38a76eca2414c64911fba30def9e3202ac461a2d22831220124" dependencies = [ - "predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "treeline 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "predicates-core", + "treeline", ] [[package]] name = "proc-macro2" version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid", ] [[package]] name = "quote" version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", ] [[package]] name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "libc", + "rand_chacha", + "rand_core 0.4.0", + "rand_hc", + "rand_isaac", + "rand_jitter", + "rand_os", + "rand_pcg", + "rand_xorshift", + "winapi 0.3.8", ] [[package]] name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "rand_core 0.3.1", ] [[package]] name = "rand_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0", ] [[package]] name = "rand_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" [[package]] name = "rand_hc" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "rand_isaac" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "rand_jitter" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" dependencies = [ - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_core 0.4.0", + "winapi 0.3.8", ] [[package]] name = "rand_os" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi", + "fuchsia-cprng", + "libc", + "rand_core 0.4.0", + "rdrand", + "winapi 0.3.8", ] [[package]] name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "rand_core 0.4.0", ] [[package]] name = "rand_xorshift" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "rdrand" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "redox_syscall" version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" [[package]] name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" dependencies = [ - "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall", ] [[package]] name = "regex" version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" dependencies = [ - "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", + "utf8-ranges", ] [[package]] name = "regex-syntax" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" dependencies = [ - "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ucd-util", ] [[package]] name = "rustc_version" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver", ] [[package]] name = "rustlings" -version = "4.2.0" +version = "4.3.0" dependencies = [ - "assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "console 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)", - "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indicatif 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", - "notify 4.0.15 (registry+https://github.com/rust-lang/crates.io-index)", - "predicates 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "assert_cmd", + "clap", + "console 0.7.7", + "glob", + "indicatif", + "notify", + "predicates", + "regex", + "serde", + "toml", ] [[package]] name = "ryu" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" [[package]] name = "same-file" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" dependencies = [ - "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util", ] [[package]] name = "scopeguard" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" [[package]] name = "semver" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver-parser", ] [[package]] name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32746bf0f26eab52f06af0d0aa1984f641341d06d8d673c693871da2d188c9be" dependencies = [ - "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a3223d0c9ba936b61c0d2e3e559e3217dbfb8d65d06d26e8b3c25de38bae3e" dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "serde_json" version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" dependencies = [ - "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa", + "ryu", + "serde", ] [[package]] name = "slab" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "smallvec" version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" [[package]] name = "strsim" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "syn" version = "0.15.34" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "unicode-xid", ] [[package]] name = "termion" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" dependencies = [ - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "numtoa", + "redox_syscall", + "redox_termios", ] [[package]] name = "termios" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b620c5ea021d75a735c943269bb07d30c9b77d6ac6b236bc8b5c496ef05625" dependencies = [ - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width", ] [[package]] name = "thread_local" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", ] [[package]] name = "toml" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" dependencies = [ - "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "treeline" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" [[package]] name = "ucd-util" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" [[package]] name = "unicode-width" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" [[package]] name = "unicode-xid" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "utf8-ranges" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" [[package]] name = "vec_map" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" [[package]] name = "walkdir" version = "2.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" dependencies = [ - "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "same-file", + "winapi 0.3.8", + "winapi-util", ] [[package]] name = "winapi" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" [[package]] name = "winapi" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "ws2_32-sys" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8", + "winapi-build", ] - -[metadata] -"checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" -"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -"checksum assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2dc477793bd82ec39799b6f6b3df64938532fdf2ab0d49ef817eac65856a5a1e" -"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" -"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" -"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" -"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" -"checksum clicolors-control 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "73abfd4c73d003a674ce5d2933fca6ce6c42480ea84a5ffe0a2dc39ed56300f9" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum console 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8ca57c2c14b8a2bf3105bc9d15574aad80babf6a9c44b1058034cdf8bd169628" -"checksum console 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b147390a412132d75d10dd3b7b175a69cf5fd95032f7503c7091b8831ba10242" -"checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" -"checksum encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90b2c9496c001e8cb61827acdefad780795c42264c137744cae6f7d9e3450abd" -"checksum escargot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ceb9adbf9874d5d028b5e4c5739d22b71988252b25c9c98fe7cf9738bee84597" -"checksum filetime 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2f8c63033fcba1f51ef744505b3cad42510432b904c062afa67ad7ece008429d" -"checksum float-cmp 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "134a8fa843d80a51a5b77d36d42bc2def9edcb0262c914861d08129fd1926600" -"checksum fsevent 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" -"checksum fsevent-sys 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" -"checksum indicatif 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "40ecd1e2ee08e6c255ce890f5a99d17000850e664e7acf119fb03b25b0575bfe" -"checksum inotify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24e40d6fd5d64e2082e0c796495c8ef5ad667a96d03e5aaa0becfd9d47bcbfb8" -"checksum inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e74a1aa87c59aeff6ef2cc2fa62d41bc43f54952f55652656b18a02fd5e356c0" -"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" -"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" -"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "6281b86796ba5e4366000be6e9e18bf35580adf9e63fbe2294aadb587613a319" -"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" -"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" -"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" -"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" -"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" -"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum normalize-line-endings 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2e0a1a39eab95caf4f5556da9289b9e68f0aafac901b2ce80daaf020d3b733a8" -"checksum notify 4.0.15 (registry+https://github.com/rust-lang/crates.io-index)" = "80ae4a7688d1fab81c5bf19c64fc8db920be8d519ce6336ed4e7efe024724dbd" -"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" -"checksum number_prefix 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dbf9993e59c894e3c08aa1c2712914e9e6bf1fcbfc6bef283e2183df345a4fee" -"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" -"checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" -"checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" -"checksum predicates 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "53e09015b0d3f5a0ec2d4428f7559bb7b3fff341b4e159fedd1d57fac8b939ff" -"checksum predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06075c3a3e92559ff8929e7a280684489ea27fe44805174c3ebd9328dcb37178" -"checksum predicates-tree 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8e63c4859013b38a76eca2414c64911fba30def9e3202ac461a2d22831220124" -"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" -"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" -"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" -"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" -"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" -"checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" -"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" -"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "32746bf0f26eab52f06af0d0aa1984f641341d06d8d673c693871da2d188c9be" -"checksum serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "46a3223d0c9ba936b61c0d2e3e559e3217dbfb8d65d06d26e8b3c25de38bae3e" -"checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" -"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" -"checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" -"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" -"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" -"checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" -"checksum termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72b620c5ea021d75a735c943269bb07d30c9b77d6ac6b236bc8b5c496ef05625" -"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum treeline 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" -"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" -"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" -"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" -"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" -"checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" -"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" diff --git a/Cargo.toml b/Cargo.toml index ebce25eb..a0564c37 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "4.2.0" +version = "4.3.0" authors = ["Marisa ", "Carol (Nichols || Goulding) "] edition = "2018" diff --git a/README.md b/README.md index 9512ac5c..a5371043 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Basically: Clone the repository, checkout to the latest tag, run `cargo install` ```bash git clone https://github.com/rust-lang/rustlings cd rustlings -git checkout tags/4.2.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) +git checkout tags/4.3.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) cargo install --force --path . ``` diff --git a/src/main.rs b/src/main.rs index 35f8df4d..bf35e4fb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,7 +25,7 @@ mod verify; fn main() { let matches = App::new("rustlings") .version(crate_version!()) - .author("Olivia Hugger, Carol Nichols") + .author("Marisa, Carol Nichols") .about("Rustlings is a collection of small exercises to get you used to writing and reading Rust code") .arg( Arg::with_name("nocapture") From 644c49f1e04cbb24e95872b3a52b07d692ae3bc8 Mon Sep 17 00:00:00 2001 From: xehpuk Date: Wed, 30 Dec 2020 22:56:04 +0100 Subject: [PATCH 0247/1293] fix: typo in default out text --- default_out.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default_out.txt b/default_out.txt index 44b7734c..b90d1e3a 100644 --- a/default_out.txt +++ b/default_out.txt @@ -6,7 +6,7 @@ started, here's a couple of notes about how Rustlings operates: 1. The central concept behind Rustlings is that you solve exercises. These exercises usually have some sort of syntax error in them, which will cause - them to fail compliation or testing. Sometimes there's a logic error instead + them to fail compilation or testing. Sometimes there's a logic error instead of a syntax error. No matter what error, it's your job to find it and fix it! You'll know when you fixed it because then, the exercise will compile and Rustlings will be able to move on to the next exercise. From ff6cba7205fc9b1a5cbb10dcf4f7887b153a4930 Mon Sep 17 00:00:00 2001 From: RoelofWobben <75732370+RoelofWobben@users.noreply.github.com> Date: Sun, 27 Dec 2020 10:49:55 +0100 Subject: [PATCH 0248/1293] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a5371043..16f8c3d8 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ Start-BitsTransfer -Source https://git.io/rustlings-win -Destination $env:TMP/in To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. +When you get a permission denied message then you have to exclude the directory where you placed the rustlings in your virus-scanner + ## Browser: [Run on Repl.it](https://repl.it/github/rust-lang/rustlings) From e9b42bbc2a20df848950375a5baafc0620017a9c Mon Sep 17 00:00:00 2001 From: Will Hayworth Date: Sun, 3 Jan 2021 03:42:39 -0800 Subject: [PATCH 0249/1293] docs: mention flatten in the options2 hint --- info.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/info.toml b/info.toml index ee4ab2f6..15cd3f3f 100644 --- a/info.toml +++ b/info.toml @@ -583,8 +583,7 @@ https://doc.rust-lang.org/rust-by-example/flow_control/while_let.html Remember that Options can be stacked in if let and while let. For example: Some(Some(variable)) = variable2 - - +Also see Option::flatten """ [[exercises]] From c355ac6593e94e09459dea93a11371f132913123 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Jan 2021 13:12:10 +0000 Subject: [PATCH 0250/1293] docs: update README.md [skip ci] --- README.md | 146 +++++++++++++++++++++++++++--------------------------- 1 file changed, 74 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index 16f8c3d8..b67793d4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-70-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-71-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -169,97 +169,99 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + +

Carol (Nichols || Goulding)

πŸ’» πŸ–‹

QuietMisdreavus

πŸ’» πŸ–‹

Robert M Lugg

πŸ–‹

Hynek Schlawack

πŸ’»

Katharina Fey

πŸ’»

lukabavdaz

πŸ’» πŸ–‹

Erik Vesteraas

πŸ’»

delet0r

πŸ’»

Carol (Nichols || Goulding)

πŸ’» πŸ–‹

QuietMisdreavus

πŸ’» πŸ–‹

Robert M Lugg

πŸ–‹

Hynek Schlawack

πŸ’»

Katharina Fey

πŸ’»

lukabavdaz

πŸ’» πŸ–‹

Erik Vesteraas

πŸ’»

delet0r

πŸ’»

Shaun Bennett

πŸ’»

Andrew Bagshaw

πŸ’»

Kyle Isom

πŸ’»

Colin Pitrat

πŸ’»

Zac Anger

πŸ’»

Matthias Geier

πŸ’»

Chris Pearce

πŸ’»

Yvan Sraka

πŸ’»

Shaun Bennett

πŸ’»

Andrew Bagshaw

πŸ’»

Kyle Isom

πŸ’»

Colin Pitrat

πŸ’»

Zac Anger

πŸ’»

Matthias Geier

πŸ’»

Chris Pearce

πŸ’»

Yvan Sraka

πŸ’»

Denys Smirnov

πŸ’»

eddyp

πŸ’»

Brian Kung

πŸ’» πŸ–‹

Russell

πŸ’»

Dan Wilhelm

πŸ“–

Jesse

πŸ’» πŸ–‹

Fredrik JambrΓ©n

πŸ’»

Pete McFarlane

πŸ–‹

Denys Smirnov

πŸ’»

eddyp

πŸ’»

Brian Kung

πŸ’» πŸ–‹

Russell

πŸ’»

Dan Wilhelm

πŸ“–

Jesse

πŸ’» πŸ–‹

Fredrik JambrΓ©n

πŸ’»

Pete McFarlane

πŸ–‹

nkanderson

πŸ’» πŸ–‹

Ajax M

πŸ“–

Dylan Nugent

πŸ–‹

vyaslav

πŸ’» πŸ–‹

George

πŸ’»

Thomas Holloway

πŸ’» πŸ–‹

Jubilee

πŸ’»

WofWca

πŸ’»

nkanderson

πŸ’» πŸ–‹

Ajax M

πŸ“–

Dylan Nugent

πŸ–‹

vyaslav

πŸ’» πŸ–‹

George

πŸ’»

Thomas Holloway

πŸ’» πŸ–‹

Jubilee

πŸ’»

WofWca

πŸ’»

Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧

Jens

πŸ“–

Rahat Ahmed

πŸ“–

Abdou Seck

πŸ’» πŸ–‹ πŸ‘€

Katie

πŸ’»

Socrates

πŸ“–

gnodarse

πŸ–‹

Harrison Metzger

πŸ’»

Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧

Jens

πŸ“–

Rahat Ahmed

πŸ“–

Abdou Seck

πŸ’» πŸ–‹ πŸ‘€

Katie

πŸ’»

Socrates

πŸ“–

gnodarse

πŸ–‹

Harrison Metzger

πŸ’»

Torben Jonas

πŸ’» πŸ–‹

Paul Bissex

πŸ“–

Steven Mann

πŸ’» πŸ–‹

Mario Reder

πŸ’» πŸ–‹

skim

πŸ’»

Sanjay K

πŸ’» πŸ–‹

Rohan Jain

πŸ’»

Said Aspen

πŸ’» πŸ–‹

Torben Jonas

πŸ’» πŸ–‹

Paul Bissex

πŸ“–

Steven Mann

πŸ’» πŸ–‹

Mario Reder

πŸ’» πŸ–‹

skim

πŸ’»

Sanjay K

πŸ’» πŸ–‹

Rohan Jain

πŸ’»

Said Aspen

πŸ’» πŸ–‹

Ufuk Celebi

πŸ’»

lebedevsergey

πŸ“–

Aleksei Trifonov

πŸ–‹

Darren Meehan

πŸ–‹

Jihchi Lee

πŸ–‹

Christofer Bertonha

πŸ–‹

Vivek Bharath Akupatni

πŸ’» ⚠️

DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹

Ufuk Celebi

πŸ’»

lebedevsergey

πŸ“–

Aleksei Trifonov

πŸ–‹

Darren Meehan

πŸ–‹

Jihchi Lee

πŸ–‹

Christofer Bertonha

πŸ–‹

Vivek Bharath Akupatni

πŸ’» ⚠️

DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹

Rob Story

πŸ’»

Siobhan Jacobson

πŸ’»

Evan Carroll

πŸ–‹

Jawaad Mahmood

πŸ–‹

Gaurang Tandon

πŸ–‹

Stefan Kupresak

πŸ–‹

Greg Leonard

πŸ–‹

Ryan McQuen

πŸ’»

Rob Story

πŸ’»

Siobhan Jacobson

πŸ’»

Evan Carroll

πŸ–‹

Jawaad Mahmood

πŸ–‹

Gaurang Tandon

πŸ–‹

Stefan Kupresak

πŸ–‹

Greg Leonard

πŸ–‹

Ryan McQuen

πŸ’»

Annika

πŸ‘€

Axel Viala

πŸ’»

Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»

Caleb Webber

🚧

Peter N

🚧

seancad

🚧

Annika

πŸ‘€

Axel Viala

πŸ’»

Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»

Caleb Webber

🚧

Peter N

🚧

seancad

🚧

Will Hayworth

πŸ–‹
- + + This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! From 6df08b411bc09fd10d510be74c80e9cc6164e145 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Jan 2021 13:12:11 +0000 Subject: [PATCH 0251/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 1549aa45..d2b0fae1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -655,6 +655,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "wsh", + "name": "Will Hayworth", + "avatar_url": "https://avatars3.githubusercontent.com/u/181174?v=4", + "profile": "http://willhayworth.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 10965920fbdf8a1efc85bed869e55a1787006404 Mon Sep 17 00:00:00 2001 From: Marius Ungureanu Date: Wed, 6 Jan 2021 11:12:33 +0200 Subject: [PATCH 0252/1293] fix(move_semantics4): Small readbility improvement (#617) * Small readbility improvement move_semantics4 doc * Remove `an` as it refers to the argument --- exercises/move_semantics/move_semantics4.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/move_semantics/move_semantics4.rs b/exercises/move_semantics/move_semantics4.rs index a1c4a413..6308c296 100644 --- a/exercises/move_semantics/move_semantics4.rs +++ b/exercises/move_semantics/move_semantics4.rs @@ -18,7 +18,7 @@ fn main() { println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); } -// `fill_vec()` no longer take `vec: Vec` as argument +// `fill_vec()` no longer takes `vec: Vec` as argument fn fill_vec() -> Vec { let mut vec = vec; From 7857b0a689b0847f48d8c14cbd1865e3b812d5ca Mon Sep 17 00:00:00 2001 From: Christian Zeller Date: Wed, 6 Jan 2021 13:47:20 +0100 Subject: [PATCH 0253/1293] fix(threads1): line number correction --- exercises/threads/threads1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/threads/threads1.rs b/exercises/threads/threads1.rs index b475b4a1..f31b317e 100644 --- a/exercises/threads/threads1.rs +++ b/exercises/threads/threads1.rs @@ -1,6 +1,6 @@ // threads1.rs // Make this compile! Execute `rustlings hint threads1` for hints :) -// The idea is the thread spawned on line 21 is completing jobs while the main thread is +// The idea is the thread spawned on line 22 is completing jobs while the main thread is // monitoring progress until 10 jobs are completed. Because of the difference between the // spawned threads' sleep time, and the waiting threads sleep time, when you see 6 lines // of "waiting..." and the program ends without timing out when running, From 621816fb561a9501aa15e8c3674ccdff3b2b24fe Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 6 Jan 2021 15:54:33 +0000 Subject: [PATCH 0254/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b67793d4..f489f93d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![crab pet](https://i.imgur.com/LbZJgmm.gif) -[![All Contributors](https://img.shields.io/badge/all_contributors-71-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-72-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -256,6 +256,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Peter N

🚧
seancad

🚧
Will Hayworth

πŸ–‹ +
Christian Zeller

πŸ–‹ From c24a78ae94b0e8527ee75908edeea136a7a3dbeb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 6 Jan 2021 15:54:34 +0000 Subject: [PATCH 0255/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d2b0fae1..46e68ae5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -664,6 +664,15 @@ "contributions": [ "content" ] + }, + { + "login": "chrizel", + "name": "Christian Zeller", + "avatar_url": "https://avatars3.githubusercontent.com/u/20802?v=4", + "profile": "https://github.com/chrizel", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From fea86c29d6b0b29513e1cfb56b9eab5d4dcd121e Mon Sep 17 00:00:00 2001 From: fmoko Date: Fri, 8 Jan 2021 14:01:04 +0100 Subject: [PATCH 0256/1293] chore: Remove Readme GIF --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f489f93d..987bb839 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -![crab pet](https://i.imgur.com/LbZJgmm.gif) [![All Contributors](https://img.shields.io/badge/all_contributors-72-orange.svg?style=flat-square)](#contributors-) From 5a0521e92c80c43d6451fcc520fd68e7f56106f8 Mon Sep 17 00:00:00 2001 From: Sang-Heon Jeon Date: Sat, 9 Jan 2021 00:07:13 +0900 Subject: [PATCH 0257/1293] feat(from_str) : add test for checking unnecessary trailing value --- exercises/conversions/from_str.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index af9eee6d..70ed1796 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -82,4 +82,16 @@ mod tests { fn missing_name_and_invalid_age() { ",one".parse::().unwrap(); } + + #[test] + #[should_panic] + fn trailing_comma() { + "John,32,".parse::().unwrap(); + } + + #[test] + #[should_panic] + fn trailing_comma_and_some_string() { + "John,32,man".parse::().unwrap(); + } } From 4f1374a6e7dd76d0f8769adf51495d5d0f9ea8a1 Mon Sep 17 00:00:00 2001 From: Sang-Heon Jeon Date: Sat, 9 Jan 2021 00:08:38 +0900 Subject: [PATCH 0258/1293] feat(from_into) : add test for checking unnecessary trailing value --- exercises/conversions/from_into.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs index f24cf61b..9d84174d 100644 --- a/exercises/conversions/from_into.rs +++ b/exercises/conversions/from_into.rs @@ -115,4 +115,18 @@ mod tests { assert_eq!(p.name, "John"); assert_eq!(p.age, 30); } + + #[test] + fn test_trailing_comma() { + let p: Person = Person::from("Mike,32,"); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 30); + } + + #[test] + fn test_trailing_comma_and_some_string() { + let p: Person = Person::from("Mike,32,man"); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 30); + } } From 0b9220c1fc5ae32438f64bf2f5bf5f47d33e3f3f Mon Sep 17 00:00:00 2001 From: Abdou Seck Date: Sat, 12 Dec 2020 13:45:37 -0500 Subject: [PATCH 0259/1293] Add looks_done method to Exercise to expose a resolution state --- src/exercise.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/exercise.rs b/src/exercise.rs index 283b2b90..7afa230a 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -232,6 +232,16 @@ path = "{}.rs""#, State::Pending(context) } + + // Check that the exercise looks to be solved using self.state() + // This is not the best way to check since + // the user can just remove the "I AM NOT DONE" string fromm the file + // without actually having solved anything. + // The only other way to truly check this would to compile and run + // the exercise; which would be both costly and counterintuitive + pub fn looks_done(&self) -> bool { + self.state() == State::Done + } } impl Display for Exercise { From 8bbe4ff1385c5c169c90cd3ff9253f9a91daaf8e Mon Sep 17 00:00:00 2001 From: Abdou Seck Date: Sat, 12 Dec 2020 13:48:25 -0500 Subject: [PATCH 0260/1293] feat(cli): Improve the list command with options, and then some 1. `rustlings list` should now display more than just the exercise names. Information such as file paths and exercises statuses should be displayed. The `--paths` option limits the displayed fields to only the path names; while the `--names` option limits the displayed fields to only exercise names. You can also control which exercises are displayed, by using the `--filter` option, or the `--solved` or `--unsolved` flags. Some use cases: - Fetching pending exercise files with the keyword "conversion" to pass to my editor: ```sh vim $(rustlings list --filter "conversion" --paths --unsolved) ``` - Fetching exercise names with keyword "conversion" to pass to `rustlings run`: ```sh for exercise in $(rustlings list --filter "conversion" --names) do rustlings run ${exercise} done ``` 2. This should also fix #465, and will likely fix #585, as well. That bug mentioned in those issues has to do with the way the `watch` command handler fetches the pending exercises. Going forward, the least recently updated exercises along with all the other exercises in a pending state are fetched. --- src/main.rs | 132 ++++++++++++++++++++++++++++------ tests/fixture/state/info.toml | 7 ++ tests/integration_tests.rs | 78 ++++++++++++++++++++ 3 files changed, 197 insertions(+), 20 deletions(-) diff --git a/src/main.rs b/src/main.rs index bf35e4fb..75a9cec1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,7 @@ use notify::DebouncedEvent; use notify::{RecommendedWatcher, RecursiveMode, Watcher}; use std::ffi::OsStr; use std::fs; -use std::io; +use std::io::{self, prelude::*}; use std::path::Path; use std::process::{Command, Stdio}; use std::sync::mpsc::channel; @@ -58,6 +58,45 @@ fn main() { SubCommand::with_name("list") .alias("l") .about("Lists the exercises available in rustlings") + .arg( + Arg::with_name("paths") + .long("paths") + .short("p") + .conflicts_with("names") + .help("Show only the paths of the exercises") + ) + .arg( + Arg::with_name("names") + .long("names") + .short("n") + .conflicts_with("paths") + .help("Show only the names of the exercises") + ) + .arg( + Arg::with_name("filter") + .long("filter") + .short("f") + .takes_value(true) + .empty_values(false) + .help( + "Provide a string to match the exercise names.\ + \nComma separated patterns are acceptable." + ) + ) + .arg( + Arg::with_name("unsolved") + .long("unsolved") + .short("u") + .conflicts_with("solved") + .help("Display only exercises not yet solved") + ) + .arg( + Arg::with_name("solved") + .long("solved") + .short("s") + .conflicts_with("unsolved") + .help("Display only exercises that have been solved") + ) ) .get_matches(); @@ -93,9 +132,51 @@ fn main() { let exercises = toml::from_str::(toml_str).unwrap().exercises; let verbose = matches.is_present("nocapture"); - if matches.subcommand_matches("list").is_some() { - exercises.iter().for_each(|e| println!("{}", e.name)); + // Handle the list command + if let Some(list_m) = matches.subcommand_matches("list") { + if ["paths", "names"].iter().all(|k| !list_m.is_present(k)) { + println!("{:<17}\t{:<46}\t{:<7}", "Name", "Path", "Status"); + } + let filters = list_m.value_of("filter").unwrap_or_default().to_lowercase(); + exercises.iter().for_each(|e| { + let fname = format!("{}", e.path.display()); + let filter_cond = filters + .split(',') + .filter(|f| f.trim().len() > 0) + .any(|f| e.name.contains(&f) || fname.contains(&f)); + let status = if e.looks_done() { "Done" } else { "Pending" }; + let solve_cond = { + (e.looks_done() && list_m.is_present("solved")) + || (!e.looks_done() && list_m.is_present("unsolved")) + || (!list_m.is_present("solved") && !list_m.is_present("unsolved")) + }; + if solve_cond && (filter_cond || !list_m.is_present("filter")) { + let line = if list_m.is_present("paths") { + format!("{}\n", fname) + } else if list_m.is_present("names") { + format!("{}\n", e.name) + } else { + format!("{:<17}\t{:<46}\t{:<7}\n", e.name, fname, status) + }; + // Somehow using println! leads to the binary panicking + // when its output is piped. + // So, we're handling a Broken Pipe error and exiting with 0 anyway + let stdout = std::io::stdout(); + { + let mut handle = stdout.lock(); + handle.write_all(line.as_bytes()).unwrap_or_else(|e| { + match e.kind() { + std::io::ErrorKind::BrokenPipe => std::process::exit(0), + _ => std::process::exit(1), + }; + }); + } + } + }); + std::process::exit(0); } + + // Handle the run command if let Some(ref matches) = matches.subcommand_matches("run") { let name = matches.value_of("name").unwrap(); @@ -123,13 +204,18 @@ fn main() { println!("{}", exercise.hint); } + // Handle the verify command if matches.subcommand_matches("verify").is_some() { verify(&exercises, verbose).unwrap_or_else(|_| std::process::exit(1)); } + // Handle the watch command if matches.subcommand_matches("watch").is_some() { if let Err(e) = watch(&exercises, verbose) { - println!("Error: Could not watch your progess. Error message was {:?}.", e); + println!( + "Error: Could not watch your progess. Error message was {:?}.", + e + ); println!("Most likely you've run out of disk space or your 'inotify limit' has been reached."); std::process::exit(1); } @@ -138,24 +224,24 @@ fn main() { emoji = Emoji("πŸŽ‰", "β˜…") ); println!(); - println!("+----------------------------------------------------+"); - println!("| You made it to the Fe-nish line! |"); - println!("+-------------------------- ------------------------+"); + println!("+----------------------------------------------------+"); + println!("| You made it to the Fe-nish line! |"); + println!("+-------------------------- ------------------------+"); println!(" \\/ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); - println!(" β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ "); - println!(" β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); + println!(" β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ "); + println!(" β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ "); println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); println!(); println!("We hope you enjoyed learning about the various aspects of Rust!"); @@ -223,7 +309,13 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result<()> { let filepath = b.as_path().canonicalize().unwrap(); let pending_exercises = exercises .iter() - .skip_while(|e| !filepath.ends_with(&e.path)); + .skip_while(|e| !filepath.ends_with(&e.path)) + // .filter(|e| filepath.ends_with(&e.path)) + .chain( + exercises + .iter() + .filter(|e| !e.looks_done() && !filepath.ends_with(&e.path)) + ); clear_screen(); match verify(pending_exercises, verbose) { Ok(_) => return Ok(()), diff --git a/tests/fixture/state/info.toml b/tests/fixture/state/info.toml index 7bfc697e..547b3a48 100644 --- a/tests/fixture/state/info.toml +++ b/tests/fixture/state/info.toml @@ -9,3 +9,10 @@ name = "pending_test_exercise" path = "pending_test_exercise.rs" mode = "test" hint = """""" + +[[exercises]] +name = "finished_exercise" +path = "finished_exercise.rs" +mode = "compile" +hint = """""" + diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 2baf9b86..f5211b64 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -181,3 +181,81 @@ fn run_single_test_success_without_output() { .code(0) .stdout(predicates::str::contains("THIS TEST TOO SHALL PAS").not()); } + +#[test] +fn run_rustlings_list() { + Command::cargo_bin("rustlings") + .unwrap() + .args(&["list"]) + .current_dir("tests/fixture/success") + .assert() + .success(); +} + +#[test] +fn run_rustlings_list_conflicting_display_options() { + Command::cargo_bin("rustlings") + .unwrap() + .args(&["list", "--names", "--paths"]) + .current_dir("tests/fixture/success") + .assert() + .failure(); +} + +#[test] +fn run_rustlings_list_conflicting_solve_options() { + Command::cargo_bin("rustlings") + .unwrap() + .args(&["list", "--solved", "--unsolved"]) + .current_dir("tests/fixture/success") + .assert() + .failure(); +} + +#[test] +fn run_rustlings_list_no_pending() { + Command::cargo_bin("rustlings") + .unwrap() + .args(&["list"]) + .current_dir("tests/fixture/success") + .assert() + .success() + .stdout(predicates::str::contains("Pending").not()); +} + +#[test] +fn run_rustlings_list_both_done_and_pending() { + Command::cargo_bin("rustlings") + .unwrap() + .args(&["list"]) + .current_dir("tests/fixture/state") + .assert() + .success() + .stdout( + predicates::str::contains("Done") + .and(predicates::str::contains("Pending")) + ); +} + +#[test] +fn run_rustlings_list_without_pending() { + Command::cargo_bin("rustlings") + .unwrap() + .args(&["list", "--solved"]) + .current_dir("tests/fixture/state") + .assert() + .success() + .stdout(predicates::str::contains("Pending").not()); +} + +#[test] +fn run_rustlings_list_without_done() { + Command::cargo_bin("rustlings") + .unwrap() + .args(&["list", "--unsolved"]) + .current_dir("tests/fixture/state") + .assert() + .success() + .stdout(predicates::str::contains("Done").not()); +} + From 9f988bfe29e1146cd7dc95c68dd6863e77433553 Mon Sep 17 00:00:00 2001 From: mokou Date: Sun, 17 Jan 2021 13:00:50 +0100 Subject: [PATCH 0261/1293] docs: Remove duplicate uninstallation section --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index 987bb839..369bfab7 100644 --- a/README.md +++ b/README.md @@ -112,13 +112,6 @@ After every couple of sections, there will be a quiz that'll test your knowledge Once you've completed Rustlings, put your new knowledge to good use! Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to. -If you'd like to uninstall Rustlings, you can do so by invoking cargo and removing the rustlings directory: - -```bash -cargo uninstall rustlings -rm -r rustlings/ # or on Windows: rmdir /s rustlings -``` - ## Uninstalling Rustlings If you want to remove Rustlings from your system, there's two steps. First, you'll need to remove the exercises folder that the install script created From 15e71535f37cfaed36e22eb778728d186e2104ab Mon Sep 17 00:00:00 2001 From: Jean-Francois Chevrette Date: Thu, 21 Jan 2021 07:55:22 -0500 Subject: [PATCH 0262/1293] fix(from_str): test for error instead of unwrap/should_panic --- exercises/conversions/from_str.rs | 36 +++++++++++++------------------ 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 70ed1796..558a9033 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -11,15 +11,17 @@ struct Person { } // I AM NOT DONE + // Steps: -// 1. If the length of the provided string is 0, then return an error +// 1. If the length of the provided string is 0 an error should be returned // 2. Split the given string on the commas present in it -// 3. Extract the first element from the split operation and use it as the name -// 4. If the name is empty, then return an error +// 3. Only 2 elements should returned from the split, otherwise return an error +// 4. Extract the first element from the split operation and use it as the name // 5. Extract the other element from the split operation and parse it into a `usize` as the age // with something like `"4".parse::()`. -// If while parsing the age, something goes wrong, then return an error -// Otherwise, then return a Result of a Person object +// 5. If while extracting the name and the age something goes wrong an error should be returned +// If everything goes well, then return a Result of a Person object + impl FromStr for Person { type Err = String; fn from_str(s: &str) -> Result { @@ -48,50 +50,42 @@ mod tests { assert_eq!(p.age, 32); } #[test] - #[should_panic] fn missing_age() { - "John,".parse::().unwrap(); + assert!("John,".parse::().is_err()); } #[test] - #[should_panic] fn invalid_age() { - "John,twenty".parse::().unwrap(); + assert!("John,twenty".parse::().is_err()); } #[test] - #[should_panic] fn missing_comma_and_age() { - "John".parse::().unwrap(); + assert!("John".parse::().is_err()); } #[test] - #[should_panic] fn missing_name() { - ",1".parse::().unwrap(); + assert!(",1".parse::().is_err()); } #[test] - #[should_panic] fn missing_name_and_age() { - ",".parse::().unwrap(); + assert!(",".parse::().is_err()); } #[test] - #[should_panic] fn missing_name_and_invalid_age() { - ",one".parse::().unwrap(); + assert!(",one".parse::().is_err()); } #[test] - #[should_panic] fn trailing_comma() { - "John,32,".parse::().unwrap(); + assert!("John,32,".parse::().is_err()); } #[test] - #[should_panic] fn trailing_comma_and_some_string() { - "John,32,man".parse::().unwrap(); + assert!("John,32,man".parse::().is_err()); } } From 52bde71166740880da2206553df790d47cecba54 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 22 Jan 2021 12:11:33 +0000 Subject: [PATCH 0263/1293] docs: update README.md [skip ci] --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 369bfab7..af97f556 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-72-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-73-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -250,6 +250,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Will Hayworth

πŸ–‹
Christian Zeller

πŸ–‹ + +
Jean-Francois Chevrette

πŸ–‹ πŸ’» + From 6102e612fa3f6255cccea4c9016078f6ea007be0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 22 Jan 2021 12:11:34 +0000 Subject: [PATCH 0264/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 46e68ae5..ea3d7ca2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -673,6 +673,16 @@ "contributions": [ "content" ] + }, + { + "login": "jfchevrette", + "name": "Jean-Francois Chevrette", + "avatar_url": "https://avatars.githubusercontent.com/u/3001?v=4", + "profile": "https://github.com/jfchevrette", + "contributions": [ + "content", + "code" + ] } ], "contributorsPerLine": 8, From cddc1e86e7ec744ee644cc774a4887b1a0ded3e8 Mon Sep 17 00:00:00 2001 From: John Baber-Lucero Date: Sat, 30 Jan 2021 16:12:06 +0000 Subject: [PATCH 0265/1293] fix(info): Fix typo (#635) Co-authored-by: John Baber-Lucero --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 23c64917..f0fed934 100644 --- a/info.toml +++ b/info.toml @@ -284,7 +284,7 @@ hint = """ Rust has more than one type of struct. Three actually, all variants are used to package related data together. There are normal (or classic) structs. These are named collections of related data stored in fields. Tuple structs are basically just named tuples. -Finally, Unit structs. These don't have and fields and are useful for generics. +Finally, Unit structs. These don't have any fields and are useful for generics. In this exercise you need to complete and implement one of each kind. Read more about structs in The Book: https://doc.rust-lang.org/book/ch05-01-defining-structs.html""" From 75802c14b2dbfbbf65139608f19cb94dba6d7a2c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 30 Jan 2021 16:12:27 +0000 Subject: [PATCH 0266/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index af97f556..c2e598c1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-73-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-74-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -252,6 +252,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Jean-Francois Chevrette

πŸ–‹ πŸ’» +
John Baber-Lucero

πŸ–‹ From c1abd13b5c026643b5dddc85b3aa546ef75243d6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 30 Jan 2021 16:12:28 +0000 Subject: [PATCH 0267/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ea3d7ca2..9cdf6b08 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -683,6 +683,15 @@ "content", "code" ] + }, + { + "login": "jbaber", + "name": "John Baber-Lucero", + "avatar_url": "https://avatars.githubusercontent.com/u/1908117?v=4", + "profile": "https://github.com/jbaber", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From cc266d7d80b91e79df3f61984f231b7f1587218e Mon Sep 17 00:00:00 2001 From: Tal <3195851+tal-zvon@users.noreply.github.com> Date: Sun, 7 Feb 2021 04:22:13 -0700 Subject: [PATCH 0268/1293] fix(move_semantics4): Remove redundant "instead" (#640) --- exercises/move_semantics/move_semantics4.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/move_semantics/move_semantics4.rs b/exercises/move_semantics/move_semantics4.rs index 6308c296..2a23c710 100644 --- a/exercises/move_semantics/move_semantics4.rs +++ b/exercises/move_semantics/move_semantics4.rs @@ -1,6 +1,6 @@ // move_semantics4.rs // Refactor this code so that instead of having `vec0` and creating the vector -// in `fn main`, we instead create it within `fn fill_vec` and transfer the +// in `fn main`, we create it within `fn fill_vec` and transfer the // freshly created vector from fill_vec to its caller. // Execute `rustlings hint move_semantics4` for hints! From 1f9d00685836cbf639a518b5612e7e16d669bf48 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 7 Feb 2021 11:22:32 +0000 Subject: [PATCH 0269/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c2e598c1..fe61f6f4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-74-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-75-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -253,6 +253,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Jean-Francois Chevrette

πŸ–‹ πŸ’»
John Baber-Lucero

πŸ–‹ +
Tal

πŸ–‹ From f1d2b3a39a676ae25cc0e4fb18f582441bc239e2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 7 Feb 2021 11:22:33 +0000 Subject: [PATCH 0270/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9cdf6b08..6db7a29b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -692,6 +692,15 @@ "contributions": [ "content" ] + }, + { + "login": "tal-zvon", + "name": "Tal", + "avatar_url": "https://avatars.githubusercontent.com/u/3195851?v=4", + "profile": "https://github.com/tal-zvon", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 726805f064659f8cc2612974eb6d21690378cabc Mon Sep 17 00:00:00 2001 From: apogeeoak <59737221+apogeeoak@users.noreply.github.com> Date: Tue, 9 Feb 2021 17:43:53 -0500 Subject: [PATCH 0271/1293] docs: Fixed grammar in contributing.md. --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d566df08..2ca0e341 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,12 +26,12 @@ isn't really that complicated since the bulk of the work is done by `rustc`. ### Adding an exercise -First step is to add the exercise! Call it `exercises/yourTopic/yourTopicN.rs`, make sure to +The first step is to add the exercise! Name the file `exercises/yourTopic/yourTopicN.rs`, make sure to put in some helpful links, and link to sections of the book in `exercises/yourTopic/README.md`. -Next you want to make sure it runs when using `rustlings`. All exercises are stored in `info.toml`, under the `exercises` array. They're ordered by the order they're ran when using `rustlings verify`. +Next make sure it runs with `rustlings`. The exercise metadata is stored in `info.toml`, under the `exercises` array. The order of the `exercises` array determines the order the exercises are run by `rustlings verify`. -You want to make sure where in the file you add your exercise. If you're not sure, add it at the bottom and ask in your pull request. To add an exercise, edit the file like this: +Add the metadata for your exercise in the correct order in the `exercises` array. If you are unsure of the correct ordering, add it at the bottom and ask in your pull request. The exercise metadata should contain the following: ```diff ... + [[exercises]] From 2e84f34cf375fa3d12c73d1f28d68f0be9de3dc4 Mon Sep 17 00:00:00 2001 From: apogeeoak <59737221+apogeeoak@users.noreply.github.com> Date: Tue, 9 Feb 2021 18:21:18 -0500 Subject: [PATCH 0272/1293] chore: Updated source to follow clippy suggestions. --- src/main.rs | 2 +- tests/integration_tests.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 75a9cec1..50e4a386 100644 --- a/src/main.rs +++ b/src/main.rs @@ -142,7 +142,7 @@ fn main() { let fname = format!("{}", e.path.display()); let filter_cond = filters .split(',') - .filter(|f| f.trim().len() > 0) + .filter(|f| !f.trim().is_empty()) .any(|f| e.name.contains(&f) || fname.contains(&f)); let status = if e.looks_done() { "Done" } else { "Pending" }; let solve_cond = { diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index f5211b64..1bd3bf7e 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -131,7 +131,7 @@ fn all_exercises_require_confirmation() { file.read_to_string(&mut s).unwrap(); s }; - source.matches("// I AM NOT DONE").next().expect(&format!( + source.matches("// I AM NOT DONE").next().unwrap_or_else(|| panic!( "There should be an `I AM NOT DONE` annotation in {:?}", path )); From d65b4a9a93477745e206de11e1634ffe3cb3a6e6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 10 Feb 2021 09:36:47 +0000 Subject: [PATCH 0273/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fe61f6f4..9e617eba 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-75-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-76-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -254,6 +254,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Jean-Francois Chevrette

πŸ–‹ πŸ’»
John Baber-Lucero

πŸ–‹
Tal

πŸ–‹ +
apogeeoak

πŸ–‹ πŸ’» From f5158ece1a9d9896f089a352f8a2bd7502890864 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 10 Feb 2021 09:36:48 +0000 Subject: [PATCH 0274/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6db7a29b..c4e68a15 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -701,6 +701,16 @@ "contributions": [ "content" ] + }, + { + "login": "apogeeoak", + "name": "apogeeoak", + "avatar_url": "https://avatars.githubusercontent.com/u/59737221?v=4", + "profile": "https://github.com/apogeeoak", + "contributions": [ + "content", + "code" + ] } ], "contributorsPerLine": 8, From b29ea17ea94d1862114af2cf5ced0e09c197dc35 Mon Sep 17 00:00:00 2001 From: apogeeoak <59737221+apogeeoak@users.noreply.github.com> Date: Wed, 10 Feb 2021 18:03:29 -0500 Subject: [PATCH 0275/1293] feat: Added iterators5.rs exercise. --- .../standard_library_types/iterators5.rs | 113 ++++++++++++++++++ info.toml | 15 +++ 2 files changed, 128 insertions(+) create mode 100644 exercises/standard_library_types/iterators5.rs diff --git a/exercises/standard_library_types/iterators5.rs b/exercises/standard_library_types/iterators5.rs new file mode 100644 index 00000000..65c50e62 --- /dev/null +++ b/exercises/standard_library_types/iterators5.rs @@ -0,0 +1,113 @@ +// iterators5.rs + +// Rustling progress is modelled using a hash map. The name of the exercise is +// the key and the progress is the value. Two counting functions were created +// to count the number of exercises with a given progress. These counting +// functions use imperative style for loops. Recreate this counting +// functionality using iterators. +// Execute `rustlings hint iterators5` for hints. +// +// Make the code compile and the tests pass. + +// I AM NOT DONE + +use std::collections::HashMap; + +#[derive(PartialEq, Eq)] +enum Progress { + None, + Some, + Complete, +} + +fn count_for(map: &HashMap, value: Progress) -> usize { + let mut count = 0; + for val in map.values() { + if val == &value { + count += 1; + } + } + count +} + +fn count(map: &HashMap, value: Progress) -> usize { +} + +fn count_stack_for(stack: &[HashMap], value: Progress) -> usize { + let mut count = 0; + for map in stack { + for val in map.values() { + if val == &value { + count += 1; + } + } + } + count +} + +fn count_stack(stack: &[HashMap], value: Progress) -> usize { +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn count_complete() { + let map = get_map(); + assert_eq!(3, count(&map, Progress::Complete)); + } + + #[test] + fn count_equals_for() { + let map = get_map(); + assert_eq!( + count_for(&map, Progress::Complete), + count(&map, Progress::Complete) + ); + } + + #[test] + fn count_stack_complete() { + let stack = get_map_stack(); + assert_eq!(6, count_stack(&stack, Progress::Complete)); + } + + #[test] + fn count_stack_equals_for() { + let stack = get_map_stack(); + assert_eq!( + count_stack_for(&stack, Progress::Complete), + count_stack(&stack, Progress::Complete) + ); + } + + fn get_map() -> HashMap { + use Progress::*; + + let mut map = HashMap::new(); + map.insert(String::from("variables1"), Complete); + map.insert(String::from("functions1"), Complete); + map.insert(String::from("hashmap1"), Complete); + map.insert(String::from("arc1"), Some); + map.insert(String::from("as_ref_mut"), None); + map.insert(String::from("from_str"), None); + + map + } + + fn get_map_stack() -> Vec> { + use Progress::*; + + let map = get_map(); + + let mut other = HashMap::new(); + other.insert(String::from("variables2"), Complete); + other.insert(String::from("functions2"), Complete); + other.insert(String::from("if1"), Complete); + other.insert(String::from("from_into"), None); + other.insert(String::from("try_from_into"), None); + + vec![map, other] + } +} diff --git a/info.toml b/info.toml index f0fed934..646bb5a5 100644 --- a/info.toml +++ b/info.toml @@ -741,6 +741,21 @@ a mutable variable. Or, you might write code utilizing recursion and a match clause. In Rust you can take another functional approach, computing the factorial elegantly with ranges and iterators.""" +[[exercises]] +name = "iterators5" +path = "exercises/standard_library_types/iterators5.rs" +mode = "test" +hint = """ +The documentation for the std::iter::Iterator trait contains numerous methods +that would be helpful here. + +Return 0 from count_stack to make the code compile in order to test count. + +The stack variable in count_stack is a slice of HashMaps. It needs to be +converted into an iterator in order to use the iterator methods. + +The fold method can be useful in the count_stack function.""" + # THREADS [[exercises]] From baf4ba175ba6eb92989e3dd54ecbec4bedc9a863 Mon Sep 17 00:00:00 2001 From: apogeeoak <59737221+apogeeoak@users.noreply.github.com> Date: Thu, 11 Feb 2021 21:24:32 -0500 Subject: [PATCH 0276/1293] fix(iterators2): Moved errors out of tests. Closes #359 --- .../standard_library_types/iterators2.rs | 38 ++++++++++++------- info.toml | 19 +++++----- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/exercises/standard_library_types/iterators2.rs b/exercises/standard_library_types/iterators2.rs index 84d14ae6..87b4eaa1 100644 --- a/exercises/standard_library_types/iterators2.rs +++ b/exercises/standard_library_types/iterators2.rs @@ -1,28 +1,41 @@ // iterators2.rs -// In this module, you'll learn some of the unique advantages that iterators can offer. -// Step 1. Complete the `capitalize_first` function to pass the first two cases. -// Step 2. Apply the `capitalize_first` function to a vector of strings. -// Ensure that it returns a vector of strings as well. -// Step 3. Apply the `capitalize_first` function again to a list. -// Try to ensure it returns a single string. +// In this exercise, you'll learn some of the unique advantages that iterators +// can offer. Follow the steps to complete the exercise. // As always, there are hints if you execute `rustlings hint iterators2`! // I AM NOT DONE +// Step 1. +// Complete the `capitalize_first` function. +// "hello" -> "Hello" pub fn capitalize_first(input: &str) -> String { let mut c = input.chars(); match c.next() { None => String::new(), - Some(first) => first.collect::() + c.as_str(), + Some(first) => ???, } } +// Step 2. +// Apply the `capitalize_first` function to a slice of string slices. +// Return a vector of strings. +// ["hello", "world"] -> ["Hello", "World"] +pub fn capitalize_words_vector(words: &[&str]) -> Vec { + vec![] +} + +// Step 3. +// Apply the `capitalize_first` function again to a slice of string slices. +// Return a single string. +// ["hello", " ", "world"] -> "Hello World" +pub fn capitalize_words_string(words: &[&str]) -> String { + String::new() +} + #[cfg(test)] mod tests { use super::*; - // Step 1. - // Tests that verify your `capitalize_first` function implementation #[test] fn test_success() { assert_eq!(capitalize_first("hello"), "Hello"); @@ -33,18 +46,15 @@ mod tests { assert_eq!(capitalize_first(""), ""); } - // Step 2. #[test] fn test_iterate_string_vec() { let words = vec!["hello", "world"]; - let capitalized_words: Vec = // TODO - assert_eq!(capitalized_words, ["Hello", "World"]); + assert_eq!(capitalize_words_vector(&words), ["Hello", "World"]); } #[test] fn test_iterate_into_string() { let words = vec!["hello", " ", "world"]; - let capitalized_words = // TODO - assert_eq!(capitalized_words, "Hello World"); + assert_eq!(capitalize_words_string(&words), "Hello World"); } } diff --git a/info.toml b/info.toml index f0fed934..5570b01c 100644 --- a/info.toml +++ b/info.toml @@ -704,21 +704,20 @@ path = "exercises/standard_library_types/iterators2.rs" mode = "test" hint = """ Step 1 -You need to call something on `first` before it can be collected -Currently its type is `char`. Have a look at the methods that are available on that type: +The variable `first` is a `char`. It needs to be capitalized and added to the +remaining characters in `c` in order to return the correct `String`. +The remaining characters in `c` can be viewed as a string slice using the +`as_str` method. +The documentation for `char` contains many useful methods. https://doc.rust-lang.org/std/primitive.char.html - Step 2 -First you'll need to turn the Vec into an iterator -Then you'll need to apply your function unto each item in the vector -P.s. Don't forget to collect() at the end! - +Create an iterator from the slice. Transform the iterated values by applying +the `capitalize_first` function. Remember to collect the iterator. Step 3. -This is very similar to the previous test. The only real change is that you will need to -alter the type that collect is coerced into. For a bonus you could try doing this with a -turbofish""" +This is surprising similar to the previous solution. Collect is very powerful +and very general. Rust just needs to know the desired type.""" [[exercises]] name = "iterators3" From c6712dfccd1a093e590ad22bbc4f49edc417dac0 Mon Sep 17 00:00:00 2001 From: apogeeoak <59737221+apogeeoak@users.noreply.github.com> Date: Fri, 12 Feb 2021 15:36:53 -0500 Subject: [PATCH 0277/1293] fix(iterators3): Enabled iterators3.rs to run without commented out tests. --- .../standard_library_types/iterators3.rs | 47 ++++++++++--------- info.toml | 12 +++-- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/exercises/standard_library_types/iterators3.rs b/exercises/standard_library_types/iterators3.rs index 353cea62..8c66c05b 100644 --- a/exercises/standard_library_types/iterators3.rs +++ b/exercises/standard_library_types/iterators3.rs @@ -1,11 +1,10 @@ // iterators3.rs // This is a bigger exercise than most of the others! You can do it! // Here is your mission, should you choose to accept it: -// 1. Complete the divide function to get the first four tests to pass -// 2. Uncomment the last two tests and get them to pass by filling in -// values for `x` using `division_results`. +// 1. Complete the divide function to get the first four tests to pass. +// 2. Get the remaining tests to pass by completing the result_with_list and +// list_of_results functions. // Execute `rustlings hint iterators3` to get some hints! -// Have fun :-) // I AM NOT DONE @@ -21,16 +20,28 @@ pub struct NotDivisibleError { divisor: i32, } -// This function should calculate `a` divided by `b` if `a` is -// evenly divisible by b. -// Otherwise, it should return a suitable error. +// Calculate `a` divided by `b` if `a` is evenly divisible by `b`. +// Otherwise, return a suitable error. pub fn divide(a: i32, b: i32) -> Result {} +// Complete the function and return a value of the correct type so the test passes. +// Desired output: Ok([1, 11, 1426, 3]) +fn result_with_list() -> () { + let numbers = vec![27, 297, 38502, 81]; + let division_results = numbers.into_iter().map(|n| divide(n, 27)); +} + +// Complete the function and return a value of the correct type so the test passes. +// Desired output: [Ok(1), Ok(11), Ok(1426), Ok(3)] +fn list_of_results() -> () { + let numbers = vec![27, 297, 38502, 81]; + let division_results = numbers.into_iter().map(|n| divide(n, 27)); +} + #[cfg(test)] mod tests { use super::*; - // Tests that verify your `divide` function implementation #[test] fn test_success() { assert_eq!(divide(81, 9), Ok(9)); @@ -57,22 +68,16 @@ mod tests { assert_eq!(divide(0, 81), Ok(0)); } - // Iterator exercises using your `divide` function - /* #[test] - fn result_with_list() { - let numbers = vec![27, 297, 38502, 81]; - let division_results = numbers.into_iter().map(|n| divide(n, 27)); - let x //... Fill in here! - assert_eq!(format!("{:?}", x), "Ok([1, 11, 1426, 3])"); + fn test_result_with_list() { + assert_eq!(format!("{:?}", result_with_list()), "Ok([1, 11, 1426, 3])"); } #[test] - fn list_of_results() { - let numbers = vec![27, 297, 38502, 81]; - let division_results = numbers.into_iter().map(|n| divide(n, 27)); - let x //... Fill in here! - assert_eq!(format!("{:?}", x), "[Ok(1), Ok(11), Ok(1426), Ok(3)]"); + fn test_list_of_results() { + assert_eq!( + format!("{:?}", list_of_results()), + "[Ok(1), Ok(11), Ok(1426), Ok(3)]" + ); } - */ } diff --git a/info.toml b/info.toml index f0fed934..73c5672c 100644 --- a/info.toml +++ b/info.toml @@ -725,11 +725,15 @@ name = "iterators3" path = "exercises/standard_library_types/iterators3.rs" mode = "test" hint = """ -Minor hint: In each of the two cases in the match in main, you can create x with either -a 'turbofish' or by hinting the type of x to the compiler. You may try both. +The divide function needs to return the correct error when even division is not +possible. -Major hint: Have a look at the Iter trait and at the explanation of its collect function. -Especially the part about Result is interesting.""" +The division_results variable needs to be collected into a collection type. + +The result_with_list function needs to return a single Result where the success +case is a vector of integers and the failure case is a DivisionError. + +The list_of_results function needs to return a vector of results.""" [[exercises]] name = "iterators4" From 5f7c89f85db1f33da01911eaa479c3a2d4721678 Mon Sep 17 00:00:00 2001 From: Jirka Kremser <535866+jkremser@users.noreply.github.com> Date: Sun, 21 Feb 2021 21:50:17 +0100 Subject: [PATCH 0278/1293] fix(from_str): Correct typos typos in the comments --- exercises/conversions/from_str.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 558a9033..41fccd7e 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -13,13 +13,13 @@ struct Person { // I AM NOT DONE // Steps: -// 1. If the length of the provided string is 0 an error should be returned +// 1. If the length of the provided string is 0, an error should be returned // 2. Split the given string on the commas present in it -// 3. Only 2 elements should returned from the split, otherwise return an error +// 3. Only 2 elements should be returned from the split, otherwise return an error // 4. Extract the first element from the split operation and use it as the name // 5. Extract the other element from the split operation and parse it into a `usize` as the age -// with something like `"4".parse::()`. -// 5. If while extracting the name and the age something goes wrong an error should be returned +// with something like `"4".parse::()` +// 5. If while extracting the name and the age something goes wrong, an error should be returned // If everything goes well, then return a Result of a Person object impl FromStr for Person { From 91ee27f22bd3797a9db57e5fd430801c170c5db8 Mon Sep 17 00:00:00 2001 From: Larry Garfield Date: Wed, 24 Feb 2021 15:03:26 -0600 Subject: [PATCH 0279/1293] fix: Spelling error --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 50e4a386..569aa4ac 100644 --- a/src/main.rs +++ b/src/main.rs @@ -213,7 +213,7 @@ fn main() { if matches.subcommand_matches("watch").is_some() { if let Err(e) = watch(&exercises, verbose) { println!( - "Error: Could not watch your progess. Error message was {:?}.", + "Error: Could not watch your progress. Error message was {:?}.", e ); println!("Most likely you've run out of disk space or your 'inotify limit' has been reached."); From 320de0d92184fc0c4467a8cb5ac4af3b8fdcde6e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 25 Feb 2021 10:20:53 +0000 Subject: [PATCH 0280/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9e617eba..8f7feb76 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-76-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-77-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -255,6 +255,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
John Baber-Lucero

πŸ–‹
Tal

πŸ–‹
apogeeoak

πŸ–‹ πŸ’» +
Larry Garfield

πŸ–‹ From 797e6d45c04c1833cbe608ca0c9af648e5373e25 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 25 Feb 2021 10:20:54 +0000 Subject: [PATCH 0281/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c4e68a15..3c2a0bb3 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -711,6 +711,15 @@ "content", "code" ] + }, + { + "login": "Crell", + "name": "Larry Garfield", + "avatar_url": "https://avatars.githubusercontent.com/u/254863?v=4", + "profile": "http://www.garfieldtech.com/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 833df0b8b3bcc03df50f76f3b9ed15c5ffc60870 Mon Sep 17 00:00:00 2001 From: circumspect <40770208+circumspect@users.noreply.github.com> Date: Fri, 12 Mar 2021 14:26:57 +0000 Subject: [PATCH 0282/1293] chore: fix typo Co-authored-by: Chenkail <40770208+Chenkail@users.noreply.github.com> --- src/exercise.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exercise.rs b/src/exercise.rs index 7afa230a..18e8d5ab 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -235,7 +235,7 @@ path = "{}.rs""#, // Check that the exercise looks to be solved using self.state() // This is not the best way to check since - // the user can just remove the "I AM NOT DONE" string fromm the file + // the user can just remove the "I AM NOT DONE" string from the file // without actually having solved anything. // The only other way to truly check this would to compile and run // the exercise; which would be both costly and counterintuitive From 3f5abca21535537dfcef69adaf2b08df790e47fa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 12 Mar 2021 15:28:03 +0100 Subject: [PATCH 0283/1293] docs: add circumspect as a contributor * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3c2a0bb3..9aa0630a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -720,6 +720,15 @@ "contributions": [ "content" ] + }, + { + "login": "circumspect", + "name": "circumspect", + "avatar_url": "https://avatars.githubusercontent.com/u/40770208?v=4", + "profile": "https://github.com/circumspect", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 8f7feb76..97790643 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-77-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-78-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -256,6 +256,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Tal

πŸ–‹
apogeeoak

πŸ–‹ πŸ’»
Larry Garfield

πŸ–‹ +
circumspect

πŸ–‹ From 5157f568753737bab860831d13fe342dec27b242 Mon Sep 17 00:00:00 2001 From: Cyrus Wyett <34195737+cjwyett@users.noreply.github.com> Date: Fri, 12 Mar 2021 14:38:28 +0000 Subject: [PATCH 0284/1293] chore: fix typo is however some --> are however some --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index f0fed934..b37306c3 100644 --- a/info.toml +++ b/info.toml @@ -295,7 +295,7 @@ path = "exercises/structs/structs2.rs" mode = "test" hint = """ Creating instances of structs is easy, all you need to do is assign some values to its fields. -There is however some shortcuts that can be taken when instantiating structs. +There are however some shortcuts that can be taken when instantiating structs. Have a look in The Book, to find out more: https://doc.rust-lang.org/stable/book/ch05-01-defining-structs.html#creating-instances-from-other-instances-with-struct-update-syntax""" [[exercises]] From 815edb7003c58f60c6baecb7d91cd72614be7ad6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 12 Mar 2021 15:39:40 +0100 Subject: [PATCH 0285/1293] docs: add cjwyett as a contributor (#666) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9aa0630a..4eab3c6b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -729,6 +729,15 @@ "contributions": [ "content" ] + }, + { + "login": "cjwyett", + "name": "Cyrus Wyett", + "avatar_url": "https://avatars.githubusercontent.com/u/34195737?v=4", + "profile": "https://github.com/cjwyett", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 97790643..ca99796f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-78-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-79-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -257,6 +257,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
apogeeoak

πŸ–‹ πŸ’»
Larry Garfield

πŸ–‹
circumspect

πŸ–‹ +
Cyrus Wyett

πŸ–‹ From 05a753fe6333d36dbee5f68c21dec04eacdc75df Mon Sep 17 00:00:00 2001 From: cadolphs Date: Fri, 12 Mar 2021 09:36:35 -0800 Subject: [PATCH 0286/1293] fix: add check to prevent naive implementation of is_international * fix(structs3): Add check to prevent naive implementation * chore(structs3): Add a missed newline after the test I added --- exercises/structs/structs3.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index 06fcaf29..f18cc925 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -57,6 +57,16 @@ mod tests { assert!(package.is_international()); } + #[test] + fn create_local_package() { + let sender_country = String::from("Canada"); + let recipient_country = sender_country.clone(); + + let package = Package::new(sender_country, recipient_country, 1200); + + assert!(!package.is_international()); + } + #[test] fn calculate_transport_fees() { let sender_country = String::from("Spain"); From 04dbf03ace1bc7f23f5f98bb701cba8505954c39 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 12 Mar 2021 18:37:58 +0100 Subject: [PATCH 0287/1293] docs: add cadolphs as a contributor (#667) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4eab3c6b..45ea4b75 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -738,6 +738,15 @@ "contributions": [ "content" ] + }, + { + "login": "cadolphs", + "name": "cadolphs", + "avatar_url": "https://avatars.githubusercontent.com/u/13894820?v=4", + "profile": "https://github.com/cadolphs", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index ca99796f..b958fae6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-79-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-80-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -258,6 +258,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Larry Garfield

πŸ–‹
circumspect

πŸ–‹
Cyrus Wyett

πŸ–‹ +
cadolphs

πŸ’» From 96c56ab08a30835e9f4d2b6b83b75a0060726fbd Mon Sep 17 00:00:00 2001 From: apogeeoak <59737221+apogeeoak@users.noreply.github.com> Date: Fri, 12 Mar 2021 14:04:29 -0500 Subject: [PATCH 0288/1293] chore: changed errors3 mode from test to compile --- info.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/info.toml b/info.toml index b37306c3..2068750a 100644 --- a/info.toml +++ b/info.toml @@ -470,7 +470,7 @@ and give it a try!""" [[exercises]] name = "errors3" path = "exercises/error_handling/errors3.rs" -mode = "test" +mode = "compile" hint = """ If other functions can return a `Result`, why shouldn't `main`?""" @@ -694,7 +694,7 @@ Step 2 & step 2.1: Very similar to the lines above and below. You've got this! Step 3: An iterator goes through all elements in a collection, but what if we've run out of -elements? What should we expect here? If you're stuck, take a look at +elements? What should we expect here? If you're stuck, take a look at https://doc.rust-lang.org/std/iter/trait.Iterator.html for some ideas. """ From 9f3e8c2dde645e5264c2d2200e68842b5f47bfa3 Mon Sep 17 00:00:00 2001 From: Darius Wiles Date: Sat, 13 Mar 2021 03:14:02 -0800 Subject: [PATCH 0289/1293] fix(structs3): reword heading comment (#664) --- exercises/structs/structs3.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index f18cc925..8d8b4710 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -1,7 +1,8 @@ // structs3.rs -// Structs contain more than simply some data, they can also have logic, in this -// exercise we have defined the Package struct and we want to test some logic attached to it, -// make the code compile and the tests pass! If you have issues execute `rustlings hint structs3` +// Structs contain data, but can also have logic. In this exercise we have +// defined the Package struct and we want to test some logic attached to it. +// Make the code compile and the tests pass! +// If you have issues execute `rustlings hint structs3` // I AM NOT DONE From ebdb66c7bfb6d687a14cc511a559a222e6fc5de4 Mon Sep 17 00:00:00 2001 From: Darius Wiles Date: Sat, 13 Mar 2021 03:14:44 -0800 Subject: [PATCH 0290/1293] fix(structs2): correct grammar in hint (#663) From aa9a943ddf3ae260782e73c26bcc9db60e5894b6 Mon Sep 17 00:00:00 2001 From: Ivan Nerazumov <64264529+cseltol@users.noreply.github.com> Date: Sat, 13 Mar 2021 18:45:52 +0700 Subject: [PATCH 0291/1293] fix(installation): first PowerShell command ExecutionPolicy to RemoteSigned command was fixed because the old command was getting denied access to change the Execution Policy property --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b958fae6..3b7ff168 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ This will install Rustlings and give you access to the `rustlings` command. Run In PowerShell, set `ExecutionPolicy` to `RemoteSigned`: ```ps -Set-ExecutionPolicy RemoteSigned +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser ``` Then, you can run: From 3bce2ef8d6a613f6601328b3679ec18256cefec9 Mon Sep 17 00:00:00 2001 From: Pascal H Date: Mon, 15 Mar 2021 09:14:12 +0100 Subject: [PATCH 0292/1293] chore: clarify collections documentation C++ `map` is more like BTreeMap. `unordered_map` in C++(11) is the equivalent of `HashMap` in Rust. (+ additional like for references). --- exercises/collections/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/collections/README.md b/exercises/collections/README.md index 9ded29a0..af87863b 100644 --- a/exercises/collections/README.md +++ b/exercises/collections/README.md @@ -14,7 +14,7 @@ structures that are used very often in Rust programs: * A *vector* allows you to store a variable number of values next to each other. * A *hash map* allows you to associate a value with a particular key. - You may also know this by the names *map* in C++, *dictionary* in - Python or an *associative array* in other languages. + You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map), + [*dictionary* in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) or an *associative array* in other languages. [Rust book chapter](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html) From be9510539e84c869362f6cd3fa6f791d3e02a821 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 15 Mar 2021 09:14:41 +0100 Subject: [PATCH 0293/1293] docs: add hpwxf as a contributor (#671) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 45ea4b75..5239b29c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -747,6 +747,15 @@ "contributions": [ "code" ] + }, + { + "login": "hpwxf", + "name": "Pascal H.", + "avatar_url": "https://avatars.githubusercontent.com/u/26146722?v=4", + "profile": "https://www.haveneer.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index b958fae6..85bba46d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-80-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-81-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -260,6 +260,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Cyrus Wyett

πŸ–‹
cadolphs

πŸ’» + +
Pascal H.

πŸ–‹ + From 0d894e6ff739943901e1ae8c904582e5c2f843bd Mon Sep 17 00:00:00 2001 From: Pascal H Date: Tue, 16 Mar 2021 10:14:25 +0100 Subject: [PATCH 0294/1293] fix(quiz3): Force an answer to Q2 (#672) Add also an example of unimplemented!() macro. --- exercises/quiz3.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/quiz3.rs b/exercises/quiz3.rs index a0cd3712..fae0eedb 100644 --- a/exercises/quiz3.rs +++ b/exercises/quiz3.rs @@ -24,6 +24,7 @@ mod tests { #[test] fn returns_twice_of_negative_numbers() { - // TODO write an assert for `times_two(-4)` + // TODO replace unimplemented!() with an assert for `times_two(-4)` + unimplemented!() } } From bef39b125961310b34b34871e480a82e82af4678 Mon Sep 17 00:00:00 2001 From: Mickael Fortunato Date: Thu, 18 Mar 2021 18:39:22 +0100 Subject: [PATCH 0295/1293] fix(collections): Naming exercises for vectors and hashmap --- exercises/collections/vec2.rs | 7 +------ info.toml | 8 ++++---- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/exercises/collections/vec2.rs b/exercises/collections/vec2.rs index ec6cfc00..08b6bbf5 100644 --- a/exercises/collections/vec2.rs +++ b/exercises/collections/vec2.rs @@ -28,11 +28,6 @@ mod tests { let v: Vec = (1..).filter(|x| x % 2 == 0).take(5).collect(); let ans = vec_loop(v.clone()); - assert_eq!( - ans, - v.iter() - .map(|x| x * 2) - .collect::>() - ); + assert_eq!(ans, v.iter().map(|x| x * 2).collect::>()); } } diff --git a/info.toml b/info.toml index 2068750a..baae76af 100644 --- a/info.toml +++ b/info.toml @@ -359,7 +359,7 @@ each constant.""" # COLLECTIONS [[exercises]] -name = "collections1" +name = "vec1" path = "exercises/collections/vec1.rs" mode = "test" hint = """ @@ -373,7 +373,7 @@ of the Rust book to learn more. """ [[exercises]] -name = "collections2" +name = "vec2" path = "exercises/collections/vec2.rs" mode = "test" hint = """ @@ -383,7 +383,7 @@ Hint 2: Check the suggestion from the compiler error ;) """ [[exercises]] -name = "collections3" +name = "hashmap1" path = "exercises/collections/hashmap1.rs" mode = "test" hint = """ @@ -394,7 +394,7 @@ Hint 2: Number of fruits should be at least 5. And you have to put """ [[exercises]] -name = "collections4" +name = "hashmap2" path = "exercises/collections/hashmap2.rs" mode = "test" hint = """ From ab9995e76e10fb1159f9ca1f378e3e11838dc5bc Mon Sep 17 00:00:00 2001 From: Mickael Fortunato Date: Thu, 18 Mar 2021 18:45:01 +0100 Subject: [PATCH 0296/1293] doc: Update collections exercises instruction to match the standard naming --- exercises/collections/hashmap1.rs | 6 ++---- exercises/collections/hashmap2.rs | 6 ++---- exercises/collections/vec1.rs | 2 +- exercises/collections/vec2.rs | 2 +- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/exercises/collections/hashmap1.rs b/exercises/collections/hashmap1.rs index b1dc0bbd..64b5a7f3 100644 --- a/exercises/collections/hashmap1.rs +++ b/exercises/collections/hashmap1.rs @@ -8,7 +8,7 @@ // // Make me compile and pass the tests! // -// Execute the command `rustlings hint collections3` if you need +// Execute the command `rustlings hint hashmap1` if you need // hints. // I AM NOT DONE @@ -39,8 +39,6 @@ mod tests { #[test] fn at_least_five_fruits() { let basket = fruit_basket(); - assert!(basket - .values() - .sum::() >= 5); + assert!(basket.values().sum::() >= 5); } } diff --git a/exercises/collections/hashmap2.rs b/exercises/collections/hashmap2.rs index 7e25be7c..f865fe1c 100644 --- a/exercises/collections/hashmap2.rs +++ b/exercises/collections/hashmap2.rs @@ -9,7 +9,7 @@ // // Make me pass the tests! // -// Execute the command `rustlings hint collections4` if you need +// Execute the command `rustlings hint hashmap2` if you need // hints. // I AM NOT DONE @@ -75,9 +75,7 @@ mod tests { fn greater_than_eleven_fruits() { let mut basket = get_fruit_basket(); fruit_basket(&mut basket); - let count = basket - .values() - .sum::(); + let count = basket.values().sum::(); assert!(count > 11); } } diff --git a/exercises/collections/vec1.rs b/exercises/collections/vec1.rs index f6bc837c..b144fb94 100644 --- a/exercises/collections/vec1.rs +++ b/exercises/collections/vec1.rs @@ -2,7 +2,7 @@ // Your task is to create a `Vec` which holds the exact same elements // as in the array `a`. // Make me compile and pass the test! -// Execute the command `rustlings hint collections1` if you need hints. +// Execute the command `rustlings hint vec1` if you need hints. // I AM NOT DONE diff --git a/exercises/collections/vec2.rs b/exercises/collections/vec2.rs index 08b6bbf5..6595e401 100644 --- a/exercises/collections/vec2.rs +++ b/exercises/collections/vec2.rs @@ -4,7 +4,7 @@ // // Make me pass the test! // -// Execute the command `rustlings hint collections2` if you need +// Execute the command `rustlings hint vec2` if you need // hints. // I AM NOT DONE From 8d62a9963708dbecd9312e8bcc4b47049c72d155 Mon Sep 17 00:00:00 2001 From: Matt Lebl Date: Fri, 19 Mar 2021 02:16:07 -0700 Subject: [PATCH 0297/1293] feat: Replace emojis when NO_EMOJI env variable present --- src/exercise.rs | 7 ++++++- src/ui.rs | 44 ++++++++++++++++++++++++++++++++++---------- src/verify.rs | 15 +++++++++++++-- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 18e8d5ab..2c5d835e 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -1,3 +1,4 @@ +use std::env; use regex::Regex; use serde::Deserialize; use std::fmt::{self, Display, Formatter}; @@ -126,8 +127,12 @@ name = "{}" path = "{}.rs""#, self.name, self.name, self.name ); + let cargo_toml_error_msg = match env::var("NO_EMOJI").is_ok() { + true => "Failed to write Clippy Cargo.toml file.", + false => "Failed to write πŸ“Ž Clippy πŸ“Ž Cargo.toml file." + }; fs::write(CLIPPY_CARGO_TOML_PATH, cargo_toml) - .expect("Failed to write πŸ“Ž Clippy πŸ“Ž Cargo.toml file."); + .expect(cargo_toml_error_msg); // To support the ability to run the clipy exercises, build // an executable, in addition to running clippy. With a // compilation failure, this would silently fail. But we expect diff --git a/src/ui.rs b/src/ui.rs index 38cbaa40..7ab87546 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,23 +1,47 @@ macro_rules! warn { ($fmt:literal, $ex:expr) => {{ + use std::env; use console::{style, Emoji}; let formatstr = format!($fmt, $ex); - println!( - "{} {}", - style(Emoji("⚠️ ", "!")).red(), - style(formatstr).red() - ); + match env::var("NO_EMOJI").is_ok() { + true => { + println!( + "{} {}", + style("!").red(), + style(formatstr).red() + ); + }, + false => { + println!( + "{} {}", + style(Emoji("⚠️ ", "!")).red(), + style(formatstr).red() + ); + } + } }}; } macro_rules! success { ($fmt:literal, $ex:expr) => {{ + use std::env; use console::{style, Emoji}; let formatstr = format!($fmt, $ex); - println!( - "{} {}", - style(Emoji("βœ…", "βœ“")).green(), - style(formatstr).green() - ); + match env::var("NO_EMOJI").is_ok() { + true => { + println!( + "{} {}", + style("βœ“").green(), + style(formatstr).green() + ); + }, + false => { + println!( + "{} {}", + style(Emoji("βœ…", "βœ“")).green(), + style(formatstr).green() + ); + } + } }}; } diff --git a/src/verify.rs b/src/verify.rs index 00e45c8c..04acfc68 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -1,3 +1,4 @@ +use std::env; use crate::exercise::{CompiledExercise, Exercise, Mode, State}; use console::style; use indicatif::ProgressBar; @@ -137,14 +138,24 @@ fn prompt_for_completion(exercise: &Exercise, prompt_output: Option) -> State::Pending(context) => context, }; + let no_emoji = env::var("NO_EMOJI").is_ok(); + + let clippy_success_msg = match no_emoji { + true => "The code is compiling, and Clippy is happy!", + false => "The code is compiling, and πŸ“Ž Clippy πŸ“Ž is happy!" + }; + let success_msg = match exercise.mode { Mode::Compile => "The code is compiling!", Mode::Test => "The code is compiling, and the tests pass!", - Mode::Clippy => "The code is compiling, and πŸ“Ž Clippy πŸ“Ž is happy!", + Mode::Clippy => clippy_success_msg, }; println!(); - println!("πŸŽ‰ πŸŽ‰ {} πŸŽ‰ πŸŽ‰", success_msg); + match no_emoji { + true => println!("~*~ {} ~*~", success_msg), + false => println!("πŸŽ‰ πŸŽ‰ {} πŸŽ‰ πŸŽ‰", success_msg) + }; println!(); if let Some(output) = prompt_output { From 01e7f27aa6ab9ba868f3997c1e5f5d3aa0bac57a Mon Sep 17 00:00:00 2001 From: Matt Lebl Date: Sat, 20 Mar 2021 11:52:57 -0700 Subject: [PATCH 0298/1293] refactor: change from match to if for NO_EMOJI --- src/exercise.rs | 7 ++++--- src/ui.rs | 54 ++++++++++++++++++++++--------------------------- src/verify.rs | 16 ++++++++------- 3 files changed, 37 insertions(+), 40 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 2c5d835e..3d2e38d1 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -127,9 +127,10 @@ name = "{}" path = "{}.rs""#, self.name, self.name, self.name ); - let cargo_toml_error_msg = match env::var("NO_EMOJI").is_ok() { - true => "Failed to write Clippy Cargo.toml file.", - false => "Failed to write πŸ“Ž Clippy πŸ“Ž Cargo.toml file." + let cargo_toml_error_msg = if env::var("NO_EMOJI").is_ok() { + "Failed to write Clippy Cargo.toml file." + } else { + "Failed to write πŸ“Ž Clippy πŸ“Ž Cargo.toml file." }; fs::write(CLIPPY_CARGO_TOML_PATH, cargo_toml) .expect(cargo_toml_error_msg); diff --git a/src/ui.rs b/src/ui.rs index 7ab87546..cb073372 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -3,21 +3,18 @@ macro_rules! warn { use std::env; use console::{style, Emoji}; let formatstr = format!($fmt, $ex); - match env::var("NO_EMOJI").is_ok() { - true => { - println!( - "{} {}", - style("!").red(), - style(formatstr).red() - ); - }, - false => { - println!( - "{} {}", - style(Emoji("⚠️ ", "!")).red(), - style(formatstr).red() - ); - } + if env::var("NO_EMOJI").is_ok() { + println!( + "{} {}", + style("!").red(), + style(formatstr).red() + ); + } else { + println!( + "{} {}", + style(Emoji("⚠️ ", "!")).red(), + style(formatstr).red() + ); } }}; } @@ -27,21 +24,18 @@ macro_rules! success { use std::env; use console::{style, Emoji}; let formatstr = format!($fmt, $ex); - match env::var("NO_EMOJI").is_ok() { - true => { - println!( - "{} {}", - style("βœ“").green(), - style(formatstr).green() - ); - }, - false => { - println!( - "{} {}", - style(Emoji("βœ…", "βœ“")).green(), - style(formatstr).green() - ); - } + if env::var("NO_EMOJI").is_ok() { + println!( + "{} {}", + style("βœ“").green(), + style(formatstr).green() + ); + } else { + println!( + "{} {}", + style(Emoji("βœ…", "βœ“")).green(), + style(formatstr).green() + ); } }}; } diff --git a/src/verify.rs b/src/verify.rs index 04acfc68..7a0e9ccd 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -140,9 +140,10 @@ fn prompt_for_completion(exercise: &Exercise, prompt_output: Option) -> let no_emoji = env::var("NO_EMOJI").is_ok(); - let clippy_success_msg = match no_emoji { - true => "The code is compiling, and Clippy is happy!", - false => "The code is compiling, and πŸ“Ž Clippy πŸ“Ž is happy!" + let clippy_success_msg = if no_emoji { + "The code is compiling, and Clippy is happy!" + } else { + "The code is compiling, and πŸ“Ž Clippy πŸ“Ž is happy!" }; let success_msg = match exercise.mode { @@ -152,10 +153,11 @@ fn prompt_for_completion(exercise: &Exercise, prompt_output: Option) -> }; println!(); - match no_emoji { - true => println!("~*~ {} ~*~", success_msg), - false => println!("πŸŽ‰ πŸŽ‰ {} πŸŽ‰ πŸŽ‰", success_msg) - }; + if no_emoji { + println!("~*~ {} ~*~", success_msg) + } else { + println!("πŸŽ‰ πŸŽ‰ {} πŸŽ‰ πŸŽ‰", success_msg) + } println!(); if let Some(output) = prompt_output { From 3df094713f4546745d4a9ea75cd75cba62473067 Mon Sep 17 00:00:00 2001 From: Rod Elias Date: Sat, 20 Mar 2021 17:12:49 -0300 Subject: [PATCH 0299/1293] chore: capitalize `c` letter By capitalizing the `c` letter it makes clear that we're talking about the C programming language. --- exercises/structs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/structs/README.md b/exercises/structs/README.md index d2d7dc24..72e0061b 100644 --- a/exercises/structs/README.md +++ b/exercises/structs/README.md @@ -1,6 +1,6 @@ ### Structs -Rust has three struct types: a classic c struct, a tuple struct, and a unit struct. +Rust has three struct types: a classic C struct, a tuple struct, and a unit struct. #### Book Sections From 550c4293ed269a7d888c384076ba247662af58c3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 20 Mar 2021 21:13:35 +0100 Subject: [PATCH 0300/1293] docs: add chapeupreto as a contributor (#678) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5239b29c..ccce9476 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -756,6 +756,15 @@ "contributions": [ "content" ] + }, + { + "login": "chapeupreto", + "name": "Rod Elias", + "avatar_url": "https://avatars.githubusercontent.com/u/834048?v=4", + "profile": "https://twitter.com/chapeupreto", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, diff --git a/README.md b/README.md index 85bba46d..995b4258 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-81-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-82-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -262,6 +262,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Pascal H.

πŸ–‹ +
Rod Elias

πŸ–‹ From 8dc587b01ab2e49a06308de29541330ff83dc371 Mon Sep 17 00:00:00 2001 From: marisa Date: Sun, 21 Mar 2021 16:34:21 +0100 Subject: [PATCH 0301/1293] chore: Update install URLs --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 995b4258..5871e3dc 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,9 @@ You will need to have Rust installed. You can get it by visiting https://rustup. Just run: ```bash -curl -L https://git.io/rustlings | bash +curl -L https://git.io/install-rustlings | bash # Or if you want it to be installed to a different path: -curl -L https://git.io/rustlings | bash -s mypath/ +curl -L https://git.io/install-rustlings | bash -s mypath/ ``` This will install Rustlings and give you access to the `rustlings` command. Run it to get started! @@ -42,7 +42,7 @@ Set-ExecutionPolicy RemoteSigned Then, you can run: ```ps -Start-BitsTransfer -Source https://git.io/rustlings-win -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 +Start-BitsTransfer -Source https://git.io/install-rustlings-win -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 ``` To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. From c163011cc0e3b0d9eaae7ae51aadba1cf9a2226e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 22 Mar 2021 12:37:01 +0000 Subject: [PATCH 0302/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5871e3dc..75e298fb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-82-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-83-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -263,6 +263,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Pascal H.

πŸ–‹
Rod Elias

πŸ–‹ +
Matt Lebl

πŸ’» From 2a6e4dc8a65a1658f55edc5fe63854197839b358 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 22 Mar 2021 12:37:02 +0000 Subject: [PATCH 0303/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ccce9476..4726b643 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -765,6 +765,15 @@ "contributions": [ "content" ] + }, + { + "login": "blerchy", + "name": "Matt Lebl", + "avatar_url": "https://avatars.githubusercontent.com/u/2555355?v=4", + "profile": "https://github.com/blerchy", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From a02b27975018f69c51147f5f8d9638a5f4e26811 Mon Sep 17 00:00:00 2001 From: marisa Date: Tue, 23 Mar 2021 09:10:40 +0100 Subject: [PATCH 0304/1293] chore: Provide a working Windows installation link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 75e298fb..b453bf41 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Set-ExecutionPolicy RemoteSigned Then, you can run: ```ps -Start-BitsTransfer -Source https://git.io/install-rustlings-win -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 +Start-BitsTransfer -Source https://git.io/JTL5v -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 ``` To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. From a6509cc4d545d8825f01ddf7ee37823b372154dd Mon Sep 17 00:00:00 2001 From: Ignacio Le Fluk Date: Sun, 4 Apr 2021 03:43:25 -0400 Subject: [PATCH 0305/1293] fix(functions3): improve function argument type (#687) --- exercises/functions/functions3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/functions/functions3.rs b/exercises/functions/functions3.rs index e3c1bf73..ed5f839f 100644 --- a/exercises/functions/functions3.rs +++ b/exercises/functions/functions3.rs @@ -7,7 +7,7 @@ fn main() { call_me(); } -fn call_me(num: i32) { +fn call_me(num: u32) { for i in 0..num { println!("Ring! Call number {}", i + 1); } From aec2c65c632c94793d23fbb1fb826dd78e59ffdf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 4 Apr 2021 07:43:50 +0000 Subject: [PATCH 0306/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b453bf41..479a307c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-83-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-84-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -264,6 +264,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Pascal H.

πŸ–‹
Rod Elias

πŸ–‹
Matt Lebl

πŸ’» +
Ignacio Le Fluk

πŸ–‹ From 2193fff4bb5e6becee03b1e9c37ee5069e6c9138 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 4 Apr 2021 07:43:51 +0000 Subject: [PATCH 0307/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4726b643..b0975cfe 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -774,6 +774,15 @@ "contributions": [ "code" ] + }, + { + "login": "flakolefluk", + "name": "Ignacio Le Fluk", + "avatar_url": "https://avatars.githubusercontent.com/u/11986564?v=4", + "profile": "http://flakolefluk.dev", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 2e93a588e0abe8badb7eafafb9e7d073c2be5df8 Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Sun, 4 Apr 2021 00:04:03 -0500 Subject: [PATCH 0308/1293] fix: use trait objects for try_from_into Use `Box` to allow solutions to use `?` to propagate errors. In the tests, explicitly check `is_ok()` instead of trying to force the error type to `String` (or other `PartialEq` type) using `assert_eq!()`. --- exercises/conversions/try_from_into.rs | 40 ++++++++++++++------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index e405c3f4..c0b5d986 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -3,6 +3,7 @@ // instead of the target type itself. // You can read more about it at https://doc.rust-lang.org/std/convert/trait.TryFrom.html use std::convert::{TryFrom, TryInto}; +use std::error; #[derive(Debug, PartialEq)] struct Color { @@ -24,19 +25,19 @@ struct Color { // Tuple implementation impl TryFrom<(i16, i16, i16)> for Color { - type Error = String; + type Error = Box; fn try_from(tuple: (i16, i16, i16)) -> Result {} } // Array implementation impl TryFrom<[i16; 3]> for Color { - type Error = String; + type Error = Box; fn try_from(arr: [i16; 3]) -> Result {} } // Slice implementation impl TryFrom<&[i16]> for Color { - type Error = String; + type Error = Box; fn try_from(slice: &[i16]) -> Result {} } @@ -76,41 +77,43 @@ mod tests { } #[test] fn test_tuple_correct() { - let c: Result = (183, 65, 14).try_into(); + let c: Result = (183, 65, 14).try_into(); + assert!(c.is_ok()); assert_eq!( - c, - Ok(Color { + c.unwrap(), + Color { red: 183, green: 65, blue: 14 - }) + } ); } #[test] fn test_array_out_of_range_positive() { - let c: Result = [1000, 10000, 256].try_into(); + let c: Result = [1000, 10000, 256].try_into(); assert!(c.is_err()); } #[test] fn test_array_out_of_range_negative() { - let c: Result = [-10, -256, -1].try_into(); + let c: Result = [-10, -256, -1].try_into(); assert!(c.is_err()); } #[test] fn test_array_sum() { - let c: Result = [-1, 255, 255].try_into(); + let c: Result = [-1, 255, 255].try_into(); assert!(c.is_err()); } #[test] fn test_array_correct() { - let c: Result = [183, 65, 14].try_into(); + let c: Result = [183, 65, 14].try_into(); + assert!(c.is_ok()); assert_eq!( - c, - Ok(Color { + c.unwrap(), + Color { red: 183, green: 65, blue: 14 - }) + } ); } #[test] @@ -131,14 +134,15 @@ mod tests { #[test] fn test_slice_correct() { let v = vec![183, 65, 14]; - let c: Result = Color::try_from(&v[..]); + let c: Result = Color::try_from(&v[..]); + assert!(c.is_ok()); assert_eq!( - c, - Ok(Color { + c.unwrap(), + Color { red: 183, green: 65, blue: 14 - }) + } ); } #[test] From c3e7b831786c9172ed8bd5d150f3c432f242fba9 Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Sun, 4 Apr 2021 18:43:38 -0500 Subject: [PATCH 0309/1293] fix: use trait objects for from_str Use `Box` to allow solutions to use `?` to propagate errors. --- exercises/conversions/from_str.rs | 3 ++- info.toml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 41fccd7e..4beebacd 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -2,6 +2,7 @@ // Additionally, upon implementing FromStr, you can use the `parse` method // on strings to generate an object of the implementor type. // You can read more about it at https://doc.rust-lang.org/std/str/trait.FromStr.html +use std::error; use std::str::FromStr; #[derive(Debug)] @@ -23,7 +24,7 @@ struct Person { // If everything goes well, then return a Result of a Person object impl FromStr for Person { - type Err = String; + type Err = Box; fn from_str(s: &str) -> Result { } } diff --git a/info.toml b/info.toml index 2068750a..4a1d3aa3 100644 --- a/info.toml +++ b/info.toml @@ -884,5 +884,5 @@ path = "exercises/conversions/from_str.rs" mode = "test" hint = """ The implementation of FromStr should return an Ok with a Person object, -or an Err with a string if the string is not valid. +or an Err with an error if the string is not valid. This is almost like the `try_from_into` exercise.""" From 1ad20d94ff6982e66561d03727e52f04ffa8756b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 5 Apr 2021 11:27:16 +0000 Subject: [PATCH 0310/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 479a307c..6ffef489 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-84-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-85-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -265,6 +265,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Rod Elias

πŸ–‹
Matt Lebl

πŸ’»
Ignacio Le Fluk

πŸ–‹ +
Taylor Yu

πŸ’» πŸ–‹ From 1a6a725f882ac25b4ed12cd960fdc3aad9b80eb3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 5 Apr 2021 11:27:17 +0000 Subject: [PATCH 0311/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b0975cfe..c7f10be4 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -783,6 +783,16 @@ "contributions": [ "content" ] + }, + { + "login": "tlyu", + "name": "Taylor Yu", + "avatar_url": "https://avatars.githubusercontent.com/u/431873?v=4", + "profile": "https://github.com/tlyu", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 8, From b790bafc02b6cbeab928a5ddeba30ed8b111a817 Mon Sep 17 00:00:00 2001 From: WowSuchRicky Date: Fri, 9 Apr 2021 14:08:02 -0700 Subject: [PATCH 0312/1293] Rename lichi to lychee in the fruit example --- exercises/collections/hashmap2.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/exercises/collections/hashmap2.rs b/exercises/collections/hashmap2.rs index 7e25be7c..cacdf203 100644 --- a/exercises/collections/hashmap2.rs +++ b/exercises/collections/hashmap2.rs @@ -4,7 +4,7 @@ // represents the name of the fruit and the value represents how many // of that particular fruit is in the basket. You have to put *MORE // THAN 11* fruits in the basket. Three types of fruits - Apple (4), -// Mango (2) and Lichi (5) are already given in the basket. You are +// Mango (2) and Lychee (5) are already given in the basket. You are // not allowed to insert any more of these fruits! // // Make me pass the tests! @@ -21,7 +21,7 @@ enum Fruit { Apple, Banana, Mango, - Lichi, + Lychee, Pineapple, } @@ -30,7 +30,7 @@ fn fruit_basket(basket: &mut HashMap) { Fruit::Apple, Fruit::Banana, Fruit::Mango, - Fruit::Lichi, + Fruit::Lychee, Fruit::Pineapple, ]; @@ -49,7 +49,7 @@ mod tests { let mut basket = HashMap::::new(); basket.insert(Fruit::Apple, 4); basket.insert(Fruit::Mango, 2); - basket.insert(Fruit::Lichi, 5); + basket.insert(Fruit::Lychee, 5); basket } @@ -60,7 +60,7 @@ mod tests { fruit_basket(&mut basket); assert_eq!(*basket.get(&Fruit::Apple).unwrap(), 4); assert_eq!(*basket.get(&Fruit::Mango).unwrap(), 2); - assert_eq!(*basket.get(&Fruit::Lichi).unwrap(), 5); + assert_eq!(*basket.get(&Fruit::Lychee).unwrap(), 5); } #[test] From c0e3daacaf6850811df5bc57fa43e0f249d5cfa4 Mon Sep 17 00:00:00 2001 From: Zerotask Date: Sun, 18 Apr 2021 15:37:41 +0200 Subject: [PATCH 0313/1293] feat(list): added progress info Added a progress info at the bottom of the list for command: rustlings list closes #705 --- src/main.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 569aa4ac..73647234 100644 --- a/src/main.rs +++ b/src/main.rs @@ -138,13 +138,19 @@ fn main() { println!("{:<17}\t{:<46}\t{:<7}", "Name", "Path", "Status"); } let filters = list_m.value_of("filter").unwrap_or_default().to_lowercase(); + let mut exercises_done: u16 = 0; exercises.iter().for_each(|e| { let fname = format!("{}", e.path.display()); let filter_cond = filters .split(',') .filter(|f| !f.trim().is_empty()) .any(|f| e.name.contains(&f) || fname.contains(&f)); - let status = if e.looks_done() { "Done" } else { "Pending" }; + let status = if e.looks_done() { + exercises_done = exercises_done + 1; + "Done" + } else { + "Pending" + }; let solve_cond = { (e.looks_done() && list_m.is_present("solved")) || (!e.looks_done() && list_m.is_present("unsolved")) @@ -173,6 +179,13 @@ fn main() { } } }); + let percentage_progress = exercises_done as f32 / exercises.len() as f32; + println!( + "Progress: You completed {} / {} exercises ({:.2} %).", + exercises_done, + exercises.len(), + percentage_progress + ); std::process::exit(0); } @@ -314,7 +327,7 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result<()> { .chain( exercises .iter() - .filter(|e| !e.looks_done() && !filepath.ends_with(&e.path)) + .filter(|e| !e.looks_done() && !filepath.ends_with(&e.path)), ); clear_screen(); match verify(pending_exercises, verbose) { From bd48544e25bb58f86fee1b1a5004e961996a3388 Mon Sep 17 00:00:00 2001 From: Zerotask Date: Sun, 18 Apr 2021 15:40:47 +0200 Subject: [PATCH 0314/1293] style: formatted files with rustfmt --- src/exercise.rs | 5 ++--- src/ui.rs | 16 ++++------------ src/verify.rs | 2 +- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 3d2e38d1..e9d1c1c9 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -1,6 +1,6 @@ -use std::env; use regex::Regex; use serde::Deserialize; +use std::env; use std::fmt::{self, Display, Formatter}; use std::fs::{self, remove_file, File}; use std::io::Read; @@ -132,8 +132,7 @@ path = "{}.rs""#, } else { "Failed to write πŸ“Ž Clippy πŸ“Ž Cargo.toml file." }; - fs::write(CLIPPY_CARGO_TOML_PATH, cargo_toml) - .expect(cargo_toml_error_msg); + fs::write(CLIPPY_CARGO_TOML_PATH, cargo_toml).expect(cargo_toml_error_msg); // To support the ability to run the clipy exercises, build // an executable, in addition to running clippy. With a // compilation failure, this would silently fail. But we expect diff --git a/src/ui.rs b/src/ui.rs index cb073372..1ee46316 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,14 +1,10 @@ macro_rules! warn { ($fmt:literal, $ex:expr) => {{ - use std::env; use console::{style, Emoji}; + use std::env; let formatstr = format!($fmt, $ex); if env::var("NO_EMOJI").is_ok() { - println!( - "{} {}", - style("!").red(), - style(formatstr).red() - ); + println!("{} {}", style("!").red(), style(formatstr).red()); } else { println!( "{} {}", @@ -21,15 +17,11 @@ macro_rules! warn { macro_rules! success { ($fmt:literal, $ex:expr) => {{ - use std::env; use console::{style, Emoji}; + use std::env; let formatstr = format!($fmt, $ex); if env::var("NO_EMOJI").is_ok() { - println!( - "{} {}", - style("βœ“").green(), - style(formatstr).green() - ); + println!("{} {}", style("βœ“").green(), style(formatstr).green()); } else { println!( "{} {}", diff --git a/src/verify.rs b/src/verify.rs index 7a0e9ccd..b98598a8 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -1,7 +1,7 @@ -use std::env; use crate::exercise::{CompiledExercise, Exercise, Mode, State}; use console::style; use indicatif::ProgressBar; +use std::env; // Verify that the provided container of Exercise objects // can be compiled and run without any failures. From e2c41903ad491df5c0c59c389e3f568dd2485611 Mon Sep 17 00:00:00 2001 From: Zerotask Date: Sun, 18 Apr 2021 16:07:30 +0200 Subject: [PATCH 0315/1293] docs: added hint for rustlings list command Added hint for `rustlings list` to the "Doing exercises" section. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 6ffef489..19ec6ce4 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,11 @@ exercise: rustlings hint myExercise1 ``` +To check your progress, you can run the following command: +```bash +rustlings list +``` + ## Testing yourself After every couple of sections, there will be a quiz that'll test your knowledge on a bunch of sections at once. These quizzes are found in `exercises/quizN.rs`. From 1c6f7e4b7b9b3bd36f4da2bb2b69c549cc8bd913 Mon Sep 17 00:00:00 2001 From: Patrick Hintermayer Date: Mon, 19 Apr 2021 09:39:05 +0200 Subject: [PATCH 0316/1293] feat(list): updated progress percentage --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 73647234..3b7a1942 100644 --- a/src/main.rs +++ b/src/main.rs @@ -179,7 +179,7 @@ fn main() { } } }); - let percentage_progress = exercises_done as f32 / exercises.len() as f32; + let percentage_progress = exercises_done as f32 / exercises.len() as f32 * 100.0; println!( "Progress: You completed {} / {} exercises ({:.2} %).", exercises_done, From 2612edc133c8ec6e2c10c13ed9c86019ea6d27d9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 20 Apr 2021 09:09:30 +0000 Subject: [PATCH 0317/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6ffef489..ed0095cf 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-85-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-86-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -266,6 +266,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Matt Lebl

πŸ’»
Ignacio Le Fluk

πŸ–‹
Taylor Yu

πŸ’» πŸ–‹ +
Patrick Hintermayer

πŸ’» From 63c942233e8e9fe1171e51acf35d8dc93897471b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 20 Apr 2021 09:09:31 +0000 Subject: [PATCH 0318/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c7f10be4..8621df10 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -793,6 +793,15 @@ "code", "content" ] + }, + { + "login": "Zerotask", + "name": "Patrick Hintermayer", + "avatar_url": "https://avatars.githubusercontent.com/u/20150243?v=4", + "profile": "https://zerotask.github.io", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 72aaa15e6ab4b72b3422f1c6356396e20a2a2bb8 Mon Sep 17 00:00:00 2001 From: Pete Pavlovski Date: Tue, 20 Apr 2021 12:15:49 +0300 Subject: [PATCH 0319/1293] fix(hashmap2): Update incorrect assertion (#660) The test description says "at least five types of fruit", but the test itself is checking for exactly five types of fruit, which was a bit misleading for newcomers like me :) A simple change from "==" to ">=" should do the trick and successfully check for the "at least" condition. --- exercises/collections/hashmap2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/collections/hashmap2.rs b/exercises/collections/hashmap2.rs index c8698fed..0abe19ab 100644 --- a/exercises/collections/hashmap2.rs +++ b/exercises/collections/hashmap2.rs @@ -68,7 +68,7 @@ mod tests { let mut basket = get_fruit_basket(); fruit_basket(&mut basket); let count_fruit_kinds = basket.len(); - assert!(count_fruit_kinds == 5); + assert!(count_fruit_kinds >= 5); } #[test] From a941c69f09c7349ff578da348a075a146c1005b6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 20 Apr 2021 09:16:15 +0000 Subject: [PATCH 0320/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 760565e2..10b7c1cf 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-86-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-87-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -272,6 +272,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Ignacio Le Fluk

πŸ–‹
Taylor Yu

πŸ’» πŸ–‹
Patrick Hintermayer

πŸ’» +
Pete Pavlovski

πŸ–‹ From bdf01aa174533d5908e83a7ed3113b62f4eb6fe3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 20 Apr 2021 09:16:16 +0000 Subject: [PATCH 0321/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8621df10..0b490899 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -802,6 +802,15 @@ "contributions": [ "code" ] + }, + { + "login": "arthas168", + "name": "Pete Pavlovski", + "avatar_url": "https://avatars.githubusercontent.com/u/32264020?v=4", + "profile": "https://petkopavlovski.com/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From b4de6594380636817d13c2677ec6f472a964cf43 Mon Sep 17 00:00:00 2001 From: k12ish <45272873+k12ish@users.noreply.github.com> Date: Tue, 20 Apr 2021 10:18:05 +0100 Subject: [PATCH 0322/1293] fix(option2): Rename uninformative variables (#675) Renaming uninformative names like `optional_value`, `value`, `optional_values_vec` and `value` helps users distinguish between the two parts of the task. --- exercises/option/option2.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/exercises/option/option2.rs b/exercises/option/option2.rs index a1517d7c..c6b83ece 100644 --- a/exercises/option/option2.rs +++ b/exercises/option/option2.rs @@ -4,22 +4,22 @@ // I AM NOT DONE fn main() { - let optional_value = Some(String::from("rustlings")); + let optional_word = Some(String::from("rustlings")); // TODO: Make this an if let statement whose value is "Some" type - value = optional_value { - println!("the value of optional value is: {}", value); + word = optional_word { + println!("The word is: {}", word); } else { - println!("The optional value doesn't contain anything!"); + println!("The optional word doesn't contain anything"); } - let mut optional_values_vec: Vec> = Vec::new(); + let mut optional_integers_vec: Vec> = Vec::new(); for x in 1..10 { - optional_values_vec.push(Some(x)); + optional_integers_vec.push(Some(x)); } // TODO: make this a while let statement - remember that vector.pop also adds another layer of Option // You can stack `Option`'s into while let and if let - value = optional_values_vec.pop() { - println!("current value: {}", value); + integer = optional_integers_vec.pop() { + println!("current value: {}", integer); } } From 472f61485e49864d62901ee024ed5c8a18b861a0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 20 Apr 2021 09:18:22 +0000 Subject: [PATCH 0323/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 10b7c1cf..721c63a0 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-87-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-88-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -273,6 +273,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Taylor Yu

πŸ’» πŸ–‹
Patrick Hintermayer

πŸ’»
Pete Pavlovski

πŸ–‹ +
k12ish

πŸ–‹ From 65cdc856aec4f86c7b513d2b85d3357e5a9b3a4f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 20 Apr 2021 09:18:23 +0000 Subject: [PATCH 0324/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0b490899..a2473872 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -811,6 +811,15 @@ "contributions": [ "content" ] + }, + { + "login": "k12ish", + "name": "k12ish", + "avatar_url": "https://avatars.githubusercontent.com/u/45272873?v=4", + "profile": "https://github.com/k12ish", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 6bd791f2f44aa7f0ad926df767f6b1fa8f12a9a9 Mon Sep 17 00:00:00 2001 From: Shao Yang Hong Date: Tue, 20 Apr 2021 17:19:24 +0800 Subject: [PATCH 0325/1293] fix(structs): Add 5.3 to structs/README (#652) Co-authored-by: Shao Yang Hong --- exercises/structs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/structs/README.md b/exercises/structs/README.md index 72e0061b..58e5a6a4 100644 --- a/exercises/structs/README.md +++ b/exercises/structs/README.md @@ -5,3 +5,4 @@ Rust has three struct types: a classic C struct, a tuple struct, and a unit stru #### Book Sections - [Structures](https://doc.rust-lang.org/book/ch05-01-defining-structs.html) +- [Method Syntax](https://doc.rust-lang.org/book/ch05-03-method-syntax.html) From fab2eb98333434079a3ace6c7d0aa31892bd49cb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 20 Apr 2021 09:19:38 +0000 Subject: [PATCH 0326/1293] docs: update README.md [skip ci] --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 721c63a0..2d2cb0ef 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-88-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-89-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -275,6 +275,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Pete Pavlovski

πŸ–‹
k12ish

πŸ–‹ + +
Shao Yang Hong

πŸ–‹ + From eadd41a9ecb05e3278a988f752e77608ded136fa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 20 Apr 2021 09:19:39 +0000 Subject: [PATCH 0327/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a2473872..e820b426 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -820,6 +820,15 @@ "contributions": [ "content" ] + }, + { + "login": "hongshaoyang", + "name": "Shao Yang Hong", + "avatar_url": "https://avatars.githubusercontent.com/u/19281800?v=4", + "profile": "https://github.com/hongshaoyang", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 9c88ea91266c84901fd46496902610241dab3baf Mon Sep 17 00:00:00 2001 From: apogeeoak <59737221+apogeeoak@users.noreply.github.com> Date: Tue, 20 Apr 2021 18:52:10 -0400 Subject: [PATCH 0328/1293] Improved iterators5.rs explanation. --- .../standard_library_types/iterators5.rs | 51 +++++++++++-------- info.toml | 11 ++-- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/exercises/standard_library_types/iterators5.rs b/exercises/standard_library_types/iterators5.rs index 65c50e62..2d97bd46 100644 --- a/exercises/standard_library_types/iterators5.rs +++ b/exercises/standard_library_types/iterators5.rs @@ -1,11 +1,14 @@ // iterators5.rs -// Rustling progress is modelled using a hash map. The name of the exercise is -// the key and the progress is the value. Two counting functions were created -// to count the number of exercises with a given progress. These counting -// functions use imperative style for loops. Recreate this counting -// functionality using iterators. -// Execute `rustlings hint iterators5` for hints. +// Let's define a simple model to track Rustlings exercise progress. Progress +// will be modelled using a hash map. The name of the exercise is the key and +// the progress is the value. Two counting functions were created to count the +// number of exercises with a given progress. These counting functions use +// imperative style for loops. Recreate this counting functionality using +// iterators. Only the two iterator methods (count_iterator and +// count_collection_iterator) need to be modified. +// Execute `rustlings hint +// iterators5` for hints. // // Make the code compile and the tests pass. @@ -30,12 +33,14 @@ fn count_for(map: &HashMap, value: Progress) -> usize { count } -fn count(map: &HashMap, value: Progress) -> usize { +fn count_iterator(map: &HashMap, value: Progress) -> usize { + // map is a hashmap with String keys and Progress values. + // map = { "variables1": Complete, "from_str": None, ... } } -fn count_stack_for(stack: &[HashMap], value: Progress) -> usize { +fn count_collection_for(collection: &[HashMap], value: Progress) -> usize { let mut count = 0; - for map in stack { + for map in collection { for val in map.values() { if val == &value { count += 1; @@ -45,7 +50,10 @@ fn count_stack_for(stack: &[HashMap], value: Progress) -> usiz count } -fn count_stack(stack: &[HashMap], value: Progress) -> usize { +fn count_collection_iterator(collection: &[HashMap], value: Progress) -> usize { + // collection is a slice of hashmaps. + // collection = [{ "variables1": Complete, "from_str": None, ... }, + // { "variables2": Complete, ... }, ... ] } #[cfg(test)] @@ -55,7 +63,7 @@ mod tests { #[test] fn count_complete() { let map = get_map(); - assert_eq!(3, count(&map, Progress::Complete)); + assert_eq!(3, count_iterator(&map, Progress::Complete)); } #[test] @@ -63,22 +71,25 @@ mod tests { let map = get_map(); assert_eq!( count_for(&map, Progress::Complete), - count(&map, Progress::Complete) + count_iterator(&map, Progress::Complete) ); } #[test] - fn count_stack_complete() { - let stack = get_map_stack(); - assert_eq!(6, count_stack(&stack, Progress::Complete)); + fn count_collection_complete() { + let collection = get_vec_map(); + assert_eq!( + 6, + count_collection_iterator(&collection, Progress::Complete) + ); } #[test] - fn count_stack_equals_for() { - let stack = get_map_stack(); + fn count_collection_equals_for() { + let collection = get_vec_map(); assert_eq!( - count_stack_for(&stack, Progress::Complete), - count_stack(&stack, Progress::Complete) + count_collection_for(&collection, Progress::Complete), + count_collection_iterator(&collection, Progress::Complete) ); } @@ -96,7 +107,7 @@ mod tests { map } - fn get_map_stack() -> Vec> { + fn get_vec_map() -> Vec> { use Progress::*; let map = get_map(); diff --git a/info.toml b/info.toml index 646bb5a5..65f671ac 100644 --- a/info.toml +++ b/info.toml @@ -694,7 +694,7 @@ Step 2 & step 2.1: Very similar to the lines above and below. You've got this! Step 3: An iterator goes through all elements in a collection, but what if we've run out of -elements? What should we expect here? If you're stuck, take a look at +elements? What should we expect here? If you're stuck, take a look at https://doc.rust-lang.org/std/iter/trait.Iterator.html for some ideas. """ @@ -749,12 +749,13 @@ hint = """ The documentation for the std::iter::Iterator trait contains numerous methods that would be helpful here. -Return 0 from count_stack to make the code compile in order to test count. +Return 0 from count_collection_iterator to make the code compile in order to +test count_iterator. -The stack variable in count_stack is a slice of HashMaps. It needs to be -converted into an iterator in order to use the iterator methods. +The collection variable in count_collection_iterator is a slice of HashMaps. It +needs to be converted into an iterator in order to use the iterator methods. -The fold method can be useful in the count_stack function.""" +The fold method can be useful in the count_collection_iterator function.""" # THREADS From 7928122fcef9ca7834d988b1ec8ca0687478beeb Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 20 Apr 2021 12:46:49 +0200 Subject: [PATCH 0329/1293] feat: Replace clap with argh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I’ve been wanting to do this for a while, but always procrastinated on it. We’ve been using Clap since the 2.0 rewrite, but Clap is known to be a fairly heavy library. Since Rustlings is usually peoples’ first contact with a Rust compilation, I think it’s in our best interests that this complation is as fast as possible. In effect, replacing Clap with the smaller, structopt-style `argh` reduces the amount of crates needing to be compiled from 82 to 60. I also think this makes the code way easier to read, we don’t need to use Clap’s methods anymore, but can switch over to using pure Rust methods, e.g., switches are booleans, options are Options or the like, and subcommands are just structs. --- Cargo.lock | 543 +++++++++++++++++------------------------------- Cargo.toml | 2 +- src/exercise.rs | 4 +- src/main.rs | 431 +++++++++++++++++++------------------- 4 files changed, 405 insertions(+), 575 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4a4313e7..367881c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,22 +2,42 @@ # It is not intended for manual editing. [[package]] name = "aho-corasick" -version = "0.7.3" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" +checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" dependencies = [ "memchr", ] [[package]] -name = "ansi_term" -version = "0.11.0" +name = "argh" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +checksum = "91792f088f87cdc7a2cfb1d617fa5ea18d7f1dc22ef0e1b5f82f3157cdc522be" dependencies = [ - "winapi 0.3.8", + "argh_derive", + "argh_shared", ] +[[package]] +name = "argh_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4eb0c0c120ad477412dc95a4ce31e38f2113e46bd13511253f79196ca68b067" +dependencies = [ + "argh_shared", + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "argh_shared" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781f336cc9826dbaddb9754cb5db61e64cab4f69668bd19dcc4a0394a86f4cb1" + [[package]] name = "assert_cmd" version = "0.11.1" @@ -32,67 +52,49 @@ dependencies = [ [[package]] name = "atty" -version = "0.2.11" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ + "hermit-abi", "libc", - "termion", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] name = "autocfg" -version = "0.1.4" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "bitflags" -version = "1.0.4" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "cfg-if" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] -name = "clap" -version = "2.33.0" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" -dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim", - "textwrap", - "unicode-width", - "vec_map", -] +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clicolors-control" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73abfd4c73d003a674ce5d2933fca6ce6c42480ea84a5ffe0a2dc39ed56300f9" +checksum = "90082ee5dcdd64dc4e9e0d37fbf3ee325419e39c0092191e0393df65518f741e" dependencies = [ "atty", "lazy_static", "libc", - "winapi 0.3.8", -] - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags", + "winapi 0.3.9", ] [[package]] @@ -110,23 +112,22 @@ dependencies = [ "regex", "termios", "unicode-width", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] name = "console" -version = "0.8.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b147390a412132d75d10dd3b7b175a69cf5fd95032f7503c7091b8831ba10242" +checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45" dependencies = [ - "clicolors-control", "encode_unicode", "lazy_static", "libc", "regex", - "termios", + "terminal_size", "unicode-width", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -137,9 +138,9 @@ checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" [[package]] name = "encode_unicode" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90b2c9496c001e8cb61827acdefad780795c42264c137744cae6f7d9e3450abd" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "escargot" @@ -155,20 +156,21 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.5" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f8c63033fcba1f51ef744505b3cad42510432b904c062afa67ad7ece008429d" +checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall", + "winapi 0.3.9", ] [[package]] name = "float-cmp" -version = "0.4.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134a8fa843d80a51a5b77d36d42bc2def9edcb0262c914861d08129fd1926600" +checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4" dependencies = [ "num-traits", ] @@ -192,12 +194,6 @@ dependencies = [ "libc", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -220,13 +216,31 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +[[package]] +name = "heck" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +dependencies = [ + "libc", +] + [[package]] name = "indicatif" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ecd1e2ee08e6c255ce890f5a99d17000850e664e7acf119fb03b25b0575bfe" dependencies = [ - "console 0.8.0", + "console 0.14.1", "lazy_static", "number_prefix", "parking_lot", @@ -235,9 +249,9 @@ dependencies = [ [[package]] name = "inotify" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e40d6fd5d64e2082e0c796495c8ef5ad667a96d03e5aaa0becfd9d47bcbfb8" +checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" dependencies = [ "bitflags", "inotify-sys", @@ -246,28 +260,36 @@ dependencies = [ [[package]] name = "inotify-sys" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e74a1aa87c59aeff6ef2cc2fa62d41bc43f54952f55652656b18a02fd5e356c0" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" dependencies = [ "libc", ] +[[package]] +name = "instant" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "iovec" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" dependencies = [ "libc", - "winapi 0.2.8", ] [[package]] name = "itoa" -version = "0.4.4" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "kernel32-sys" @@ -281,52 +303,53 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lazycell" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.58" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6281b86796ba5e4366000be6e9e18bf35580adf9e63fbe2294aadb587613a319" +checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41" [[package]] name = "lock_api" -version = "0.2.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" +checksum = "5a3c91c24eae6777794bb1997ad98bbb87daf92890acab859f7eaa4320333176" dependencies = [ "scopeguard", ] [[package]] name = "log" -version = "0.4.6" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] name = "memchr" -version = "2.2.0" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" [[package]] name = "mio" -version = "0.6.19" +version = "0.6.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" +checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" dependencies = [ + "cfg-if 0.1.10", "fuchsia-zircon", "fuchsia-zircon-sys", "iovec", @@ -341,9 +364,9 @@ dependencies = [ [[package]] name = "mio-extras" -version = "2.0.5" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" +checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" dependencies = [ "lazycell", "log", @@ -353,9 +376,9 @@ dependencies = [ [[package]] name = "miow" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" +checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" dependencies = [ "kernel32-sys", "net2", @@ -365,26 +388,26 @@ dependencies = [ [[package]] name = "net2" -version = "0.2.33" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" +checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] name = "normalize-line-endings" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e0a1a39eab95caf4f5556da9289b9e68f0aafac901b2ce80daaf020d3b733a8" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] name = "notify" -version = "4.0.15" +version = "4.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80ae4a7688d1fab81c5bf19c64fc8db920be8d519ce6336ed4e7efe024724dbd" +checksum = "2599080e87c9bd051ddb11b10074f4da7b1223298df65d4c2ec5bcf309af1533" dependencies = [ "bitflags", "filetime", @@ -395,14 +418,14 @@ dependencies = [ "mio", "mio-extras", "walkdir", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] name = "num-traits" -version = "0.2.8" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" dependencies = [ "autocfg", ] @@ -416,44 +439,36 @@ dependencies = [ "num-traits", ] -[[package]] -name = "numtoa" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" - [[package]] name = "parking_lot" -version = "0.8.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" dependencies = [ + "instant", "lock_api", "parking_lot_core", - "rustc_version", ] [[package]] name = "parking_lot_core" -version = "0.5.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" +checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" dependencies = [ - "cfg-if", - "cloudabi", + "cfg-if 1.0.0", + "instant", "libc", - "rand", "redox_syscall", - "rustc_version", "smallvec", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] name = "predicates" -version = "1.0.1" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e09015b0d3f5a0ec2d4428f7559bb7b3fff341b4e159fedd1d57fac8b939ff" +checksum = "eeb433456c1a57cc93554dea3ce40b4c19c4057e41c55d4a0f3d84ea71c325aa" dependencies = [ "difference", "float-cmp", @@ -464,15 +479,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06075c3a3e92559ff8929e7a280684489ea27fe44805174c3ebd9328dcb37178" +checksum = "57e35a3326b75e49aa85f5dc6ec15b41108cf5aee58eabb1f274dd18b73c2451" [[package]] name = "predicates-tree" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e63c4859013b38a76eca2414c64911fba30def9e3202ac461a2d22831220124" +checksum = "15f553275e5721409451eb85e15fd9a860a6e5ab4496eb215987502b5f5391f2" dependencies = [ "predicates-core", "treeline", @@ -480,189 +495,54 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "0.4.30" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" dependencies = [ "unicode-xid", ] [[package]] name = "quote" -version = "0.6.12" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg", - "libc", - "rand_chacha", - "rand_core 0.4.0", - "rand_hc", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi 0.3.8", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg", - "rand_core 0.3.1", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.0", -] - -[[package]] -name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.0", - "winapi 0.3.8", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.0", - "rdrand", - "winapi 0.3.8", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg", - "rand_core 0.4.0", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - [[package]] name = "redox_syscall" -version = "0.1.54" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" - -[[package]] -name = "redox_termios" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" +checksum = "8270314b5ccceb518e7e578952f0b72b88222d02e8f77f5ecf7abbb673539041" dependencies = [ - "redox_syscall", + "bitflags", ] [[package]] name = "regex" -version = "1.1.6" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19" dependencies = [ "aho-corasick", "memchr", "regex-syntax", - "thread_local", - "utf8-ranges", ] [[package]] name = "regex-syntax" -version = "0.6.6" +version = "0.6.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" -dependencies = [ - "ucd-util", -] - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] +checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" [[package]] name = "rustlings" version = "4.3.0" dependencies = [ + "argh", "assert_cmd", - "clap", "console 0.7.7", "glob", "indicatif", @@ -675,54 +555,39 @@ dependencies = [ [[package]] name = "ryu" -version = "0.2.8" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "same-file" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] [[package]] name = "scopeguard" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.92" +version = "1.0.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32746bf0f26eab52f06af0d0aa1984f641341d06d8d673c693871da2d188c9be" +checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.92" +version = "1.0.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a3223d0c9ba936b61c0d2e3e559e3217dbfb8d65d06d26e8b3c25de38bae3e" +checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" dependencies = [ "proc-macro2", "quote", @@ -731,9 +596,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.39" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" dependencies = [ "itoa", "ryu", @@ -748,21 +613,15 @@ checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "smallvec" -version = "0.6.9" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "syn" -version = "0.15.34" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +checksum = "48fe99c6bd8b1cc636890bcc071842de909d902c81ac7dab53ba33c421ab8ffb" dependencies = [ "proc-macro2", "quote", @@ -770,44 +629,24 @@ dependencies = [ ] [[package]] -name = "termion" -version = "1.5.2" +name = "terminal_size" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" +checksum = "86ca8ced750734db02076f44132d802af0b33b09942331f4459dde8636fd2406" dependencies = [ "libc", - "numtoa", - "redox_syscall", - "redox_termios", + "winapi 0.3.9", ] [[package]] name = "termios" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b620c5ea021d75a735c943269bb07d30c9b77d6ac6b236bc8b5c496ef05625" +checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" dependencies = [ "libc", ] -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "thread_local" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -dependencies = [ - "lazy_static", -] - [[package]] name = "toml" version = "0.4.10" @@ -824,43 +663,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" [[package]] -name = "ucd-util" -version = "0.1.3" +name = "unicode-segmentation" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" [[package]] name = "unicode-width" -version = "0.1.5" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "unicode-xid" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - -[[package]] -name = "utf8-ranges" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" - -[[package]] -name = "vec_map" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" [[package]] name = "walkdir" -version = "2.2.7" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ "same-file", - "winapi 0.3.8", + "winapi 0.3.9", "winapi-util", ] @@ -872,9 +699,9 @@ checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" [[package]] name = "winapi" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", @@ -894,11 +721,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a0564c37..397eb996 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Marisa ", "Carol (Nichols || Goulding) String { } // The mode of the exercise. -#[derive(Deserialize, Copy, Clone)] +#[derive(Deserialize, Copy, Clone, Debug)] #[serde(rename_all = "lowercase")] pub enum Mode { // Indicates that the exercise should be compiled as a binary @@ -42,7 +42,7 @@ pub struct ExerciseList { // A representation of a rustlings exercise. // This is deserialized from the accompanying info.toml file -#[derive(Deserialize)] +#[derive(Deserialize, Debug)] pub struct Exercise { // Name of the exercise pub name: String, diff --git a/src/main.rs b/src/main.rs index 3b7a1942..5af5febc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use crate::exercise::{Exercise, ExerciseList}; use crate::run::run; use crate::verify::verify; -use clap::{crate_version, App, Arg, SubCommand}; +use argh::FromArgs; use console::Emoji; use notify::DebouncedEvent; use notify::{RecommendedWatcher, RecursiveMode, Watcher}; @@ -22,85 +22,91 @@ mod exercise; mod run; mod verify; -fn main() { - let matches = App::new("rustlings") - .version(crate_version!()) - .author("Marisa, Carol Nichols") - .about("Rustlings is a collection of small exercises to get you used to writing and reading Rust code") - .arg( - Arg::with_name("nocapture") - .long("nocapture") - .help("Show outputs from the test exercises") - ) - .subcommand( - SubCommand::with_name("verify") - .alias("v") - .about("Verifies all exercises according to the recommended order") - ) - .subcommand( - SubCommand::with_name("watch") - .alias("w") - .about("Reruns `verify` when files were edited") - ) - .subcommand( - SubCommand::with_name("run") - .alias("r") - .about("Runs/Tests a single exercise") - .arg(Arg::with_name("name").required(true).index(1)), - ) - .subcommand( - SubCommand::with_name("hint") - .alias("h") - .about("Returns a hint for the current exercise") - .arg(Arg::with_name("name").required(true).index(1)), - ) - .subcommand( - SubCommand::with_name("list") - .alias("l") - .about("Lists the exercises available in rustlings") - .arg( - Arg::with_name("paths") - .long("paths") - .short("p") - .conflicts_with("names") - .help("Show only the paths of the exercises") - ) - .arg( - Arg::with_name("names") - .long("names") - .short("n") - .conflicts_with("paths") - .help("Show only the names of the exercises") - ) - .arg( - Arg::with_name("filter") - .long("filter") - .short("f") - .takes_value(true) - .empty_values(false) - .help( - "Provide a string to match the exercise names.\ - \nComma separated patterns are acceptable." - ) - ) - .arg( - Arg::with_name("unsolved") - .long("unsolved") - .short("u") - .conflicts_with("solved") - .help("Display only exercises not yet solved") - ) - .arg( - Arg::with_name("solved") - .long("solved") - .short("s") - .conflicts_with("unsolved") - .help("Display only exercises that have been solved") - ) - ) - .get_matches(); +// In sync with crate version +const VERSION: &str = "4.3.0"; - if matches.subcommand_name().is_none() { +#[derive(FromArgs, PartialEq, Debug)] +/// Rustlings is a collection of small exercises to get you used to writing and reading Rust code +struct Args { + /// show outputs from the test exercises + #[argh(switch)] + nocapture: bool, + /// show the executable version + #[argh(switch, short = 'v')] + version: bool, + #[argh(subcommand)] + nested: Option, +} + +#[derive(FromArgs, PartialEq, Debug)] +#[argh(subcommand)] +enum Subcommands { + Verify(VerifyArgs), + Watch(WatchArgs), + Run(RunArgs), + Hint(HintArgs), + List(ListArgs), +} + +#[derive(FromArgs, PartialEq, Debug)] +#[argh(subcommand, name = "verify")] +/// Verifies all exercises according to the recommended order +struct VerifyArgs {} + +#[derive(FromArgs, PartialEq, Debug)] +#[argh(subcommand, name = "watch")] +/// Reruns `verify` when files were edited +struct WatchArgs {} + +#[derive(FromArgs, PartialEq, Debug)] +#[argh(subcommand, name = "run")] +/// Runs/Tests a single exercise +struct RunArgs { + #[argh(positional)] + /// the name of the exercise + name: String, +} + +#[derive(FromArgs, PartialEq, Debug)] +#[argh(subcommand, name = "hint")] +/// Returns a hint for the given exercise +struct HintArgs { + #[argh(positional)] + /// the name of the exercise + name: String, +} + +#[derive(FromArgs, PartialEq, Debug)] +#[argh(subcommand, name = "list")] +/// Lists the exercises available in Rustlings +struct ListArgs { + #[argh(switch, short = 'p')] + /// show only the paths of the exercises + paths: bool, + #[argh(switch, short = 'n')] + /// show only the names of the exercises + names: bool, + #[argh(option, short = 'f')] + /// provide a string to match exercise names + /// comma separated patterns are acceptable + filter: Option, + #[argh(switch, short = 'u')] + /// display only exercises not yet solved + unsolved: bool, + #[argh(switch, short = 's')] + /// display only exercises that have been solved + solved: bool, +} + +fn main() { + let args: Args = argh::from_env(); + + if args.version { + println!("v{}", VERSION); + std::process::exit(0); + } + + if args.nested.is_none() { println!(); println!(r#" welcome to... "#); println!(r#" _ _ _ "#); @@ -130,144 +136,129 @@ fn main() { let toml_str = &fs::read_to_string("info.toml").unwrap(); let exercises = toml::from_str::(toml_str).unwrap().exercises; - let verbose = matches.is_present("nocapture"); + let verbose = args.nocapture; - // Handle the list command - if let Some(list_m) = matches.subcommand_matches("list") { - if ["paths", "names"].iter().all(|k| !list_m.is_present(k)) { - println!("{:<17}\t{:<46}\t{:<7}", "Name", "Path", "Status"); - } - let filters = list_m.value_of("filter").unwrap_or_default().to_lowercase(); - let mut exercises_done: u16 = 0; - exercises.iter().for_each(|e| { - let fname = format!("{}", e.path.display()); - let filter_cond = filters - .split(',') - .filter(|f| !f.trim().is_empty()) - .any(|f| e.name.contains(&f) || fname.contains(&f)); - let status = if e.looks_done() { - exercises_done = exercises_done + 1; - "Done" - } else { - "Pending" - }; - let solve_cond = { - (e.looks_done() && list_m.is_present("solved")) - || (!e.looks_done() && list_m.is_present("unsolved")) - || (!list_m.is_present("solved") && !list_m.is_present("unsolved")) - }; - if solve_cond && (filter_cond || !list_m.is_present("filter")) { - let line = if list_m.is_present("paths") { - format!("{}\n", fname) - } else if list_m.is_present("names") { - format!("{}\n", e.name) - } else { - format!("{:<17}\t{:<46}\t{:<7}\n", e.name, fname, status) - }; - // Somehow using println! leads to the binary panicking - // when its output is piped. - // So, we're handling a Broken Pipe error and exiting with 0 anyway - let stdout = std::io::stdout(); - { - let mut handle = stdout.lock(); - handle.write_all(line.as_bytes()).unwrap_or_else(|e| { - match e.kind() { - std::io::ErrorKind::BrokenPipe => std::process::exit(0), - _ => std::process::exit(1), - }; - }); - } - } - }); - let percentage_progress = exercises_done as f32 / exercises.len() as f32 * 100.0; - println!( - "Progress: You completed {} / {} exercises ({:.2} %).", - exercises_done, - exercises.len(), - percentage_progress - ); - std::process::exit(0); - } - - // Handle the run command - if let Some(ref matches) = matches.subcommand_matches("run") { - let name = matches.value_of("name").unwrap(); - - let matching_exercise = |e: &&Exercise| name == e.name; - - let exercise = exercises.iter().find(matching_exercise).unwrap_or_else(|| { - println!("No exercise found for your given name!"); - std::process::exit(1) - }); - - run(&exercise, verbose).unwrap_or_else(|_| std::process::exit(1)); - } - - if let Some(ref matches) = matches.subcommand_matches("hint") { - let name = matches.value_of("name").unwrap(); - - let exercise = exercises - .iter() - .find(|e| name == e.name) - .unwrap_or_else(|| { - println!("No exercise found for your given name!"); - std::process::exit(1) - }); - - println!("{}", exercise.hint); - } - - // Handle the verify command - if matches.subcommand_matches("verify").is_some() { - verify(&exercises, verbose).unwrap_or_else(|_| std::process::exit(1)); - } - - // Handle the watch command - if matches.subcommand_matches("watch").is_some() { - if let Err(e) = watch(&exercises, verbose) { - println!( - "Error: Could not watch your progress. Error message was {:?}.", - e - ); - println!("Most likely you've run out of disk space or your 'inotify limit' has been reached."); - std::process::exit(1); - } - println!( - "{emoji} All exercises completed! {emoji}", - emoji = Emoji("πŸŽ‰", "β˜…") - ); - println!(); - println!("+----------------------------------------------------+"); - println!("| You made it to the Fe-nish line! |"); - println!("+-------------------------- ------------------------+"); - println!(" \\/ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); - println!(" β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ "); - println!(" β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); - println!(); - println!("We hope you enjoyed learning about the various aspects of Rust!"); - println!("If you noticed any issues, please don't hesitate to report them to our repo."); - println!("You can also contribute your own exercises to help the greater community!"); - println!(); - println!("Before reporting an issue or contributing, please read our guidelines:"); - println!("https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md"); - } - - if matches.subcommand_name().is_none() { + let command = args.nested.unwrap_or_else(|| { let text = fs::read_to_string("default_out.txt").unwrap(); println!("{}", text); + std::process::exit(0); + }); + match command { + Subcommands::List(subargs) => { + if !subargs.paths && !subargs.names { + println!("{:<17}\t{:<46}\t{:<7}", "Name", "Path", "Status"); + } + let mut exercises_done: u16 = 0; + let filters = subargs.filter.clone().unwrap_or_default().to_lowercase(); + exercises.iter().for_each(|e| { + let fname = format!("{}", e.path.display()); + let filter_cond = filters + .split(',') + .filter(|f| !f.trim().is_empty()) + .any(|f| e.name.contains(&f) || fname.contains(&f)); + let status = if e.looks_done() { + exercises_done += 1; + "Done" + } else { + "Pending" + }; + let solve_cond = { + (e.looks_done() && subargs.solved) + || (!e.looks_done() && subargs.unsolved) + || (!subargs.solved && !subargs.unsolved) + }; + if solve_cond && (filter_cond || subargs.filter.is_none()) { + let line = if subargs.paths { + format!("{}\n", fname) + } else if subargs.names { + format!("{}\n", e.name) + } else { + format!("{:<17}\t{:<46}\t{:<7}\n", e.name, fname, status) + }; + // Somehow using println! leads to the binary panicking + // when its output is piped. + // So, we're handling a Broken Pipe error and exiting with 0 anyway + let stdout = std::io::stdout(); + { + let mut handle = stdout.lock(); + handle.write_all(line.as_bytes()).unwrap_or_else(|e| { + match e.kind() { + std::io::ErrorKind::BrokenPipe => std::process::exit(0), + _ => std::process::exit(1), + }; + }); + } + } + }); + let percentage_progress = exercises_done as f32 / exercises.len() as f32 * 100.0; + println!( + "Progress: You completed {} / {} exercises ({:.2} %).", + exercises_done, + exercises.len(), + percentage_progress + ); + std::process::exit(0); + } + + Subcommands::Run(subargs) => { + let exercise = find_exercise(subargs.name, exercises); + + run(&exercise, verbose).unwrap_or_else(|_| std::process::exit(1)); + } + + Subcommands::Hint(subargs) => { + let exercise = find_exercise(subargs.name, exercises); + + println!("{}", exercise.hint); + } + + Subcommands::Verify(_subargs) => { + verify(&exercises, verbose).unwrap_or_else(|_| std::process::exit(1)); + } + + Subcommands::Watch(_subargs) => { + if let Err(e) = watch(&exercises, verbose) { + println!( + "Error: Could not watch your progress. Error message was {:?}.", + e + ); + println!("Most likely you've run out of disk space or your 'inotify limit' has been reached."); + std::process::exit(1); + } + println!( + "{emoji} All exercises completed! {emoji}", + emoji = Emoji("πŸŽ‰", "β˜…") + ); + println!(); + println!("+----------------------------------------------------+"); + println!("| You made it to the Fe-nish line! |"); + println!("+-------------------------- ------------------------+"); + println!(" \\/ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); + println!(" β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ "); + println!(" β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); + println!(); + println!("We hope you enjoyed learning about the various aspects of Rust!"); + println!( + "If you noticed any issues, please don't hesitate to report them to our repo." + ); + println!("You can also contribute your own exercises to help the greater community!"); + println!(); + println!("Before reporting an issue or contributing, please read our guidelines:"); + println!("https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md"); + } } } @@ -294,6 +285,18 @@ fn spawn_watch_shell(failed_exercise_hint: &Arc>>) { }); } +fn find_exercise(name: String, exercises: Vec) -> Exercise { + let matching_exercise = |e: &Exercise| name == e.name; + + exercises + .into_iter() + .find(matching_exercise) + .unwrap_or_else(|| { + println!("No exercise found for your given name!"); + std::process::exit(1) + }) +} + fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result<()> { /* Clears the terminal with an ANSI escape code. Works in UNIX and newer Windows terminals. */ From 6177b6e126852027b689ebab4e0796b2984f987b Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 21 Apr 2021 14:47:53 +0200 Subject: [PATCH 0330/1293] chore: Fix integration tests --- tests/integration_tests.rs | 67 ++++++++++++++------------------------ 1 file changed, 24 insertions(+), 43 deletions(-) diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 1bd3bf7e..be9af965 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -24,7 +24,7 @@ fn fails_when_in_wrong_dir() { fn verify_all_success() { Command::cargo_bin("rustlings") .unwrap() - .arg("v") + .arg("verify") .current_dir("tests/fixture/success") .assert() .success(); @@ -34,7 +34,7 @@ fn verify_all_success() { fn verify_fails_if_some_fails() { Command::cargo_bin("rustlings") .unwrap() - .arg("v") + .arg("verify") .current_dir("tests/fixture/failure") .assert() .code(1); @@ -44,7 +44,7 @@ fn verify_fails_if_some_fails() { fn run_single_compile_success() { Command::cargo_bin("rustlings") .unwrap() - .args(&["r", "compSuccess"]) + .args(&["run", "compSuccess"]) .current_dir("tests/fixture/success/") .assert() .success(); @@ -54,7 +54,7 @@ fn run_single_compile_success() { fn run_single_compile_failure() { Command::cargo_bin("rustlings") .unwrap() - .args(&["r", "compFailure"]) + .args(&["run", "compFailure"]) .current_dir("tests/fixture/failure/") .assert() .code(1); @@ -64,7 +64,7 @@ fn run_single_compile_failure() { fn run_single_test_success() { Command::cargo_bin("rustlings") .unwrap() - .args(&["r", "testSuccess"]) + .args(&["run", "testSuccess"]) .current_dir("tests/fixture/success/") .assert() .success(); @@ -74,7 +74,7 @@ fn run_single_test_success() { fn run_single_test_failure() { Command::cargo_bin("rustlings") .unwrap() - .args(&["r", "testFailure"]) + .args(&["run", "testFailure"]) .current_dir("tests/fixture/failure/") .assert() .code(1); @@ -84,7 +84,7 @@ fn run_single_test_failure() { fn run_single_test_not_passed() { Command::cargo_bin("rustlings") .unwrap() - .args(&["r", "testNotPassed.rs"]) + .args(&["run", "testNotPassed.rs"]) .current_dir("tests/fixture/failure/") .assert() .code(1); @@ -94,7 +94,7 @@ fn run_single_test_not_passed() { fn run_single_test_no_filename() { Command::cargo_bin("rustlings") .unwrap() - .arg("r") + .arg("run") .current_dir("tests/fixture/") .assert() .code(1); @@ -104,7 +104,7 @@ fn run_single_test_no_filename() { fn run_single_test_no_exercise() { Command::cargo_bin("rustlings") .unwrap() - .args(&["r", "compNoExercise.rs"]) + .args(&["run", "compNoExercise.rs"]) .current_dir("tests/fixture/failure") .assert() .code(1); @@ -114,7 +114,7 @@ fn run_single_test_no_exercise() { fn get_hint_for_single_test() { Command::cargo_bin("rustlings") .unwrap() - .args(&["h", "testFailure"]) + .args(&["hint", "testFailure"]) .current_dir("tests/fixture/failure") .assert() .code(0) @@ -131,10 +131,15 @@ fn all_exercises_require_confirmation() { file.read_to_string(&mut s).unwrap(); s }; - source.matches("// I AM NOT DONE").next().unwrap_or_else(|| panic!( - "There should be an `I AM NOT DONE` annotation in {:?}", - path - )); + source + .matches("// I AM NOT DONE") + .next() + .unwrap_or_else(|| { + panic!( + "There should be an `I AM NOT DONE` annotation in {:?}", + path + ) + }); } } @@ -142,7 +147,7 @@ fn all_exercises_require_confirmation() { fn run_compile_exercise_does_not_prompt() { Command::cargo_bin("rustlings") .unwrap() - .args(&["r", "pending_exercise"]) + .args(&["run", "pending_exercise"]) .current_dir("tests/fixture/state") .assert() .code(0) @@ -153,7 +158,7 @@ fn run_compile_exercise_does_not_prompt() { fn run_test_exercise_does_not_prompt() { Command::cargo_bin("rustlings") .unwrap() - .args(&["r", "pending_test_exercise"]) + .args(&["run", "pending_test_exercise"]) .current_dir("tests/fixture/state") .assert() .code(0) @@ -164,7 +169,7 @@ fn run_test_exercise_does_not_prompt() { fn run_single_test_success_with_output() { Command::cargo_bin("rustlings") .unwrap() - .args(&["--nocapture", "r", "testSuccess"]) + .args(&["--nocapture", "run", "testSuccess"]) .current_dir("tests/fixture/success/") .assert() .code(0) @@ -175,7 +180,7 @@ fn run_single_test_success_with_output() { fn run_single_test_success_without_output() { Command::cargo_bin("rustlings") .unwrap() - .args(&["r", "testSuccess"]) + .args(&["run", "testSuccess"]) .current_dir("tests/fixture/success/") .assert() .code(0) @@ -192,26 +197,6 @@ fn run_rustlings_list() { .success(); } -#[test] -fn run_rustlings_list_conflicting_display_options() { - Command::cargo_bin("rustlings") - .unwrap() - .args(&["list", "--names", "--paths"]) - .current_dir("tests/fixture/success") - .assert() - .failure(); -} - -#[test] -fn run_rustlings_list_conflicting_solve_options() { - Command::cargo_bin("rustlings") - .unwrap() - .args(&["list", "--solved", "--unsolved"]) - .current_dir("tests/fixture/success") - .assert() - .failure(); -} - #[test] fn run_rustlings_list_no_pending() { Command::cargo_bin("rustlings") @@ -231,10 +216,7 @@ fn run_rustlings_list_both_done_and_pending() { .current_dir("tests/fixture/state") .assert() .success() - .stdout( - predicates::str::contains("Done") - .and(predicates::str::contains("Pending")) - ); + .stdout(predicates::str::contains("Done").and(predicates::str::contains("Pending"))); } #[test] @@ -258,4 +240,3 @@ fn run_rustlings_list_without_done() { .success() .stdout(predicates::str::contains("Done").not()); } - From 81be40448777fa338ebced3b0bfc1b32d6370313 Mon Sep 17 00:00:00 2001 From: Brandon Macer Date: Wed, 21 Apr 2021 08:50:03 -0400 Subject: [PATCH 0331/1293] feat(arc1): Add more details to description and hint (#710) Co-authored-by: bmacer Co-authored-by: marisa Co-authored-by: Roberto Vidal --- exercises/standard_library_types/arc1.rs | 19 +++++++++++++++++-- info.toml | 7 ++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/exercises/standard_library_types/arc1.rs b/exercises/standard_library_types/arc1.rs index 4ad649f1..d167380c 100644 --- a/exercises/standard_library_types/arc1.rs +++ b/exercises/standard_library_types/arc1.rs @@ -1,7 +1,21 @@ // arc1.rs +// In this exercise, we are given a Vec of u32 called "numbers" with values ranging +// from 0 to 99 -- [ 0, 1, 2, ..., 98, 99 ] +// We would like to use this set of numbers within 8 different threads simultaneously. +// Each thread is going to get the sum of every eighth value, with an offset. +// The first thread (offset 0), will sum 0, 8, 16, ... +// The second thread (offset 1), will sum 1, 9, 17, ... +// The third thread (offset 2), will sum 2, 10, 18, ... +// ... +// The eighth thread (offset 7), will sum 7, 15, 23, ... + +// Because we are using threads, our values need to be thread-safe. Therefore, +// we are using Arc. We need to make a change in each of the two TODOs. + + // Make this code compile by filling in a value for `shared_numbers` where the -// TODO comment is and create an initial binding for `child_numbers` -// somewhere. Try not to create any copies of the `numbers` Vec! +// first TODO comment is, and create an initial binding for `child_numbers` +// where the second TODO comment is. Try not to create any copies of the `numbers` Vec! // Execute `rustlings hint arc1` for hints :) // I AM NOT DONE @@ -16,6 +30,7 @@ fn main() { let mut joinhandles = Vec::new(); for offset in 0..8 { + let child_numbers = // TODO joinhandles.push(thread::spawn(move || { let mut i = offset; let mut sum = 0; diff --git a/info.toml b/info.toml index 36dcbe90..82e11952 100644 --- a/info.toml +++ b/info.toml @@ -679,7 +679,12 @@ to avoid creating a copy of `numbers`, you'll need to create `child_numbers` inside the loop but still in the main thread. `child_numbers` should be a clone of the Arc of the numbers instead of a -thread-local copy of the numbers.""" +thread-local copy of the numbers. + +This is a simple exercise if you understand the underlying concepts, but if this +is too much of a struggle, consider reading through all of Chapter 16 in the book: +https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html +""" [[exercises]] name = "iterators1" From 293dfb35d53aba5f9566f980197f93545ed2216d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 21 Apr 2021 12:50:26 +0000 Subject: [PATCH 0332/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2d2cb0ef..e76a04dc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-89-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-90-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -277,6 +277,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Shao Yang Hong

πŸ–‹ +
Brandon Macer

πŸ–‹ From 8d0490bd70c7f4227a5aa43b259359a13117435d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 21 Apr 2021 12:50:27 +0000 Subject: [PATCH 0333/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e820b426..2820d18a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -829,6 +829,15 @@ "contributions": [ "content" ] + }, + { + "login": "bmacer", + "name": "Brandon Macer", + "avatar_url": "https://avatars.githubusercontent.com/u/13931806?v=4", + "profile": "https://github.com/bmacer", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 347f30bd867343c5ace1097e085a1f7e356553f7 Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 21 Apr 2021 16:21:56 +0200 Subject: [PATCH 0334/1293] fix(main): Let find_exercise work with borrows --- src/main.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5af5febc..a95a09d9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -201,13 +201,13 @@ fn main() { } Subcommands::Run(subargs) => { - let exercise = find_exercise(subargs.name, exercises); + let exercise = find_exercise(&subargs.name, &exercises); run(&exercise, verbose).unwrap_or_else(|_| std::process::exit(1)); } Subcommands::Hint(subargs) => { - let exercise = find_exercise(subargs.name, exercises); + let exercise = find_exercise(&subargs.name, &exercises); println!("{}", exercise.hint); } @@ -285,14 +285,12 @@ fn spawn_watch_shell(failed_exercise_hint: &Arc>>) { }); } -fn find_exercise(name: String, exercises: Vec) -> Exercise { - let matching_exercise = |e: &Exercise| name == e.name; - +fn find_exercise<'a>(name: &str, exercises: &'a [Exercise]) -> &'a Exercise { exercises - .into_iter() - .find(matching_exercise) + .iter() + .find(|e| e.name == name) .unwrap_or_else(|| { - println!("No exercise found for your given name!"); + println!("No exercise found for '{}'!", name); std::process::exit(1) }) } From 1120db57a6c20966184eb8f731804604270ff2f1 Mon Sep 17 00:00:00 2001 From: Zerotask Date: Thu, 22 Apr 2021 21:32:29 +0200 Subject: [PATCH 0335/1293] docs(errors): add additional help for Result/Boxing add additional help information provided by the rust by example book --- exercises/error_handling/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/exercises/error_handling/README.md b/exercises/error_handling/README.md index 77a58d18..478510a4 100644 --- a/exercises/error_handling/README.md +++ b/exercises/error_handling/README.md @@ -3,3 +3,9 @@ For this exercise check out the sections: - [Generics](https://doc.rust-lang.org/book/ch10-01-syntax.html) of the Rust Book. + +or alternatively, check out the sections: +- [Result](https://doc.rust-lang.org/rust-by-example/error/result.html) +- [Boxing errors](https://doc.rust-lang.org/rust-by-example/error/multiple_error_types/boxing_errors.html) + +of the Rust By Example Book. From f253103a314b9cdbda1d6271015cf64e5b2347bd Mon Sep 17 00:00:00 2001 From: Zerotask Date: Thu, 22 Apr 2021 22:11:04 +0200 Subject: [PATCH 0336/1293] docs(generics): add bounds help add help for bounds provided by the rust by example book --- exercises/generics/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/generics/README.md b/exercises/generics/README.md index 7105f06f..12170d4a 100644 --- a/exercises/generics/README.md +++ b/exercises/generics/README.md @@ -4,4 +4,5 @@ In this section you'll learn about saving yourself many lines of code with gener ### Book Sections -- [Generic Data Types](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html) \ No newline at end of file +- [Generic Data Types](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html) +- [Bounds](https://doc.rust-lang.org/rust-by-example/generics/bounds.html) From 249ad44cc03974fd34708c23d9832b1729c6e844 Mon Sep 17 00:00:00 2001 From: Zerotask Date: Fri, 23 Apr 2021 19:54:31 +0200 Subject: [PATCH 0337/1293] docs(exercises): updated all exercises readme files all exercises readme files now have a unified structure and a description --- exercises/clippy/README.md | 6 ++++-- exercises/collections/README.md | 6 ++++-- exercises/conversions/README.md | 9 +++++---- exercises/enums/README.md | 4 ++-- exercises/error_handling/README.md | 14 +++++++------- exercises/functions/README.md | 4 ++-- exercises/generics/README.md | 9 ++++++--- exercises/if/README.md | 4 ++-- exercises/macros/README.md | 4 ++-- exercises/modules/README.md | 4 ++-- exercises/move_semantics/README.md | 4 ++-- exercises/option/README.md | 15 ++++++++++++--- exercises/primitive_types/README.md | 4 ++-- exercises/standard_library_types/README.md | 11 ++++++++--- exercises/strings/README.md | 4 ++-- exercises/structs/README.md | 4 ++-- exercises/tests/README.md | 4 ++-- exercises/threads/README.md | 10 +++++++++- exercises/traits/README.md | 11 +++++------ exercises/variables/README.md | 8 +++++--- 20 files changed, 85 insertions(+), 54 deletions(-) diff --git a/exercises/clippy/README.md b/exercises/clippy/README.md index 60a12fe5..55438af6 100644 --- a/exercises/clippy/README.md +++ b/exercises/clippy/README.md @@ -1,8 +1,10 @@ -### Clippy +# Clippy The Clippy tool is a collection of lints to analyze your code so you can catch common mistakes and improve your Rust code. If you used the installation script for Rustlings, Clippy should be already installed. If not you can install it manually via `rustup component add clippy`. -For more information about Clippy lints, please see [their documentation page](https://rust-lang.github.io/rust-clippy/master/). +## Further information + +- [GitHub Repository](https://github.com/rust-lang/rust-clippy). diff --git a/exercises/collections/README.md b/exercises/collections/README.md index af87863b..0291bc87 100644 --- a/exercises/collections/README.md +++ b/exercises/collections/README.md @@ -1,4 +1,4 @@ -### Collections +# Collections Rust’s standard library includes a number of very useful data structures called collections. Most other data types represent one @@ -17,4 +17,6 @@ structures that are used very often in Rust programs: You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map), [*dictionary* in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) or an *associative array* in other languages. -[Rust book chapter](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html) +## Further information + +- [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html) diff --git a/exercises/conversions/README.md b/exercises/conversions/README.md index 114bd428..8d7da93e 100644 --- a/exercises/conversions/README.md +++ b/exercises/conversions/README.md @@ -1,5 +1,4 @@ -### Type conversions - +# Type conversions Rust offers a multitude of ways to convert a value of a given type into another type. @@ -15,6 +14,8 @@ Furthermore, the `std::str` module offers a trait called [`FromStr`](https://doc These should be the main ways ***within the standard library*** to convert data into your desired types. -#### Book Sections +## Further information -These are not directly covered in the book, but the standard library has great documentation for [conversions here](https://doc.rust-lang.org/std/convert/index.html). The `FromStr` trait is also covered [here](https://doc.rust-lang.org/std/str/trait.FromStr.html). \ No newline at end of file +These are not directly covered in the book, but the standard library has a great documentation for it. +- [conversions](https://doc.rust-lang.org/std/convert/index.html) +- [`FromStr` trait](https://doc.rust-lang.org/std/str/trait.FromStr.html) \ No newline at end of file diff --git a/exercises/enums/README.md b/exercises/enums/README.md index 091f5d04..30d4d91d 100644 --- a/exercises/enums/README.md +++ b/exercises/enums/README.md @@ -1,10 +1,10 @@ -### Enums +# Enums Rust allows you to define types called "enums" which enumerate possible values. Enums are a feature in many languages, but their capabilities differ in each language. Rust’s enums are most similar to algebraic data types in functional languages, such as F#, OCaml, and Haskell. Useful in combination with enums is Rust's "pattern matching" facility, which makes it easy to run different code for different values of an enumeration. -#### Book Sections +## Further information - [Enums](https://doc.rust-lang.org/book/ch06-00-enums.html) - [Pattern syntax](https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html) diff --git a/exercises/error_handling/README.md b/exercises/error_handling/README.md index 478510a4..5255ace9 100644 --- a/exercises/error_handling/README.md +++ b/exercises/error_handling/README.md @@ -1,11 +1,11 @@ -For this exercise check out the sections: +# Error handling +Most errors aren’t serious enough to require the program to stop entirely. +Sometimes, when a function fails, it’s for a reason that you can easily interpret and respond to. +For example, if you try to open a file and that operation fails because the file doesn’t exist, you might want to create the file instead of terminating the process. + +## Further information + - [Error Handling](https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html) - [Generics](https://doc.rust-lang.org/book/ch10-01-syntax.html) - -of the Rust Book. - -or alternatively, check out the sections: - [Result](https://doc.rust-lang.org/rust-by-example/error/result.html) - [Boxing errors](https://doc.rust-lang.org/rust-by-example/error/multiple_error_types/boxing_errors.html) - -of the Rust By Example Book. diff --git a/exercises/functions/README.md b/exercises/functions/README.md index 351ae023..66547bd4 100644 --- a/exercises/functions/README.md +++ b/exercises/functions/README.md @@ -1,7 +1,7 @@ -### Functions +# Functions Here, you'll learn how to write functions and how Rust's compiler can trace things way back. -#### Book Sections +## Further information - [How Functions Work](https://doc.rust-lang.org/book/ch03-03-how-functions-work.html) diff --git a/exercises/generics/README.md b/exercises/generics/README.md index 12170d4a..de46d503 100644 --- a/exercises/generics/README.md +++ b/exercises/generics/README.md @@ -1,8 +1,11 @@ -### Generics +# Generics -In this section you'll learn about saving yourself many lines of code with generics! +Generics is the topic of generalizing types and functionalities to broader cases. +This is extremely useful for reducing code duplication in many ways, but can call for rather involving syntax. +Namely, being generic requires taking great care to specify over which types a generic type is actually considered valid. +The simplest and most common use of generics is for type parameters. -### Book Sections +## Further information - [Generic Data Types](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html) - [Bounds](https://doc.rust-lang.org/rust-by-example/generics/bounds.html) diff --git a/exercises/if/README.md b/exercises/if/README.md index b1157218..528d9886 100644 --- a/exercises/if/README.md +++ b/exercises/if/README.md @@ -1,7 +1,7 @@ -### If +# If `if`, the most basic type of control flow, is what you'll learn here. -#### Book Sections +## Further information - [Control Flow - if expressions](https://doc.rust-lang.org/book/ch03-05-control-flow.html#if-expressions) diff --git a/exercises/macros/README.md b/exercises/macros/README.md index b48b880a..319d8408 100644 --- a/exercises/macros/README.md +++ b/exercises/macros/README.md @@ -1,10 +1,10 @@ -### Macros +# Macros Rust's macro system is very powerful, but also kind of difficult to wrap your head around. We're not going to teach you how to write your own fully-featured macros. Instead, we'll show you how to use and create them. -#### Book Sections +## Further information - [Macros](https://doc.rust-lang.org/book/ch19-06-macros.html) - [The Little Book of Rust Macros](https://danielkeep.github.io/tlborm/book/index.html) diff --git a/exercises/modules/README.md b/exercises/modules/README.md index bb765106..6582b000 100644 --- a/exercises/modules/README.md +++ b/exercises/modules/README.md @@ -1,7 +1,7 @@ -### Modules +# Modules In this section we'll give you an introduction to Rust's module system. -#### Book Sections +## Further information - [The Module System](https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html) diff --git a/exercises/move_semantics/README.md b/exercises/move_semantics/README.md index 6842af7c..54ddd8e6 100644 --- a/exercises/move_semantics/README.md +++ b/exercises/move_semantics/README.md @@ -1,8 +1,8 @@ -### Move Semantics +# Move Semantics These exercises are adapted from [pnkfelix](https://github.com/pnkfelix)'s [Rust Tutorial](https://pnkfelix.github.io/rust-examples-icfp2014/) -- Thank you Felix!!! -#### Book Sections +## Further information For this section, the book links are especially important. diff --git a/exercises/option/README.md b/exercises/option/README.md index d17b79cc..a304bb44 100644 --- a/exercises/option/README.md +++ b/exercises/option/README.md @@ -1,8 +1,17 @@ -### Option +# Option -#### Book Sections +Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not. +Option types are very common in Rust code, as they have a number of uses: +- Initial values +- Return values for functions that are not defined over their entire input range (partial functions) +- Return value for otherwise reporting simple errors, where None is returned on error +- Optional struct fields +- Struct fields that can be loaned or "taken" +- Optional function arguments +- Nullable pointers +- Swapping things out of difficult situations -To learn about Option, check out these links: +## Further Information - [Option Enum Format](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-enum-definitions) - [Option Module Documentation](https://doc.rust-lang.org/std/option/) diff --git a/exercises/primitive_types/README.md b/exercises/primitive_types/README.md index daa70eea..cea69b02 100644 --- a/exercises/primitive_types/README.md +++ b/exercises/primitive_types/README.md @@ -1,9 +1,9 @@ -### Primitive Types +# Primitive Types Rust has a couple of basic types that are directly implemented into the compiler. In this section, we'll go through the most important ones. -#### Book Sections +## Further information - [Data Types](https://doc.rust-lang.org/stable/book/ch03-02-data-types.html) - [The Slice Type](https://doc.rust-lang.org/stable/book/ch04-03-slices.html) diff --git a/exercises/standard_library_types/README.md b/exercises/standard_library_types/README.md index 8b53dd81..809d61fe 100644 --- a/exercises/standard_library_types/README.md +++ b/exercises/standard_library_types/README.md @@ -1,5 +1,10 @@ -For the Box exercise check out the chapter [Using Box to Point to Data on the Heap](https://doc.rust-lang.org/book/ch15-01-box.html). +# Standard library types -For the Arc exercise check out the chapter [Shared-State Concurrency](https://doc.rust-lang.org/book/ch16-03-shared-state.html) of the Rust Book. +This section will teach you about Box, Shared-State Concurrency and Iterators. -For the Iterator exercise check out the chapters [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html) of the Rust Book and the [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/). +## Further information + +- [Using Box to Point to Data on the Heap](https://doc.rust-lang.org/book/ch15-01-box.html) +- [Shared-State Concurrency](https://doc.rust-lang.org/book/ch16-03-shared-state.html) +- [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html) +- [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/) diff --git a/exercises/strings/README.md b/exercises/strings/README.md index 38d24c84..fa2104cc 100644 --- a/exercises/strings/README.md +++ b/exercises/strings/README.md @@ -1,9 +1,9 @@ -### Strings +# Strings Rust has two string types, a string slice (`&str`) and an owned string (`String`). We're not going to dictate when you should use which one, but we'll show you how to identify and create them, as well as use them. -#### Book Sections +## Further information - [Strings](https://doc.rust-lang.org/book/ch08-02-strings.html) diff --git a/exercises/structs/README.md b/exercises/structs/README.md index 58e5a6a4..3fc1fdc9 100644 --- a/exercises/structs/README.md +++ b/exercises/structs/README.md @@ -1,8 +1,8 @@ -### Structs +# Structs Rust has three struct types: a classic C struct, a tuple struct, and a unit struct. -#### Book Sections +## Further information - [Structures](https://doc.rust-lang.org/book/ch05-01-defining-structs.html) - [Method Syntax](https://doc.rust-lang.org/book/ch05-03-method-syntax.html) diff --git a/exercises/tests/README.md b/exercises/tests/README.md index dbb14a83..27c6818d 100644 --- a/exercises/tests/README.md +++ b/exercises/tests/README.md @@ -1,7 +1,7 @@ -### Tests +# Tests Going out of order from the book to cover tests -- many of the following exercises will ask you to make tests pass! -#### Book Sections +## Further information - [Writing Tests](https://doc.rust-lang.org/book/ch11-01-writing-tests.html) diff --git a/exercises/threads/README.md b/exercises/threads/README.md index 2024292f..d0866947 100644 --- a/exercises/threads/README.md +++ b/exercises/threads/README.md @@ -1 +1,9 @@ -For this exercise check out the [Dining Philosophers example](https://doc.rust-lang.org/1.4.0/book/dining-philosophers.html) and the chapter [Concurrency](https://doc.rust-lang.org/book/ch16-01-threads.html) of the Rust Book. \ No newline at end of file +# Threads + +In most current operating systems, an executed program’s code is run in a process, and the operating system manages multiple processes at once. +Within your program, you can also have independent parts that run simultaneously. The features that run these independent parts are called threads. + +## Further information + +- [Dining Philosophers example](https://doc.rust-lang.org/1.4.0/book/dining-philosophers.html) +- [Using Threads to Run Code Simultaneously](https://doc.rust-lang.org/book/ch16-01-threads.html) diff --git a/exercises/traits/README.md b/exercises/traits/README.md index 8cd03ec4..de67acd0 100644 --- a/exercises/traits/README.md +++ b/exercises/traits/README.md @@ -1,4 +1,4 @@ -### Traits +# Traits A trait is a collection of methods. @@ -7,14 +7,13 @@ Data types can implement traits. To do so, the methods making up the trait are d In this way, traits are somewhat similar to Java interfaces and C++ abstract classes. Some additional common Rust traits include: - -+ `Clone` (the `clone` method), -+ `Display` (which allows formatted display via `{}`), and -+ `Debug` (which allows formatted display via `{:?}`). +- `Clone` (the `clone` method) +- `Display` (which allows formatted display via `{}`) +- `Debug` (which allows formatted display via `{:?}`) Because traits indicate shared behavior between data types, they are useful when writing generics. -#### Book Sections +## Further information - [Traits](https://doc.rust-lang.org/book/ch10-02-traits.html) diff --git a/exercises/variables/README.md b/exercises/variables/README.md index 1e2eb596..11a7a78a 100644 --- a/exercises/variables/README.md +++ b/exercises/variables/README.md @@ -1,7 +1,9 @@ -### Variables +# Variables -Here you'll learn about simple variables. +In Rust, variables are immutable by default. +When a variable is immutable, once a value is bound to a name, you can’t change that value. +You can make them mutable by adding mut in front of the variable name. -#### Book Sections +## Further information - [Variables and Mutability](https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html) From eefa6562327cd537fc33b1688caf8d8512ef46de Mon Sep 17 00:00:00 2001 From: Zerotask Date: Fri, 23 Apr 2021 20:07:32 +0200 Subject: [PATCH 0338/1293] chore(deps): update cargo dependencies --- Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 367881c7..fb361569 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -522,9 +522,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19" +checksum = "2a26af418b574bd56588335b3a3659a65725d4e636eb1016c2f9e3b38c7cc759" dependencies = [ "aho-corasick", "memchr", @@ -607,9 +607,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" [[package]] name = "smallvec" @@ -619,9 +619,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "syn" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fe99c6bd8b1cc636890bcc071842de909d902c81ac7dab53ba33c421ab8ffb" +checksum = "b9505f307c872bab8eb46f77ae357c8eba1fdacead58ee5a850116b1d7f82883" dependencies = [ "proc-macro2", "quote", From cf42ddc4497a2577e8c8e9206523322b3a2b9fc2 Mon Sep 17 00:00:00 2001 From: Zerotask Date: Fri, 23 Apr 2021 20:28:55 +0200 Subject: [PATCH 0339/1293] chore(watch): add hint for the exercises README.md rustlings watch will now show an additional hint for the corresponding README.me --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index a95a09d9..bc1b71e4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -264,7 +264,7 @@ fn main() { fn spawn_watch_shell(failed_exercise_hint: &Arc>>) { let failed_exercise_hint = Arc::clone(failed_exercise_hint); - println!("Type 'hint' to get help or 'clear' to clear the screen"); + println!("Type 'hint' or open the corresponding README.md file to get help or type 'clear' to clear the screen."); thread::spawn(move || loop { let mut input = String::new(); match io::stdin().read_line(&mut input) { From 84461c20cbaf97a67baa55afc16989aab3e3c02d Mon Sep 17 00:00:00 2001 From: mokou Date: Sat, 24 Apr 2021 11:57:00 +0200 Subject: [PATCH 0340/1293] release: 4.4.0 --- CHANGELOG.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 2 +- src/main.rs | 2 +- 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3988826e..1686bdd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,48 @@ + +## 4.4.0 (2021-04-24) + + +#### Bug Fixes + +* Fix spelling error in main.rs ([91ee27f2](https://github.com/rust-lang/rustlings/commit/91ee27f22bd3797a9db57e5fd430801c170c5db8)) +* typo in default out text ([644c49f1](https://github.com/rust-lang/rustlings/commit/644c49f1e04cbb24e95872b3a52b07d692ae3bc8)) +* **collections:** Naming exercises for vectors and hashmap ([bef39b12](https://github.com/rust-lang/rustlings/commit/bef39b125961310b34b34871e480a82e82af4678)) +* **from_str:** + * Correct typos ([5f7c89f8](https://github.com/rust-lang/rustlings/commit/5f7c89f85db1f33da01911eaa479c3a2d4721678)) + * test for error instead of unwrap/should_panic ([15e71535](https://github.com/rust-lang/rustlings/commit/15e71535f37cfaed36e22eb778728d186e2104ab)) + * use trait objects for from_str ([c3e7b831](https://github.com/rust-lang/rustlings/commit/c3e7b831786c9172ed8bd5d150f3c432f242fba9)) +* **functions3:** improve function argument type (#687) ([a6509cc4](https://github.com/rust-lang/rustlings/commit/a6509cc4d545d8825f01ddf7ee37823b372154dd)) +* **hashmap2:** Update incorrect assertion (#660) ([72aaa15e](https://github.com/rust-lang/rustlings/commit/72aaa15e6ab4b72b3422f1c6356396e20a2a2bb8)) +* **info:** Fix typo (#635) ([cddc1e86](https://github.com/rust-lang/rustlings/commit/cddc1e86e7ec744ee644cc774a4887b1a0ded3e8)) +* **iterators2:** Moved errors out of tests. ([baf4ba17](https://github.com/rust-lang/rustlings/commit/baf4ba175ba6eb92989e3dd54ecbec4bedc9a863), closes [#359](https://github.com/rust-lang/rustlings/issues/359)) +* **iterators3:** Enabled iterators3.rs to run without commented out tests. ([c6712dfc](https://github.com/rust-lang/rustlings/commit/c6712dfccd1a093e590ad22bbc4f49edc417dac0)) +* **main:** Let find_exercise work with borrows ([347f30bd](https://github.com/rust-lang/rustlings/commit/347f30bd867343c5ace1097e085a1f7e356553f7)) +* **move_semantics4:** + * Remove redundant "instead" (#640) ([cc266d7d](https://github.com/rust-lang/rustlings/commit/cc266d7d80b91e79df3f61984f231b7f1587218e)) + * Small readbility improvement (#617) ([10965920](https://github.com/rust-lang/rustlings/commit/10965920fbdf8a1efc85bed869e55a1787006404)) +* **option2:** Rename uninformative variables (#675) ([b4de6594](https://github.com/rust-lang/rustlings/commit/b4de6594380636817d13c2677ec6f472a964cf43)) +* **quiz3:** Force an answer to Q2 (#672) ([0d894e6f](https://github.com/rust-lang/rustlings/commit/0d894e6ff739943901e1ae8c904582e5c2f843bd)) +* **structs:** Add 5.3 to structs/README (#652) ([6bd791f2](https://github.com/rust-lang/rustlings/commit/6bd791f2f44aa7f0ad926df767f6b1fa8f12a9a9)) +* **structs2:** correct grammar in hint (#663) ([ebdb66c7](https://github.com/rust-lang/rustlings/commit/ebdb66c7bfb6d687a14cc511a559a222e6fc5de4)) +* **structs3:** + * reword heading comment (#664) ([9f3e8c2d](https://github.com/rust-lang/rustlings/commit/9f3e8c2dde645e5264c2d2200e68842b5f47bfa3)) + * add check to prevent naive implementation of is_international ([05a753fe](https://github.com/rust-lang/rustlings/commit/05a753fe6333d36dbee5f68c21dec04eacdc75df)) +* **threads1:** line number correction ([7857b0a6](https://github.com/rust-lang/rustlings/commit/7857b0a689b0847f48d8c14cbd1865e3b812d5ca)) +* **try_from_into:** use trait objects ([2e93a588](https://github.com/rust-lang/rustlings/commit/2e93a588e0abe8badb7eafafb9e7d073c2be5df8)) + +#### Features + +* Replace clap with argh ([7928122f](https://github.com/rust-lang/rustlings/commit/7928122fcef9ca7834d988b1ec8ca0687478beeb)) +* Replace emojis when NO_EMOJI env variable present ([8d62a996](https://github.com/rust-lang/rustlings/commit/8d62a9963708dbecd9312e8bcc4b47049c72d155)) +* Added iterators5.rs exercise. ([b29ea17e](https://github.com/rust-lang/rustlings/commit/b29ea17ea94d1862114af2cf5ced0e09c197dc35)) +* **arc1:** Add more details to description and hint (#710) ([81be4044](https://github.com/rust-lang/rustlings/commit/81be40448777fa338ebced3b0bfc1b32d6370313)) +* **cli:** Improve the list command with options, and then some ([8bbe4ff1](https://github.com/rust-lang/rustlings/commit/8bbe4ff1385c5c169c90cd3ff9253f9a91daaf8e)) +* **list:** + * updated progress percentage ([1c6f7e4b](https://github.com/rust-lang/rustlings/commit/1c6f7e4b7b9b3bd36f4da2bb2b69c549cc8bd913)) + * added progress info ([c0e3daac](https://github.com/rust-lang/rustlings/commit/c0e3daacaf6850811df5bc57fa43e0f249d5cfa4)) + + + ## 4.3.0 (2020-12-29) diff --git a/Cargo.lock b/Cargo.lock index fb361569..cc8ff94a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -539,7 +539,7 @@ checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" [[package]] name = "rustlings" -version = "4.3.0" +version = "4.4.0" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index 397eb996..0a757040 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "4.3.0" +version = "4.4.0" authors = ["Marisa ", "Carol (Nichols || Goulding) "] edition = "2018" diff --git a/README.md b/README.md index e76a04dc..cf1de15a 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ Basically: Clone the repository, checkout to the latest tag, run `cargo install` ```bash git clone https://github.com/rust-lang/rustlings cd rustlings -git checkout tags/4.3.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) +git checkout tags/4.4.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) cargo install --force --path . ``` diff --git a/src/main.rs b/src/main.rs index bc1b71e4..a80ce88e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,7 +23,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "4.3.0"; +const VERSION: &str = "4.4.0"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From 4a384cae4ac735e243bbc58184b1f409e914ddc5 Mon Sep 17 00:00:00 2001 From: Zerotask Date: Sat, 24 Apr 2021 12:12:49 +0200 Subject: [PATCH 0341/1293] docs(option): improve further information --- exercises/option/README.md | 2 ++ exercises/option/option1.rs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/exercises/option/README.md b/exercises/option/README.md index a304bb44..89c00289 100644 --- a/exercises/option/README.md +++ b/exercises/option/README.md @@ -16,3 +16,5 @@ Option types are very common in Rust code, as they have a number of uses: - [Option Enum Format](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-enum-definitions) - [Option Module Documentation](https://doc.rust-lang.org/std/option/) - [Option Enum Documentation](https://doc.rust-lang.org/std/option/enum.Option.html) +- [if let](https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html) +- [while let](https://doc.rust-lang.org/rust-by-example/flow_control/while_let.html) diff --git a/exercises/option/option1.rs b/exercises/option/option1.rs index 602ff1a9..17cf4f60 100644 --- a/exercises/option/option1.rs +++ b/exercises/option/option1.rs @@ -3,7 +3,7 @@ // I AM NOT DONE -// you can modify anything EXCEPT for this function's sig +// you can modify anything EXCEPT for this function's signature fn print_number(maybe_number: Option) { println!("printing: {}", maybe_number.unwrap()); } From c6b7ad8878d77202cd1f363a0d6b021ee48604ad Mon Sep 17 00:00:00 2001 From: Dan Stoian Date: Sat, 24 Apr 2021 18:32:13 +0300 Subject: [PATCH 0342/1293] updated README.md; specify need for admin rights --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf1de15a..99b9d6e0 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ This will install Rustlings and give you access to the `rustlings` command. Run ## Windows -In PowerShell, set `ExecutionPolicy` to `RemoteSigned`: +In PowerShell (Run as Administrator), set `ExecutionPolicy` to `RemoteSigned`: ```ps Set-ExecutionPolicy RemoteSigned From 4f7dbbd2c31b49d0a34f28ae4d4ccf8210289754 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 24 Apr 2021 15:36:38 +0000 Subject: [PATCH 0343/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 99b9d6e0..8ca25bae 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-90-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-91-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -278,6 +278,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Shao Yang Hong

πŸ–‹
Brandon Macer

πŸ–‹ +
Stoian Dan

πŸ–‹ From 3a9ec4192dc7584a56999d70b533ec18a03a096c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 24 Apr 2021 15:36:39 +0000 Subject: [PATCH 0344/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2820d18a..2f209713 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -838,6 +838,15 @@ "contributions": [ "content" ] + }, + { + "login": "stoiandan", + "name": "Stoian Dan", + "avatar_url": "https://avatars.githubusercontent.com/u/10388612?v=4", + "profile": "https://github.com/stoiandan", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 7f0d2c2bf011838d77fc05f111aacf2b0a663f5c Mon Sep 17 00:00:00 2001 From: apogeeoak <59737221+apogeeoak@users.noreply.github.com> Date: Sat, 24 Apr 2021 12:42:06 -0400 Subject: [PATCH 0345/1293] chore(iterators5): Minor formatting improvements. --- exercises/standard_library_types/iterators5.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/exercises/standard_library_types/iterators5.rs b/exercises/standard_library_types/iterators5.rs index 2d97bd46..6e246b4c 100644 --- a/exercises/standard_library_types/iterators5.rs +++ b/exercises/standard_library_types/iterators5.rs @@ -1,5 +1,4 @@ // iterators5.rs - // Let's define a simple model to track Rustlings exercise progress. Progress // will be modelled using a hash map. The name of the exercise is the key and // the progress is the value. Two counting functions were created to count the @@ -7,8 +6,7 @@ // imperative style for loops. Recreate this counting functionality using // iterators. Only the two iterator methods (count_iterator and // count_collection_iterator) need to be modified. -// Execute `rustlings hint -// iterators5` for hints. +// Execute `rustlings hint iterators5` for hints. // // Make the code compile and the tests pass. From 21c9f44168394e08338fd470b5f49b1fd235986f Mon Sep 17 00:00:00 2001 From: apogeeoak <59737221+apogeeoak@users.noreply.github.com> Date: Sat, 24 Apr 2021 13:15:34 -0400 Subject: [PATCH 0346/1293] feat(intro): Add intro section. --- exercises/intro/README.md | 8 ++++++++ exercises/intro/intro1.rs | 19 +++++++++++++++++++ exercises/intro/intro2.rs | 9 +++++++++ exercises/variables/variables1.rs | 8 ++------ info.toml | 16 ++++++++++++++++ 5 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 exercises/intro/README.md create mode 100644 exercises/intro/intro1.rs create mode 100644 exercises/intro/intro2.rs diff --git a/exercises/intro/README.md b/exercises/intro/README.md new file mode 100644 index 00000000..d32e4a8b --- /dev/null +++ b/exercises/intro/README.md @@ -0,0 +1,8 @@ +# Intro + +Rust uses the `print!` and `println!` macros to print text to the console. + +## Further information + +- [Hello World](https://doc.rust-lang.org/rust-by-example/hello.html) +- [Formatted print](https://doc.rust-lang.org/rust-by-example/hello/print.html) diff --git a/exercises/intro/intro1.rs b/exercises/intro/intro1.rs new file mode 100644 index 00000000..83a78e68 --- /dev/null +++ b/exercises/intro/intro1.rs @@ -0,0 +1,19 @@ +// intro1.rs +// About this `I AM NOT DONE` thing: +// We sometimes encourage you to keep trying things on a given exercise, even +// after you already figured it out. If you got everything working and feel +// ready for the next exercise, remove the `I AM NOT DONE` comment below. +// Execute the command `rustlings hint intro1` for a hint. + +// I AM NOT DONE + +fn main() { + println!("Hello and"); + println!(r#" welcome to... "#); + println!(r#" _ _ _ "#); + println!(r#" _ __ _ _ ___| |_| (_)_ __ __ _ ___ "#); + println!(r#" | '__| | | / __| __| | | '_ \ / _` / __| "#); + println!(r#" | | | |_| \__ \ |_| | | | | | (_| \__ \ "#); + println!(r#" |_| \__,_|___/\__|_|_|_| |_|\__, |___/ "#); + println!(r#" |___/ "#); +} diff --git a/exercises/intro/intro2.rs b/exercises/intro/intro2.rs new file mode 100644 index 00000000..97a073f0 --- /dev/null +++ b/exercises/intro/intro2.rs @@ -0,0 +1,9 @@ +// intro2.rs +// Make the code print a greeting to the world. +// Execute `rustlings hint intro2` for a hint. + +// I AM NOT DONE + +fn main() { + println!("Hello {}!"); +} diff --git a/exercises/variables/variables1.rs b/exercises/variables/variables1.rs index 4a3af73c..d1af8311 100644 --- a/exercises/variables/variables1.rs +++ b/exercises/variables/variables1.rs @@ -1,10 +1,6 @@ // variables1.rs -// Make me compile! Execute the command `rustlings hint variables1` if you want a hint :) - -// About this `I AM NOT DONE` thing: -// We sometimes encourage you to keep trying things on a given exercise, -// even after you already figured it out. If you got everything working and -// feel ready for the next exercise, remove the `I AM NOT DONE` comment below. +// Make me compile! +// Execute the command `rustlings hint variables1` if you want a hint :) // I AM NOT DONE diff --git a/info.toml b/info.toml index 82e11952..c56b19fd 100644 --- a/info.toml +++ b/info.toml @@ -1,3 +1,19 @@ +# INTRO + +[[exercises]] +name = "intro1" +path = "exercises/intro/intro1.rs" +mode = "compile" +hint = """ +Remove the I AM NOT DONE comment to move on to the next exercise.""" + +[[exercises]] +name = "intro2" +path = "exercises/intro/intro2.rs" +mode = "compile" +hint = """ +Add an argument after the format string.""" + # VARIABLES [[exercises]] From 650b1dee541d3ad789c4ac6d461045e7c592b396 Mon Sep 17 00:00:00 2001 From: Maarten Tibau Date: Sun, 25 Apr 2021 17:49:46 +0200 Subject: [PATCH 0347/1293] chore: Update quiz1.rs add explicit test for 40 --- exercises/quiz1.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index 5c5c355d..2bb2c24a 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -16,8 +16,10 @@ #[test] fn verify_test() { let price1 = calculate_apple_price(35); - let price2 = calculate_apple_price(65); + let price2 = calculate_apple_price(40); + let price3 = calculate_apple_price(65); assert_eq!(70, price1); - assert_eq!(65, price2); + assert_eq!(80, price2); + assert_eq!(65, price3); } From 9b8de65525a5576b78cf0c8e4098cdd34296338f Mon Sep 17 00:00:00 2001 From: apogeeoak <59737221+apogeeoak@users.noreply.github.com> Date: Mon, 26 Apr 2021 20:28:17 -0400 Subject: [PATCH 0348/1293] fix(intro1): Add compiler error explanation. --- exercises/intro/intro1.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/exercises/intro/intro1.rs b/exercises/intro/intro1.rs index 83a78e68..1c4582de 100644 --- a/exercises/intro/intro1.rs +++ b/exercises/intro/intro1.rs @@ -16,4 +16,8 @@ fn main() { println!(r#" | | | |_| \__ \ |_| | | | | | (_| \__ \ "#); println!(r#" |_| \__,_|___/\__|_|_|_| |_|\__, |___/ "#); println!(r#" |___/ "#); + println!(); + println!("This exercise compiles successfully. The remaining exercises contain a compiler"); + println!("or logic error. The central concept behind Rustlings is to fix these errors and"); + println!("solve the exercises. Good luck!"); } From 166a53946cf79d01f0ae670d7778f9f7221b7cba Mon Sep 17 00:00:00 2001 From: Martin HART <82845873+martinhartxyz@users.noreply.github.com> Date: Tue, 27 Apr 2021 20:22:13 +0200 Subject: [PATCH 0349/1293] Correct small typo in exercises/conversions/from_str.rs --- exercises/conversions/from_str.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 4beebacd..93a5299a 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -20,7 +20,7 @@ struct Person { // 4. Extract the first element from the split operation and use it as the name // 5. Extract the other element from the split operation and parse it into a `usize` as the age // with something like `"4".parse::()` -// 5. If while extracting the name and the age something goes wrong, an error should be returned +// 6. If while extracting the name and the age something goes wrong, an error should be returned // If everything goes well, then return a Result of a Person object impl FromStr for Person { From 86cc85295ae36948963ae52882e285d7e3e29323 Mon Sep 17 00:00:00 2001 From: Martin HART <82845873+martinhartxyz@users.noreply.github.com> Date: Tue, 27 Apr 2021 20:22:13 +0200 Subject: [PATCH 0350/1293] fix: Correct small typo in exercises/conversions/from_str.rs --- exercises/conversions/from_str.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 4beebacd..93a5299a 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -20,7 +20,7 @@ struct Person { // 4. Extract the first element from the split operation and use it as the name // 5. Extract the other element from the split operation and parse it into a `usize` as the age // with something like `"4".parse::()` -// 5. If while extracting the name and the age something goes wrong, an error should be returned +// 6. If while extracting the name and the age something goes wrong, an error should be returned // If everything goes well, then return a Result of a Person object impl FromStr for Person { From f78c48020830d7900dd8d81f355606581670446d Mon Sep 17 00:00:00 2001 From: apogeeoak <59737221+apogeeoak@users.noreply.github.com> Date: Tue, 27 Apr 2021 17:09:44 -0400 Subject: [PATCH 0351/1293] fix(cli): Move long text strings into constants. --- default_out.txt | 25 ------------ src/main.rs | 104 +++++++++++++++++++++++++++++------------------- 2 files changed, 64 insertions(+), 65 deletions(-) delete mode 100644 default_out.txt diff --git a/default_out.txt b/default_out.txt deleted file mode 100644 index b90d1e3a..00000000 --- a/default_out.txt +++ /dev/null @@ -1,25 +0,0 @@ -Thanks for installing Rustlings! - -Is this your first time? Don't worry, Rustlings was made for beginners! We are -going to teach you a lot of things about Rust, but before we can get -started, here's a couple of notes about how Rustlings operates: - -1. The central concept behind Rustlings is that you solve exercises. These - exercises usually have some sort of syntax error in them, which will cause - them to fail compilation or testing. Sometimes there's a logic error instead - of a syntax error. No matter what error, it's your job to find it and fix it! - You'll know when you fixed it because then, the exercise will compile and - Rustlings will be able to move on to the next exercise. -2. If you run Rustlings in watch mode (which we recommend), it'll automatically - start with the first exercise. Don't get confused by an error message popping - up as soon as you run Rustlings! This is part of the exercise that you're - supposed to solve, so open the exercise file in an editor and start your - detective work! -3. If you're stuck on an exercise, there is a helpful hint you can view by typing - 'hint' (in watch mode), or running `rustlings hint myexercise`. -4. If an exercise doesn't make sense to you, feel free to open an issue on GitHub! - (https://github.com/rust-lang/rustlings/issues/new). We look at every issue, - and sometimes, other learners do too so you can help each other out! - -Got all that? Great! To get started, run `rustlings watch` in order to get the first -exercise. Make sure to have your editor open! diff --git a/src/main.rs b/src/main.rs index a80ce88e..64161e58 100644 --- a/src/main.rs +++ b/src/main.rs @@ -107,15 +107,7 @@ fn main() { } if args.nested.is_none() { - println!(); - println!(r#" welcome to... "#); - println!(r#" _ _ _ "#); - println!(r#" _ __ _ _ ___| |_| (_)_ __ __ _ ___ "#); - println!(r#" | '__| | | / __| __| | | '_ \ / _` / __| "#); - println!(r#" | | | |_| \__ \ |_| | | | | | (_| \__ \ "#); - println!(r#" |_| \__,_|___/\__|_|_|_| |_|\__, |___/ "#); - println!(r#" |___/ "#); - println!(); + println!("\n{}\n", WELCOME); } if !Path::new("info.toml").exists() { @@ -139,8 +131,7 @@ fn main() { let verbose = args.nocapture; let command = args.nested.unwrap_or_else(|| { - let text = fs::read_to_string("default_out.txt").unwrap(); - println!("{}", text); + println!("{}\n", DEFAULT_OUT); std::process::exit(0); }); match command { @@ -229,35 +220,7 @@ fn main() { "{emoji} All exercises completed! {emoji}", emoji = Emoji("πŸŽ‰", "β˜…") ); - println!(); - println!("+----------------------------------------------------+"); - println!("| You made it to the Fe-nish line! |"); - println!("+-------------------------- ------------------------+"); - println!(" \\/ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); - println!(" β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ "); - println!(" β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); - println!(); - println!("We hope you enjoyed learning about the various aspects of Rust!"); - println!( - "If you noticed any issues, please don't hesitate to report them to our repo." - ); - println!("You can also contribute your own exercises to help the greater community!"); - println!(); - println!("Before reporting an issue or contributing, please read our guidelines:"); - println!("https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md"); + println!("\n{}\n", FENISH_LINE); } } } @@ -356,3 +319,64 @@ fn rustc_exists() -> bool { .map(|status| status.success()) .unwrap_or(false) } + +const DEFAULT_OUT: &str = r#"Thanks for installing Rustlings! + +Is this your first time? Don't worry, Rustlings was made for beginners! We are +going to teach you a lot of things about Rust, but before we can get +started, here's a couple of notes about how Rustlings operates: + +1. The central concept behind Rustlings is that you solve exercises. These + exercises usually have some sort of syntax error in them, which will cause + them to fail compilation or testing. Sometimes there's a logic error instead + of a syntax error. No matter what error, it's your job to find it and fix it! + You'll know when you fixed it because then, the exercise will compile and + Rustlings will be able to move on to the next exercise. +2. If you run Rustlings in watch mode (which we recommend), it'll automatically + start with the first exercise. Don't get confused by an error message popping + up as soon as you run Rustlings! This is part of the exercise that you're + supposed to solve, so open the exercise file in an editor and start your + detective work! +3. If you're stuck on an exercise, there is a helpful hint you can view by typing + 'hint' (in watch mode), or running `rustlings hint exercise_name`. +4. If an exercise doesn't make sense to you, feel free to open an issue on GitHub! + (https://github.com/rust-lang/rustlings/issues/new). We look at every issue, + and sometimes, other learners do too so you can help each other out! + +Got all that? Great! To get started, run `rustlings watch` in order to get the first +exercise. Make sure to have your editor open!"#; + +const FENISH_LINE: &str = r#"+----------------------------------------------------+ +| You made it to the Fe-nish line! | ++-------------------------- ------------------------+ + \\/ + β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ + β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ + β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ + β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ + β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ + β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ + β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ + β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ + β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ + β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ + β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ + β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ + β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ + β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ + β–’β–’ β–’β–’ β–’β–’ β–’β–’ + +We hope you enjoyed learning about the various aspects of Rust! +If you noticed any issues, please don't hesitate to report them to our repo. +You can also contribute your own exercises to help the greater community! + +Before reporting an issue or contributing, please read our guidelines: +https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md"#; + +const WELCOME: &str = r#" welcome to... + _ _ _ + _ __ _ _ ___| |_| (_)_ __ __ _ ___ + | '__| | | / __| __| | | '_ \ / _` / __| + | | | |_| \__ \ |_| | | | | | (_| \__ \ + |_| \__,_|___/\__|_|_|_| |_|\__, |___/ + |___/"#; From 9569c9a9e72fb0ff792437207a579930cea8f9fb Mon Sep 17 00:00:00 2001 From: Pi Delport Date: Thu, 29 Apr 2021 23:31:26 +0200 Subject: [PATCH 0352/1293] style(standard_library_types): stray line break --- exercises/standard_library_types/iterators5.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/exercises/standard_library_types/iterators5.rs b/exercises/standard_library_types/iterators5.rs index 2d97bd46..d8d44537 100644 --- a/exercises/standard_library_types/iterators5.rs +++ b/exercises/standard_library_types/iterators5.rs @@ -7,8 +7,7 @@ // imperative style for loops. Recreate this counting functionality using // iterators. Only the two iterator methods (count_iterator and // count_collection_iterator) need to be modified. -// Execute `rustlings hint -// iterators5` for hints. +// Execute `rustlings hint iterators5` for hints. // // Make the code compile and the tests pass. From 404f3ef465f15916f3f9348190459b64d513b056 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 1 May 2021 10:12:42 +0000 Subject: [PATCH 0353/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ca25bae..fede6723 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-91-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-92-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -279,6 +279,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Shao Yang Hong

πŸ–‹
Brandon Macer

πŸ–‹
Stoian Dan

πŸ–‹ +
Pi Delport

πŸ–‹ From ce40e201f0b454822074399800886068317027aa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 1 May 2021 10:12:43 +0000 Subject: [PATCH 0354/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2f209713..4627e294 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -847,6 +847,15 @@ "contributions": [ "content" ] + }, + { + "login": "PiDelport", + "name": "Pi Delport", + "avatar_url": "https://avatars.githubusercontent.com/u/630271?v=4", + "profile": "https://about.me/pjdelport", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d9b69bd1a0a7a99f2c0d80933ad2eea44c8c71b2 Mon Sep 17 00:00:00 2001 From: Juan Pablo Ramirez Date: Sun, 9 May 2021 17:58:54 -0500 Subject: [PATCH 0355/1293] fix: remove trailing whitespace --- exercises/structs/structs3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index 8d8b4710..a80d0625 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -31,7 +31,7 @@ impl Package { } fn get_fees(&self, cents_per_gram: i32) -> ??? { - // Something goes here... + // Something goes here... } } From 31457940846b3844d78d4a4d2b074bc8d6aaf1eb Mon Sep 17 00:00:00 2001 From: Juan Pablo Ramirez Date: Tue, 11 May 2021 14:50:05 -0500 Subject: [PATCH 0356/1293] fix: add hints to generics1 and generics2 exercises --- exercises/generics/generics1.rs | 2 ++ exercises/generics/generics2.rs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/exercises/generics/generics1.rs b/exercises/generics/generics1.rs index 967287ef..f93e64a0 100644 --- a/exercises/generics/generics1.rs +++ b/exercises/generics/generics1.rs @@ -1,6 +1,8 @@ // This shopping list program isn't compiling! // Use your knowledge of generics to fix it. +// Execute `rustlings hint generics1` for hints! + // I AM NOT DONE fn main() { diff --git a/exercises/generics/generics2.rs b/exercises/generics/generics2.rs index 0cb59adc..1501529c 100644 --- a/exercises/generics/generics2.rs +++ b/exercises/generics/generics2.rs @@ -1,6 +1,8 @@ // This powerful wrapper provides the ability to store a positive integer value. // Rewrite it using generics so that it supports wrapping ANY type. +// Execute `rustlings hint generics2` for hints! + // I AM NOT DONE struct Wrapper { From 4d4fa77459392acd3581c6068aa8be9a02de12fc Mon Sep 17 00:00:00 2001 From: Juan Pablo Ramirez Date: Wed, 12 May 2021 10:20:07 -0500 Subject: [PATCH 0357/1293] fix: remove trailing whitespaces from iterators1 --- exercises/standard_library_types/iterators1.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/standard_library_types/iterators1.rs b/exercises/standard_library_types/iterators1.rs index 3fd519d6..4606ad35 100644 --- a/exercises/standard_library_types/iterators1.rs +++ b/exercises/standard_library_types/iterators1.rs @@ -1,11 +1,11 @@ // iterators1.rs -// +// // Make me compile by filling in the `???`s // // When performing operations on elements within a collection, iterators are essential. -// This module helps you get familiar with the structure of using an iterator and +// This module helps you get familiar with the structure of using an iterator and // how to go through elements within an iterable collection. -// +// // Execute `rustlings hint iterators1` for hints :D // I AM NOT DONE From 11d2cf0d604dee3f5023c17802d69438e69fa50e Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Sat, 15 May 2021 14:01:17 -0500 Subject: [PATCH 0358/1293] fix(try_from_into, from_str): hints for dyn Error Add hints about how to return the correct type for functions that return `Result<_, Box`. Some feedback from Discord suggests that people run into trouble with that. --- info.toml | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/info.toml b/info.toml index 82e11952..0535a77b 100644 --- a/info.toml +++ b/info.toml @@ -893,7 +893,19 @@ path = "exercises/conversions/try_from_into.rs" mode = "test" hint = """ Follow the steps provided right before the `TryFrom` implementation. -You can also use the example at https://doc.rust-lang.org/std/convert/trait.TryFrom.html""" +You can also use the example at https://doc.rust-lang.org/std/convert/trait.TryFrom.html + +You might want to look back at the exercise errorsn (or its hints) to remind +yourself about how `Box` works. + +If you're trying to return a string as an error, note that neither `str` +nor `String` implements `error::Error`. However, there is an implementation +of `From<&str>` for `Box`. This means you can use `.into()` or +the `?` operator to convert your string into the correct error type. + +If you're having trouble with using the `?` operator to convert an error string, +recall that `?` works to convert `Err(something)` into the appropriate error +type for returning from the function.""" [[exercises]] name = "as_ref_mut" @@ -909,4 +921,7 @@ mode = "test" 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. -This is almost like the `try_from_into` exercise.""" +This is almost like the `try_from_into` exercise. + +If you're having trouble with returning the correct error type, see the +hints for try_from_into.""" From 399ab328d8d407265c09563aa4ef4534b2503ff2 Mon Sep 17 00:00:00 2001 From: Sateesh Date: Mon, 17 May 2021 17:40:40 +0530 Subject: [PATCH 0359/1293] feat: Add move_semantics5 exercise. (#746) * feat: Add move_semantics5 exercise. * feat: Add option3 exercise * Address review comments. Fix typos, sentence formatting. * Remove unwanted newline. * Address review comments: make comment inline, fix format in print. --- exercises/move_semantics/move_semantics5.rs | 14 ++++++++++++++ exercises/option/option3.rs | 19 +++++++++++++++++++ info.toml | 21 +++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 exercises/move_semantics/move_semantics5.rs create mode 100644 exercises/option/option3.rs diff --git a/exercises/move_semantics/move_semantics5.rs b/exercises/move_semantics/move_semantics5.rs new file mode 100644 index 00000000..4f8128c7 --- /dev/null +++ b/exercises/move_semantics/move_semantics5.rs @@ -0,0 +1,14 @@ +// move_semantics5.rs +// Make me compile without adding any newlines or removing any of the lines. +// Execute `rustlings hint move_semantics5` for hints :) + +// I AM NOT DONE + +fn main() { + let mut x = 100; + let y = &mut x; + let z = &mut *y; + *y += 100; + *z += 1000; + assert_eq!(x, 1200); +} diff --git a/exercises/option/option3.rs b/exercises/option/option3.rs new file mode 100644 index 00000000..045d2acb --- /dev/null +++ b/exercises/option/option3.rs @@ -0,0 +1,19 @@ +// option3.rs +// Make me compile! Execute `rustlings hint option3` for hints + +// I AM NOT DONE + +struct Point { + x: i32, + y: i32, +} + +fn main() { + let y: Option = Some(Point { x: 100, y: 200 }); + + match y { + Some(p) => println!("Co-ordinates are {},{} ", p.x, p.y), + _ => println!("no match"), + } + y; // Fix without deleting this line. +} diff --git a/info.toml b/info.toml index 0535a77b..0e9f4282 100644 --- a/info.toml +++ b/info.toml @@ -210,6 +210,17 @@ So the end goal is to: - since we're not creating a new vec in `main` anymore, we need to create a new vec in `fill_vec`, similarly to the way we did in `main`""" +[[exercises]] +name = "move_semantics5" +path = "exercises/move_semantics/move_semantics5.rs" +mode = "compile" +hint = """ +Carefully reason about the range in which each mutable reference is in +vogue. Does updating the value of referrent (x) immediately after the +mutable reference is taken helps? Read more about 'Mutable Referenes' +in the book's section References and Borrowing': +https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references.""" + # PRIMITIVE TYPES [[exercises]] @@ -578,6 +589,16 @@ For example: Some(Some(variable)) = variable2 Also see Option::flatten """ +[[exercises]] +name = "option3" +path = "exercises/option/option3.rs" +mode = "compile" +hint = """ +The compiler says a partial move happened in the `match` +statement. How can this be avoided? The compiler shows the correction +needed. After making the correction as suggested by the compiler, do +read: https://doc.rust-lang.org/std/keyword.ref.html""" + [[exercises]] name = "result1" path = "exercises/error_handling/result1.rs" From cd02abc48138f9415d1d81da86524508d501a09f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 17 May 2021 12:11:04 +0000 Subject: [PATCH 0360/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fede6723..503cf2cf 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-92-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-93-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -280,6 +280,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Brandon Macer

πŸ–‹
Stoian Dan

πŸ–‹
Pi Delport

πŸ–‹ +
Sateesh

πŸ’» πŸ–‹ From 72e615aa7ae36c0e0a7c82b3e22a33a04f579e3c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 17 May 2021 12:11:05 +0000 Subject: [PATCH 0361/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4627e294..867f1d51 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -856,6 +856,16 @@ "contributions": [ "content" ] + }, + { + "login": "sateeshkumarb", + "name": "Sateesh ", + "avatar_url": "https://avatars.githubusercontent.com/u/429263?v=4", + "profile": "https://github.com/sateeshkumarb", + "contributions": [ + "code", + "content" + ] } ], "contributorsPerLine": 8, From 4c46e5e1a33478d6cdb5f2a08b62f5ee79e35dd9 Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Sat, 22 May 2021 21:56:14 -0500 Subject: [PATCH 0362/1293] chore: minor typos in move_semantics5 hints --- info.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/info.toml b/info.toml index 0e9f4282..d8e7dd59 100644 --- a/info.toml +++ b/info.toml @@ -216,8 +216,8 @@ path = "exercises/move_semantics/move_semantics5.rs" mode = "compile" hint = """ Carefully reason about the range in which each mutable reference is in -vogue. Does updating the value of referrent (x) immediately after the -mutable reference is taken helps? Read more about 'Mutable Referenes' +vogue. Does updating the value of referent (x) immediately after the +mutable reference is taken helps? Read more about 'Mutable References' in the book's section References and Borrowing': https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references.""" From 1b85828548f46f58b622b5e0c00f8c989f928807 Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Sat, 22 May 2021 22:09:58 -0500 Subject: [PATCH 0363/1293] fix: move_semantics5 hints Improve the hints for move_semantics5, as well as the explanatory comments in the code. Previously, it was not clear what possible changes were allowed. It seems that reordering the statements might be the intended solution. The previous comment about not "adding newlines" doesn't make sense, so treating it as "adding new lines" makes it more clear. --- exercises/move_semantics/move_semantics5.rs | 3 ++- info.toml | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/exercises/move_semantics/move_semantics5.rs b/exercises/move_semantics/move_semantics5.rs index 4f8128c7..2fb7b8e8 100644 --- a/exercises/move_semantics/move_semantics5.rs +++ b/exercises/move_semantics/move_semantics5.rs @@ -1,5 +1,6 @@ // move_semantics5.rs -// Make me compile without adding any newlines or removing any of the lines. +// Make me compile without adding, removing, or changing any of the +// lines in `main()`. // Execute `rustlings hint move_semantics5` for hints :) // I AM NOT DONE diff --git a/info.toml b/info.toml index d8e7dd59..8c8f7c18 100644 --- a/info.toml +++ b/info.toml @@ -216,10 +216,14 @@ path = "exercises/move_semantics/move_semantics5.rs" mode = "compile" hint = """ Carefully reason about the range in which each mutable reference is in -vogue. Does updating the value of referent (x) immediately after the -mutable reference is taken helps? Read more about 'Mutable References' +vogue. Does it help to update the value of referent (x) immediately after +the mutable reference is taken? Read more about 'Mutable References' in the book's section References and Borrowing': -https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references.""" +https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references. + +Additional hint: +If you can't add, change, or remove any statements in `main()`, can you +reorder them in a way that lets the program compile?""" # PRIMITIVE TYPES From 91fc9e3118f4af603c9911698cc2a234725cb032 Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Sun, 6 Jun 2021 17:36:44 -0500 Subject: [PATCH 0364/1293] fix(iterators5): derive Clone, Copy To allow more flexibility in solutions, derive `Clone` and `Copy` for `Progress`. --- exercises/standard_library_types/iterators5.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/standard_library_types/iterators5.rs b/exercises/standard_library_types/iterators5.rs index d8d44537..765028af 100644 --- a/exercises/standard_library_types/iterators5.rs +++ b/exercises/standard_library_types/iterators5.rs @@ -15,7 +15,7 @@ use std::collections::HashMap; -#[derive(PartialEq, Eq)] +#[derive(Clone, Copy, PartialEq, Eq)] enum Progress { None, Some, From 4e079fdd0829ab271508c773aa814b21d6cff32b Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Sun, 6 Jun 2021 17:39:13 -0500 Subject: [PATCH 0365/1293] chore(iterators5): conciseness hint --- info.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 8c8f7c18..562fe42f 100644 --- a/info.toml +++ b/info.toml @@ -788,7 +788,10 @@ test count_iterator. The collection variable in count_collection_iterator is a slice of HashMaps. It needs to be converted into an iterator in order to use the iterator methods. -The fold method can be useful in the count_collection_iterator function.""" +The fold method can be useful in the count_collection_iterator function. + +For a further challenge, consult the documentation for Iterator to find +a different method that could make your code more compact than using fold.""" # THREADS From 50ab289da6b9eb19a7486c341b00048c516b88c0 Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Sun, 6 Jun 2021 20:14:29 -0500 Subject: [PATCH 0366/1293] fix: rename result1 to errors4 Also put it in the ERROR HANDLING section where it probably belongs. --- .../error_handling/{result1.rs => errors4.rs} | 4 ++-- info.toml | 20 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) rename exercises/error_handling/{result1.rs => errors4.rs} (88%) diff --git a/exercises/error_handling/result1.rs b/exercises/error_handling/errors4.rs similarity index 88% rename from exercises/error_handling/result1.rs rename to exercises/error_handling/errors4.rs index b978001b..0685c374 100644 --- a/exercises/error_handling/result1.rs +++ b/exercises/error_handling/errors4.rs @@ -1,5 +1,5 @@ -// result1.rs -// Make this test pass! Execute `rustlings hint result1` for hints :) +// errors4.rs +// Make this test pass! Execute `rustlings hint errors4` for hints :) // I AM NOT DONE diff --git a/info.toml b/info.toml index 8c8f7c18..55875d7e 100644 --- a/info.toml +++ b/info.toml @@ -489,6 +489,15 @@ mode = "compile" hint = """ If other functions can return a `Result`, why shouldn't `main`?""" +[[exercises]] +name = "errors4" +path = "exercises/error_handling/errors4.rs" +mode = "test" +hint = """ +`PositiveNonzeroInteger::new` is always creating a new instance and returning an `Ok` result. +It should be doing some checking, returning an `Err` result if those checks fail, and only +returning an `Ok` result if those checks determine that everything is... okay :)""" + [[exercises]] name = "errorsn" path = "exercises/error_handling/errorsn.rs" @@ -561,7 +570,7 @@ ReportCard struct generic, but also the correct property - you will need to chan of the struct slightly too...you can do it! """ -# OPTIONS / RESULTS +# OPTIONS [[exercises]] name = "option1" @@ -603,15 +612,6 @@ statement. How can this be avoided? The compiler shows the correction needed. After making the correction as suggested by the compiler, do read: https://doc.rust-lang.org/std/keyword.ref.html""" -[[exercises]] -name = "result1" -path = "exercises/error_handling/result1.rs" -mode = "test" -hint = """ -`PositiveNonzeroInteger::new` is always creating a new instance and returning an `Ok` result. -It should be doing some checking, returning an `Err` result if those checks fail, and only -returning an `Ok` result if those checks determine that everything is... okay :)""" - # TRAITS [[exercises]] From 68d3ac567cd5c23f5593c2f4df51612bca3d09a9 Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Sun, 6 Jun 2021 23:05:01 -0500 Subject: [PATCH 0367/1293] feature: improve error_handling exercises Add new exercises errors5 and errors6, to introduce boxed errors and custom error enums more gently. Delete errorsn, because it tried to do too much too soon. --- exercises/error_handling/errors5.rs | 53 +++++++++++++ exercises/error_handling/errors6.rs | 86 ++++++++++++++++++++ exercises/error_handling/errorsn.rs | 117 ---------------------------- info.toml | 61 ++++++++------- 4 files changed, 173 insertions(+), 144 deletions(-) create mode 100644 exercises/error_handling/errors5.rs create mode 100644 exercises/error_handling/errors6.rs delete mode 100644 exercises/error_handling/errorsn.rs diff --git a/exercises/error_handling/errors5.rs b/exercises/error_handling/errors5.rs new file mode 100644 index 00000000..1b118000 --- /dev/null +++ b/exercises/error_handling/errors5.rs @@ -0,0 +1,53 @@ +// errors5.rs + +// This program uses a completed version of the code from errors4. +// It won't compile right now! Why? +// Execute `rustlings hint errors5` for hints! + +// I AM NOT DONE + +use std::error; +use std::fmt; +use std::num::ParseIntError; + +// TODO: update the return type of `main()` to make this compile. +fn main() -> Result<(), ParseIntError> { + let pretend_user_input = "42"; + let x: i64 = pretend_user_input.parse()?; + println!("output={:?}", PositiveNonzeroInteger::new(x)?); + Ok(()) +} + +// Don't change anything below this line. + +#[derive(PartialEq, Debug)] +struct PositiveNonzeroInteger(u64); + +#[derive(PartialEq, Debug)] +enum CreationError { + Negative, + Zero, +} + +impl PositiveNonzeroInteger { + fn new(value: i64) -> Result { + match value { + x if x < 0 => Err(CreationError::Negative), + x if x == 0 => Err(CreationError::Zero), + x => Ok(PositiveNonzeroInteger(x as u64)) + } + } +} + +// This is required so that `CreationError` can implement `error::Error`. +impl fmt::Display for CreationError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let description = match *self { + CreationError::Negative => "Number is negative", + CreationError::Zero => "Number is zero", + }; + f.write_str(description) + } +} + +impl error::Error for CreationError {} diff --git a/exercises/error_handling/errors6.rs b/exercises/error_handling/errors6.rs new file mode 100644 index 00000000..cee72504 --- /dev/null +++ b/exercises/error_handling/errors6.rs @@ -0,0 +1,86 @@ +// errors6.rs + +// Using catch-all error types like `Box` isn't recommended +// for library code, where callers might want to make decisions based on the +// error content, instead of printing it out or propagating it further. Here, +// we define a custom error type to make it possible for callers to decide +// what to do next when our function returns an error. + +// Make these tests pass! Execute `rustlings hint errors6` for hints :) + +// I AM NOT DONE + +// This is a custom error type that we will be using in `parse_pos_nonzero()`. +#[derive(PartialEq, Debug)] +enum ParsePosNonzeroError { + CreationError, + ParseIntError +} + +fn parse_pos_nonzero(s: &str) + -> Result +{ + // TODO: change this to return an appropriate error instead of panicking + // when `parse()` returns an error. + let x: i64 = s.parse().unwrap(); + PositiveNonzeroInteger::new(x) + .or(Err(ParsePosNonzeroError::CreationError)) +} + +// Don't change anything below this line. + +#[derive(PartialEq, Debug)] +struct PositiveNonzeroInteger(u64); + +#[derive(PartialEq, Debug)] +enum CreationError { + Negative, + Zero, +} + +impl PositiveNonzeroInteger { + fn new(value: i64) -> Result { + match value { + x if x < 0 => Err(CreationError::Negative), + x if x == 0 => Err(CreationError::Zero), + x => Ok(PositiveNonzeroInteger(x as u64)) + } + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_parse_error() { + assert_eq!( + parse_pos_nonzero("not a number"), + Err(ParsePosNonzeroError::ParseIntError) + ); + } + + #[test] + fn test_negative() { + assert_eq!( + parse_pos_nonzero("-555"), + Err(ParsePosNonzeroError::CreationError) + ); + } + + #[test] + fn test_zero() { + assert_eq!( + parse_pos_nonzero("0"), + Err(ParsePosNonzeroError::CreationError) + ); + } + + #[test] + fn test_positive() { + assert_eq!( + parse_pos_nonzero("42"), + Ok(PositiveNonzeroInteger(42)) + ); + } +} diff --git a/exercises/error_handling/errorsn.rs b/exercises/error_handling/errorsn.rs deleted file mode 100644 index 5fe212bf..00000000 --- a/exercises/error_handling/errorsn.rs +++ /dev/null @@ -1,117 +0,0 @@ -// errorsn.rs -// This is a bigger error exercise than the previous ones! -// You can do it! :) -// -// Edit the `read_and_validate` function ONLY. Don't create any Errors -// that do not already exist. -// -// So many things could go wrong! -// -// - Reading from stdin could produce an io::Error -// - Parsing the input could produce a num::ParseIntError -// - Validating the input could produce a CreationError (defined below) -// -// How can we lump these errors into one general error? That is, what -// type goes where the question marks are, and how do we return -// that type from the body of read_and_validate? -// -// Execute `rustlings hint errorsn` for hints :) - -// I AM NOT DONE - -use std::error; -use std::fmt; -use std::io; - -// PositiveNonzeroInteger is a struct defined below the tests. -fn read_and_validate(b: &mut dyn io::BufRead) -> Result { - let mut line = String::new(); - b.read_line(&mut line); - let num: i64 = line.trim().parse(); - let answer = PositiveNonzeroInteger::new(num); - answer -} - -// -// Nothing below this needs to be modified -// - -// This is a test helper function that turns a &str into a BufReader. -fn test_with_str(s: &str) -> Result> { - let mut b = io::BufReader::new(s.as_bytes()); - read_and_validate(&mut b) -} - -#[test] -fn test_success() { - let x = test_with_str("42\n"); - assert_eq!(PositiveNonzeroInteger(42), x.unwrap()); -} - -#[test] -fn test_not_num() { - let x = test_with_str("eleven billion\n"); - assert!(x.is_err()); -} - -#[test] -fn test_non_positive() { - let x = test_with_str("-40\n"); - assert!(x.is_err()); -} - -#[test] -fn test_ioerror() { - struct Broken; - impl io::Read for Broken { - fn read(&mut self, _buf: &mut [u8]) -> io::Result { - Err(io::Error::new(io::ErrorKind::BrokenPipe, "uh-oh!")) - } - } - let mut b = io::BufReader::new(Broken); - assert!(read_and_validate(&mut b).is_err()); - assert_eq!("uh-oh!", read_and_validate(&mut b).unwrap_err().to_string()); -} - -#[derive(PartialEq, Debug)] -struct PositiveNonzeroInteger(u64); - -impl PositiveNonzeroInteger { - fn new(value: i64) -> Result { - if value == 0 { - Err(CreationError::Zero) - } else if value < 0 { - Err(CreationError::Negative) - } else { - Ok(PositiveNonzeroInteger(value as u64)) - } - } -} - -#[test] -fn test_positive_nonzero_integer_creation() { - assert!(PositiveNonzeroInteger::new(10).is_ok()); - assert_eq!( - Err(CreationError::Negative), - PositiveNonzeroInteger::new(-10) - ); - assert_eq!(Err(CreationError::Zero), PositiveNonzeroInteger::new(0)); -} - -#[derive(PartialEq, Debug)] -enum CreationError { - Negative, - Zero, -} - -impl fmt::Display for CreationError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let description = match *self { - CreationError::Negative => "Number is negative", - CreationError::Zero => "Number is zero", - }; - f.write_str(description) - } -} - -impl error::Error for CreationError {} diff --git a/info.toml b/info.toml index 55875d7e..63eb78b0 100644 --- a/info.toml +++ b/info.toml @@ -499,42 +499,49 @@ It should be doing some checking, returning an `Err` result if those checks fail returning an `Ok` result if those checks determine that everything is... okay :)""" [[exercises]] -name = "errorsn" -path = "exercises/error_handling/errorsn.rs" -mode = "test" +name = "errors5" +path = "exercises/error_handling/errors5.rs" +mode = "compile" hint = """ -First hint: To figure out what type should go where the ??? is, take a look -at the test helper function `test_with_str`, since it returns whatever -`read_and_validate` returns and `test_with_str` has its signature fully -specified. - - -Next hint: There are three places in `read_and_validate` that we call a -function that returns a `Result` (that is, the functions might fail). -Apply the `?` operator on those calls so that we return immediately from -`read_and_validate` if those function calls fail. - +Hint: There are two different possible `Result` types produced within +`main()`, which are propagated using `?` operators. How do we declare a +return type from `main()` that allows both? Another hint: under the hood, the `?` operator calls `From::from` -on the error value to convert it to a boxed trait object, a Box, -which is polymorphic-- that means that lots of different kinds of errors -can be returned from the same function because all errors act the same -since they all implement the `error::Error` trait. +on the error value to convert it to a boxed trait object, a +`Box`, which is polymorphic-- that means that lots of +different kinds of errors can be returned from the same function because +all errors act the same since they all implement the `error::Error` trait. Check out this section of the book: https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html#a-shortcut-for-propagating-errors-the--operator +This exercise uses some concepts that we won't get to until later in the +course, like `Box` and the `From` trait. It's not important to understand +them in detail right now, but you can read ahead if you like. -Another another hint: Note that because the `?` operator returns -the *unwrapped* value in the `Ok` case, if we want to return a `Result` from -`read_and_validate` for *its* success case, we'll have to rewrap a value -that we got from the return value of a `?`ed call in an `Ok`-- this will -look like `Ok(something)`. +Read more about boxing errors: +https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/boxing_errors.html +Read more about using the `?` operator with boxed errors: +https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/reenter_question_mark.html +""" -Another another another hint: `Result`s must be "used", that is, you'll -get a warning if you don't handle a `Result` that you get in your -function. Read more about that in the `std::result` module docs: -https://doc.rust-lang.org/std/result/#results-must-be-used""" +[[exercises]] +name = "errors6" +path = "exercises/error_handling/errors6.rs" +mode = "test" +hint = """ +This exercise uses a completed version of `PositiveNonzeroInteger` from +the errors4. + +Below the TODO line, there is an example of using the `.or()` method +on a `Result` to transform one type of error into another. Try using +something similar on the `Result` from `parse()`. You might use the `?` +operator to return early from the function, or you might use a `match` +expression, or maybe there's another way! + +Read more about `.or()` in the `std::result` documentation: +https://doc.rust-lang.org/std/result/enum.Result.html#method.or""" # Generics From 48ffcbd2c4cc4d936c2c7480019190f179813cc5 Mon Sep 17 00:00:00 2001 From: ZC Date: Mon, 7 Jun 2021 18:22:55 +0800 Subject: [PATCH 0368/1293] fix(variables5): confine the answer further let mut number = 3; can lead to a correct answer, so the comment helps to direct the users to the intended answer. --- exercises/variables/variables5.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/variables/variables5.rs b/exercises/variables/variables5.rs index da37ae99..175eebb3 100644 --- a/exercises/variables/variables5.rs +++ b/exercises/variables/variables5.rs @@ -4,7 +4,7 @@ // I AM NOT DONE fn main() { - let number = "T-H-R-E-E"; + let number = "T-H-R-E-E"; // don't change this line println!("Spell a Number : {}", number); number = 3; println!("Number plus two is : {}", number + 2); From b7ddd09fab97fc96f032bc8c0b9e1a64e5ffbcdd Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Wed, 9 Jun 2021 18:13:57 -0500 Subject: [PATCH 0369/1293] address review feedback Adjust error text and naming to conform with best practices. Use `map_err()` instead of `or()`. Wrap lower-level errors instead of ignoring their details. Also, don't "cheat" by bypassing the `new()` function in tests. Fix a dangling reference in the try_from_into hints. --- exercises/error_handling/errors5.rs | 4 ++-- exercises/error_handling/errors6.rs | 33 ++++++++++++++++++----------- info.toml | 21 ++++++++++-------- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/exercises/error_handling/errors5.rs b/exercises/error_handling/errors5.rs index 1b118000..365a8691 100644 --- a/exercises/error_handling/errors5.rs +++ b/exercises/error_handling/errors5.rs @@ -43,8 +43,8 @@ impl PositiveNonzeroInteger { impl fmt::Display for CreationError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let description = match *self { - CreationError::Negative => "Number is negative", - CreationError::Zero => "Number is zero", + CreationError::Negative => "number is negative", + CreationError::Zero => "number is zero", }; f.write_str(description) } diff --git a/exercises/error_handling/errors6.rs b/exercises/error_handling/errors6.rs index cee72504..0f6b27a6 100644 --- a/exercises/error_handling/errors6.rs +++ b/exercises/error_handling/errors6.rs @@ -10,11 +10,20 @@ // I AM NOT DONE +use std::num::ParseIntError; + // This is a custom error type that we will be using in `parse_pos_nonzero()`. #[derive(PartialEq, Debug)] enum ParsePosNonzeroError { - CreationError, - ParseIntError + Creation(CreationError), + ParseInt(ParseIntError) +} + +impl ParsePosNonzeroError { + fn from_creation(err: CreationError) -> ParsePosNonzeroError { + ParsePosNonzeroError::Creation(err) + } + // TODO: add another error conversion function here. } fn parse_pos_nonzero(s: &str) @@ -24,7 +33,7 @@ fn parse_pos_nonzero(s: &str) // when `parse()` returns an error. let x: i64 = s.parse().unwrap(); PositiveNonzeroInteger::new(x) - .or(Err(ParsePosNonzeroError::CreationError)) + .map_err(ParsePosNonzeroError::from_creation) } // Don't change anything below this line. @@ -54,17 +63,18 @@ mod test { #[test] fn test_parse_error() { - assert_eq!( + // We can't construct a ParseIntError, so we have to pattern match. + assert!(matches!( parse_pos_nonzero("not a number"), - Err(ParsePosNonzeroError::ParseIntError) - ); + Err(ParsePosNonzeroError::ParseInt(_)) + )); } #[test] fn test_negative() { assert_eq!( parse_pos_nonzero("-555"), - Err(ParsePosNonzeroError::CreationError) + Err(ParsePosNonzeroError::Creation(CreationError::Negative)) ); } @@ -72,15 +82,14 @@ mod test { fn test_zero() { assert_eq!( parse_pos_nonzero("0"), - Err(ParsePosNonzeroError::CreationError) + Err(ParsePosNonzeroError::Creation(CreationError::Zero)) ); } #[test] fn test_positive() { - assert_eq!( - parse_pos_nonzero("42"), - Ok(PositiveNonzeroInteger(42)) - ); + let x = PositiveNonzeroInteger::new(42); + assert!(x.is_ok()); + assert_eq!(parse_pos_nonzero("42"), Ok(x.unwrap())); } } diff --git a/info.toml b/info.toml index 63eb78b0..76950373 100644 --- a/info.toml +++ b/info.toml @@ -532,16 +532,19 @@ path = "exercises/error_handling/errors6.rs" mode = "test" hint = """ This exercise uses a completed version of `PositiveNonzeroInteger` from -the errors4. +errors4. -Below the TODO line, there is an example of using the `.or()` method -on a `Result` to transform one type of error into another. Try using -something similar on the `Result` from `parse()`. You might use the `?` -operator to return early from the function, or you might use a `match` -expression, or maybe there's another way! +Below the line that TODO asks you to change, there is an example of using +the `map_err()` method on a `Result` to transform one type of error into +another. Try using something similar on the `Result` from `parse()`. You +might use the `?` operator to return early from the function, or you might +use a `match` expression, or maybe there's another way! -Read more about `.or()` in the `std::result` documentation: -https://doc.rust-lang.org/std/result/enum.Result.html#method.or""" +You can create another function inside `impl ParsePosNonzeroError` to use +with `map_err()`. + +Read more about `map_err()` in the `std::result` documentation: +https://doc.rust-lang.org/std/result/enum.Result.html#method.map_err""" # Generics @@ -927,7 +930,7 @@ hint = """ Follow the steps provided right before the `TryFrom` implementation. You can also use the example at https://doc.rust-lang.org/std/convert/trait.TryFrom.html -You might want to look back at the exercise errorsn (or its hints) to remind +You might want to look back at the exercise errors5 (or its hints) to remind yourself about how `Box` works. If you're trying to return a string as an error, note that neither `str` From 75788b1148d054e24b019c6efa47662eaf88ce74 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 24 Jun 2021 12:10:23 +0000 Subject: [PATCH 0370/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 503cf2cf..07e7c700 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-93-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-94-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -281,6 +281,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Stoian Dan

πŸ–‹
Pi Delport

πŸ–‹
Sateesh

πŸ’» πŸ–‹ +
ZC

πŸ–‹ From 73777980f1108f9362ddcf8211f0a8e9918cf996 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 24 Jun 2021 12:10:24 +0000 Subject: [PATCH 0371/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 867f1d51..4e2f1efa 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -866,6 +866,15 @@ "code", "content" ] + }, + { + "login": "kayuapi", + "name": "ZC", + "avatar_url": "https://avatars.githubusercontent.com/u/10304328?v=4", + "profile": "https://github.com/kayuapi", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d91044f3a24f65e27321d544a9ff7895919fa63e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 24 Jun 2021 12:17:31 +0000 Subject: [PATCH 0372/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 07e7c700..2f21b990 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-94-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-95-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -282,6 +282,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Pi Delport

πŸ–‹
Sateesh

πŸ’» πŸ–‹
ZC

πŸ–‹ +
hyperparabolic

πŸ’» From fadade85920268fa37092ba42adb0855d82478cf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 24 Jun 2021 12:17:32 +0000 Subject: [PATCH 0373/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4e2f1efa..e3ddb19a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -875,6 +875,15 @@ "contributions": [ "content" ] + }, + { + "login": "hyperparabolic", + "name": "hyperparabolic", + "avatar_url": "https://avatars.githubusercontent.com/u/12348474?v=4", + "profile": "https://github.com/hyperparabolic", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 2dc93caddad43821743e4903d89b355df58d7a49 Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Thu, 24 Jun 2021 21:33:41 -0500 Subject: [PATCH 0374/1293] fix(from_str, try_from_into): custom error types Remove the use of trait objects as errors from `from_str` and `try_from_into`; they seem to have caused a lot of confusion in practice. (Also, it's considered best practice to use custom error types instead of boxed errors in library code.) Instead, use custom error enums, and update hints accordingly. Hints also provide some guidance about converting errors, which could be covered more completely in a future advanced errors section. Also move from_str to directly after the similar exercise `from_into`, for the sake of familiarity when solving. --- exercises/conversions/from_str.rs | 56 ++++++++++++++----- exercises/conversions/try_from_into.rs | 74 ++++++++++++++++++-------- info.toml | 53 ++++++++++-------- 3 files changed, 127 insertions(+), 56 deletions(-) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 4beebacd..6e9e699d 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -1,16 +1,31 @@ -// This does practically the same thing that TryFrom<&str> does. +// from_str.rs +// This is similar to from_into.rs, but this time we'll implement `FromStr` +// and return errors instead of falling back to a default value. // Additionally, upon implementing FromStr, you can use the `parse` method // on strings to generate an object of the implementor type. // You can read more about it at https://doc.rust-lang.org/std/str/trait.FromStr.html -use std::error; +use std::num::ParseIntError; use std::str::FromStr; -#[derive(Debug)] +#[derive(Debug, PartialEq)] struct Person { name: String, age: usize, } +// We will use this error type for the `FromStr` implementation. +#[derive(Debug, PartialEq)] +enum ParsePersonError { + // Empty input string + Empty, + // Incorrect number of fields + BadLen, + // Empty name field + NoName, + // Wrapped error from parse::() + ParseInt(ParseIntError), +} + // I AM NOT DONE // Steps: @@ -24,7 +39,7 @@ struct Person { // If everything goes well, then return a Result of a Person object impl FromStr for Person { - type Err = Box; + type Err = ParsePersonError; fn from_str(s: &str) -> Result { } } @@ -40,7 +55,7 @@ mod tests { #[test] fn empty_input() { - assert!("".parse::().is_err()); + assert_eq!("".parse::(), Err(ParsePersonError::Empty)); } #[test] fn good_input() { @@ -52,41 +67,56 @@ mod tests { } #[test] fn missing_age() { - assert!("John,".parse::().is_err()); + assert!(matches!( + "John,".parse::(), + Err(ParsePersonError::ParseInt(_)) + )); } #[test] fn invalid_age() { - assert!("John,twenty".parse::().is_err()); + assert!(matches!( + "John,twenty".parse::(), + Err(ParsePersonError::ParseInt(_)) + )); } #[test] fn missing_comma_and_age() { - assert!("John".parse::().is_err()); + assert_eq!("John".parse::(), Err(ParsePersonError::BadLen)); } #[test] fn missing_name() { - assert!(",1".parse::().is_err()); + assert_eq!(",1".parse::(), Err(ParsePersonError::NoName)); } #[test] fn missing_name_and_age() { - assert!(",".parse::().is_err()); + assert!(matches!( + ",".parse::(), + Err(ParsePersonError::NoName | ParsePersonError::ParseInt(_)) + )); } #[test] fn missing_name_and_invalid_age() { - assert!(",one".parse::().is_err()); + assert!(matches!( + ",one".parse::(), + Err(ParsePersonError::NoName | ParsePersonError::ParseInt(_)) + )); } #[test] fn trailing_comma() { - assert!("John,32,".parse::().is_err()); + assert_eq!("John,32,".parse::(), Err(ParsePersonError::BadLen)); } #[test] fn trailing_comma_and_some_string() { - assert!("John,32,man".parse::().is_err()); + assert_eq!( + "John,32,man".parse::(), + Err(ParsePersonError::BadLen) + ); } } diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index c0b5d986..b8ec4455 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -1,9 +1,9 @@ +// try_from_into.rs // TryFrom is a simple and safe type conversion that may fail in a controlled way under some circumstances. // Basically, this is the same as From. The main difference is that this should return a Result type // instead of the target type itself. // You can read more about it at https://doc.rust-lang.org/std/convert/trait.TryFrom.html use std::convert::{TryFrom, TryInto}; -use std::error; #[derive(Debug, PartialEq)] struct Color { @@ -12,12 +12,21 @@ struct Color { blue: u8, } +// We will use this error type for these `TryFrom` conversions. +#[derive(Debug, PartialEq)] +enum IntoColorError { + // Incorrect length of slice + BadLen, + // Integer conversion error + IntConversion, +} + // I AM NOT DONE // Your task is to complete this implementation // and return an Ok result of inner type Color. // You need to create an implementation for a tuple of three integers, -// an array of three integers and a slice of integers. +// an array of three integers, and a slice of integers. // // Note that the implementation for tuple and array will be checked at compile time, // but the slice implementation needs to check the slice length! @@ -25,20 +34,23 @@ struct Color { // Tuple implementation impl TryFrom<(i16, i16, i16)> for Color { - type Error = Box; - fn try_from(tuple: (i16, i16, i16)) -> Result {} + type Error = IntoColorError; + fn try_from(tuple: (i16, i16, i16)) -> Result { + } } // Array implementation impl TryFrom<[i16; 3]> for Color { - type Error = Box; - fn try_from(arr: [i16; 3]) -> Result {} + type Error = IntoColorError; + fn try_from(arr: [i16; 3]) -> Result { + } } // Slice implementation impl TryFrom<&[i16]> for Color { - type Error = Box; - fn try_from(slice: &[i16]) -> Result {} + type Error = IntoColorError; + fn try_from(slice: &[i16]) -> Result { + } } fn main() { @@ -46,15 +58,15 @@ fn main() { let c1 = Color::try_from((183, 65, 14)); println!("{:?}", c1); - // Since From is implemented for Color, we should be able to use Into + // Since TryFrom is implemented for Color, we should be able to use TryInto let c2: Result = [183, 65, 14].try_into(); println!("{:?}", c2); let v = vec![183, 65, 14]; - // With slice we should use `from` function + // With slice we should use `try_from` function let c3 = Color::try_from(&v[..]); println!("{:?}", c3); - // or take slice within round brackets and use Into + // or take slice within round brackets and use TryInto let c4: Result = (&v[..]).try_into(); println!("{:?}", c4); } @@ -65,15 +77,24 @@ mod tests { #[test] fn test_tuple_out_of_range_positive() { - assert!(Color::try_from((256, 1000, 10000)).is_err()); + assert_eq!( + Color::try_from((256, 1000, 10000)), + Err(IntoColorError::IntConversion) + ); } #[test] fn test_tuple_out_of_range_negative() { - assert!(Color::try_from((-1, -10, -256)).is_err()); + assert_eq!( + Color::try_from((-1, -10, -256)), + Err(IntoColorError::IntConversion) + ); } #[test] fn test_tuple_sum() { - assert!(Color::try_from((-1, 255, 255)).is_err()); + assert_eq!( + Color::try_from((-1, 255, 255)), + Err(IntoColorError::IntConversion) + ); } #[test] fn test_tuple_correct() { @@ -91,17 +112,17 @@ mod tests { #[test] fn test_array_out_of_range_positive() { let c: Result = [1000, 10000, 256].try_into(); - assert!(c.is_err()); + assert_eq!(c, Err(IntoColorError::IntConversion)); } #[test] fn test_array_out_of_range_negative() { let c: Result = [-10, -256, -1].try_into(); - assert!(c.is_err()); + assert_eq!(c, Err(IntoColorError::IntConversion)); } #[test] fn test_array_sum() { let c: Result = [-1, 255, 255].try_into(); - assert!(c.is_err()); + assert_eq!(c, Err(IntoColorError::IntConversion)); } #[test] fn test_array_correct() { @@ -119,17 +140,26 @@ mod tests { #[test] fn test_slice_out_of_range_positive() { let arr = [10000, 256, 1000]; - assert!(Color::try_from(&arr[..]).is_err()); + assert_eq!( + Color::try_from(&arr[..]), + Err(IntoColorError::IntConversion) + ); } #[test] fn test_slice_out_of_range_negative() { let arr = [-256, -1, -10]; - assert!(Color::try_from(&arr[..]).is_err()); + assert_eq!( + Color::try_from(&arr[..]), + Err(IntoColorError::IntConversion) + ); } #[test] fn test_slice_sum() { let arr = [-1, 255, 255]; - assert!(Color::try_from(&arr[..]).is_err()); + assert_eq!( + Color::try_from(&arr[..]), + Err(IntoColorError::IntConversion) + ); } #[test] fn test_slice_correct() { @@ -148,11 +178,11 @@ mod tests { #[test] fn test_slice_excess_length() { let v = vec![0, 0, 0, 0]; - assert!(Color::try_from(&v[..]).is_err()); + assert_eq!(Color::try_from(&v[..]), Err(IntoColorError::BadLen)); } #[test] fn test_slice_insufficient_length() { let v = vec![0, 0]; - assert!(Color::try_from(&v[..]).is_err()); + assert_eq!(Color::try_from(&v[..]), Err(IntoColorError::BadLen)); } } diff --git a/info.toml b/info.toml index ab4dc933..f5af8840 100644 --- a/info.toml +++ b/info.toml @@ -925,6 +925,27 @@ mode = "test" hint = """ Follow the steps provided right before the `From` implementation""" +[[exercises]] +name = "from_str" +path = "exercises/conversions/from_str.rs" +mode = "test" +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. + +This is almost like the `from_into` exercise, but returning errors instead +of falling back to a default value. + +Hint: Look at the test cases to see which error variants to return. + +Another hint: You can use the `map_err` method of `Result` with a function +or a closure to wrap the error from `parse::`. + +Yet another hint: If you would like to propagate errors by using the `?` +operator in your solution, you might want to look at +https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/reenter_question_mark.html +""" + [[exercises]] name = "try_from_into" path = "exercises/conversions/try_from_into.rs" @@ -933,17 +954,19 @@ hint = """ Follow the steps provided right before the `TryFrom` implementation. You can also use the example at https://doc.rust-lang.org/std/convert/trait.TryFrom.html -You might want to look back at the exercise errors5 (or its hints) to remind -yourself about how `Box` works. +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? -If you're trying to return a string as an error, note that neither `str` -nor `String` implements `error::Error`. However, there is an implementation -of `From<&str>` for `Box`. This means you can use `.into()` or -the `?` operator to convert your string into the correct error type. +Another hint: Look at the test cases to see which error variants to return. -If you're having trouble with using the `?` operator to convert an error string, -recall that `?` works to convert `Err(something)` into the appropriate error -type for returning from the function.""" +Yet another hint: You can use the `map_err` or `or` methods of `Result` to +convert errors. + +Yet another hint: If you would like to propagate errors by using the `?` +operator in your solution, you might want to look at +https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/reenter_question_mark.html + +Challenge: Can you make the `TryFrom` implementations generic over many integer types?""" [[exercises]] name = "as_ref_mut" @@ -951,15 +974,3 @@ path = "exercises/conversions/as_ref_mut.rs" mode = "test" hint = """ Add AsRef as a trait bound to the functions.""" - -[[exercises]] -name = "from_str" -path = "exercises/conversions/from_str.rs" -mode = "test" -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. -This is almost like the `try_from_into` exercise. - -If you're having trouble with returning the correct error type, see the -hints for try_from_into.""" From 3a4433d5a2961e3f3e613bd67459579fbc6277fa Mon Sep 17 00:00:00 2001 From: arlecchino Date: Mon, 28 Jun 2021 17:08:53 +0200 Subject: [PATCH 0375/1293] docs: Faster git clone command Clone only release tag without history --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2f21b990..2aa54e04 100644 --- a/README.md +++ b/README.md @@ -57,12 +57,12 @@ When you get a permission denied message then you have to exclude the directory ## Manually -Basically: Clone the repository, checkout to the latest tag, run `cargo install`. +Basically: Clone the repository at the latest tag, run `cargo install`. ```bash -git clone https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 4.4.0) +git clone -b 4.4.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings -git checkout tags/4.4.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest) cargo install --force --path . ``` From 34ea029df8cb0af90524b9158990a56d6beb3d10 Mon Sep 17 00:00:00 2001 From: arlecchino Date: Tue, 29 Jun 2021 12:03:18 +0200 Subject: [PATCH 0376/1293] chore: Update hint of iterators3 `collect()` needs some hint for standard_library_types/iterators3 exercise with doc link for understanding different return types via `FromIterator`. --- info.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/info.toml b/info.toml index ab4dc933..dedc65db 100644 --- a/info.toml +++ b/info.toml @@ -772,7 +772,10 @@ The division_results variable needs to be collected into a collection type. The result_with_list function needs to return a single Result where the success case is a vector of integers and the failure case is a DivisionError. -The list_of_results function needs to return a vector of results.""" +The list_of_results function needs to return a vector of results. + +See https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect how +the `FromIterator` trait is used in `collect()`.""" [[exercises]] name = "iterators4" From 2e05606edca43baeeed88c693b9041442362c148 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 29 Jun 2021 10:46:40 +0000 Subject: [PATCH 0377/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2aa54e04..ecb8bde7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-95-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-96-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -283,6 +283,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Sateesh

πŸ’» πŸ–‹
ZC

πŸ–‹
hyperparabolic

πŸ’» +
arlecchino

πŸ“– From 3b4514b686b15949112a50f6ec49c79e08dcae38 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 29 Jun 2021 10:46:41 +0000 Subject: [PATCH 0378/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e3ddb19a..285584b2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -884,6 +884,15 @@ "contributions": [ "code" ] + }, + { + "login": "kolbma", + "name": "arlecchino", + "avatar_url": "https://avatars.githubusercontent.com/u/5228369?v=4", + "profile": "https://www.net4visions.at", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From a4a10987667ed5094763101fb885c9efc0e53bc3 Mon Sep 17 00:00:00 2001 From: arlecchino Date: Tue, 29 Jun 2021 13:41:16 +0200 Subject: [PATCH 0379/1293] Update info.toml Co-authored-by: marisa --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index dedc65db..e91909a6 100644 --- a/info.toml +++ b/info.toml @@ -774,7 +774,7 @@ case is a vector of integers and the failure case is a DivisionError. The list_of_results function needs to return a vector of results. -See https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect how +See https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect for how the `FromIterator` trait is used in `collect()`.""" [[exercises]] From 9bf4c5e8df576e36a1a2e9d022dae6b7d5e5f4f8 Mon Sep 17 00:00:00 2001 From: arlecchino Date: Tue, 29 Jun 2021 20:47:32 +0200 Subject: [PATCH 0380/1293] chore: clippy1 hint enhancement Added some explanation and links about floating point representation and to use the clippy suggestion. (fixes #390) --- info.toml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/info.toml b/info.toml index e91909a6..afc7fdfe 100644 --- a/info.toml +++ b/info.toml @@ -902,7 +902,15 @@ name = "clippy1" path = "exercises/clippy/clippy1.rs" mode = "clippy" hint = """ -Floating point calculations are usually imprecise, so asking if two values are exactly equal is asking for trouble""" +Not every floating point value can be represented exactly in binary values in +memory. Take a look at the description of +https://doc.rust-lang.org/stable/std/primitive.f32.html +When using the binary compare operators with floating points you won't compare +the floating point values but the binary representation in memory. This is +usually not what you would like to do. +See the suggestions of the clippy warning in compile output and use the +machine epsilon value... +https://doc.rust-lang.org/stable/std/primitive.f32.html#associatedconstant.EPSILON""" [[exercises]] name = "clippy2" From d20e413a68772cd493561f2651cf244e822b7ca5 Mon Sep 17 00:00:00 2001 From: Richthofen Date: Wed, 30 Jun 2021 03:05:49 -0700 Subject: [PATCH 0381/1293] feat(cli): Add "next" to run the next unsolved exercise. (#785) * Add "run next" to run the next unsolved exercise. * Fix a grammar error in the message. * Update README.md with the suggested change Co-authored-by: marisa * Update the README.md for "rustlings hint next". Co-authored-by: marisa --- README.md | 12 ++++++++++++ src/main.rs | 25 ++++++++++++++++++------- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ecb8bde7..bbaea0cf 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,12 @@ In case you want to go by your own order, or want to only verify a single exerci rustlings run myExercise1 ``` +Or simply use the following command to run the next unsolved exercise in the course: + +```bash +rustlings run next +``` + In case you get stuck, you can run the following command to get a hint for your exercise: @@ -104,6 +110,12 @@ exercise: rustlings hint myExercise1 ``` +You can also get the hint for the next unsolved exercise with the following command: + +``` bash +rustlings hint next +``` + To check your progress, you can run the following command: ```bash rustlings list diff --git a/src/main.rs b/src/main.rs index a80ce88e..985fe34f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -286,13 +286,24 @@ fn spawn_watch_shell(failed_exercise_hint: &Arc>>) { } fn find_exercise<'a>(name: &str, exercises: &'a [Exercise]) -> &'a Exercise { - exercises - .iter() - .find(|e| e.name == name) - .unwrap_or_else(|| { - println!("No exercise found for '{}'!", name); - std::process::exit(1) - }) + if name.eq("next") { + exercises + .iter() + .find(|e| !e.looks_done()) + .unwrap_or_else(|| { + println!("πŸŽ‰ Congratulations! You have done all the exercises!"); + println!("πŸ”š There are no more exercises to do next!"); + std::process::exit(1) + }) + } else { + exercises + .iter() + .find(|e| e.name == name) + .unwrap_or_else(|| { + println!("No exercise found for '{}'!", name); + std::process::exit(1) + }) + } } fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result<()> { From 1043a06124a0125a1d205180ec1c8e8e0166cf3c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 30 Jun 2021 10:06:06 +0000 Subject: [PATCH 0382/1293] docs: update README.md [skip ci] --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bbaea0cf..db254685 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-96-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-97-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -297,6 +297,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
hyperparabolic

πŸ’»
arlecchino

πŸ“– + +
Richthofen

πŸ’» + From 03dcb582e6c816cf6cb13e55a1d91485e5dfacc3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 30 Jun 2021 10:06:07 +0000 Subject: [PATCH 0383/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 285584b2..c449587a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -893,6 +893,15 @@ "contributions": [ "doc" ] + }, + { + "login": "jazzplato", + "name": "Richthofen", + "avatar_url": "https://avatars.githubusercontent.com/u/7576730?v=4", + "profile": "https://richthofen.io/", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 6a10f900b4b4f599a13892ea03603bbeac059e3b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 5 Jul 2021 16:56:56 +0000 Subject: [PATCH 0384/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d70cd55d..9f8f90f4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-97-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-98-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -299,6 +299,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Richthofen

πŸ’» +
Ivan Nerazumov

πŸ“– From 91d86a1de960c7efabff21e192f415592e517540 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 5 Jul 2021 16:56:57 +0000 Subject: [PATCH 0385/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c449587a..a441a6af 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -902,6 +902,15 @@ "contributions": [ "code" ] + }, + { + "login": "cseltol", + "name": "Ivan Nerazumov", + "avatar_url": "https://avatars.githubusercontent.com/u/64264529?v=4", + "profile": "https://github.com/cseltol", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From e422ab150738f578c4dc2560687a1e7214924d31 Mon Sep 17 00:00:00 2001 From: Laura Lindzey Date: Mon, 5 Jul 2021 23:07:34 -0700 Subject: [PATCH 0386/1293] docs: Update exercise to chapter mapping for HashMap --- exercises/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/README.md b/exercises/README.md index 0c715247..eebbd0bb 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -10,7 +10,7 @@ | structs | Β§5.1 | | enums | Β§6 | | modules | Β§7.2 | -| collections | Β§8.1 | +| collections | Β§8.1, Β§8.3 | | strings | Β§8.2 | | error_handling | Β§9 | | generics | Β§10 | From 8774e47dc34c8a7929a8b7d7504999028935ff6e Mon Sep 17 00:00:00 2001 From: lauralindzey <65185744+lauralindzey@users.noreply.github.com> Date: Tue, 6 Jul 2021 01:31:27 -0700 Subject: [PATCH 0387/1293] docs: Update collections README with HashMap link --- exercises/collections/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/collections/README.md b/exercises/collections/README.md index 0291bc87..b6d62acb 100644 --- a/exercises/collections/README.md +++ b/exercises/collections/README.md @@ -20,3 +20,4 @@ structures that are used very often in Rust programs: ## Further information - [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html) +- [Storing Keys with Associated Values in Hash Maps](https://doc.rust-lang.org/book/ch08-03-hash-maps.html) From b017579577dccce491a5f6fefd4515ac8f7d43bd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 7 Jul 2021 20:17:03 +0000 Subject: [PATCH 0388/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f8f90f4..d7eef8d3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-98-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-99-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -300,6 +300,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Richthofen

πŸ’»
Ivan Nerazumov

πŸ“– +
lauralindzey

πŸ“– From b438049c393d78fa65ea53468dc8f6093610ca8f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 7 Jul 2021 20:17:04 +0000 Subject: [PATCH 0389/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a441a6af..fca0d0d1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -911,6 +911,15 @@ "contributions": [ "doc" ] + }, + { + "login": "lauralindzey", + "name": "lauralindzey", + "avatar_url": "https://avatars.githubusercontent.com/u/65185744?v=4", + "profile": "https://github.com/lauralindzey", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From d876649616cc8a8dd5f539f8bc1a5434b960b1e9 Mon Sep 17 00:00:00 2001 From: Rakshit Sinha Date: Wed, 7 Jul 2021 13:18:33 -0700 Subject: [PATCH 0390/1293] fix(quiz1): Updated question description (#794) Co-authored-by: Rakshit Sinha --- exercises/quiz1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index 2bb2c24a..3af1293d 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -5,7 +5,7 @@ // Mary is buying apples. One apple usually costs 2 Rustbucks, but if you buy // more than 40 at once, each apple only costs 1! Write a function that calculates -// the price of an order of apples given the order amount. No hints this time! +// the price of an order of apples given the quantity bought. No hints this time! // I AM NOT DONE From 23f700dc2375787fe8c79f4e191fb9e6aa3b2ef2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 7 Jul 2021 20:19:47 +0000 Subject: [PATCH 0391/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d7eef8d3..5497944d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-99-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-100-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -301,6 +301,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Richthofen

πŸ’»
Ivan Nerazumov

πŸ“–
lauralindzey

πŸ“– +
Rakshit Sinha

πŸ–‹ From 33fa274bbfa85d817a39562b0461f8d42f1418c1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 7 Jul 2021 20:19:48 +0000 Subject: [PATCH 0392/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index fca0d0d1..85c66703 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -920,6 +920,15 @@ "contributions": [ "doc" ] + }, + { + "login": "sinharaksh1t", + "name": "Rakshit Sinha", + "avatar_url": "https://avatars.githubusercontent.com/u/28585848?v=4", + "profile": "https://github.com/sinharaksh1t", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From ba087ce64a35c93e40689d258f6dfde538b9ca22 Mon Sep 17 00:00:00 2001 From: ana Date: Wed, 7 Jul 2021 22:23:52 +0200 Subject: [PATCH 0393/1293] release: 4.5.0 Signed-off-by: ana --- CHANGELOG.md | 24 ++++++++++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 4 ++-- README.md | 4 ++-- src/main.rs | 2 +- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1686bdd6..67b8cdc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,27 @@ + +## 4.5.0 (2021-07-07) + + +#### Features + +* Add move_semantics5 exercise. (#746) ([399ab328](https://github.com/rust-lang/rustlings/commit/399ab328d8d407265c09563aa4ef4534b2503ff2)) +* **cli:** Add "next" to run the next unsolved exercise. (#785) ([d20e413a](https://github.com/rust-lang/rustlings/commit/d20e413a68772cd493561f2651cf244e822b7ca5)) + +#### Bug Fixes + +* rename result1 to errors4 ([50ab289d](https://github.com/rust-lang/rustlings/commit/50ab289da6b9eb19a7486c341b00048c516b88c0)) +* move_semantics5 hints ([1b858285](https://github.com/rust-lang/rustlings/commit/1b85828548f46f58b622b5e0c00f8c989f928807)) +* remove trailing whitespaces from iterators1 ([4d4fa774](https://github.com/rust-lang/rustlings/commit/4d4fa77459392acd3581c6068aa8be9a02de12fc)) +* add hints to generics1 and generics2 exercises ([31457940](https://github.com/rust-lang/rustlings/commit/31457940846b3844d78d4a4d2b074bc8d6aaf1eb)) +* remove trailing whitespace ([d9b69bd1](https://github.com/rust-lang/rustlings/commit/d9b69bd1a0a7a99f2c0d80933ad2eea44c8c71b2)) +* **installation:** first PowerShell command ([aa9a943d](https://github.com/rust-lang/rustlings/commit/aa9a943ddf3ae260782e73c26bcc9db60e5894b6)) +* **iterators5:** derive Clone, Copy ([91fc9e31](https://github.com/rust-lang/rustlings/commit/91fc9e3118f4af603c9911698cc2a234725cb032)) +* **quiz1:** Updated question description (#794) ([d8766496](https://github.com/rust-lang/rustlings/commit/d876649616cc8a8dd5f539f8bc1a5434b960b1e9)) +* **try_from_into, from_str:** hints for dyn Error ([11d2cf0d](https://github.com/rust-lang/rustlings/commit/11d2cf0d604dee3f5023c17802d69438e69fa50e)) +* **variables5:** confine the answer further ([48ffcbd2](https://github.com/rust-lang/rustlings/commit/48ffcbd2c4cc4d936c2c7480019190f179813cc5)) + + + ## 4.4.0 (2021-04-24) diff --git a/Cargo.lock b/Cargo.lock index cc8ff94a..d291c169 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -539,7 +539,7 @@ checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" [[package]] name = "rustlings" -version = "4.4.0" +version = "4.5.0" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index 0a757040..615a09c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustlings" -version = "4.4.0" -authors = ["Marisa ", "Carol (Nichols || Goulding) "] +version = "4.5.0" +authors = ["anastasie ", "Carol (Nichols || Goulding) "] edition = "2018" [dependencies] diff --git a/README.md b/README.md index 5497944d..7313c8e1 100644 --- a/README.md +++ b/README.md @@ -60,8 +60,8 @@ When you get a permission denied message then you have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 4.4.0) -git clone -b 4.4.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 4.5.0) +git clone -b 4.5.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/src/main.rs b/src/main.rs index 985fe34f..c8ebc68b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,7 +23,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "4.4.0"; +const VERSION: &str = "4.5.0"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From df25684cb79f8413915e00b5efef29369849cef1 Mon Sep 17 00:00:00 2001 From: ana Date: Thu, 29 Jul 2021 12:37:15 +0200 Subject: [PATCH 0394/1293] fix(move_semantics5): Clarify instructions --- exercises/move_semantics/move_semantics5.rs | 4 ++-- info.toml | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/exercises/move_semantics/move_semantics5.rs b/exercises/move_semantics/move_semantics5.rs index 2fb7b8e8..5449e951 100644 --- a/exercises/move_semantics/move_semantics5.rs +++ b/exercises/move_semantics/move_semantics5.rs @@ -1,6 +1,6 @@ // move_semantics5.rs -// Make me compile without adding, removing, or changing any of the -// lines in `main()`. +// Make me compile only be reordering the lines in `main()`, but without +// adding, changing or removing any of them. // Execute `rustlings hint move_semantics5` for hints :) // I AM NOT DONE diff --git a/info.toml b/info.toml index afc7fdfe..d5008ede 100644 --- a/info.toml +++ b/info.toml @@ -220,10 +220,7 @@ vogue. Does it help to update the value of referent (x) immediately after the mutable reference is taken? Read more about 'Mutable References' in the book's section References and Borrowing': https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references. - -Additional hint: -If you can't add, change, or remove any statements in `main()`, can you -reorder them in a way that lets the program compile?""" +""" # PRIMITIVE TYPES From 03131a3d35d9842598150f9da817f7cc26e2669a Mon Sep 17 00:00:00 2001 From: Damian <54457902+dbednar230@users.noreply.github.com> Date: Tue, 24 Aug 2021 03:48:51 -0500 Subject: [PATCH 0395/1293] fix(quiz1): Fix inconsistent wording (#826) The second test expects the function to return 80 when there is an order of 40 apples, but the current wording implies returning 40 will pass as well --- exercises/quiz1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index 3af1293d..985cd97c 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -4,7 +4,7 @@ // - Functions // Mary is buying apples. One apple usually costs 2 Rustbucks, but if you buy -// more than 40 at once, each apple only costs 1! Write a function that calculates +// 40 or more at once, each apple only costs 1! Write a function that calculates // the price of an order of apples given the quantity bought. No hints this time! // I AM NOT DONE From ba8f97f4188e516102852cf2b595774b3b0fb0bc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 24 Aug 2021 08:49:23 +0000 Subject: [PATCH 0396/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7313c8e1..6ae6979e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-100-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-101-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -302,6 +302,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Ivan Nerazumov

πŸ“–
lauralindzey

πŸ“–
Rakshit Sinha

πŸ–‹ +
Damian

πŸ–‹ From 380587f12024a4d62c254d6e1cb08e1ec488caea Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 24 Aug 2021 08:49:24 +0000 Subject: [PATCH 0397/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 85c66703..22df6a56 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -929,6 +929,15 @@ "contributions": [ "content" ] + }, + { + "login": "dbednar230", + "name": "Damian", + "avatar_url": "https://avatars.githubusercontent.com/u/54457902?v=4", + "profile": "https://github.com/dbednar230", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 1cd9328a5872f1d6a95b02824e1af33a423c047a Mon Sep 17 00:00:00 2001 From: Ben Armstead Date: Tue, 24 Aug 2021 12:06:30 +0000 Subject: [PATCH 0398/1293] fix(cli): remove unnecessary borrows (#829) * Update dependencies * Format better and remove unnecessary borrows --- Cargo.lock | 114 ++++++++++++++++++++++++------------------------ src/exercise.rs | 2 +- src/main.rs | 2 +- src/verify.rs | 16 +++---- 4 files changed, 68 insertions(+), 66 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d291c169..57b211be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,19 +1,21 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "aho-corasick" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] [[package]] name = "argh" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91792f088f87cdc7a2cfb1d617fa5ea18d7f1dc22ef0e1b5f82f3157cdc522be" +checksum = "2e7317a549bc17c5278d9e72bb6e62c6aa801ac2567048e39ebc1c194249323e" dependencies = [ "argh_derive", "argh_shared", @@ -21,9 +23,9 @@ dependencies = [ [[package]] name = "argh_derive" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4eb0c0c120ad477412dc95a4ce31e38f2113e46bd13511253f79196ca68b067" +checksum = "60949c42375351e9442e354434b0cba2ac402c1237edf673cac3a4bf983b8d3c" dependencies = [ "argh_shared", "heck", @@ -34,9 +36,9 @@ dependencies = [ [[package]] name = "argh_shared" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781f336cc9826dbaddb9754cb5db61e64cab4f69668bd19dcc4a0394a86f4cb1" +checksum = "8a61eb019cb8f415d162cb9f12130ee6bbe9168b7d953c17f4ad049e4051ca00" [[package]] name = "assert_cmd" @@ -69,9 +71,9 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "cfg-if" @@ -156,9 +158,9 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8" +checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" dependencies = [ "cfg-if 1.0.0", "libc", @@ -218,18 +220,18 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "heck" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" dependencies = [ "unicode-segmentation", ] [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] @@ -269,9 +271,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" dependencies = [ "cfg-if 1.0.0", ] @@ -287,9 +289,9 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "kernel32-sys" @@ -315,15 +317,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41" +checksum = "a1fa8cddc8fbbee11227ef194b5317ed014b8acbf15139bd716a18ad3fe99ec5" [[package]] name = "lock_api" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3c91c24eae6777794bb1997ad98bbb87daf92890acab859f7eaa4320333176" +checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" dependencies = [ "scopeguard", ] @@ -339,9 +341,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "mio" @@ -405,9 +407,9 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] name = "notify" -version = "4.0.16" +version = "4.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2599080e87c9bd051ddb11b10074f4da7b1223298df65d4c2ec5bcf309af1533" +checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257" dependencies = [ "bitflags", "filetime", @@ -466,9 +468,9 @@ dependencies = [ [[package]] name = "predicates" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb433456c1a57cc93554dea3ce40b4c19c4057e41c55d4a0f3d84ea71c325aa" +checksum = "f49cfaf7fdaa3bfacc6fa3e7054e65148878354a5cfddcf661df4c851f8021df" dependencies = [ "difference", "float-cmp", @@ -485,9 +487,9 @@ checksum = "57e35a3326b75e49aa85f5dc6ec15b41108cf5aee58eabb1f274dd18b73c2451" [[package]] name = "predicates-tree" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f553275e5721409451eb85e15fd9a860a6e5ab4496eb215987502b5f5391f2" +checksum = "d7dd0fd014130206c9352efbdc92be592751b2b9274dff685348341082c6ea3d" dependencies = [ "predicates-core", "treeline", @@ -495,9 +497,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" +checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" dependencies = [ "unicode-xid", ] @@ -513,18 +515,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.6" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8270314b5ccceb518e7e578952f0b72b88222d02e8f77f5ecf7abbb673539041" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.4.6" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a26af418b574bd56588335b3a3659a65725d4e636eb1016c2f9e3b38c7cc759" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", "memchr", @@ -533,9 +535,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.23" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustlings" @@ -576,18 +578,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.125" +version = "1.0.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" +checksum = "d1f72836d2aa753853178eda473a3b9d8e4eefdaf20523b919677e6de489f8f1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.125" +version = "1.0.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" +checksum = "e57ae87ad533d9a56427558b516d0adac283614e347abf85b0dc0cbbf0a249f3" dependencies = [ "proc-macro2", "quote", @@ -596,9 +598,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.64" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" dependencies = [ "itoa", "ryu", @@ -607,9 +609,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" [[package]] name = "smallvec" @@ -619,9 +621,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "syn" -version = "1.0.70" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9505f307c872bab8eb46f77ae357c8eba1fdacead58ee5a850116b1d7f82883" +checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" dependencies = [ "proc-macro2", "quote", @@ -630,9 +632,9 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ca8ced750734db02076f44132d802af0b33b09942331f4459dde8636fd2406" +checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" dependencies = [ "libc", "winapi 0.3.9", @@ -664,9 +666,9 @@ checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" [[package]] name = "unicode-segmentation" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] name = "unicode-width" @@ -676,9 +678,9 @@ checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "walkdir" diff --git a/src/exercise.rs b/src/exercise.rs index d934cfd3..53457ace 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -162,7 +162,7 @@ path = "{}.rs""#, if cmd.status.success() { Ok(CompiledExercise { - exercise: &self, + exercise: self, _handle: FileHandle, }) } else { diff --git a/src/main.rs b/src/main.rs index c8ebc68b..1e343478 100644 --- a/src/main.rs +++ b/src/main.rs @@ -203,7 +203,7 @@ fn main() { Subcommands::Run(subargs) => { let exercise = find_exercise(&subargs.name, &exercises); - run(&exercise, verbose).unwrap_or_else(|_| std::process::exit(1)); + run(exercise, verbose).unwrap_or_else(|_| std::process::exit(1)); } Subcommands::Hint(subargs) => { diff --git a/src/verify.rs b/src/verify.rs index b98598a8..fd59fa51 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -14,9 +14,9 @@ pub fn verify<'a>( ) -> Result<(), &'a Exercise> { for exercise in start_at { let compile_result = match exercise.mode { - Mode::Test => compile_and_test(&exercise, RunMode::Interactive, verbose), - Mode::Compile => compile_and_run_interactively(&exercise), - Mode::Clippy => compile_only(&exercise), + Mode::Test => compile_and_test(exercise, RunMode::Interactive, verbose), + Mode::Compile => compile_and_run_interactively(exercise), + Mode::Clippy => compile_only(exercise), }; if !compile_result.unwrap_or(false) { return Err(exercise); @@ -42,11 +42,11 @@ fn compile_only(exercise: &Exercise) -> Result { progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); - let _ = compile(&exercise, &progress_bar)?; + let _ = compile(exercise, &progress_bar)?; progress_bar.finish_and_clear(); success!("Successfully compiled {}!", exercise); - Ok(prompt_for_completion(&exercise, None)) + Ok(prompt_for_completion(exercise, None)) } // Compile the given Exercise and run the resulting binary in an interactive mode @@ -55,7 +55,7 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result { progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); - let compilation = compile(&exercise, &progress_bar)?; + let compilation = compile(exercise, &progress_bar)?; progress_bar.set_message(format!("Running {}...", exercise).as_str()); let result = compilation.run(); @@ -73,7 +73,7 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result { success!("Successfully ran {}!", exercise); - Ok(prompt_for_completion(&exercise, Some(output.stdout))) + Ok(prompt_for_completion(exercise, Some(output.stdout))) } // Compile the given Exercise as a test harness and display @@ -94,7 +94,7 @@ fn compile_and_test(exercise: &Exercise, run_mode: RunMode, verbose: bool) -> Re } success!("Successfully tested {}", &exercise); if let RunMode::Interactive = run_mode { - Ok(prompt_for_completion(&exercise, None)) + Ok(prompt_for_completion(exercise, None)) } else { Ok(true) } From 2f0ff258b1c3780971d9b7896d8ede7848fefcdb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 24 Aug 2021 12:06:44 +0000 Subject: [PATCH 0399/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6ae6979e..c867258c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-101-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-102-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -303,6 +303,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
lauralindzey

πŸ“–
Rakshit Sinha

πŸ–‹
Damian

πŸ–‹ +
Ben Armstead

πŸ’» From a64dbdcc043ae907c003ff940b43f0315283899d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 24 Aug 2021 12:06:45 +0000 Subject: [PATCH 0400/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 22df6a56..7816a0b8 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -938,6 +938,15 @@ "contributions": [ "content" ] + }, + { + "login": "benarmstead", + "name": "Ben Armstead", + "avatar_url": "https://avatars.githubusercontent.com/u/70973680?v=4", + "profile": "https://benarmstead.co.uk", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 96fc3017642b1b4b224390320111c6e305c736a3 Mon Sep 17 00:00:00 2001 From: diannasoriel Date: Thu, 26 Aug 2021 10:30:18 +0200 Subject: [PATCH 0401/1293] chore(quiz1): revert wording --- exercises/quiz1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index 985cd97c..3af1293d 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -4,7 +4,7 @@ // - Functions // Mary is buying apples. One apple usually costs 2 Rustbucks, but if you buy -// 40 or more at once, each apple only costs 1! Write a function that calculates +// more than 40 at once, each apple only costs 1! Write a function that calculates // the price of an order of apples given the quantity bought. No hints this time! // I AM NOT DONE From dfd2fab4f33d1bf59e2e5ee03123c0c9a67a9481 Mon Sep 17 00:00:00 2001 From: anuk909 <34924662+anuk909@users.noreply.github.com> Date: Fri, 3 Sep 2021 11:41:12 +0300 Subject: [PATCH 0402/1293] feat(modules): update exercises, add modules3 (#822) Co-authored-by: diannasoriel --- exercises/README.md | 2 +- exercises/modules/README.md | 2 +- exercises/modules/modules1.rs | 6 ++++++ exercises/modules/modules2.rs | 8 ++++++-- exercises/modules/modules3.rs | 18 ++++++++++++++++++ info.toml | 18 +++++++++++++----- 6 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 exercises/modules/modules3.rs diff --git a/exercises/README.md b/exercises/README.md index eebbd0bb..73754db5 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -9,7 +9,7 @@ | primitive_types | Β§4.3 | | structs | Β§5.1 | | enums | Β§6 | -| modules | Β§7.2 | +| modules | Β§7 | | collections | Β§8.1, Β§8.3 | | strings | Β§8.2 | | error_handling | Β§9 | diff --git a/exercises/modules/README.md b/exercises/modules/README.md index 6582b000..3dc8a482 100644 --- a/exercises/modules/README.md +++ b/exercises/modules/README.md @@ -4,4 +4,4 @@ In this section we'll give you an introduction to Rust's module system. ## Further information -- [The Module System](https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html) +- [The Module System](https://doc.rust-lang.org/book/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html) diff --git a/exercises/modules/modules1.rs b/exercises/modules/modules1.rs index 812dfeef..1a2bd0dd 100644 --- a/exercises/modules/modules1.rs +++ b/exercises/modules/modules1.rs @@ -4,7 +4,13 @@ // I AM NOT DONE mod sausage_factory { + // Don't let anybody outside of this module see this! + fn get_secret_recipe() -> String { + String::from("Ginger") + } + fn make_sausage() { + get_secret_recipe(); println!("sausage!"); } } diff --git a/exercises/modules/modules2.rs b/exercises/modules/modules2.rs index fde439d1..687bb788 100644 --- a/exercises/modules/modules2.rs +++ b/exercises/modules/modules2.rs @@ -1,11 +1,15 @@ // modules2.rs +// You can bring module paths into scopes and provide new names for them with the +// 'use' and 'as' keywords. Fix these 'use' statments to make the code compile. // Make me compile! Execute `rustlings hint modules2` for hints :) // I AM NOT DONE mod delicious_snacks { - use self::fruits::PEAR as fruit; - use self::veggies::CUCUMBER as veggie; + + // TODO: Fix these use statments + use self::fruits::PEAR as ??? + use self::veggies::CUCUMBER as ??? mod fruits { pub const PEAR: &'static str = "Pear"; diff --git a/exercises/modules/modules3.rs b/exercises/modules/modules3.rs new file mode 100644 index 00000000..8eed77df --- /dev/null +++ b/exercises/modules/modules3.rs @@ -0,0 +1,18 @@ +// modules3.rs +// You can use the 'use' keyword to bring module paths from modules from anywhere +// and especially from the Rust standard library into your scope. +// Bring SystemTime and UNIX_EPOCH +// from the std::time module. Bonus style points if you can do it with one line! +// Make me compile! Execute `rustlings hint modules3` for hints :) + +// I AM NOT DONE + +// TODO: Complete this use statement +use ??? + +fn main() { + match SystemTime::now().duration_since(UNIX_EPOCH) { + Ok(n) => println!("1970-01-01 00:00:00 UTC was {} seconds ago!", n.as_secs()), + Err(_) => panic!("SystemTime before UNIX EPOCH!"), + } +} diff --git a/info.toml b/info.toml index d5008ede..0f68d059 100644 --- a/info.toml +++ b/info.toml @@ -362,11 +362,19 @@ name = "modules2" path = "exercises/modules/modules2.rs" mode = "compile" hint = """ -The delicious_snacks module is trying to present an external -interface (the `fruit` and `veggie` constants) that is different than -its internal structure (the `fruits` and `veggies` modules and -associated constants). It's almost there except for one keyword missing for -each constant.""" +The delicious_snacks module is trying to present an external interface that is +different than its internal structure (the `fruits` and `veggies` modules and +associated constants). Complete the `use` statemants to fit the uses in main and +find the one keyword missing for both constants.""" + +[[exercises]] +name = "modules3" +path = "exercises/modules/modules3.rs" +mode = "compile" +hint = """ +UNIX_EPOCH and SystemTime are declared in the std::time module. Add a use statement +for these two to bring them into scope. You can use nested paths or the glob +operator to bring these two in using only one line.""" # COLLECTIONS From 5423f1be29abc97a5659cac05a819a36d62182f5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 3 Sep 2021 08:41:42 +0000 Subject: [PATCH 0403/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c867258c..608bba9b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-102-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-103-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -304,6 +304,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Rakshit Sinha

πŸ–‹
Damian

πŸ–‹
Ben Armstead

πŸ’» +
anuk909

πŸ–‹ πŸ’» From 44d8047249bc4c32ccc1cbc5de848caea0df8c2f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 3 Sep 2021 08:41:43 +0000 Subject: [PATCH 0404/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7816a0b8..03e8dd1c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -947,6 +947,16 @@ "contributions": [ "code" ] + }, + { + "login": "anuk909", + "name": "anuk909", + "avatar_url": "https://avatars.githubusercontent.com/u/34924662?v=4", + "profile": "https://github.com/anuk909", + "contributions": [ + "content", + "code" + ] } ], "contributorsPerLine": 8, From 1c3beb0a59178c950dc05fe8ee2346b017429ae0 Mon Sep 17 00:00:00 2001 From: granddaifuku <49578068+granddaifuku@users.noreply.github.com> Date: Mon, 6 Sep 2021 23:32:39 +0900 Subject: [PATCH 0405/1293] fix(modules2): fix typo (#835) --- exercises/modules/modules2.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/modules/modules2.rs b/exercises/modules/modules2.rs index 687bb788..87f0c458 100644 --- a/exercises/modules/modules2.rs +++ b/exercises/modules/modules2.rs @@ -1,13 +1,13 @@ // modules2.rs // You can bring module paths into scopes and provide new names for them with the -// 'use' and 'as' keywords. Fix these 'use' statments to make the code compile. +// 'use' and 'as' keywords. Fix these 'use' statements to make the code compile. // Make me compile! Execute `rustlings hint modules2` for hints :) // I AM NOT DONE mod delicious_snacks { - // TODO: Fix these use statments + // TODO: Fix these use statements use self::fruits::PEAR as ??? use self::veggies::CUCUMBER as ??? From 6c41adef63d777a90bf2a80f0abb5efeb872f52b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 6 Sep 2021 14:33:03 +0000 Subject: [PATCH 0406/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 608bba9b..e28a4815 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-103-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-104-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -305,6 +305,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Damian

πŸ–‹
Ben Armstead

πŸ’»
anuk909

πŸ–‹ πŸ’» +
granddaifuku

πŸ–‹ From de22b132731bd6f9bae6d0a90707d29e9d3bc389 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 6 Sep 2021 14:33:05 +0000 Subject: [PATCH 0407/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 03e8dd1c..5a932d94 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -957,6 +957,15 @@ "content", "code" ] + }, + { + "login": "granddaifuku", + "name": "granddaifuku", + "avatar_url": "https://avatars.githubusercontent.com/u/49578068?v=4", + "profile": "https://granddaifuku.com/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 6efa7d5d1554f8973346e9e15dbd5268306a2458 Mon Sep 17 00:00:00 2001 From: "joakim.kartveit" Date: Thu, 9 Sep 2021 15:53:05 +0200 Subject: [PATCH 0408/1293] Added ignore for .iml files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 06de8710..253f8f33 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ exercises/clippy/Cargo.toml exercises/clippy/Cargo.lock .idea .vscode +*.iml From a7dc080b95e49146fbaafe6922a6de2f8cb1582a Mon Sep 17 00:00:00 2001 From: ana Date: Tue, 21 Sep 2021 10:36:11 +0200 Subject: [PATCH 0409/1293] feat: add more watch commands Includes: - quit, to quit the shell instead of having to press Cmd/Ctrl-C or Cmd/Ctrl-D - help, to display an overview of all the commands available in watch mode. Closes #842. --- src/main.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 1e343478..06b41770 100644 --- a/src/main.rs +++ b/src/main.rs @@ -264,7 +264,7 @@ fn main() { fn spawn_watch_shell(failed_exercise_hint: &Arc>>) { let failed_exercise_hint = Arc::clone(failed_exercise_hint); - println!("Type 'hint' or open the corresponding README.md file to get help or type 'clear' to clear the screen."); + println!("Welcome to watch mode! You can type 'help' to get an overview of the commands you can use here."); thread::spawn(move || loop { let mut input = String::new(); match io::stdin().read_line(&mut input) { @@ -276,6 +276,18 @@ fn spawn_watch_shell(failed_exercise_hint: &Arc>>) { } } else if input.eq("clear") { println!("\x1B[2J\x1B[1;1H"); + } else if input.eq("quit") { + println!("Bye!"); + std::process::exit(0); + } else if input.eq("help") { + println!("Commands available to you in watch mode:"); + println!(" hint - prints the current exercise's hint"); + println!(" clear - clears the screen"); + println!(" quit - quits watch mode"); + println!(" help - displays this help message"); + println!(""); + println!("Watch mode automatically re-evaluates the current exercise"); + println!("when you edit a file's contents.") } else { println!("unknown command: {}", input); } From 0a11bad71402b5403143d642f439f57931278c07 Mon Sep 17 00:00:00 2001 From: Weilet <32561597+Weilet@users.noreply.github.com> Date: Tue, 21 Sep 2021 16:43:44 +0800 Subject: [PATCH 0410/1293] feat(quiz1): add default function name in comment (#838) --- exercises/quiz1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index 3af1293d..b13b9284 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -10,7 +10,7 @@ // I AM NOT DONE // Put your function here! -// fn ..... { +// fn calculate_apple_price { // Don't modify this function! #[test] From fe726f5bcafd35c56b66c9b17a962b7a5cab5ece Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 08:44:03 +0000 Subject: [PATCH 0411/1293] docs: update README.md [skip ci] --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e28a4815..af0cbb8f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-104-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-105-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -307,6 +307,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
anuk909

πŸ–‹ πŸ’»
granddaifuku

πŸ–‹ + +
Weilet

πŸ–‹ + From 9ddd4ca33a4cb2a6b02b03a574682c92de5d7253 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 08:44:04 +0000 Subject: [PATCH 0412/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5a932d94..8811aef5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -966,6 +966,15 @@ "contributions": [ "content" ] + }, + { + "login": "Weilet", + "name": "Weilet", + "avatar_url": "https://avatars.githubusercontent.com/u/32561597?v=4", + "profile": "https://weilet.me", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 06d5c0973a3dffa3c6c6f70acb775d4c6630323c Mon Sep 17 00:00:00 2001 From: LIU JIE Date: Tue, 21 Sep 2021 17:50:15 +0800 Subject: [PATCH 0413/1293] fix(cli): typo in exercise.rs (#848) --- src/exercise.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exercise.rs b/src/exercise.rs index 53457ace..ec694df9 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -133,7 +133,7 @@ path = "{}.rs""#, "Failed to write πŸ“Ž Clippy πŸ“Ž Cargo.toml file." }; fs::write(CLIPPY_CARGO_TOML_PATH, cargo_toml).expect(cargo_toml_error_msg); - // To support the ability to run the clipy exercises, build + // To support the ability to run the clippy exercises, build // an executable, in addition to running clippy. With a // compilation failure, this would silently fail. But we expect // clippy to reflect the same failure while compiling later. From 9ef63c0b9b892dd572a76db9c95947e77f82eb3c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 09:50:31 +0000 Subject: [PATCH 0414/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index af0cbb8f..94ab10f8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-105-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-106-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -309,6 +309,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Weilet

πŸ–‹ +
LIU JIE

πŸ–‹ From e9c0ca6be2a73c4dc890f2ebeaaec8aeaad06650 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 09:50:32 +0000 Subject: [PATCH 0415/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8811aef5..44d24396 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -975,6 +975,15 @@ "contributions": [ "content" ] + }, + { + "login": "Millione", + "name": "LIU JIE", + "avatar_url": "https://avatars.githubusercontent.com/u/38575932?v=4", + "profile": "https://github.com/Millione", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 3352b5a4d380df65763b4e64fc9e8938a3adfd80 Mon Sep 17 00:00:00 2001 From: ana Date: Fri, 24 Sep 2021 13:04:30 +0200 Subject: [PATCH 0416/1293] chore: improve println! usage --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 06b41770..d01a8273 100644 --- a/src/main.rs +++ b/src/main.rs @@ -285,7 +285,7 @@ fn spawn_watch_shell(failed_exercise_hint: &Arc>>) { println!(" clear - clears the screen"); println!(" quit - quits watch mode"); println!(" help - displays this help message"); - println!(""); + println!(); println!("Watch mode automatically re-evaluates the current exercise"); println!("when you edit a file's contents.") } else { From 1caef0b43494c8b8cdd6c9260147e70d510f1aca Mon Sep 17 00:00:00 2001 From: Antoine Busch Date: Tue, 14 Sep 2021 20:34:40 +1000 Subject: [PATCH 0417/1293] feat: Add "quit" command to `rustlings watch` closes: #842 --- src/main.rs | 122 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 72 insertions(+), 50 deletions(-) diff --git a/src/main.rs b/src/main.rs index d01a8273..30096dfe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,8 @@ use std::fs; use std::io::{self, prelude::*}; use std::path::Path; use std::process::{Command, Stdio}; -use std::sync::mpsc::channel; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::mpsc::{RecvTimeoutError, channel}; use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; @@ -217,52 +218,60 @@ fn main() { } Subcommands::Watch(_subargs) => { - if let Err(e) = watch(&exercises, verbose) { - println!( - "Error: Could not watch your progress. Error message was {:?}.", - e - ); - println!("Most likely you've run out of disk space or your 'inotify limit' has been reached."); - std::process::exit(1); + match watch(&exercises, verbose) { + Err(e) => { + println!( + "Error: Could not watch your progress. Error message was {:?}.", + e + ); + println!("Most likely you've run out of disk space or your 'inotify limit' has been reached."); + std::process::exit(1); + } + Ok(WatchStatus::Finished) => { + println!( + "{emoji} All exercises completed! {emoji}", + emoji = Emoji("πŸŽ‰", "β˜…") + ); + println!(); + println!("+----------------------------------------------------+"); + println!("| You made it to the Fe-nish line! |"); + println!("+-------------------------- ------------------------+"); + println!(" \\/ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); + println!(" β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ "); + println!(" β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); + println!(); + println!("We hope you enjoyed learning about the various aspects of Rust!"); + println!( + "If you noticed any issues, please don't hesitate to report them to our repo." + ); + println!("You can also contribute your own exercises to help the greater community!"); + println!(); + println!("Before reporting an issue or contributing, please read our guidelines:"); + println!("https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md"); + } + Ok(WatchStatus::Unfinished) => { + println!("We hope you're enjoying learning about Rust!"); + println!("If you want to continue working on the exercises at a later point, you can simply run `rustlings watch` again"); + } } - println!( - "{emoji} All exercises completed! {emoji}", - emoji = Emoji("πŸŽ‰", "β˜…") - ); - println!(); - println!("+----------------------------------------------------+"); - println!("| You made it to the Fe-nish line! |"); - println!("+-------------------------- ------------------------+"); - println!(" \\/ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); - println!(" β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ "); - println!(" β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); - println!(); - println!("We hope you enjoyed learning about the various aspects of Rust!"); - println!( - "If you noticed any issues, please don't hesitate to report them to our repo." - ); - println!("You can also contribute your own exercises to help the greater community!"); - println!(); - println!("Before reporting an issue or contributing, please read our guidelines:"); - println!("https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md"); } } } -fn spawn_watch_shell(failed_exercise_hint: &Arc>>) { +fn spawn_watch_shell(failed_exercise_hint: &Arc>>, should_quit: Arc) { let failed_exercise_hint = Arc::clone(failed_exercise_hint); println!("Welcome to watch mode! You can type 'help' to get an overview of the commands you can use here."); thread::spawn(move || loop { @@ -270,15 +279,15 @@ fn spawn_watch_shell(failed_exercise_hint: &Arc>>) { match io::stdin().read_line(&mut input) { Ok(_) => { let input = input.trim(); - if input.eq("hint") { + if input == "hint" { if let Some(hint) = &*failed_exercise_hint.lock().unwrap() { println!("{}", hint); } - } else if input.eq("clear") { + } else if input == "clear" { println!("\x1B[2J\x1B[1;1H"); } else if input.eq("quit") { + should_quit.store(true, Ordering::SeqCst); println!("Bye!"); - std::process::exit(0); } else if input.eq("help") { println!("Commands available to you in watch mode:"); println!(" hint - prints the current exercise's hint"); @@ -318,7 +327,12 @@ fn find_exercise<'a>(name: &str, exercises: &'a [Exercise]) -> &'a Exercise { } } -fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result<()> { +enum WatchStatus { + Finished, + Unfinished, +} + +fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result { /* Clears the terminal with an ANSI escape code. Works in UNIX and newer Windows terminals. */ fn clear_screen() { @@ -326,6 +340,7 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result<()> { } let (tx, rx) = channel(); + let should_quit = Arc::new(AtomicBool::new(false)); let mut watcher: RecommendedWatcher = Watcher::new(tx, Duration::from_secs(2))?; watcher.watch(Path::new("./exercises"), RecursiveMode::Recursive)?; @@ -334,12 +349,12 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result<()> { let to_owned_hint = |t: &Exercise| t.hint.to_owned(); let failed_exercise_hint = match verify(exercises.iter(), verbose) { - Ok(_) => return Ok(()), + Ok(_) => return Ok(WatchStatus::Finished), Err(exercise) => Arc::new(Mutex::new(Some(to_owned_hint(exercise)))), }; - spawn_watch_shell(&failed_exercise_hint); + spawn_watch_shell(&failed_exercise_hint, Arc::clone(&should_quit)); loop { - match rx.recv() { + match rx.recv_timeout(Duration::from_secs(1)) { Ok(event) => match event { DebouncedEvent::Create(b) | DebouncedEvent::Chmod(b) | DebouncedEvent::Write(b) => { if b.extension() == Some(OsStr::new("rs")) && b.exists() { @@ -355,7 +370,7 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result<()> { ); clear_screen(); match verify(pending_exercises, verbose) { - Ok(_) => return Ok(()), + Ok(_) => return Ok(WatchStatus::Finished), Err(exercise) => { let mut failed_exercise_hint = failed_exercise_hint.lock().unwrap(); *failed_exercise_hint = Some(to_owned_hint(exercise)); @@ -365,8 +380,15 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result<()> { } _ => {} }, + Err(RecvTimeoutError::Timeout) => { + // the timeout expired, just check the `should_quit` variable below then loop again + } Err(e) => println!("watch error: {:?}", e), } + // Check if we need to exit + if should_quit.load(Ordering::SeqCst) { + return Ok(WatchStatus::Unfinished); + } } } From c4b59aa593fc4ae952f69133068cb8f8f5ac0866 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 25 Sep 2021 08:47:55 +0000 Subject: [PATCH 0418/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 94ab10f8..8435a107 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-106-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-107-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -310,6 +310,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Weilet

πŸ–‹
LIU JIE

πŸ–‹ +
Antoine BΓΌsch

πŸ’» From a1b9c50f36513ce8f8ba26dfdaec2bb427fffeb6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 25 Sep 2021 08:47:56 +0000 Subject: [PATCH 0419/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 44d24396..345a7ec9 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -984,6 +984,15 @@ "contributions": [ "content" ] + }, + { + "login": "abusch", + "name": "Antoine BΓΌsch", + "avatar_url": "https://avatars.githubusercontent.com/u/506344?v=4", + "profile": "https://github.com/abusch", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From d75759e829fdcd64ef071cf4b6eae2a011a7718b Mon Sep 17 00:00:00 2001 From: frogtd <31412003+frogtd@users.noreply.github.com> Date: Sat, 25 Sep 2021 04:52:18 -0400 Subject: [PATCH 0420/1293] fix(move_semantics5): change &mut *y to &mut x (#814) Instead of having to explain why ```rs let mut x = 100; let y = &mut x; let mut z_owned = *y; let z = &mut z_owned; *y += 100; *z += 1000; ``` and ```rs let mut x = 100; let y = &mut x; let z = &mut *y; *y += 100; *z += 1000; ``` are different, you still get the point across about having only one mutable reference. As it stands, this exercise does too much (dereferencing and having only one mutable reference), and by doing so confuses people. Example of someone being confused by this: --- exercises/move_semantics/move_semantics5.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/move_semantics/move_semantics5.rs b/exercises/move_semantics/move_semantics5.rs index 5449e951..1afe16c5 100644 --- a/exercises/move_semantics/move_semantics5.rs +++ b/exercises/move_semantics/move_semantics5.rs @@ -8,7 +8,7 @@ fn main() { let mut x = 100; let y = &mut x; - let z = &mut *y; + let z = &mut x; *y += 100; *z += 1000; assert_eq!(x, 1200); From e106d7a4f4d375fd8648cde25e4e7a1c4c6bdeac Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 25 Sep 2021 08:53:04 +0000 Subject: [PATCH 0421/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8435a107..ac1d84d3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-107-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-108-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -311,6 +311,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Weilet

πŸ–‹
LIU JIE

πŸ–‹
Antoine BΓΌsch

πŸ’» +
frogtd

πŸ–‹ From ab5ecbee7a8fab44867cd18ab030dc9de7185360 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 25 Sep 2021 08:53:05 +0000 Subject: [PATCH 0422/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 345a7ec9..d18743c2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -993,6 +993,15 @@ "contributions": [ "code" ] + }, + { + "login": "frogtd", + "name": "frogtd", + "avatar_url": "https://avatars.githubusercontent.com/u/31412003?v=4", + "profile": "https://frogtd.com/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 882d535ba8628d5e0b37e8664b3e2f26260b2671 Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Wed, 9 Jun 2021 23:26:10 -0500 Subject: [PATCH 0423/1293] feat: add advanced_errs1 New section and exercise to demonstrate the `From` trait for errors and its usefulness with the `?` operator. --- exercises/advanced_errors/advanced_errs1.rs | 98 +++++++++++++++++++++ info.toml | 20 +++++ 2 files changed, 118 insertions(+) create mode 100644 exercises/advanced_errors/advanced_errs1.rs diff --git a/exercises/advanced_errors/advanced_errs1.rs b/exercises/advanced_errors/advanced_errs1.rs new file mode 100644 index 00000000..4bc7b635 --- /dev/null +++ b/exercises/advanced_errors/advanced_errs1.rs @@ -0,0 +1,98 @@ +// advanced_errs1.rs + +// Remember back in errors6, we had multiple mapping functions so that we +// could translate lower-level errors into our custom error type using +// `map_err()`? What if we could use the `?` operator directly instead? + +// Make this code compile! Execute `rustlings hint advanced_errs1` for +// hints :) + +// I AM NOT DONE + +use std::num::ParseIntError; +use std::str::FromStr; + +// This is a custom error type that we will be using in the `FromStr` +// implementation. +#[derive(PartialEq, Debug)] +enum ParsePosNonzeroError { + Creation(CreationError), + ParseInt(ParseIntError), +} + +impl From for ParsePosNonzeroError { + fn from(e: CreationError) -> Self { + // TODO: complete this implementation so that the `?` operator will + // work for `CreationError` + } +} + +// TODO: implement another instance of the `From` trait here so that the +// `?` operator will work in the other place in the `FromStr` +// implementation below. + +// Don't change anything below this line. + +impl FromStr for PositiveNonzeroInteger { + type Err = ParsePosNonzeroError; + fn from_str(s: &str) -> Result { + let x: i64 = s.parse()?; + Ok(PositiveNonzeroInteger::new(x)?) + } +} + +#[derive(PartialEq, Debug)] +struct PositiveNonzeroInteger(u64); + +#[derive(PartialEq, Debug)] +enum CreationError { + Negative, + Zero, +} + +impl PositiveNonzeroInteger { + fn new(value: i64) -> Result { + match value { + x if x < 0 => Err(CreationError::Negative), + x if x == 0 => Err(CreationError::Zero), + x => Ok(PositiveNonzeroInteger(x as u64)), + } + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_parse_error() { + // We can't construct a ParseIntError, so we have to pattern match. + assert!(matches!( + PositiveNonzeroInteger::from_str("not a number"), + Err(ParsePosNonzeroError::ParseInt(_)) + )); + } + + #[test] + fn test_negative() { + assert_eq!( + PositiveNonzeroInteger::from_str("-555"), + Err(ParsePosNonzeroError::Creation(CreationError::Negative)) + ); + } + + #[test] + fn test_zero() { + assert_eq!( + PositiveNonzeroInteger::from_str("0"), + Err(ParsePosNonzeroError::Creation(CreationError::Zero)) + ); + } + + #[test] + fn test_positive() { + let x = PositiveNonzeroInteger::new(42); + assert!(x.is_ok()); + assert_eq!(PositiveNonzeroInteger::from_str("42"), Ok(x.unwrap())); + } +} diff --git a/info.toml b/info.toml index f5af8840..8e24b7db 100644 --- a/info.toml +++ b/info.toml @@ -974,3 +974,23 @@ path = "exercises/conversions/as_ref_mut.rs" mode = "test" hint = """ Add AsRef as a trait bound to the functions.""" + +# ADVANCED ERRORS + +[[exercises]] +name = "advanced_errs1" +path = "exercises/advanced_errors/advanced_errs1.rs" +mode = "test" +hint = """ +This exercise uses an updated version of the code in errors6. The parsing +code is now in an implementation of the `FromStr` trait. Note that the +parsing code uses `?` directly, without any calls to `map_err()`. There is +one partial implementation of the `From` trait example that you should +complete. + +Details: The `?` operator calls `From::from()` on the error type to convert +it to the error type of the return type of the surrounding function. + +Hint: You will need to write another implementation of `From` that has a +different input type. +""" From abd6b70c72dc6426752ff41f09160b839e5c449e Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Fri, 25 Jun 2021 16:52:10 -0500 Subject: [PATCH 0424/1293] feat: add advanced_errs2 New exercise to demonstrate traits that make it easier for other code to consume our custom error types. --- exercises/advanced_errors/advanced_errs2.rs | 203 ++++++++++++++++++++ info.toml | 32 +++ 2 files changed, 235 insertions(+) create mode 100644 exercises/advanced_errors/advanced_errs2.rs diff --git a/exercises/advanced_errors/advanced_errs2.rs b/exercises/advanced_errors/advanced_errs2.rs new file mode 100644 index 00000000..d9d44d06 --- /dev/null +++ b/exercises/advanced_errors/advanced_errs2.rs @@ -0,0 +1,203 @@ +// advanced_errs2.rs + +// This exercise demonstrates a few traits that are useful for custom error +// types to implement, especially so that other code can consume the custom +// error type more usefully. + +// Make this compile, and make the tests pass! +// Execute `rustlings hint advanced_errs2` for hints. + +// Steps: +// 1. Implement a missing trait so that `main()` will compile. +// 2. Complete the partial implementation of `From` for +// `ParseClimateError`. +// 3. Handle the missing error cases in the `FromStr` implementation for +// `Climate`. +// 4. Complete the partial implementation of `Display` for +// `ParseClimateError`. + +// I AM NOT DONE + +use std::error::Error; +use std::fmt::{self, Display, Formatter}; +use std::num::{ParseFloatError, ParseIntError}; +use std::str::FromStr; + +// This is the custom error type that we will be using for the parser for +// `Climate`. +#[derive(Debug, PartialEq)] +enum ParseClimateError { + Empty, + BadLen, + NoCity, + ParseInt(ParseIntError), + ParseFloat(ParseFloatError), +} + +// This `From` implementation allows the `?` operator to work on +// `ParseIntError` values. +impl From for ParseClimateError { + fn from(e: ParseIntError) -> Self { + Self::ParseInt(e) + } +} + +// This `From` implementation allows the `?` operator to work on +// `ParseFloatError` values. +impl From for ParseClimateError { + fn from(e: ParseFloatError) -> Self { + // TODO: Complete this function + } +} + +// TODO: Implement a missing trait so that `main()` below will compile. It +// is not necessary to implement any methods inside the missing trait. + +// The `Display` trait allows for other code to obtain the error formatted +// as a user-visible string. +impl Display for ParseClimateError { + // TODO: Complete this function so that it produces the correct strings + // for each error variant. + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + // Imports the variants to make the following code more compact. + use ParseClimateError::*; + match self { + NoCity => write!(f, "no city name"), + ParseFloat(e) => write!(f, "error parsing temperature: {}", e), + _ => write!(f, "unhandled error!"), + } + } +} + +#[derive(Debug, PartialEq)] +struct Climate { + city: String, + year: u32, + temp: f32, +} + +// Parser for `Climate`. +// 1. Split the input string into 3 fields: city, year, temp. +// 2. Return an error if the string is empty or has the wrong number of +// fields. +// 3. Return an error if the city name is empty. +// 4. Parse the year as a `u32` and return an error if that fails. +// 5. Parse the temp as a `f32` and return an error if that fails. +// 6. Return an `Ok` value containing the completed `Climate` value. +impl FromStr for Climate { + type Err = ParseClimateError; + // TODO: Complete this function by making it handle the missing error + // cases. + fn from_str(s: &str) -> Result { + let v: Vec<_> = s.split(',').collect(); + let (city, year, temp) = match &v[..] { + [city, year, temp] => (city.to_string(), year, temp), + _ => return Err(ParseClimateError::BadLen), + }; + let year: u32 = year.parse()?; + let temp: f32 = temp.parse()?; + Ok(Climate { city, year, temp }) + } +} + +// Don't change anything below this line (other than to enable ignored +// tests). + +fn main() -> Result<(), Box> { + println!("{:?}", "Hong Kong,1999,25.7".parse::()?); + println!("{:?}", "".parse::()?); + Ok(()) +} + +#[cfg(test)] +mod test { + use super::*; + #[test] + fn test_empty() { + let res = "".parse::(); + assert_eq!(res, Err(ParseClimateError::Empty)); + assert_eq!(res.unwrap_err().to_string(), "empty input"); + } + #[test] + fn test_short() { + let res = "Boston,1991".parse::(); + assert_eq!(res, Err(ParseClimateError::BadLen)); + assert_eq!(res.unwrap_err().to_string(), "incorrect number of fields"); + } + #[test] + fn test_long() { + let res = "Paris,1920,17.2,extra".parse::(); + assert_eq!(res, Err(ParseClimateError::BadLen)); + assert_eq!(res.unwrap_err().to_string(), "incorrect number of fields"); + } + #[test] + fn test_no_city() { + let res = ",1997,20.5".parse::(); + assert_eq!(res, Err(ParseClimateError::NoCity)); + assert_eq!(res.unwrap_err().to_string(), "no city name"); + } + #[test] + fn test_parse_int_neg() { + let res = "Barcelona,-25,22.3".parse::(); + assert!(matches!(res, Err(ParseClimateError::ParseInt(_)))); + let err = res.unwrap_err(); + if let ParseClimateError::ParseInt(ref inner) = err { + assert_eq!( + err.to_string(), + format!("error parsing year: {}", inner.to_string()) + ); + } else { + unreachable!(); + }; + } + #[test] + fn test_parse_int_bad() { + let res = "Beijing,foo,15.0".parse::(); + assert!(matches!(res, Err(ParseClimateError::ParseInt(_)))); + let err = res.unwrap_err(); + if let ParseClimateError::ParseInt(ref inner) = err { + assert_eq!( + err.to_string(), + format!("error parsing year: {}", inner.to_string()) + ); + } else { + unreachable!(); + }; + } + #[test] + fn test_parse_float() { + let res = "Manila,2001,bar".parse::(); + assert!(matches!(res, Err(ParseClimateError::ParseFloat(_)))); + let err = res.unwrap_err(); + if let ParseClimateError::ParseFloat(ref inner) = err { + assert_eq!( + err.to_string(), + format!("error parsing temperature: {}", inner.to_string()) + ); + } else { + unreachable!(); + }; + } + #[test] + fn test_parse_good() { + let res = "Munich,2015,23.1".parse::(); + assert_eq!( + res, + Ok(Climate { + city: "Munich".to_string(), + year: 2015, + temp: 23.1, + }) + ); + } + #[test] + #[ignore] + fn test_downcast() { + let res = "SΓ£o Paulo,-21,28.5".parse::(); + assert!(matches!(res, Err(ParseClimateError::ParseInt(_)))); + let err = res.unwrap_err(); + let inner: Option<&(dyn Error + 'static)> = err.source(); + assert!(inner.is_some()); + assert!(inner.unwrap().is::()); + } +} diff --git a/info.toml b/info.toml index 8e24b7db..1b8c65d2 100644 --- a/info.toml +++ b/info.toml @@ -994,3 +994,35 @@ it to the error type of the return type of the surrounding function. Hint: You will need to write another implementation of `From` that has a different input type. """ + +[[exercises]] +name = "advanced_errs2" +path = "exercises/advanced_errors/advanced_errs2.rs" +mode = "test" +hint = """ +This exercise demonstrates a few traits that are useful for custom error +types to implement. These traits make it easier for other code to consume +the custom error type. + +Follow the steps in the comment near the top of the file. You will have to +supply a missing trait implementation, and complete a few incomplete ones. + +You may find these pages to be helpful references: +https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/define_error_type.html +https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/boxing_errors.html +https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/wrap_error.html + +Hint: What trait must our error type have for `main()` to return the return +type that it returns? + +Another hint: It's not necessary to implement any methods inside the missing +trait. (Some methods have default implementations that are supplied by the +trait.) + +Another hint: Consult the tests to determine which error variants (and which +error message text) to produce for certain error conditions. + +Challenge: There is one test that is marked `#[ignore]`. Can you supply the +missing code that will make it pass? You may want to consult the standard +library documentation for a certain trait for more hints. +""" From d57c1830280b2dbc1b9fe2ac3f48b51add591412 Mon Sep 17 00:00:00 2001 From: ana Date: Sat, 25 Sep 2021 11:23:05 +0200 Subject: [PATCH 0425/1293] release: 4.6.0 --- CHANGELOG.md | 26 ++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 4 +- src/main.rs | 109 ++++++++++++++++++++++++++------------------------- 5 files changed, 86 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67b8cdc3..fcc39e42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,29 @@ + +## 4.6.0 (2021-09-25) + + +#### Features + +* add advanced_errs2 ([abd6b70c](https://github.com/rust-lang/rustlings/commit/abd6b70c72dc6426752ff41f09160b839e5c449e)) +* add advanced_errs1 ([882d535b](https://github.com/rust-lang/rustlings/commit/882d535ba8628d5e0b37e8664b3e2f26260b2671)) +* Add a farewell message when quitting `watch` ([1caef0b4](https://github.com/rust-lang/rustlings/commit/1caef0b43494c8b8cdd6c9260147e70d510f1aca)) +* add more watch commands ([a7dc080b](https://github.com/rust-lang/rustlings/commit/a7dc080b95e49146fbaafe6922a6de2f8cb1582a), closes [#842](https://github.com/rust-lang/rustlings/issues/842)) +* **modules:** update exercises, add modules3 (#822) ([dfd2fab4](https://github.com/rust-lang/rustlings/commit/dfd2fab4f33d1bf59e2e5ee03123c0c9a67a9481)) +* **quiz1:** add default function name in comment (#838) ([0a11bad7](https://github.com/rust-lang/rustlings/commit/0a11bad71402b5403143d642f439f57931278c07)) + +#### Bug Fixes + +* Correct small typo in exercises/conversions/from_str.rs ([86cc8529](https://github.com/rust-lang/rustlings/commit/86cc85295ae36948963ae52882e285d7e3e29323)) +* **cli:** typo in exercise.rs (#848) ([06d5c097](https://github.com/rust-lang/rustlings/commit/06d5c0973a3dffa3c6c6f70acb775d4c6630323c)) +* **from_str, try_from_into:** custom error types ([2dc93cad](https://github.com/rust-lang/rustlings/commit/2dc93caddad43821743e4903d89b355df58d7a49)) +* **modules2:** fix typo (#835) ([1c3beb0a](https://github.com/rust-lang/rustlings/commit/1c3beb0a59178c950dc05fe8ee2346b017429ae0)) +* **move_semantics5:** + * change &mut *y to &mut x (#814) ([d75759e8](https://github.com/rust-lang/rustlings/commit/d75759e829fdcd64ef071cf4b6eae2a011a7718b)) + * Clarify instructions ([df25684c](https://github.com/rust-lang/rustlings/commit/df25684cb79f8413915e00b5efef29369849cef1)) +* **quiz1:** Fix inconsistent wording (#826) ([03131a3d](https://github.com/rust-lang/rustlings/commit/03131a3d35d9842598150f9da817f7cc26e2669a)) + + + ## 4.5.0 (2021-07-07) diff --git a/Cargo.lock b/Cargo.lock index 57b211be..e536d1b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -541,7 +541,7 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustlings" -version = "4.5.0" +version = "4.6.0" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index 615a09c3..3b2a85a7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "4.5.0" +version = "4.6.0" authors = ["anastasie ", "Carol (Nichols || Goulding) "] edition = "2018" diff --git a/README.md b/README.md index ac1d84d3..18e0b73a 100644 --- a/README.md +++ b/README.md @@ -60,8 +60,8 @@ When you get a permission denied message then you have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 4.5.0) -git clone -b 4.5.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 4.6.0) +git clone -b 4.6.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/src/main.rs b/src/main.rs index 30096dfe..32e7bba2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,7 +11,7 @@ use std::io::{self, prelude::*}; use std::path::Path; use std::process::{Command, Stdio}; use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::mpsc::{RecvTimeoutError, channel}; +use std::sync::mpsc::{channel, RecvTimeoutError}; use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; @@ -24,7 +24,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "4.5.0"; +const VERSION: &str = "4.6.0"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code @@ -217,61 +217,64 @@ fn main() { verify(&exercises, verbose).unwrap_or_else(|_| std::process::exit(1)); } - Subcommands::Watch(_subargs) => { - match watch(&exercises, verbose) { - Err(e) => { - println!( - "Error: Could not watch your progress. Error message was {:?}.", - e - ); - println!("Most likely you've run out of disk space or your 'inotify limit' has been reached."); - std::process::exit(1); - } - Ok(WatchStatus::Finished) => { - println!( - "{emoji} All exercises completed! {emoji}", - emoji = Emoji("πŸŽ‰", "β˜…") - ); - println!(); - println!("+----------------------------------------------------+"); - println!("| You made it to the Fe-nish line! |"); - println!("+-------------------------- ------------------------+"); - println!(" \\/ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); - println!(" β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ "); - println!(" β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ "); - println!(" β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); - println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); - println!(); - println!("We hope you enjoyed learning about the various aspects of Rust!"); - println!( - "If you noticed any issues, please don't hesitate to report them to our repo." - ); - println!("You can also contribute your own exercises to help the greater community!"); - println!(); - println!("Before reporting an issue or contributing, please read our guidelines:"); - println!("https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md"); - } - Ok(WatchStatus::Unfinished) => { - println!("We hope you're enjoying learning about Rust!"); - println!("If you want to continue working on the exercises at a later point, you can simply run `rustlings watch` again"); - } + Subcommands::Watch(_subargs) => match watch(&exercises, verbose) { + Err(e) => { + println!( + "Error: Could not watch your progress. Error message was {:?}.", + e + ); + println!("Most likely you've run out of disk space or your 'inotify limit' has been reached."); + std::process::exit(1); } - } + Ok(WatchStatus::Finished) => { + println!( + "{emoji} All exercises completed! {emoji}", + emoji = Emoji("πŸŽ‰", "β˜…") + ); + println!(); + println!("+----------------------------------------------------+"); + println!("| You made it to the Fe-nish line! |"); + println!("+-------------------------- ------------------------+"); + println!(" \\/ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ "); + println!(" β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ "); + println!(" β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ "); + println!(" β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); + println!(" β–’β–’ β–’β–’ β–’β–’ β–’β–’ "); + println!(); + println!("We hope you enjoyed learning about the various aspects of Rust!"); + println!( + "If you noticed any issues, please don't hesitate to report them to our repo." + ); + println!( + "You can also contribute your own exercises to help the greater community!" + ); + println!(); + println!("Before reporting an issue or contributing, please read our guidelines:"); + println!("https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md"); + } + Ok(WatchStatus::Unfinished) => { + println!("We hope you're enjoying learning about Rust!"); + println!("If you want to continue working on the exercises at a later point, you can simply run `rustlings watch` again"); + } + }, } } -fn spawn_watch_shell(failed_exercise_hint: &Arc>>, should_quit: Arc) { +fn spawn_watch_shell( + failed_exercise_hint: &Arc>>, + should_quit: Arc, +) { let failed_exercise_hint = Arc::clone(failed_exercise_hint); println!("Welcome to watch mode! You can type 'help' to get an overview of the commands you can use here."); thread::spawn(move || loop { From bf33829da240375d086f96267fc2e02fa6b07001 Mon Sep 17 00:00:00 2001 From: Zhenghao Lu <54395432+EmisonLu@users.noreply.github.com> Date: Mon, 27 Sep 2021 16:03:28 +0800 Subject: [PATCH 0426/1293] fix(structs3): remove redundant 'return' (#852) --- exercises/structs/structs3.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index a80d0625..b3aa2825 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -18,11 +18,11 @@ impl Package { if weight_in_grams <= 0 { // Something goes here... } else { - return Package { + Package { sender_country, recipient_country, weight_in_grams, - }; + } } } From fed4fe78bbc0f4a9dbace1a556811a9f506237b6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 27 Sep 2021 08:03:46 +0000 Subject: [PATCH 0427/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 18e0b73a..1c3709cc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-108-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-109-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -312,6 +312,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
LIU JIE

πŸ–‹
Antoine BΓΌsch

πŸ’»
frogtd

πŸ–‹ +
Zhenghao Lu

πŸ–‹ From e3cfaa246dbef9ebea5ca020bdbaf018194b4974 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 27 Sep 2021 08:03:47 +0000 Subject: [PATCH 0428/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d18743c2..21089c52 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1002,6 +1002,15 @@ "contributions": [ "content" ] + }, + { + "login": "EmisonLu", + "name": "Zhenghao Lu", + "avatar_url": "https://avatars.githubusercontent.com/u/54395432?v=4", + "profile": "https://github.com/EmisonLu", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 46c28d5cef3d8446b5a356b19d8dbc725f91a3a0 Mon Sep 17 00:00:00 2001 From: Fredrik Enestad Date: Thu, 30 Sep 2021 10:18:36 +0200 Subject: [PATCH 0429/1293] fix(move_semantics5): correct typo (#857) --- exercises/move_semantics/move_semantics5.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/move_semantics/move_semantics5.rs b/exercises/move_semantics/move_semantics5.rs index 1afe16c5..c4704f9e 100644 --- a/exercises/move_semantics/move_semantics5.rs +++ b/exercises/move_semantics/move_semantics5.rs @@ -1,5 +1,5 @@ // move_semantics5.rs -// Make me compile only be reordering the lines in `main()`, but without +// Make me compile only by reordering the lines in `main()`, but without // adding, changing or removing any of them. // Execute `rustlings hint move_semantics5` for hints :) From 574bbffe0b11b5426970e4710a2275776690e85e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 30 Sep 2021 08:18:52 +0000 Subject: [PATCH 0430/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c3709cc..6e5ce3f6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-109-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-110-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -313,6 +313,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Antoine BΓΌsch

πŸ’»
frogtd

πŸ–‹
Zhenghao Lu

πŸ–‹ +
Fredrik Enestad

πŸ–‹ From ae54c17b6a5ca63705192011d11d371bb51eee97 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 30 Sep 2021 08:18:53 +0000 Subject: [PATCH 0431/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 21089c52..fe18385f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1011,6 +1011,15 @@ "contributions": [ "content" ] + }, + { + "login": "fredr", + "name": "Fredrik Enestad", + "avatar_url": "https://avatars.githubusercontent.com/u/762956?v=4", + "profile": "https://soundtrackyourbrand.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 1c0fe3cbcca85f90b3985985b8e265ee872a2ab2 Mon Sep 17 00:00:00 2001 From: rlch Date: Sat, 2 Oct 2021 23:59:23 +1000 Subject: [PATCH 0432/1293] fix: few spelling mistakes --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 21406630..5eece6d7 100644 --- a/info.toml +++ b/info.toml @@ -364,7 +364,7 @@ mode = "compile" hint = """ The delicious_snacks module is trying to present an external interface that is different than its internal structure (the `fruits` and `veggies` modules and -associated constants). Complete the `use` statemants to fit the uses in main and +associated constants). Complete the `use` statements to fit the uses in main and find the one keyword missing for both constants.""" [[exercises]] From 1663a16eade6ca646b6ed061735f7982434d530d Mon Sep 17 00:00:00 2001 From: xuesong Date: Mon, 18 Oct 2021 19:57:12 +0800 Subject: [PATCH 0433/1293] fix(traits1): rename test functions to snake case (#854) Co-authored-by: zhangshaozhi --- exercises/advanced_errors/advanced_errs2.rs | 1 - exercises/traits/traits1.rs | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/exercises/advanced_errors/advanced_errs2.rs b/exercises/advanced_errors/advanced_errs2.rs index d9d44d06..54e669fd 100644 --- a/exercises/advanced_errors/advanced_errs2.rs +++ b/exercises/advanced_errors/advanced_errs2.rs @@ -64,7 +64,6 @@ impl Display for ParseClimateError { match self { NoCity => write!(f, "no city name"), ParseFloat(e) => write!(f, "error parsing temperature: {}", e), - _ => write!(f, "unhandled error!"), } } } diff --git a/exercises/traits/traits1.rs b/exercises/traits/traits1.rs index 2ef9e11b..15e08f24 100644 --- a/exercises/traits/traits1.rs +++ b/exercises/traits/traits1.rs @@ -29,12 +29,12 @@ mod tests { use super::*; #[test] - fn is_FooBar() { + fn is_foo_bar() { assert_eq!(String::from("Foo").append_bar(), String::from("FooBar")); } #[test] - fn is_BarBar() { + fn is_bar_bar() { assert_eq!( String::from("").append_bar().append_bar(), String::from("BarBar") From b24b295d88d0f5598c5b0fe0ff926d29ab3c5828 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 18 Oct 2021 11:57:33 +0000 Subject: [PATCH 0434/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e5ce3f6..a3ef758d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-110-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-111-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -314,6 +314,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
frogtd

πŸ–‹
Zhenghao Lu

πŸ–‹
Fredrik Enestad

πŸ–‹ +
xuesong

πŸ–‹ From 71da9068e71ee395a30083dfc516e7dc110a2a8f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 18 Oct 2021 11:57:34 +0000 Subject: [PATCH 0435/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index fe18385f..d7c7d465 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1020,6 +1020,15 @@ "contributions": [ "content" ] + }, + { + "login": "xuesongbj", + "name": "xuesong", + "avatar_url": "https://avatars.githubusercontent.com/u/18476085?v=4", + "profile": "http://xuesong.pydevops.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 359f81dd0bf5cc82016c56d374b38bf4de8f5893 Mon Sep 17 00:00:00 2001 From: ana Date: Fri, 29 Oct 2021 14:27:36 +0200 Subject: [PATCH 0436/1293] chore: upgrade edition to 2021 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 3b2a85a7..30032695 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "rustlings" version = "4.6.0" authors = ["anastasie ", "Carol (Nichols || Goulding) "] -edition = "2018" +edition = "2021" [dependencies] argh = "0.1.4" From d1ee2daf14f19105e6db3f9c610f44293d688532 Mon Sep 17 00:00:00 2001 From: Michael Walsh <48160144+MpdWalsh@users.noreply.github.com> Date: Sat, 30 Oct 2021 16:55:58 -0600 Subject: [PATCH 0437/1293] fix(structs3.rs): assigned value to cents_per_gram in test Intended to simplify the lesson by removing the need to figure out what the value is meant to be based on the tests. Previous commits (https://github.com/rust-lang/rustlings/commit/9ca08b8f2b09366e97896a4a8cf9ff3bb4d54380 and https://github.com/rust-lang/rustlings/commit/114b54cbdb977234b39e5f180d937c14c78bb8b2#diff-ce1c232ff0ddaff909351bb84cb5bff423b5b9e04f21fd4db7ffe443e598e174) removed the mathematical complexity, and I feel this addition is a needed change to further streamline the exercise. --- exercises/structs/structs3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index b3aa2825..1a81531c 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -73,7 +73,7 @@ mod tests { let sender_country = String::from("Spain"); let recipient_country = String::from("Spain"); - let cents_per_gram = ???; + let cents_per_gram = 3; let package = Package::new(sender_country, recipient_country, 1500); From e08b6cf3ef157dd7dc65b920b36723a4c480179c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 31 Oct 2021 16:25:35 +0000 Subject: [PATCH 0438/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a3ef758d..c0ba6ce9 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-111-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-112-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -315,6 +315,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Zhenghao Lu

πŸ–‹
Fredrik Enestad

πŸ–‹
xuesong

πŸ–‹ +
Michael Walsh

πŸ’» From cb661896a21aa00d46b894cdc4a7632f7569479c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 31 Oct 2021 16:25:36 +0000 Subject: [PATCH 0439/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d7c7d465..cda03778 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1029,6 +1029,15 @@ "contributions": [ "content" ] + }, + { + "login": "MpdWalsh", + "name": "Michael Walsh", + "avatar_url": "https://avatars.githubusercontent.com/u/48160144?v=4", + "profile": "https://github.com/MpdWalsh", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 8ef4869b264094e5a9b50452b4534823a9df19c3 Mon Sep 17 00:00:00 2001 From: alirezaghey Date: Wed, 15 Dec 2021 10:44:21 +0100 Subject: [PATCH 0440/1293] fix(functions5): Remove wrong new line and small English improvements (#885) --- info.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/info.toml b/info.toml index 5eece6d7..95850c63 100644 --- a/info.toml +++ b/info.toml @@ -114,8 +114,7 @@ path = "exercises/functions/functions5.rs" mode = "compile" hint = """ This is a really common error that can be fixed by removing one character. -It happens because Rust distinguishes between expressions and statements: expressions return -a value based on its operand, and statements simply return a () type which behaves just like `void` in C/C++ language. +It happens because Rust distinguishes between expressions and statements: expressions return a value based on their operand(s), and statements simply return a () type which behaves just like `void` in C/C++ language. We want to return a value of `i32` type from the `square` function, but it is returning a `()` type... They are not the same. There are two solutions: 1. Add a `return` ahead of `num * num;` From 72b2c9f54f5f4d246616af767a1a842223702a13 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 15 Dec 2021 09:44:38 +0000 Subject: [PATCH 0441/1293] docs: update README.md [skip ci] --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c0ba6ce9..7595a9eb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-112-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-113-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -317,6 +317,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
xuesong

πŸ–‹
Michael Walsh

πŸ’» + +
alirezaghey

πŸ–‹ + From 527a5b1182483aa467556c1a36d9322440befa43 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 15 Dec 2021 09:44:39 +0000 Subject: [PATCH 0442/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index cda03778..6bf3853e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1038,6 +1038,15 @@ "contributions": [ "code" ] + }, + { + "login": "alirezaghey", + "name": "alirezaghey", + "avatar_url": "https://avatars.githubusercontent.com/u/26653424?v=4", + "profile": "https://github.com/alirezaghey", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From f2650de369810867d2763e935ac0963c32ec420e Mon Sep 17 00:00:00 2001 From: Franklin van Nes Date: Wed, 15 Dec 2021 11:46:27 -0500 Subject: [PATCH 0443/1293] fix(clippy1): Updated code to test correctness clippy lint with approx_constant lint rule closes #888 --- exercises/clippy/clippy1.rs | 16 +++++++++++----- info.toml | 16 ++++++++-------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/exercises/clippy/clippy1.rs b/exercises/clippy/clippy1.rs index bdb5dd2c..c5f84a9c 100644 --- a/exercises/clippy/clippy1.rs +++ b/exercises/clippy/clippy1.rs @@ -8,10 +8,16 @@ // I AM NOT DONE +use std::f32; + fn main() { - let x = 1.2331f64; - let y = 1.2332f64; - if y != x { - println!("Success!"); - } + let pi = 3.14f32; + let radius = 5.00f32; + + let area = pi * f32::powi(radius, 2); + + println!( + "The area of a circle with radius {:.2} is {:.5}!", + radius, area + ) } diff --git a/info.toml b/info.toml index 95850c63..0c03def3 100644 --- a/info.toml +++ b/info.toml @@ -906,15 +906,15 @@ name = "clippy1" path = "exercises/clippy/clippy1.rs" mode = "clippy" hint = """ -Not every floating point value can be represented exactly in binary values in -memory. Take a look at the description of -https://doc.rust-lang.org/stable/std/primitive.f32.html -When using the binary compare operators with floating points you won't compare -the floating point values but the binary representation in memory. This is -usually not what you would like to do. +Rust stores the highest precision version of any long or inifinite precision +mathematical constants in the rust standard library. +https://doc.rust-lang.org/stable/std/f32/consts/index.html + +We may be tempted to use our own approximations for certain mathematical constants, +but clippy recognizes those imprecise mathematical constants as a source of +potential error. See the suggestions of the clippy warning in compile output and use the -machine epsilon value... -https://doc.rust-lang.org/stable/std/primitive.f32.html#associatedconstant.EPSILON""" +appropriate replacement constant from std::f32::consts...""" [[exercises]] name = "clippy2" From 8d675198d81eedb02ef3124321670000f0f6fd6c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 16 Dec 2021 13:11:14 +0000 Subject: [PATCH 0444/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7595a9eb..469e1ef0 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-113-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-114-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -319,6 +319,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
alirezaghey

πŸ–‹ +
Franklin van Nes

πŸ’» From 81fb3967805a939f1149f0451afd94d566ab4d2a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 16 Dec 2021 13:11:15 +0000 Subject: [PATCH 0445/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6bf3853e..f04a0ce2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1047,6 +1047,15 @@ "contributions": [ "content" ] + }, + { + "login": "frvannes16", + "name": "Franklin van Nes", + "avatar_url": "https://avatars.githubusercontent.com/u/3188475?v=4", + "profile": "https://github.com/frvannes16", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 9b27e8d993ca20232fe38a412750c3f845a83b65 Mon Sep 17 00:00:00 2001 From: Galih wisnuaji Date: Fri, 24 Dec 2021 13:48:43 +0700 Subject: [PATCH 0446/1293] chore : replace filter_map() with find_map() --- src/exercise.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index ec694df9..e4a4145d 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -217,8 +217,7 @@ path = "{}.rs""#, let matched_line_index = source .lines() .enumerate() - .filter_map(|(i, line)| if re.is_match(line) { Some(i) } else { None }) - .next() + .find_map(|(i, line)| if re.is_match(line) { Some(i) } else { None }) .expect("This should not happen at all"); let min_line = ((matched_line_index as i32) - (CONTEXT as i32)).max(0) as usize; From f61f9f379638c0142f759ece850c768807a8abfd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 24 Dec 2021 12:28:07 +0000 Subject: [PATCH 0447/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 469e1ef0..1a878ef4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-114-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-115-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -320,6 +320,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
alirezaghey

πŸ–‹
Franklin van Nes

πŸ’» +
nekonako

πŸ’» From 7dce8c8b612a68ccfc1165358e075c4837b0bf92 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 24 Dec 2021 12:28:08 +0000 Subject: [PATCH 0448/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index f04a0ce2..6c3319ca 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1056,6 +1056,15 @@ "contributions": [ "code" ] + }, + { + "login": "nekonako", + "name": "nekonako", + "avatar_url": "https://avatars.githubusercontent.com/u/46141275?v=4", + "profile": "https://nekonako.github.io", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 1622e8c198d89739765c915203efff0091bdeb78 Mon Sep 17 00:00:00 2001 From: ZX <67887489+tan-zx@users.noreply.github.com> Date: Wed, 29 Dec 2021 14:55:37 +0800 Subject: [PATCH 0449/1293] fix(quiz1): update to say quiz covers "If" --- exercises/quiz1.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index b13b9284..7bd3f589 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -2,6 +2,7 @@ // This is a quiz for the following sections: // - Variables // - Functions +// - If // Mary is buying apples. One apple usually costs 2 Rustbucks, but if you buy // more than 40 at once, each apple only costs 1! Write a function that calculates From af84359bdb49282dbd26a72cb67d25a3823290db Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 30 Dec 2021 11:59:05 +0000 Subject: [PATCH 0450/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a878ef4..6fe96b57 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-115-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-116-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -321,6 +321,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
alirezaghey

πŸ–‹
Franklin van Nes

πŸ’»
nekonako

πŸ’» +
ZX

πŸ–‹ From 17e3e75331ea508efddd9a7d507bf76a16fd9a24 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 30 Dec 2021 11:59:06 +0000 Subject: [PATCH 0451/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6c3319ca..91b2a486 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1065,6 +1065,15 @@ "contributions": [ "code" ] + }, + { + "login": "tan-zx", + "name": "ZX", + "avatar_url": "https://avatars.githubusercontent.com/u/67887489?v=4", + "profile": "https://github.com/tan-zx", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 71a06044e6a96ff756dc31d7b0ed665ae4badb57 Mon Sep 17 00:00:00 2001 From: radicale Date: Fri, 4 Feb 2022 14:39:09 +0100 Subject: [PATCH 0452/1293] fix(clippy1): Set clippy::float_cmp lint to deny (#907) --- src/exercise.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exercise.rs b/src/exercise.rs index e4a4145d..6e49a9aa 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -154,7 +154,7 @@ path = "{}.rs""#, Command::new("cargo") .args(&["clippy", "--manifest-path", CLIPPY_CARGO_TOML_PATH]) .args(RUSTC_COLOR_ARGS) - .args(&["--", "-D", "warnings"]) + .args(&["--", "-D", "warnings","-D","clippy::float_cmp"]) .output() } } From cbcde345409c3e550112e449242848eaa3391bb6 Mon Sep 17 00:00:00 2001 From: zydxhs Date: Fri, 4 Feb 2022 22:00:24 +0800 Subject: [PATCH 0453/1293] fix(errors1): Add a comment to make the purpose more clear (#486) Signed-off-by: zydxhs --- exercises/error_handling/errors1.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/error_handling/errors1.rs b/exercises/error_handling/errors1.rs index 9c24d85d..5844a497 100644 --- a/exercises/error_handling/errors1.rs +++ b/exercises/error_handling/errors1.rs @@ -36,6 +36,7 @@ mod tests { fn explains_why_generating_nametag_text_fails() { assert_eq!( generate_nametag_text("".into()), + // Don't change this line Err("`name` was empty; it must be nonempty.".into()) ); } From 4f7ff5d9c7b2d8b045194c1a9469d37e30257c4a Mon Sep 17 00:00:00 2001 From: Yang Wen Date: Fri, 4 Feb 2022 22:12:02 +0800 Subject: [PATCH 0454/1293] fix(structs3): Add a hint for panic (#608) as a totally newbie to Rust, I don't know panic statement from https://doc.rust-lang.org/book/ and rustlings in the beginning. After a hard searching of [should_panic], then I figure out panic statement. So it's helpful to tell the learner that write a panic statement here. --- exercises/structs/structs3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index 1a81531c..e84f2ebc 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -16,7 +16,7 @@ struct Package { impl Package { fn new(sender_country: String, recipient_country: String, weight_in_grams: i32) -> Package { if weight_in_grams <= 0 { - // Something goes here... + // panic statement goes here... } else { Package { sender_country, From 52c7f8a85901b6714c732d2107823750de0d452f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 4 Feb 2022 14:13:31 +0000 Subject: [PATCH 0455/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6fe96b57..b4f6a7ee 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-116-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-117-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -322,6 +322,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Franklin van Nes

πŸ’»
nekonako

πŸ’»
ZX

πŸ–‹ +
Yang Wen

πŸ–‹ From a2e74a2a4bebdd48e9c4336c08c02222e36e2e6d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 4 Feb 2022 14:13:32 +0000 Subject: [PATCH 0456/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 91b2a486..3f246446 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1074,6 +1074,15 @@ "contributions": [ "content" ] + }, + { + "login": "sundevilyang", + "name": "Yang Wen", + "avatar_url": "https://avatars.githubusercontent.com/u/1499214?v=4", + "profile": "https://github.com/sundevilyang", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From bc5686174463ad6f4f6b824b0e9b97c3039d4886 Mon Sep 17 00:00:00 2001 From: Brandon High Date: Fri, 4 Feb 2022 06:38:55 -0800 Subject: [PATCH 0457/1293] doc: Add hints on how to get gcc installed (#741) --- README.md | 1 + install.sh | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/README.md b/README.md index b4f6a7ee..835200e8 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Alternatively, for a first-time Rust learner, there are several other resources: ## Getting Started _Note: If you're on MacOS, make sure you've installed Xcode and its developer tools by typing `xcode-select --install`._ +_Note: If you're on Linux, make sure you've installed gcc. Deb: `sudo apt install gcc`. Yum: `sudo yum -y install gcc`._ You will need to have Rust installed. You can get it by visiting https://rustup.rs. This'll also install Cargo, Rust's package/project manager. diff --git a/install.sh b/install.sh index e986e741..68b8da3a 100755 --- a/install.sh +++ b/install.sh @@ -12,6 +12,18 @@ else exit 1 fi +if [ -x "$(command -v cc)" ] +then + echo "SUCCESS: cc is installed" +else + echo "ERROR: cc does not seem to be installed." + echo "Please download (g)cc using your package manager." + echo "OSX: xcode-select --install" + echo "Deb: sudo apt install gcc" + echo "Yum: sudo yum -y install gcc" + exit 1 +fi + if [ -x "$(command -v rustc)" ] then echo "SUCCESS: Rust is installed" From e96112ab998f6b121b2ea7ddf27d9e99e37dba0f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 4 Feb 2022 14:39:42 +0000 Subject: [PATCH 0458/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 835200e8..c9bb8b87 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-117-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-118-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -324,6 +324,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
nekonako

πŸ’»
ZX

πŸ–‹
Yang Wen

πŸ–‹ +
Brandon High

πŸ“– From dc36ca6d84e66e1304f662770d560b3fcde7c35d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 4 Feb 2022 14:39:43 +0000 Subject: [PATCH 0459/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3f246446..8207a035 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1083,6 +1083,15 @@ "contributions": [ "content" ] + }, + { + "login": "highb", + "name": "Brandon High", + "avatar_url": "https://avatars.githubusercontent.com/u/759848?v=4", + "profile": "https://brandon-high.com", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From 9be012dda0617e868c044a22e815933bc0db2cb0 Mon Sep 17 00:00:00 2001 From: Ryan Lowe Date: Sat, 5 Feb 2022 16:54:11 -0500 Subject: [PATCH 0460/1293] feat!: Add progress indicator closes #360 BREAKING CHANGE: verify() has a new function signature so it can know the current completion progress --- src/main.rs | 13 ++++++------- src/verify.rs | 25 ++++++++++++++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/main.rs b/src/main.rs index 32e7bba2..96378ece 100644 --- a/src/main.rs +++ b/src/main.rs @@ -214,7 +214,7 @@ fn main() { } Subcommands::Verify(_subargs) => { - verify(&exercises, verbose).unwrap_or_else(|_| std::process::exit(1)); + verify(&exercises, (0, exercises.len()), verbose).unwrap_or_else(|_| std::process::exit(1)); } Subcommands::Watch(_subargs) => match watch(&exercises, verbose) { @@ -351,7 +351,7 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result { clear_screen(); let to_owned_hint = |t: &Exercise| t.hint.to_owned(); - let failed_exercise_hint = match verify(exercises.iter(), verbose) { + let failed_exercise_hint = match verify(exercises.iter(), (0, exercises.len()), verbose) { Ok(_) => return Ok(WatchStatus::Finished), Err(exercise) => Arc::new(Mutex::new(Some(to_owned_hint(exercise)))), }; @@ -362,17 +362,16 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result { DebouncedEvent::Create(b) | DebouncedEvent::Chmod(b) | DebouncedEvent::Write(b) => { if b.extension() == Some(OsStr::new("rs")) && b.exists() { let filepath = b.as_path().canonicalize().unwrap(); - let pending_exercises = exercises - .iter() - .skip_while(|e| !filepath.ends_with(&e.path)) - // .filter(|e| filepath.ends_with(&e.path)) + let pending_exercises = exercises.iter() + .find(|e| filepath.ends_with(&e.path)).into_iter() .chain( exercises .iter() .filter(|e| !e.looks_done() && !filepath.ends_with(&e.path)), ); + let num_done = exercises.iter().filter(|e| e.looks_done()).count(); clear_screen(); - match verify(pending_exercises, verbose) { + match verify(pending_exercises, (num_done, exercises.len()), verbose) { Ok(_) => return Ok(WatchStatus::Finished), Err(exercise) => { let mut failed_exercise_hint = failed_exercise_hint.lock().unwrap(); diff --git a/src/verify.rs b/src/verify.rs index fd59fa51..eb7af69f 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -1,6 +1,6 @@ use crate::exercise::{CompiledExercise, Exercise, Mode, State}; use console::style; -use indicatif::ProgressBar; +use indicatif::{ProgressBar, ProgressStyle}; use std::env; // Verify that the provided container of Exercise objects @@ -9,10 +9,18 @@ use std::env; // If the Exercise being verified is a test, the verbose boolean // determines whether or not the test harness outputs are displayed. pub fn verify<'a>( - start_at: impl IntoIterator, + exercises: impl IntoIterator, + progress: (usize, usize), verbose: bool, ) -> Result<(), &'a Exercise> { - for exercise in start_at { + let (num_done, total) = progress; + let bar = ProgressBar::new(total as u64); + bar.set_style(ProgressStyle::default_bar() + .template("Progress: [{bar:60.green/red}] {pos}/{len}") + .progress_chars("#>-") + ); + bar.set_position(num_done as u64); + for exercise in exercises { let compile_result = match exercise.mode { Mode::Test => compile_and_test(exercise, RunMode::Interactive, verbose), Mode::Compile => compile_and_run_interactively(exercise), @@ -21,6 +29,7 @@ pub fn verify<'a>( if !compile_result.unwrap_or(false) { return Err(exercise); } + bar.inc(1); } Ok(()) } @@ -45,7 +54,6 @@ fn compile_only(exercise: &Exercise) -> Result { let _ = compile(exercise, &progress_bar)?; progress_bar.finish_and_clear(); - success!("Successfully compiled {}!", exercise); Ok(prompt_for_completion(exercise, None)) } @@ -71,8 +79,6 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result { } }; - success!("Successfully ran {}!", exercise); - Ok(prompt_for_completion(exercise, Some(output.stdout))) } @@ -92,7 +98,6 @@ fn compile_and_test(exercise: &Exercise, run_mode: RunMode, verbose: bool) -> Re if verbose { println!("{}", output.stdout); } - success!("Successfully tested {}", &exercise); if let RunMode::Interactive = run_mode { Ok(prompt_for_completion(exercise, None)) } else { @@ -138,6 +143,12 @@ fn prompt_for_completion(exercise: &Exercise, prompt_output: Option) -> State::Pending(context) => context, }; + match exercise.mode { + Mode::Compile => success!("Successfully ran {}!", exercise), + Mode::Test => success!("Successfully tested {}!", exercise), + Mode::Clippy => success!("Successfully compiled {}!", exercise), + } + let no_emoji = env::var("NO_EMOJI").is_ok(); let clippy_success_msg = if no_emoji { From 17f9d7429ccd133a72e815fb5618e0ce79560929 Mon Sep 17 00:00:00 2001 From: Kisaragi <48310258+KisaragiEffective@users.noreply.github.com> Date: Mon, 28 Mar 2022 10:10:25 +0900 Subject: [PATCH 0461/1293] docs: fix some code-blocks were not highlighted --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c9bb8b87..11e0438a 100644 --- a/README.md +++ b/README.md @@ -36,13 +36,13 @@ This will install Rustlings and give you access to the `rustlings` command. Run In PowerShell (Run as Administrator), set `ExecutionPolicy` to `RemoteSigned`: -```ps +```ps1 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser ``` Then, you can run: -```ps +```ps1 Start-BitsTransfer -Source https://git.io/JTL5v -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 ``` From 179a75a68d03ac9518dec2297fb17f91a4fc506b Mon Sep 17 00:00:00 2001 From: x-hgg-x <39058530+x-hgg-x@users.noreply.github.com> Date: Tue, 29 Mar 2022 11:44:06 +0200 Subject: [PATCH 0462/1293] fix: Include exercises folder in the project structure behind a feature (#917) closes #859 closes #913 closes #942 --- Cargo.toml | 5 ++++- exercises/advanced_errors/mod.rs | 2 ++ exercises/clippy/mod.rs | 2 ++ exercises/collections/mod.rs | 4 ++++ exercises/conversions/mod.rs | 5 +++++ exercises/enums/mod.rs | 3 +++ exercises/error_handling/mod.rs | 6 ++++++ exercises/functions/mod.rs | 5 +++++ exercises/generics/mod.rs | 3 +++ exercises/if/mod.rs | 2 ++ exercises/intro/mod.rs | 2 ++ exercises/macros/mod.rs | 4 ++++ exercises/mod.rs | 26 +++++++++++++++++++++++++ exercises/modules/mod.rs | 3 +++ exercises/move_semantics/mod.rs | 5 +++++ exercises/option/mod.rs | 3 +++ exercises/primitive_types/mod.rs | 6 ++++++ exercises/standard_library_types/mod.rs | 7 +++++++ exercises/strings/mod.rs | 2 ++ exercises/structs/mod.rs | 3 +++ exercises/tests/mod.rs | 3 +++ exercises/threads/mod.rs | 1 + exercises/traits/mod.rs | 2 ++ exercises/variables/mod.rs | 6 ++++++ src/lib.rs | 3 +++ 25 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 exercises/advanced_errors/mod.rs create mode 100644 exercises/clippy/mod.rs create mode 100644 exercises/collections/mod.rs create mode 100644 exercises/conversions/mod.rs create mode 100644 exercises/enums/mod.rs create mode 100644 exercises/error_handling/mod.rs create mode 100644 exercises/functions/mod.rs create mode 100644 exercises/generics/mod.rs create mode 100644 exercises/if/mod.rs create mode 100644 exercises/intro/mod.rs create mode 100644 exercises/macros/mod.rs create mode 100644 exercises/mod.rs create mode 100644 exercises/modules/mod.rs create mode 100644 exercises/move_semantics/mod.rs create mode 100644 exercises/option/mod.rs create mode 100644 exercises/primitive_types/mod.rs create mode 100644 exercises/standard_library_types/mod.rs create mode 100644 exercises/strings/mod.rs create mode 100644 exercises/structs/mod.rs create mode 100644 exercises/tests/mod.rs create mode 100644 exercises/threads/mod.rs create mode 100644 exercises/traits/mod.rs create mode 100644 exercises/variables/mod.rs create mode 100644 src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 30032695..4761c9a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ console = "0.7.7" notify = "4.0.15" toml = "0.4.10" regex = "1.1.6" -serde = {version = "1.0.10", features = ["derive"]} +serde = { version = "1.0.10", features = ["derive"] } [[bin]] name = "rustlings" @@ -21,3 +21,6 @@ path = "src/main.rs" assert_cmd = "0.11.0" predicates = "1.0.1" glob = "0.3.0" + +[features] +exercises = [] diff --git a/exercises/advanced_errors/mod.rs b/exercises/advanced_errors/mod.rs new file mode 100644 index 00000000..e33fb80d --- /dev/null +++ b/exercises/advanced_errors/mod.rs @@ -0,0 +1,2 @@ +mod advanced_errs1; +mod advanced_errs2; diff --git a/exercises/clippy/mod.rs b/exercises/clippy/mod.rs new file mode 100644 index 00000000..689dc95f --- /dev/null +++ b/exercises/clippy/mod.rs @@ -0,0 +1,2 @@ +mod clippy1; +mod clippy2; diff --git a/exercises/collections/mod.rs b/exercises/collections/mod.rs new file mode 100644 index 00000000..f46c1424 --- /dev/null +++ b/exercises/collections/mod.rs @@ -0,0 +1,4 @@ +mod hashmap1; +mod hashmap2; +mod vec1; +mod vec2; diff --git a/exercises/conversions/mod.rs b/exercises/conversions/mod.rs new file mode 100644 index 00000000..69f66ae4 --- /dev/null +++ b/exercises/conversions/mod.rs @@ -0,0 +1,5 @@ +mod as_ref_mut; +mod from_into; +mod from_str; +mod try_from_into; +mod using_as; diff --git a/exercises/enums/mod.rs b/exercises/enums/mod.rs new file mode 100644 index 00000000..a23fd6e5 --- /dev/null +++ b/exercises/enums/mod.rs @@ -0,0 +1,3 @@ +mod enums1; +mod enums2; +mod enums3; diff --git a/exercises/error_handling/mod.rs b/exercises/error_handling/mod.rs new file mode 100644 index 00000000..539fa23d --- /dev/null +++ b/exercises/error_handling/mod.rs @@ -0,0 +1,6 @@ +mod errors1; +mod errors2; +mod errors3; +mod errors4; +mod errors5; +mod errors6; diff --git a/exercises/functions/mod.rs b/exercises/functions/mod.rs new file mode 100644 index 00000000..445b6f58 --- /dev/null +++ b/exercises/functions/mod.rs @@ -0,0 +1,5 @@ +mod functions1; +mod functions2; +mod functions3; +mod functions4; +mod functions5; diff --git a/exercises/generics/mod.rs b/exercises/generics/mod.rs new file mode 100644 index 00000000..5b93555c --- /dev/null +++ b/exercises/generics/mod.rs @@ -0,0 +1,3 @@ +mod generics1; +mod generics2; +mod generics3; diff --git a/exercises/if/mod.rs b/exercises/if/mod.rs new file mode 100644 index 00000000..c5d02445 --- /dev/null +++ b/exercises/if/mod.rs @@ -0,0 +1,2 @@ +mod if1; +mod if2; diff --git a/exercises/intro/mod.rs b/exercises/intro/mod.rs new file mode 100644 index 00000000..445c47ab --- /dev/null +++ b/exercises/intro/mod.rs @@ -0,0 +1,2 @@ +mod intro1; +mod intro2; diff --git a/exercises/macros/mod.rs b/exercises/macros/mod.rs new file mode 100644 index 00000000..9f65acf5 --- /dev/null +++ b/exercises/macros/mod.rs @@ -0,0 +1,4 @@ +mod macros1; +mod macros2; +mod macros3; +mod macros4; diff --git a/exercises/mod.rs b/exercises/mod.rs new file mode 100644 index 00000000..6a143b56 --- /dev/null +++ b/exercises/mod.rs @@ -0,0 +1,26 @@ +mod advanced_errors; +mod clippy; +mod collections; +mod conversions; +mod enums; +mod error_handling; +mod functions; +mod generics; +mod r#if; +mod intro; +mod macros; +mod modules; +mod move_semantics; +mod option; +mod primitive_types; +mod quiz1; +mod quiz2; +mod quiz3; +mod quiz4; +mod standard_library_types; +mod strings; +mod structs; +mod tests; +mod threads; +mod traits; +mod variables; diff --git a/exercises/modules/mod.rs b/exercises/modules/mod.rs new file mode 100644 index 00000000..35f96af5 --- /dev/null +++ b/exercises/modules/mod.rs @@ -0,0 +1,3 @@ +mod modules1; +mod modules2; +mod modules3; diff --git a/exercises/move_semantics/mod.rs b/exercises/move_semantics/mod.rs new file mode 100644 index 00000000..c9e61b36 --- /dev/null +++ b/exercises/move_semantics/mod.rs @@ -0,0 +1,5 @@ +mod move_semantics1; +mod move_semantics2; +mod move_semantics3; +mod move_semantics4; +mod move_semantics5; diff --git a/exercises/option/mod.rs b/exercises/option/mod.rs new file mode 100644 index 00000000..b3cdb13d --- /dev/null +++ b/exercises/option/mod.rs @@ -0,0 +1,3 @@ +mod option1; +mod option2; +mod option3; diff --git a/exercises/primitive_types/mod.rs b/exercises/primitive_types/mod.rs new file mode 100644 index 00000000..23355239 --- /dev/null +++ b/exercises/primitive_types/mod.rs @@ -0,0 +1,6 @@ +mod primitive_types1; +mod primitive_types2; +mod primitive_types3; +mod primitive_types4; +mod primitive_types5; +mod primitive_types6; diff --git a/exercises/standard_library_types/mod.rs b/exercises/standard_library_types/mod.rs new file mode 100644 index 00000000..b03acb92 --- /dev/null +++ b/exercises/standard_library_types/mod.rs @@ -0,0 +1,7 @@ +mod arc1; +mod box1; +mod iterators1; +mod iterators2; +mod iterators3; +mod iterators4; +mod iterators5; diff --git a/exercises/strings/mod.rs b/exercises/strings/mod.rs new file mode 100644 index 00000000..b1b460bc --- /dev/null +++ b/exercises/strings/mod.rs @@ -0,0 +1,2 @@ +mod strings1; +mod strings2; diff --git a/exercises/structs/mod.rs b/exercises/structs/mod.rs new file mode 100644 index 00000000..214fed16 --- /dev/null +++ b/exercises/structs/mod.rs @@ -0,0 +1,3 @@ +mod structs1; +mod structs2; +mod structs3; diff --git a/exercises/tests/mod.rs b/exercises/tests/mod.rs new file mode 100644 index 00000000..489541be --- /dev/null +++ b/exercises/tests/mod.rs @@ -0,0 +1,3 @@ +mod tests1; +mod tests2; +mod tests3; diff --git a/exercises/threads/mod.rs b/exercises/threads/mod.rs new file mode 100644 index 00000000..24d54007 --- /dev/null +++ b/exercises/threads/mod.rs @@ -0,0 +1 @@ +mod threads1; diff --git a/exercises/traits/mod.rs b/exercises/traits/mod.rs new file mode 100644 index 00000000..6f0a9c3f --- /dev/null +++ b/exercises/traits/mod.rs @@ -0,0 +1,2 @@ +mod traits1; +mod traits2; diff --git a/exercises/variables/mod.rs b/exercises/variables/mod.rs new file mode 100644 index 00000000..a25f477e --- /dev/null +++ b/exercises/variables/mod.rs @@ -0,0 +1,6 @@ +mod variables1; +mod variables2; +mod variables3; +mod variables4; +mod variables5; +mod variables6; diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 00000000..82c1e7e4 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,3 @@ +#[cfg(feature = "exercises")] +#[path = "../exercises/mod.rs"] +mod exercises; From 4378d1db461843d8fb93e0a8649d1c05dcb3032e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 09:47:50 +0000 Subject: [PATCH 0463/1293] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c9bb8b87..92a5095e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-118-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-119-orange.svg?style=flat-square)](#contributors-) # rustlings πŸ¦€β€οΈ @@ -325,6 +325,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
ZX

πŸ–‹
Yang Wen

πŸ–‹
Brandon High

πŸ“– +
x-hgg-x

πŸ’» From 0232f6058f7d6252378f6082a46ad2f4e7885d36 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 09:47:51 +0000 Subject: [PATCH 0464/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8207a035..fc94bb1d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1092,6 +1092,15 @@ "contributions": [ "doc" ] + }, + { + "login": "x-hgg-x", + "name": "x-hgg-x", + "avatar_url": "https://avatars.githubusercontent.com/u/39058530?v=4", + "profile": "https://github.com/x-hgg-x", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 057d912e78dc1f465b671be4f290db49331d0701 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 29 Mar 2022 11:49:36 +0200 Subject: [PATCH 0465/1293] chore: push contributors to AUTHORS.md the readme file is getting a bit crowded at this point, it's better to have a reference to AUTHORS.md, and then to let the bot add it in there --- .all-contributorsrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index fc94bb1d..b18300b9 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1,6 +1,6 @@ { "files": [ - "README.md" + "AUTHORS.md" ], "imageSize": 100, "commit": false, From bf93724511e672fb1dd124cb76da74f9f2af421b Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 29 Mar 2022 11:52:06 +0200 Subject: [PATCH 0466/1293] chore: add empty authors file --- AUTHORS.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 AUTHORS.md diff --git a/AUTHORS.md b/AUTHORS.md new file mode 100644 index 00000000..6d309389 --- /dev/null +++ b/AUTHORS.md @@ -0,0 +1,6 @@ +## Authors + +This file lists the people that have contributed to this project. + +Excluded from this list are @carols10cents and @diannasoreil, the principal +authors. From c60bd97cb94b234a3e17d8cc043f441eca3c073e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:54:21 +0000 Subject: [PATCH 0467/1293] docs: update AUTHORS.md [skip ci] From 70e29d9717a1f4fdb1bdd1a52e4c4d8211262579 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:54:22 +0000 Subject: [PATCH 0468/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b18300b9..c07ac794 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1101,6 +1101,15 @@ "contributions": [ "code" ] + }, + { + "login": "KisaragiEffective", + "name": "Kisaragi", + "avatar_url": "https://avatars.githubusercontent.com/u/48310258?v=4", + "profile": "http://kisaragieffective.github.io", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From 01023f5b4f461ed6819b7c3192164cee36d73b2d Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 29 Mar 2022 14:58:52 +0200 Subject: [PATCH 0469/1293] chore: copy existing contributors table --- AUTHORS.md | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 6d309389..9813bd17 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -4,3 +4,165 @@ This file lists the people that have contributed to this project. Excluded from this list are @carols10cents and @diannasoreil, the principal authors. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Carol (Nichols || Goulding)

πŸ’» πŸ–‹

QuietMisdreavus

πŸ’» πŸ–‹

Robert M Lugg

πŸ–‹

Hynek Schlawack

πŸ’»

Katharina Fey

πŸ’»

lukabavdaz

πŸ’» πŸ–‹

Erik Vesteraas

πŸ’»

delet0r

πŸ’»

Shaun Bennett

πŸ’»

Andrew Bagshaw

πŸ’»

Kyle Isom

πŸ’»

Colin Pitrat

πŸ’»

Zac Anger

πŸ’»

Matthias Geier

πŸ’»

Chris Pearce

πŸ’»

Yvan Sraka

πŸ’»

Denys Smirnov

πŸ’»

eddyp

πŸ’»

Brian Kung

πŸ’» πŸ–‹

Russell

πŸ’»

Dan Wilhelm

πŸ“–

Jesse

πŸ’» πŸ–‹

Fredrik JambrΓ©n

πŸ’»

Pete McFarlane

πŸ–‹

nkanderson

πŸ’» πŸ–‹

Ajax M

πŸ“–

Dylan Nugent

πŸ–‹

vyaslav

πŸ’» πŸ–‹

George

πŸ’»

Thomas Holloway

πŸ’» πŸ–‹

Jubilee

πŸ’»

WofWca

πŸ’»

Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧

Jens

πŸ“–

Rahat Ahmed

πŸ“–

Abdou Seck

πŸ’» πŸ–‹ πŸ‘€

Katie

πŸ’»

Socrates

πŸ“–

gnodarse

πŸ–‹

Harrison Metzger

πŸ’»

Torben Jonas

πŸ’» πŸ–‹

Paul Bissex

πŸ“–

Steven Mann

πŸ’» πŸ–‹

Mario Reder

πŸ’» πŸ–‹

skim

πŸ’»

Sanjay K

πŸ’» πŸ–‹

Rohan Jain

πŸ’»

Said Aspen

πŸ’» πŸ–‹

Ufuk Celebi

πŸ’»

lebedevsergey

πŸ“–

Aleksei Trifonov

πŸ–‹

Darren Meehan

πŸ–‹

Jihchi Lee

πŸ–‹

Christofer Bertonha

πŸ–‹

Vivek Bharath Akupatni

πŸ’» ⚠️

DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹

Rob Story

πŸ’»

Siobhan Jacobson

πŸ’»

Evan Carroll

πŸ–‹

Jawaad Mahmood

πŸ–‹

Gaurang Tandon

πŸ–‹

Stefan Kupresak

πŸ–‹

Greg Leonard

πŸ–‹

Ryan McQuen

πŸ’»

Annika

πŸ‘€

Axel Viala

πŸ’»

Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»

Caleb Webber

🚧

Peter N

🚧

seancad

🚧

Will Hayworth

πŸ–‹

Christian Zeller

πŸ–‹

Jean-Francois Chevrette

πŸ–‹ πŸ’»

John Baber-Lucero

πŸ–‹

Tal

πŸ–‹

apogeeoak

πŸ–‹ πŸ’»

Larry Garfield

πŸ–‹

circumspect

πŸ–‹

Cyrus Wyett

πŸ–‹

cadolphs

πŸ’»

Pascal H.

πŸ–‹

Rod Elias

πŸ–‹

Matt Lebl

πŸ’»

Ignacio Le Fluk

πŸ–‹

Taylor Yu

πŸ’» πŸ–‹

Patrick Hintermayer

πŸ’»

Pete Pavlovski

πŸ–‹

k12ish

πŸ–‹

Shao Yang Hong

πŸ–‹

Brandon Macer

πŸ–‹

Stoian Dan

πŸ–‹

Pi Delport

πŸ–‹

Sateesh

πŸ’» πŸ–‹

ZC

πŸ–‹

hyperparabolic

πŸ’»

arlecchino

πŸ“–

Richthofen

πŸ’»

Ivan Nerazumov

πŸ“–

lauralindzey

πŸ“–

Rakshit Sinha

πŸ–‹

Damian

πŸ–‹

Ben Armstead

πŸ’»

anuk909

πŸ–‹ πŸ’»

granddaifuku

πŸ–‹

Weilet

πŸ–‹

LIU JIE

πŸ–‹

Antoine BΓΌsch

πŸ’»

frogtd

πŸ–‹

Zhenghao Lu

πŸ–‹

Fredrik Enestad

πŸ–‹

xuesong

πŸ–‹

Michael Walsh

πŸ’»

alirezaghey

πŸ–‹

Franklin van Nes

πŸ’»

nekonako

πŸ’»

ZX

πŸ–‹

Yang Wen

πŸ–‹

Brandon High

πŸ“–

x-hgg-x

πŸ’»
+ + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! From 3f0e1303e0b3bf3fecc0baced3c8b8a37f83c184 Mon Sep 17 00:00:00 2001 From: Lucas Aries <73198738+Kallu-A@users.noreply.github.com> Date: Tue, 29 Mar 2022 15:02:35 +0200 Subject: [PATCH 0470/1293] feat: Add move_semantics6.rs exercise (#908) --- exercises/move_semantics/move_semantics6.rs | 25 +++++++++++++++++++++ info.toml | 15 +++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 exercises/move_semantics/move_semantics6.rs diff --git a/exercises/move_semantics/move_semantics6.rs b/exercises/move_semantics/move_semantics6.rs new file mode 100644 index 00000000..457e7ae7 --- /dev/null +++ b/exercises/move_semantics/move_semantics6.rs @@ -0,0 +1,25 @@ +// move_semantics6.rs +// Make me compile! `rustlings hint move_semantics6` for hints +// You can't change anything except adding or removing references + +// I AM NOT DONE + +fn main() { + let data = "Rust is great!".to_string(); + + get_char(data); + + string_uppercase(&data); +} + +// Should not take ownership +fn get_char(data: String) -> char { + data.chars().last().unwrap() +} + +// Should take ownership +fn string_uppercase(mut data: &String) { + data = &data.to_uppercase(); + + println!("{}", data); +} diff --git a/info.toml b/info.toml index fbe0d53b..9430a161 100644 --- a/info.toml +++ b/info.toml @@ -237,6 +237,21 @@ in the book's section References and Borrowing': https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references. """ +[[exercises]] +name = "move_semantics6" +path = "exercises/move_semantics/move_semantics6.rs" +mode = "compile" +hint = """ +To find the answer, you can consult the book section "References and Borrowing": +https://doc.rust-lang.org/stable/book/ch04-02-references-and-borrowing.html +The first problem is that `get_char` is taking ownership of the string. +So `data` is moved and can't be used for `string_uppercase` +`data` is moved to `get_char` first, meaning that `string_uppercase` cannot manipulate the data. +Once you've fixed that, `string_uppercase`'s function signature will also need to be adjusted. +Can you figure out how? + +Another hint: it has to do with the `&` character.""" + # PRIMITIVE TYPES [[exercises]] From 2ca5250f78cba3276b9284af5f0f49e5ce296f71 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 13:02:51 +0000 Subject: [PATCH 0471/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 9813bd17..a7f29bb2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -157,6 +157,10 @@ authors.
Yang Wen

πŸ–‹
Brandon High

πŸ“–
x-hgg-x

πŸ’» +
Kisaragi

πŸ“– + + +
Lucas Aries

πŸ–‹ From d4e3d98d0abe732df08ee6fe85ef276b7805257e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 13:02:52 +0000 Subject: [PATCH 0472/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c07ac794..24832b42 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1110,6 +1110,15 @@ "contributions": [ "doc" ] + }, + { + "login": "Kallu-A", + "name": "Lucas Aries", + "avatar_url": "https://avatars.githubusercontent.com/u/73198738?v=4", + "profile": "https://github.com/Kallu-A", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From bdf6efeccde2a669571fcc5dd68801c88c72d0f1 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 29 Mar 2022 15:04:52 +0200 Subject: [PATCH 0473/1293] chore: clean up readme --- README.md | 178 +++--------------------------------------------------- 1 file changed, 7 insertions(+), 171 deletions(-) diff --git a/README.md b/README.md index fdae4acb..babc3423 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,3 @@ - -[![All Contributors](https://img.shields.io/badge/all_contributors-119-orange.svg?style=flat-square)](#contributors-) - - # rustlings πŸ¦€β€οΈ Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages! @@ -68,6 +64,7 @@ cargo install --force --path . ``` If there are installation errors, ensure that your toolchain is up to date. For the latest, run: + ```bash rustup update ``` @@ -107,17 +104,18 @@ rustlings run next In case you get stuck, you can run the following command to get a hint for your exercise: -``` bash +```bash rustlings hint myExercise1 ``` You can also get the hint for the next unsolved exercise with the following command: -``` bash +```bash rustlings hint next ``` To check your progress, you can run the following command: + ```bash rustlings list ``` @@ -135,14 +133,14 @@ Once you've completed Rustlings, put your new knowledge to good use! Continue pr If you want to remove Rustlings from your system, there's two steps. First, you'll need to remove the exercises folder that the install script created for you: -``` bash +```bash rm -rf rustlings # or your custom folder name, if you chose and or renamed it ``` Second, since Rustlings got installed via `cargo install`, it's only reasonable to assume that you can also remove it using Cargo, and exactly that is the case. Run `cargo uninstall` to remove the `rustlings` binary: -``` bash +```bash cargo uninstall rustlings ``` @@ -172,166 +170,4 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md). ## Contributors ✨ -Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Carol (Nichols || Goulding)

πŸ’» πŸ–‹

QuietMisdreavus

πŸ’» πŸ–‹

Robert M Lugg

πŸ–‹

Hynek Schlawack

πŸ’»

Katharina Fey

πŸ’»

lukabavdaz

πŸ’» πŸ–‹

Erik Vesteraas

πŸ’»

delet0r

πŸ’»

Shaun Bennett

πŸ’»

Andrew Bagshaw

πŸ’»

Kyle Isom

πŸ’»

Colin Pitrat

πŸ’»

Zac Anger

πŸ’»

Matthias Geier

πŸ’»

Chris Pearce

πŸ’»

Yvan Sraka

πŸ’»

Denys Smirnov

πŸ’»

eddyp

πŸ’»

Brian Kung

πŸ’» πŸ–‹

Russell

πŸ’»

Dan Wilhelm

πŸ“–

Jesse

πŸ’» πŸ–‹

Fredrik JambrΓ©n

πŸ’»

Pete McFarlane

πŸ–‹

nkanderson

πŸ’» πŸ–‹

Ajax M

πŸ“–

Dylan Nugent

πŸ–‹

vyaslav

πŸ’» πŸ–‹

George

πŸ’»

Thomas Holloway

πŸ’» πŸ–‹

Jubilee

πŸ’»

WofWca

πŸ’»

Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧

Jens

πŸ“–

Rahat Ahmed

πŸ“–

Abdou Seck

πŸ’» πŸ–‹ πŸ‘€

Katie

πŸ’»

Socrates

πŸ“–

gnodarse

πŸ–‹

Harrison Metzger

πŸ’»

Torben Jonas

πŸ’» πŸ–‹

Paul Bissex

πŸ“–

Steven Mann

πŸ’» πŸ–‹

Mario Reder

πŸ’» πŸ–‹

skim

πŸ’»

Sanjay K

πŸ’» πŸ–‹

Rohan Jain

πŸ’»

Said Aspen

πŸ’» πŸ–‹

Ufuk Celebi

πŸ’»

lebedevsergey

πŸ“–

Aleksei Trifonov

πŸ–‹

Darren Meehan

πŸ–‹

Jihchi Lee

πŸ–‹

Christofer Bertonha

πŸ–‹

Vivek Bharath Akupatni

πŸ’» ⚠️

DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹

Rob Story

πŸ’»

Siobhan Jacobson

πŸ’»

Evan Carroll

πŸ–‹

Jawaad Mahmood

πŸ–‹

Gaurang Tandon

πŸ–‹

Stefan Kupresak

πŸ–‹

Greg Leonard

πŸ–‹

Ryan McQuen

πŸ’»

Annika

πŸ‘€

Axel Viala

πŸ’»

Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»

Caleb Webber

🚧

Peter N

🚧

seancad

🚧

Will Hayworth

πŸ–‹

Christian Zeller

πŸ–‹

Jean-Francois Chevrette

πŸ–‹ πŸ’»

John Baber-Lucero

πŸ–‹

Tal

πŸ–‹

apogeeoak

πŸ–‹ πŸ’»

Larry Garfield

πŸ–‹

circumspect

πŸ–‹

Cyrus Wyett

πŸ–‹

cadolphs

πŸ’»

Pascal H.

πŸ–‹

Rod Elias

πŸ–‹

Matt Lebl

πŸ’»

Ignacio Le Fluk

πŸ–‹

Taylor Yu

πŸ’» πŸ–‹

Patrick Hintermayer

πŸ’»

Pete Pavlovski

πŸ–‹

k12ish

πŸ–‹

Shao Yang Hong

πŸ–‹

Brandon Macer

πŸ–‹

Stoian Dan

πŸ–‹

Pi Delport

πŸ–‹

Sateesh

πŸ’» πŸ–‹

ZC

πŸ–‹

hyperparabolic

πŸ’»

arlecchino

πŸ“–

Richthofen

πŸ’»

Ivan Nerazumov

πŸ“–

lauralindzey

πŸ“–

Rakshit Sinha

πŸ–‹

Damian

πŸ–‹

Ben Armstead

πŸ’»

anuk909

πŸ–‹ πŸ’»

granddaifuku

πŸ–‹

Weilet

πŸ–‹

LIU JIE

πŸ–‹

Antoine BΓΌsch

πŸ’»

frogtd

πŸ–‹

Zhenghao Lu

πŸ–‹

Fredrik Enestad

πŸ–‹

xuesong

πŸ–‹

Michael Walsh

πŸ’»

alirezaghey

πŸ–‹

Franklin van Nes

πŸ’»

nekonako

πŸ’»

ZX

πŸ–‹

Yang Wen

πŸ–‹

Brandon High

πŸ“–

x-hgg-x

πŸ’»
- - - - - - -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! +Thanks goes to the wonderful people listed in [AUTHORS.md](./AUTHORS.md) πŸŽ‰ From 0bd7a0631a17a9d69af5746795a30efc9cf64e6e Mon Sep 17 00:00:00 2001 From: Soroush Zare Date: Wed, 30 Mar 2022 15:57:52 +0430 Subject: [PATCH 0474/1293] fix(iterators1): reorder TODO steps Update the TODO steps in the iterators1 exercise. --- exercises/standard_library_types/iterators1.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/standard_library_types/iterators1.rs b/exercises/standard_library_types/iterators1.rs index 4606ad35..5aa49b64 100644 --- a/exercises/standard_library_types/iterators1.rs +++ b/exercises/standard_library_types/iterators1.rs @@ -18,7 +18,7 @@ fn main () { assert_eq!(my_iterable_fav_fruits.next(), Some(&"banana")); assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 2 assert_eq!(my_iterable_fav_fruits.next(), Some(&"avocado")); - assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 2.1 - assert_eq!(my_iterable_fav_fruits.next(), Some(&"raspberry")); assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 3 + assert_eq!(my_iterable_fav_fruits.next(), Some(&"raspberry")); + assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 4 } From 4dfd85ff05bc7e624909a32ce92bfd8d68bb1669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20Have=CC=81?= Date: Sun, 3 Apr 2022 23:45:45 +0200 Subject: [PATCH 0475/1293] fix(move_semantics) : add move_semantics6.rs to its mod --- exercises/move_semantics/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/move_semantics/mod.rs b/exercises/move_semantics/mod.rs index c9e61b36..e8eecf0a 100644 --- a/exercises/move_semantics/mod.rs +++ b/exercises/move_semantics/mod.rs @@ -3,3 +3,4 @@ mod move_semantics2; mod move_semantics3; mod move_semantics4; mod move_semantics5; +mod move_semantics6; From d114847f256c5f571c0b4c87e04b04bce3435509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20Have=CC=81?= Date: Sun, 3 Apr 2022 19:49:59 +0200 Subject: [PATCH 0476/1293] fix(install): protect path with whitespaces using quotes and stop at the first error --- install.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/install.sh b/install.sh index 68b8da3a..1d9cff27 100755 --- a/install.sh +++ b/install.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +set -euo pipefail echo "Let's get you set up with Rustlings!" @@ -100,8 +101,8 @@ function vercomp() { RustVersion=$(rustc --version | cut -d " " -f 2) MinRustVersion=1.39 -vercomp $RustVersion $MinRustVersion -if [ $? -eq 2 ] +vercomp "$RustVersion" $MinRustVersion || ec=$? +if [ ${ec:-0} -eq 2 ] then echo "ERROR: Rust version is too old: $RustVersion - needs at least $MinRustVersion" echo "Please update Rust with 'rustup update'" @@ -112,9 +113,9 @@ fi Path=${1:-rustlings/} echo "Cloning Rustlings at $Path..." -git clone -q https://github.com/rust-lang/rustlings $Path +git clone -q https://github.com/rust-lang/rustlings "$Path" -cd $Path +cd "$Path" Version=$(curl -s https://api.github.com/repos/rust-lang/rustlings/releases/latest | ${PY} -c "import json,sys;obj=json.load(sys.stdin);print(obj['tag_name']);") CargoBin="${CARGO_HOME:-$HOME/.cargo}/bin" From 89650f808af23a32c9a2c6d46592b77547a6a464 Mon Sep 17 00:00:00 2001 From: ragreenburg Date: Wed, 6 Apr 2022 00:29:27 -0700 Subject: [PATCH 0477/1293] fix(move_semantics2): Add comment --- exercises/move_semantics/move_semantics2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs index bd21fbb7..888dc529 100644 --- a/exercises/move_semantics/move_semantics2.rs +++ b/exercises/move_semantics/move_semantics2.rs @@ -1,5 +1,5 @@ // move_semantics2.rs -// Make me compile without changing line 13! +// Make me compile without changing line 13 or moving line 10! // Execute `rustlings hint move_semantics2` for hints :) // I AM NOT DONE From d3c5058d89c08cffb8be34491147a0d8976c3b0b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 6 Apr 2022 07:29:49 +0000 Subject: [PATCH 0478/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index a7f29bb2..a81018cc 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -161,6 +161,7 @@ authors.
Lucas Aries

πŸ–‹ +
ragreenburg

πŸ–‹ From b1cdce6289934fe4a73e6f22265c13fa463208d3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 6 Apr 2022 07:29:50 +0000 Subject: [PATCH 0479/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 24832b42..66a8eabf 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1119,6 +1119,15 @@ "contributions": [ "content" ] + }, + { + "login": "ragreenburg", + "name": "ragreenburg", + "avatar_url": "https://avatars.githubusercontent.com/u/24358100?v=4", + "profile": "https://github.com/ragreenburg", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 43d0623086edbc46fe896ba59c7afa22c3da9f7a Mon Sep 17 00:00:00 2001 From: J-S-Kim Date: Sat, 9 Apr 2022 01:23:58 +0900 Subject: [PATCH 0480/1293] fix(errors6.rs): remove one answer code Although marked as 'TODO', three tests pass without any implementation because the correct answer code already exists. --- exercises/error_handling/errors6.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/exercises/error_handling/errors6.rs b/exercises/error_handling/errors6.rs index 0f6b27a6..847a049a 100644 --- a/exercises/error_handling/errors6.rs +++ b/exercises/error_handling/errors6.rs @@ -20,9 +20,6 @@ enum ParsePosNonzeroError { } impl ParsePosNonzeroError { - fn from_creation(err: CreationError) -> ParsePosNonzeroError { - ParsePosNonzeroError::Creation(err) - } // TODO: add another error conversion function here. } From 60bb7cc3931d21d3986ad52b2b302e632a93831c Mon Sep 17 00:00:00 2001 From: stevenfukase Date: Thu, 14 Apr 2022 17:25:44 +0900 Subject: [PATCH 0481/1293] Fix test (#958) fix(errors1): don't modify tests --- exercises/error_handling/errors1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/error_handling/errors1.rs b/exercises/error_handling/errors1.rs index 5844a497..243622c4 100644 --- a/exercises/error_handling/errors1.rs +++ b/exercises/error_handling/errors1.rs @@ -28,7 +28,7 @@ mod tests { fn generates_nametag_text_for_a_nonempty_name() { assert_eq!( generate_nametag_text("BeyoncΓ©".into()), - Some("Hi! My name is BeyoncΓ©".into()) + Ok("Hi! My name is BeyoncΓ©".into()) ); } From 887b6e183b9657403553188a89aa0afaacf5ab9a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Apr 2022 08:26:06 +0000 Subject: [PATCH 0482/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index a81018cc..5d7f5cdb 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -162,6 +162,7 @@ authors.
Lucas Aries

πŸ–‹
ragreenburg

πŸ–‹ +
stevenfukase

πŸ–‹ From 7dcc1fca29d1796608389c7b98034f27e61c9f6a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Apr 2022 08:26:07 +0000 Subject: [PATCH 0483/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 66a8eabf..4d0e9082 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1128,6 +1128,15 @@ "contributions": [ "content" ] + }, + { + "login": "stevenfukase", + "name": "stevenfukase", + "avatar_url": "https://avatars.githubusercontent.com/u/66785624?v=4", + "profile": "https://github.com/stevenfukase", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 76a36dd38594c63b4bd64e655efeb272ccfaf2a4 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Apr 2022 10:32:43 +0200 Subject: [PATCH 0484/1293] chore: update errors1 comments and hint --- exercises/error_handling/errors1.rs | 8 ++------ info.toml | 6 ++---- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/exercises/error_handling/errors1.rs b/exercises/error_handling/errors1.rs index 243622c4..c417fb26 100644 --- a/exercises/error_handling/errors1.rs +++ b/exercises/error_handling/errors1.rs @@ -1,9 +1,8 @@ // errors1.rs // This function refuses to generate text to be printed on a nametag if // you pass it an empty string. It'd be nicer if it explained what the problem -// was, instead of just sometimes returning `None`. The 2nd test currently -// does not compile or pass, but it illustrates the behavior we would like -// this function to have. +// was, instead of just sometimes returning `None`. Thankfully, Rust has a similar +// construct to `Option` that can be used to express error conditions. Let's use it! // Execute `rustlings hint errors1` for hints! // I AM NOT DONE @@ -21,9 +20,6 @@ pub fn generate_nametag_text(name: String) -> Option { mod tests { use super::*; - // This test passes initially if you comment out the 2nd test. - // You'll need to update what this test expects when you change - // the function under test! #[test] fn generates_nametag_text_for_a_nonempty_name() { assert_eq!( diff --git a/info.toml b/info.toml index 9430a161..56fa7ec5 100644 --- a/info.toml +++ b/info.toml @@ -490,7 +490,7 @@ name = "errors1" path = "exercises/error_handling/errors1.rs" mode = "test" hint = """ -`Err` is one of the variants of `Result`, so what the 2nd test is saying +`Ok` and `Err` are one of the variants of `Result`, so what the tests are saying is that `generate_nametag_text` should return a `Result` instead of an `Option`. @@ -500,9 +500,7 @@ To make this change, you'll need to: - change the body of the function to return `Ok(stuff)` where it currently returns `Some(stuff)` - change the body of the function to return `Err(error message)` where it - currently returns `None` - - change the first test to expect `Ok(stuff)` where it currently expects - `Some(stuff)`.""" + currently returns `None`""" [[exercises]] name = "errors2" From 4bb94e050bb19e421b69467ea49f1e221e966038 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Apr 2022 08:44:38 +0000 Subject: [PATCH 0485/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 5d7f5cdb..1dc56475 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -163,6 +163,7 @@ authors.
Lucas Aries

πŸ–‹
ragreenburg

πŸ–‹
stevenfukase

πŸ–‹ +
J-S-Kim

πŸ–‹ From 03ba8836f2527bc30f4c86f678d91e4d4199a4bf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Apr 2022 08:44:39 +0000 Subject: [PATCH 0486/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4d0e9082..26fd5c99 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1137,6 +1137,15 @@ "contributions": [ "content" ] + }, + { + "login": "J-S-Kim", + "name": "J-S-Kim", + "avatar_url": "https://avatars.githubusercontent.com/u/17569303?v=4", + "profile": "https://github.com/J-S-Kim", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 6c87dc82102ef7cc29ce8cf6370684cfd6668d92 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Apr 2022 11:09:27 +0200 Subject: [PATCH 0487/1293] docs: update changelog for new release --- CHANGELOG.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcc39e42..24da1bc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,46 @@ + +## 4.7.0 (2022-04-14) + + +#### Features + +* Add move_semantics6.rs exercise (#908) ([3f0e1303](https://github.com/rust-lang/rustlings/commit/3f0e1303e0b3bf3fecc0baced3c8b8a37f83c184)) +* **intro:** Add intro section. ([21c9f441](https://github.com/rust-lang/rustlings/commit/21c9f44168394e08338fd470b5f49b1fd235986f)) +* Include exercises folder in the project structure behind a feature, enabling rust-analyzer to work (#917) ([179a75a6](https://github.com/rust-lang/rustlings/commit/179a75a68d03ac9518dec2297fb17f91a4fc506b)) + +#### Bug Fixes + +* Fix a few spelling mistakes ([1c0fe3cb](https://github.com/rust-lang/rustlings/commit/1c0fe3cbcca85f90b3985985b8e265ee872a2ab2)) +* **cli:** + * Move long text strings into constants. ([f78c4802](https://github.com/rust-lang/rustlings/commit/f78c48020830d7900dd8d81f355606581670446d)) + * Replace `filter_map()` with `find_map()` ([9b27e8d](https://github.com/rust-lang/rustlings/commit/9b27e8d993ca20232fe38a412750c3f845a83b65)) +* **clippy1:** + * Set clippy::float_cmp lint to deny (#907) ([71a06044](https://github.com/rust-lang/rustlings/commit/71a06044e6a96ff756dc31d7b0ed665ae4badb57)) + * Updated code to test correctness clippy lint with approx_constant lint rule ([f2650de3](https://github.com/rust-lang/rustlings/commit/f2650de369810867d2763e935ac0963c32ec420e)) +* **errors1:** + * Add a comment to make the purpose more clear (#486) ([cbcde345](https://github.com/rust-lang/rustlings/commit/cbcde345409c3e550112e449242848eaa3391bb6)) + * Don't modify tests (#958) ([60bb7cc](https://github.com/rust-lang/rustlings/commit/60bb7cc3931d21d3986ad52b2b302e632a93831c)) +* **errors6:** Remove existing answer code ([43d0623](https://github.com/rust-lang/rustlings/commit/43d0623086edbc46fe896ba59c7afa22c3da9f7a)) +* **functions5:** Remove wrong new line and small English improvements (#885) ([8ef4869b](https://github.com/rust-lang/rustlings/commit/8ef4869b264094e5a9b50452b4534823a9df19c3)) +* **install:** protect path with whitespaces using quotes and stop at the first error ([d114847f](https://github.com/rust-lang/rustlings/commit/d114847f256c5f571c0b4c87e04b04bce3435509)) +* **intro1:** Add compiler error explanation. ([9b8de655](https://github.com/rust-lang/rustlings/commit/9b8de65525a5576b78cf0c8e4098cdd34296338f)) +* **iterators1:** reorder TODO steps ([0bd7a063](https://github.com/rust-lang/rustlings/commit/0bd7a0631a17a9d69af5746795a30efc9cf64e6e)) +* **move_semantics2:** Add comment ([89650f80](https://github.com/rust-lang/rustlings/commit/89650f808af23a32c9a2c6d46592b77547a6a464)) +* **move_semantics5:** correct typo (#857) ([46c28d5c](https://github.com/rust-lang/rustlings/commit/46c28d5cef3d8446b5a356b19d8dbc725f91a3a0)) +* **quiz1:** update to say quiz covers "If" ([1622e8c1](https://github.com/rust-lang/rustlings/commit/1622e8c198d89739765c915203efff0091bdeb78)) +* **structs3:** + * Add a hint for panic (#608) ([4f7ff5d9](https://github.com/rust-lang/rustlings/commit/4f7ff5d9c7b2d8b045194c1a9469d37e30257c4a)) + * remove redundant 'return' (#852) ([bf33829d](https://github.com/rust-lang/rustlings/commit/bf33829da240375d086f96267fc2e02fa6b07001)) + * Assigned value to `cents_per_gram` in test ([d1ee2da](https://github.com/rust-lang/rustlings/commit/d1ee2daf14f19105e6db3f9c610f44293d688532)) +* **structs3.rs:** assigned value to cents_per_gram in test ([d1ee2daf](https://github.com/rust-lang/rustlings/commit/d1ee2daf14f19105e6db3f9c610f44293d688532)) +* **traits1:** rename test functions to snake case (#854) ([1663a16e](https://github.com/rust-lang/rustlings/commit/1663a16eade6ca646b6ed061735f7982434d530d)) + +#### Documentation improvements + +* Add hints on how to get GCC installed (#741) ([bc56861](https://github.com/rust-lang/rustlings/commit/bc5686174463ad6f4f6b824b0e9b97c3039d4886)) +* Fix some code blocks that were not highlighted ([17f9d74](https://github.com/rust-lang/rustlings/commit/17f9d7429ccd133a72e815fb5618e0ce79560929)) + + ## 4.6.0 (2021-09-25) From 8f33dba9caaf59d19a174d39ec0373241807eb6e Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Apr 2022 11:15:04 +0200 Subject: [PATCH 0488/1293] docs: write documentation for enabling rust-analyzer --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index babc3423..876578ee 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,27 @@ rustlings list After every couple of sections, there will be a quiz that'll test your knowledge on a bunch of sections at once. These quizzes are found in `exercises/quizN.rs`. +## Enabling `rust-analyzer` + +`rust-analyzer` support is provided, but it depends on your editor +whether it's enabled by default. (RLS support is not provided) + +To enable `rust-analyzer`, you'll need to make Cargo build the project +with the `exercises` feature, which will automatically include the `exercises/` +subfolder in the project. The easiest way to do this is to tell your editor to +build the project with all features (the equivalent of `cargo build --all-features`). +For specific editor instructions: + +- **VSCode**: Add a `.vscode/settings.json` file with the following: +```json +{ + "rust-analyzer.cargo.features": ["exercises"] +} +``` +- **IntelliJ-based Editors**: Using the Rust plugin, everything should work + by default. +- _Missing your editor? Feel free to contribute more instructions!_ + ## Continuing On Once you've completed Rustlings, put your new knowledge to good use! Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to. From cf9f382873a8ec167803ff575004048240dc0532 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Apr 2022 11:16:00 +0200 Subject: [PATCH 0489/1293] chore: bump version --- Cargo.lock | 2 +- Cargo.toml | 4 ++-- src/main.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e536d1b7..c3e8290f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -541,7 +541,7 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustlings" -version = "4.6.0" +version = "4.7.0" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index 4761c9a4..a340cd21 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustlings" -version = "4.6.0" -authors = ["anastasie ", "Carol (Nichols || Goulding) "] +version = "4.7.0" +authors = ["mokou ", "Carol (Nichols || Goulding) "] edition = "2021" [dependencies] diff --git a/src/main.rs b/src/main.rs index 453b8c0b..e8591f7d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,7 +24,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "4.6.0"; +const VERSION: &str = "4.7.0"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From 0b7f3fe37a6f202d85607ae30d07736a9202d489 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Apr 2022 11:19:54 +0200 Subject: [PATCH 0490/1293] test: skip mod.rs files when checking for annotations --- tests/integration_tests.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index be9af965..fc46b983 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -125,6 +125,9 @@ fn get_hint_for_single_test() { fn all_exercises_require_confirmation() { for exercise in glob("exercises/**/*.rs").unwrap() { let path = exercise.unwrap(); + if path.file_name().unwrap() == "mod.rs" { + continue + } let source = { let mut file = File::open(&path).unwrap(); let mut s = String::new(); From 92a5d0037f0124eb2cdd8637762ca6aa4494fcbd Mon Sep 17 00:00:00 2001 From: fointard Date: Tue, 19 Apr 2022 17:11:27 +0200 Subject: [PATCH 0491/1293] refactor(arc1): improve readability by using functional style --- exercises/standard_library_types/arc1.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/exercises/standard_library_types/arc1.rs b/exercises/standard_library_types/arc1.rs index d167380c..f60061e7 100644 --- a/exercises/standard_library_types/arc1.rs +++ b/exercises/standard_library_types/arc1.rs @@ -32,12 +32,7 @@ fn main() { for offset in 0..8 { let child_numbers = // TODO joinhandles.push(thread::spawn(move || { - let mut i = offset; - let mut sum = 0; - while i < child_numbers.len() { - sum += child_numbers[i]; - i += 8; - } + let sum: u32 = child_numbers.iter().filter(|n| *n % 8 == offset).sum(); println!("Sum of offset {} is {}", offset, sum); })); } From 452ab26aa735c85756ca0ec91453fe72d487af1b Mon Sep 17 00:00:00 2001 From: fointard Date: Tue, 19 Apr 2022 17:37:00 +0200 Subject: [PATCH 0492/1293] refactor(using_as): improve readability by using sum() instead of fold() --- exercises/conversions/using_as.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/conversions/using_as.rs b/exercises/conversions/using_as.rs index 821309ec..f3f745ff 100644 --- a/exercises/conversions/using_as.rs +++ b/exercises/conversions/using_as.rs @@ -8,7 +8,7 @@ // I AM NOT DONE fn average(values: &[f64]) -> f64 { - let total = values.iter().fold(0.0, |a, b| a + b); + let total = values.iter().sum::(); total / values.len() } From 107f1f97d96cb79513a7ff62d92e52c4296a69e8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 20 Apr 2022 07:14:26 +0000 Subject: [PATCH 0493/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 1dc56475..9b388bb4 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -164,6 +164,7 @@ authors.
ragreenburg

πŸ–‹
stevenfukase

πŸ–‹
J-S-Kim

πŸ–‹ +
Fointard

πŸ–‹ From c9b73e412ed49f05c999a3ecf640209d5700dfac Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 20 Apr 2022 07:14:27 +0000 Subject: [PATCH 0494/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 26fd5c99..d3f0c2ce 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1146,6 +1146,15 @@ "contributions": [ "content" ] + }, + { + "login": "Fointard", + "name": "Fointard", + "avatar_url": "https://avatars.githubusercontent.com/u/9333398?v=4", + "profile": "https://github.com/Fointard", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 268822dbd833435673889f6da04020d20b30acb8 Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 20 Apr 2022 09:20:42 +0200 Subject: [PATCH 0495/1293] chore: bump minimum required rust version in installs --- install.ps1 | 2 +- install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/install.ps1 b/install.ps1 index 32167f06..97980c5b 100644 --- a/install.ps1 +++ b/install.ps1 @@ -53,7 +53,7 @@ function vercomp($v1, $v2) { } $rustVersion = $(rustc --version).Split(" ")[1] -$minRustVersion = "1.39" +$minRustVersion = "1.56" if ((vercomp $rustVersion $minRustVersion) -eq 2) { Write-Host "WARNING: Rust version is too old: $rustVersion - needs at least $minRustVersion" Write-Host "Please update Rust with 'rustup update'" diff --git a/install.sh b/install.sh index 1d9cff27..bf517851 100755 --- a/install.sh +++ b/install.sh @@ -100,7 +100,7 @@ function vercomp() { } RustVersion=$(rustc --version | cut -d " " -f 2) -MinRustVersion=1.39 +MinRustVersion=1.56 vercomp "$RustVersion" $MinRustVersion || ec=$? if [ ${ec:-0} -eq 2 ] then From c811643d1e28dc573c5862ccfd4901d6860f5855 Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 20 Apr 2022 09:35:08 +0200 Subject: [PATCH 0496/1293] chore: bump library versions --- Cargo.lock | 140 +++++--------------------------------------------- Cargo.toml | 14 ++--- src/run.rs | 4 +- src/verify.rs | 8 +-- 4 files changed, 27 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c3e8290f..ce894363 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,17 +52,6 @@ dependencies = [ "predicates-tree", ] -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi 0.3.9", -] - [[package]] name = "autocfg" version = "1.0.1" @@ -87,45 +76,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "clicolors-control" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90082ee5dcdd64dc4e9e0d37fbf3ee325419e39c0092191e0393df65518f741e" -dependencies = [ - "atty", - "lazy_static", - "libc", - "winapi 0.3.9", -] - [[package]] name = "console" -version = "0.7.7" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca57c2c14b8a2bf3105bc9d15574aad80babf6a9c44b1058034cdf8bd169628" -dependencies = [ - "atty", - "clicolors-control", - "encode_unicode", - "lazy_static", - "libc", - "parking_lot", - "regex", - "termios", - "unicode-width", - "winapi 0.3.9", -] - -[[package]] -name = "console" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45" +checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31" dependencies = [ "encode_unicode", - "lazy_static", "libc", + "once_cell", "regex", "terminal_size", "unicode-width", @@ -227,25 +186,15 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "indicatif" -version = "0.10.3" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd1e2ee08e6c255ce890f5a99d17000850e664e7acf119fb03b25b0575bfe" +checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b" dependencies = [ - "console 0.14.1", + "console", "lazy_static", "number_prefix", - "parking_lot", "regex", ] @@ -269,15 +218,6 @@ dependencies = [ "libc", ] -[[package]] -name = "instant" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" -dependencies = [ - "cfg-if 1.0.0", -] - [[package]] name = "iovec" version = "0.1.4" @@ -321,15 +261,6 @@ version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1fa8cddc8fbbee11227ef194b5317ed014b8acbf15139bd716a18ad3fe99ec5" -[[package]] -name = "lock_api" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" -dependencies = [ - "scopeguard", -] - [[package]] name = "log" version = "0.4.14" @@ -434,37 +365,15 @@ dependencies = [ [[package]] name = "number_prefix" -version = "0.2.8" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf9993e59c894e3c08aa1c2712914e9e6bf1fcbfc6bef283e2183df345a4fee" -dependencies = [ - "num-traits", -] +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] -name = "parking_lot" -version = "0.11.1" +name = "once_cell" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall", - "smallvec", - "winapi 0.3.9", -] +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" [[package]] name = "predicates" @@ -545,7 +454,7 @@ version = "4.7.0" dependencies = [ "argh", "assert_cmd", - "console 0.7.7", + "console", "glob", "indicatif", "notify", @@ -570,12 +479,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - [[package]] name = "serde" version = "1.0.129" @@ -613,12 +516,6 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" -[[package]] -name = "smallvec" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" - [[package]] name = "syn" version = "1.0.75" @@ -640,20 +537,11 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "termios" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" -dependencies = [ - "libc", -] - [[package]] name = "toml" -version = "0.4.10" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] diff --git a/Cargo.toml b/Cargo.toml index a340cd21..e8ded146 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,13 +5,13 @@ authors = ["mokou ", "Carol (Nichols || Goulding) Result<(), ()> { // This is strictly for non-test binaries, so output is displayed fn compile_and_run(exercise: &Exercise) -> Result<(), ()> { let progress_bar = ProgressBar::new_spinner(); - progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); + progress_bar.set_message(format!("Compiling {}...", exercise)); progress_bar.enable_steady_tick(100); let compilation_result = exercise.compile(); @@ -37,7 +37,7 @@ fn compile_and_run(exercise: &Exercise) -> Result<(), ()> { } }; - progress_bar.set_message(format!("Running {}...", exercise).as_str()); + progress_bar.set_message(format!("Running {}...", exercise)); let result = compilation.run(); progress_bar.finish_and_clear(); diff --git a/src/verify.rs b/src/verify.rs index fd59fa51..eff57141 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -39,7 +39,7 @@ pub fn test(exercise: &Exercise, verbose: bool) -> Result<(), ()> { // Invoke the rust compiler without running the resulting binary fn compile_only(exercise: &Exercise) -> Result { let progress_bar = ProgressBar::new_spinner(); - progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); + progress_bar.set_message(format!("Compiling {}...", exercise)); progress_bar.enable_steady_tick(100); let _ = compile(exercise, &progress_bar)?; @@ -52,12 +52,12 @@ fn compile_only(exercise: &Exercise) -> Result { // Compile the given Exercise and run the resulting binary in an interactive mode fn compile_and_run_interactively(exercise: &Exercise) -> Result { let progress_bar = ProgressBar::new_spinner(); - progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); + progress_bar.set_message(format!("Compiling {}...", exercise)); progress_bar.enable_steady_tick(100); let compilation = compile(exercise, &progress_bar)?; - progress_bar.set_message(format!("Running {}...", exercise).as_str()); + progress_bar.set_message(format!("Running {}...", exercise)); let result = compilation.run(); progress_bar.finish_and_clear(); @@ -80,7 +80,7 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result { // the output if verbose is set to true fn compile_and_test(exercise: &Exercise, run_mode: RunMode, verbose: bool) -> Result { let progress_bar = ProgressBar::new_spinner(); - progress_bar.set_message(format!("Testing {}...", exercise).as_str()); + progress_bar.set_message(format!("Testing {}...", exercise)); progress_bar.enable_steady_tick(100); let compilation = compile(exercise, &progress_bar)?; From 9ec35d899ce4002b6e1703185dd1f5243d80e30a Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 20 Apr 2022 09:44:37 +0200 Subject: [PATCH 0497/1293] chore: bump version Plus, remove the clog configuration file, since that's not being used anymore. --- .clog.toml | 4 ---- CHANGELOG.md | 21 +++++++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- src/main.rs | 2 +- 5 files changed, 24 insertions(+), 7 deletions(-) delete mode 100644 .clog.toml diff --git a/.clog.toml b/.clog.toml deleted file mode 100644 index 206c3b5a..00000000 --- a/.clog.toml +++ /dev/null @@ -1,4 +0,0 @@ -[clog] - -repository = "https://github.com/rust-lang/rustlings" -changelog = "CHANGELOG.md" \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 24da1bc0..e857e339 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ + +## 4.7.1 (2022-04-20) + +#### Features + +- The amount of dependency crates that need to be compiled went down from ~65 to + ~45 by bumping dependency versions. +- The minimum Rust version in the install scripts has been bumped to 1.56.0 (this isn't in + the release itself, since install scripts don't really get versioned) + +#### Bug Fixes + +- **arc1**: A small part has been rewritten using a more functional code style (#968). +- **using_as**: A small part has been refactored to use `sum` instead of `fold`, resulting + in better readability. + +#### Housekeeping + +- The changelog will now be manually written instead of being automatically generated by the + Git log. + ## 4.7.0 (2022-04-14) diff --git a/Cargo.lock b/Cargo.lock index ce894363..27521e7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -450,7 +450,7 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustlings" -version = "4.7.0" +version = "4.7.1" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index e8ded146..befdd6e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "4.7.0" +version = "4.7.1" authors = ["mokou ", "Carol (Nichols || Goulding) "] edition = "2021" diff --git a/src/main.rs b/src/main.rs index e8591f7d..83b98d96 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,7 +24,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "4.7.0"; +const VERSION: &str = "4.7.1"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From d2179d3e8442ca3ecd24738e2fa41b31023120e5 Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 20 Apr 2022 09:47:43 +0200 Subject: [PATCH 0498/1293] doc: update manual checkout version --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 876578ee..f954618b 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ When you get a permission denied message then you have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 4.6.0) -git clone -b 4.6.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 4.7.1) +git clone -b 4.7.1 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` From 8dc696883ee8f7c0eb6da75cdcc7b58f40872e15 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 21 Apr 2022 09:36:52 +0000 Subject: [PATCH 0499/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 9b388bb4..ad8ce474 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -165,6 +165,7 @@ authors.
stevenfukase

πŸ–‹
J-S-Kim

πŸ–‹
Fointard

πŸ–‹ +
Ryan Lowe

πŸ’» From 283a4691aa7155cb896650abcf962066d12cb0d6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 21 Apr 2022 09:36:53 +0000 Subject: [PATCH 0500/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d3f0c2ce..d995be80 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1155,6 +1155,15 @@ "contributions": [ "content" ] + }, + { + "login": "rytheo", + "name": "Ryan Lowe", + "avatar_url": "https://avatars.githubusercontent.com/u/22184325?v=4", + "profile": "https://github.com/rytheo", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From b821ffdd332b7359317c88cb4e6fa9a6d290640e Mon Sep 17 00:00:00 2001 From: Ron Lusk Date: Fri, 22 Apr 2022 09:04:36 -0400 Subject: [PATCH 0501/1293] docs(move_semantics5): Replace "in vogue" with "in scope" in hint The hint for `move_semantics5` refers to "the range in which each mutable reference is in vogue". Unless this is a deliberate introduction of "vogue" (an admittedly-useful term because "scope" isn't purely lexical, as in many other languages), it may be in error: I have been unable to find the term used with reference to *Rust* references. Thus, I'm suggesting the replacement, in case it's been overlooked. --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 56fa7ec5..54a91bfb 100644 --- a/info.toml +++ b/info.toml @@ -231,7 +231,7 @@ path = "exercises/move_semantics/move_semantics5.rs" mode = "compile" hint = """ Carefully reason about the range in which each mutable reference is in -vogue. Does it help to update the value of referent (x) immediately after +scope. Does it help to update the value of referent (x) immediately after the mutable reference is taken? Read more about 'Mutable References' in the book's section References and Borrowing': https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references. From 701dd9c7008f6607f0fab67dc6b44f1294ae9586 Mon Sep 17 00:00:00 2001 From: cuishuang Date: Sat, 23 Apr 2022 21:01:40 +0800 Subject: [PATCH 0502/1293] fix typo Signed-off-by: cuishuang --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e857e339..1fc12506 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -285,7 +285,7 @@ #### Features * add Option2 exercise (#290) ([86b5c08b](https://github.com/rust-lang/rustlings/commit/86b5c08b9bea1576127a7c5f599f5752072c087d)) -* add excercise for option (#282) ([135e5d47](https://github.com/rust-lang/rustlings/commit/135e5d47a7c395aece6f6022117fb20c82f2d3d4)) +* add exercise for option (#282) ([135e5d47](https://github.com/rust-lang/rustlings/commit/135e5d47a7c395aece6f6022117fb20c82f2d3d4)) * add new exercises for generics (#280) ([76be5e4e](https://github.com/rust-lang/rustlings/commit/76be5e4e991160f5fd9093f03ee2ba260e8f7229)) * **ci:** add buildkite config ([b049fa2c](https://github.com/rust-lang/rustlings/commit/b049fa2c84dba0f0c8906ac44e28fd45fba51a71)) From 7eb66550c99997d65ac68906521193243ddaa50e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 25 Apr 2022 09:36:30 +0000 Subject: [PATCH 0503/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index ad8ce474..30efeeb6 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -166,6 +166,7 @@ authors.
J-S-Kim

πŸ–‹
Fointard

πŸ–‹
Ryan Lowe

πŸ’» +
cui fliter

πŸ–‹ From 190bb27d78f264126ad5dd1e19f191348ac7e370 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 25 Apr 2022 09:36:31 +0000 Subject: [PATCH 0504/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d995be80..b9a7aa4c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1164,6 +1164,15 @@ "contributions": [ "code" ] + }, + { + "login": "cuishuang", + "name": "cui fliter", + "avatar_url": "https://avatars.githubusercontent.com/u/15921519?v=4", + "profile": "http://www.dashen.tech", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 9e98b78260c5fba20484533d5b6f0ddbec2a2dd4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 25 Apr 2022 09:38:18 +0000 Subject: [PATCH 0505/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 30efeeb6..169430fe 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -167,6 +167,7 @@ authors.
Fointard

πŸ–‹
Ryan Lowe

πŸ’»
cui fliter

πŸ–‹ +
Ron Lusk

πŸ–‹ From 7a41bbca67935ae0012d145f90c8519b3394f744 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 25 Apr 2022 09:38:19 +0000 Subject: [PATCH 0506/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b9a7aa4c..94fef728 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1173,6 +1173,15 @@ "contributions": [ "content" ] + }, + { + "login": "luskwater", + "name": "Ron Lusk", + "avatar_url": "https://avatars.githubusercontent.com/u/42529?v=4", + "profile": "https://github.com/luskwater", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 13832d772646b149368e0470ad65ca0fa3722540 Mon Sep 17 00:00:00 2001 From: Bryan Lee Date: Wed, 27 Apr 2022 00:51:25 +0800 Subject: [PATCH 0507/1293] docs: replace git.io link with the original URL --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f954618b..fd2d4e42 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,9 @@ You will need to have Rust installed. You can get it by visiting https://rustup. Just run: ```bash -curl -L https://git.io/install-rustlings | bash +curl -L https://raw.githubusercontent.com/rust-lang/rustlings/master/install.sh | bash # Or if you want it to be installed to a different path: -curl -L https://git.io/install-rustlings | bash -s mypath/ +curl -L https://raw.githubusercontent.com/rust-lang/rustlings/master/install.sh | bash -s mypath/ ``` This will install Rustlings and give you access to the `rustlings` command. Run it to get started! @@ -39,7 +39,7 @@ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser Then, you can run: ```ps1 -Start-BitsTransfer -Source https://git.io/JTL5v -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 +Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 ``` To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. From 659a99032e265a94c0bf9cca12416a404a2cb252 Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 27 Apr 2022 12:21:54 +0200 Subject: [PATCH 0508/1293] chore: change branch name to main for cloning --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fd2d4e42..5febd651 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,9 @@ You will need to have Rust installed. You can get it by visiting https://rustup. Just run: ```bash -curl -L https://raw.githubusercontent.com/rust-lang/rustlings/master/install.sh | bash +curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash # Or if you want it to be installed to a different path: -curl -L https://raw.githubusercontent.com/rust-lang/rustlings/master/install.sh | bash -s mypath/ +curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash -s mypath/ ``` This will install Rustlings and give you access to the `rustlings` command. Run it to get started! From 144e1ef01821e8d3c14a0d06874c6d4fcd597693 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 27 Apr 2022 10:22:19 +0000 Subject: [PATCH 0509/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 169430fe..4ce36b6a 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -169,6 +169,9 @@ authors.
cui fliter

πŸ–‹
Ron Lusk

πŸ–‹ + +
Bryan Lee

πŸ–‹ + From a18f3b8158aaafebcaae2078c968d738ef7389b0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 27 Apr 2022 10:22:20 +0000 Subject: [PATCH 0510/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 94fef728..d90e92c7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1182,6 +1182,15 @@ "contributions": [ "content" ] + }, + { + "login": "liby", + "name": "Bryan Lee", + "avatar_url": "https://avatars.githubusercontent.com/u/38807139?v=4", + "profile": "http://liby.github.io/liby/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 7027320a8f09d5047c7349635eca7c41bcfe2aec Mon Sep 17 00:00:00 2001 From: likzn <1020193211@qq.com> Date: Wed, 4 May 2022 00:46:49 +0800 Subject: [PATCH 0511/1293] fix(install.sh):fix arr out of bounds --- install.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/install.sh b/install.sh index bf517851..7d8ac90c 100755 --- a/install.sh +++ b/install.sh @@ -75,6 +75,21 @@ function vercomp() { then max_len=$len2 fi + + #pad right in short arr + if [[ len1 -gt len2 ]]; + then + for ((i = len2; i < len1; i++)); + do + v2[$i]=0 + done + else + for ((i = len1; i < len2; i++)); + do + v1[$i]=0 + done + fi + for i in `seq 0 $max_len` do # Fill empty fields with zeros in v1 From 769483640c6cb5b00f1be10ec3c7f2d0873a6562 Mon Sep 17 00:00:00 2001 From: Nandaja Varma Date: Mon, 9 May 2022 19:20:04 +0000 Subject: [PATCH 0512/1293] remove deprecated user uploaded extension from .gitpod.yml --- .gitpod.yml | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index 46b1a6a8..73cb802d 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -4,4 +4,4 @@ tasks: vscode: extensions: - - rust-lang.rust@0.7.8:CvNqMTgDdt3UXt+6BCDTVg== + - rust-lang.rust@0.7.8 diff --git a/README.md b/README.md index 5febd651..dd96a59c 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ When you get a permission denied message then you have to exclude the directory [Run on Repl.it](https://repl.it/github/rust-lang/rustlings) -[Open in Gitpod](https://gitpod.io/#https://github.com/rust-lang/rustlings) +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/rust-lang/rustlings) ## Manually From b8ff2993999ef3f7b2243f3ce080b66a9d2b1219 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 10 May 2022 10:45:13 +0000 Subject: [PATCH 0513/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4ce36b6a..cb997bea 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -171,6 +171,7 @@ authors.
Bryan Lee

πŸ–‹ +
Nandaja Varma

πŸ“– From 89efbdf02d5525733493c341aa03bb3b8ecace19 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 10 May 2022 10:45:14 +0000 Subject: [PATCH 0514/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d90e92c7..03c84b70 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1191,6 +1191,15 @@ "contributions": [ "content" ] + }, + { + "login": "nandajavarma", + "name": "Nandaja Varma", + "avatar_url": "https://avatars.githubusercontent.com/u/2624550?v=4", + "profile": "http://nandaja.space", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From 5b940165852772d9a009f2f7db50f0a1bda8fd9d Mon Sep 17 00:00:00 2001 From: pwygab <88221256+merelymyself@users.noreply.github.com> Date: Tue, 17 May 2022 17:24:39 +0800 Subject: [PATCH 0515/1293] check for rustup install --- install.sh | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/install.sh b/install.sh index 7d8ac90c..f3b3f33d 100755 --- a/install.sh +++ b/install.sh @@ -25,12 +25,21 @@ else exit 1 fi +if [ -x "$(command -v rustup)" ] +then + echo "SUCCESS: rustup is installed" +else + echo "ERROR: rustup does not seem to be installed." + echo "Please download rustup using https://rustup.rs!" + exit 1 +fi + if [ -x "$(command -v rustc)" ] then echo "SUCCESS: Rust is installed" else echo "ERROR: Rust does not seem to be installed." - echo "Please download Rust using https://rustup.rs!" + echo "Please download Rust using rustup!" exit 1 fi @@ -39,7 +48,7 @@ then echo "SUCCESS: Cargo is installed" else echo "ERROR: Cargo does not seem to be installed." - echo "Please download Rust and Cargo using https://rustup.rs!" + echo "Please download Rust and Cargo using rustup!" exit 1 fi From c17177bdefb696611fecd6400fa6eed831eb69fc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 17 May 2022 11:21:33 +0000 Subject: [PATCH 0516/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index cb997bea..728481ce 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -172,6 +172,7 @@ authors.
Bryan Lee

πŸ–‹
Nandaja Varma

πŸ“– +
pwygab

πŸ’» From 47afcdcc6b74409102d31390de508e9db4405376 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 17 May 2022 11:21:34 +0000 Subject: [PATCH 0517/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 03c84b70..4d2034e7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1200,6 +1200,15 @@ "contributions": [ "doc" ] + }, + { + "login": "merelymyself", + "name": "pwygab", + "avatar_url": "https://avatars.githubusercontent.com/u/88221256?v=4", + "profile": "https://github.com/merelymyself", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From b0e079e6bf7963aa9acbd94ac0b190cd93b6f301 Mon Sep 17 00:00:00 2001 From: Lucas Grigolon Varela <37870368+lucasgrvarela@users.noreply.github.com> Date: Fri, 20 May 2022 20:26:37 -0300 Subject: [PATCH 0518/1293] Update info.toml --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 54a91bfb..32e0d9ab 100644 --- a/info.toml +++ b/info.toml @@ -21,7 +21,7 @@ name = "variables1" path = "exercises/variables/variables1.rs" mode = "compile" hint = """ -Hint: The declaration on line 12 is missing a keyword that is needed in Rust +Hint: The declaration on line 8 is missing a keyword that is needed in Rust to create a new variable binding.""" [[exercises]] From fedabf5f7f89ba4a99e52fe55c5b85f04245c139 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 21 May 2022 14:30:12 +0000 Subject: [PATCH 0519/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 728481ce..4853c717 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -173,6 +173,7 @@ authors.
Bryan Lee

πŸ–‹
Nandaja Varma

πŸ“–
pwygab

πŸ’» +
Lucas Grigolon Varela

πŸ–‹ From 439a07445e167de4699f56ffe3c2945e8065c770 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 21 May 2022 14:30:14 +0000 Subject: [PATCH 0520/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4d2034e7..295a7d4c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1209,6 +1209,15 @@ "contributions": [ "code" ] + }, + { + "login": "lucasgrvarela", + "name": "Lucas Grigolon Varela", + "avatar_url": "https://avatars.githubusercontent.com/u/37870368?v=4", + "profile": "http://linkedin.com/in/lucasgrvarela", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 0bdb5207b5ea0ae83c2571a1bb16203381936b2e Mon Sep 17 00:00:00 2001 From: Jesse van Papenrecht Date: Sun, 22 May 2022 18:56:26 +0200 Subject: [PATCH 0521/1293] typo fix in hint message if2 --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 32e0d9ab..efe2b9c7 100644 --- a/info.toml +++ b/info.toml @@ -158,7 +158,7 @@ path = "exercises/if/if2.rs" mode = "test" hint = """ For that first compiler error, it's important in Rust that each conditional -block return the same type! To get the tests passing, you will need a couple +block returns the same type! To get the tests passing, you will need a couple conditions checking different input values.""" # TEST 1 From 34a3c440d0efb172594574ca3ac98bafe2233323 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 23 May 2022 13:56:59 +0000 Subject: [PATCH 0522/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4853c717..a4b6bdf2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -174,6 +174,7 @@ authors.
Nandaja Varma

πŸ“–
pwygab

πŸ’»
Lucas Grigolon Varela

πŸ–‹ +
Bufo

πŸ–‹ From ffb6ecaf7eb6f2909d7c03e667cdbd80fe77bd5b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 23 May 2022 13:57:00 +0000 Subject: [PATCH 0523/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 295a7d4c..00566c7e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1218,6 +1218,15 @@ "contributions": [ "content" ] + }, + { + "login": "bufo24", + "name": "Bufo", + "avatar_url": "https://avatars.githubusercontent.com/u/32884105?v=4", + "profile": "https://github.com/bufo24", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 5130a57f8fe6093168759c5328c41a2f839ea7e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jun 2022 21:06:16 +0000 Subject: [PATCH 0524/1293] chore(deps): bump regex from 1.5.4 to 1.5.5 Bumps [regex](https://github.com/rust-lang/regex) from 1.5.4 to 1.5.5. - [Release notes](https://github.com/rust-lang/regex/releases) - [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/regex/compare/1.5.4...1.5.5) --- updated-dependencies: - dependency-name: regex dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 27521e7c..02b78eca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -433,9 +433,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" dependencies = [ "aho-corasick", "memchr", From baca5d62aebdac65c691f28f2f306be83662c863 Mon Sep 17 00:00:00 2001 From: Konstantin Date: Mon, 13 Jun 2022 21:30:25 +0200 Subject: [PATCH 0525/1293] fix: update link to book --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index efe2b9c7..a9608e65 100644 --- a/info.toml +++ b/info.toml @@ -84,7 +84,7 @@ than keyword 'let'. Constants types must also always be annotated. Read more about constants under 'Differences Between Variables and Constants' in the book's section 'Variables and Mutability': -https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#differences-between-variables-and-constants +https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#constants """ # FUNCTIONS From be87cc9fa624233a8bf2f489399f7837e2601bd3 Mon Sep 17 00:00:00 2001 From: Jack Clayton Date: Thu, 16 Jun 2022 11:53:41 +0800 Subject: [PATCH 0526/1293] Add lsp command to fix rust-analyzer --- .gitignore | 1 + Cargo.lock | 19 ++++++++--- Cargo.toml | 3 ++ README.md | 19 +---------- src/main.rs | 31 +++++++++++++++++ src/project.rs | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 141 insertions(+), 22 deletions(-) create mode 100644 src/project.rs diff --git a/.gitignore b/.gitignore index 253f8f33..253d85bd 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ target/ *.pdb exercises/clippy/Cargo.toml exercises/clippy/Cargo.lock +rust-project.json .idea .vscode *.iml diff --git a/Cargo.lock b/Cargo.lock index 02b78eca..6737d29c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -186,6 +186,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "home" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "indicatif" version = "0.16.2" @@ -229,9 +238,9 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.8" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "kernel32-sys" @@ -456,11 +465,13 @@ dependencies = [ "assert_cmd", "console", "glob", + "home", "indicatif", "notify", "predicates", "regex", "serde", + "serde_json", "toml", ] @@ -501,9 +512,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.66" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ "itoa", "ryu", diff --git a/Cargo.toml b/Cargo.toml index befdd6e8..e2a05aae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,9 @@ notify = "4.0" toml = "0.5" regex = "1.5" serde= { version = "1.0", features = ["derive"] } +serde_json = "1.0.81" +home = "0.5.3" +glob = "0.3.0" [[bin]] name = "rustlings" diff --git a/README.md b/README.md index dd96a59c..12a77810 100644 --- a/README.md +++ b/README.md @@ -126,24 +126,7 @@ After every couple of sections, there will be a quiz that'll test your knowledge ## Enabling `rust-analyzer` -`rust-analyzer` support is provided, but it depends on your editor -whether it's enabled by default. (RLS support is not provided) - -To enable `rust-analyzer`, you'll need to make Cargo build the project -with the `exercises` feature, which will automatically include the `exercises/` -subfolder in the project. The easiest way to do this is to tell your editor to -build the project with all features (the equivalent of `cargo build --all-features`). -For specific editor instructions: - -- **VSCode**: Add a `.vscode/settings.json` file with the following: -```json -{ - "rust-analyzer.cargo.features": ["exercises"] -} -``` -- **IntelliJ-based Editors**: Using the Rust plugin, everything should work - by default. -- _Missing your editor? Feel free to contribute more instructions!_ +Run the command `rustlings lsp` which will generate a `rust-project.json` at the root of the project, this allows [rust-analyzer](https://rust-analyzer.github.io/) to parse each exercise. ## Continuing On diff --git a/src/main.rs b/src/main.rs index af3dffbc..24ffbc5d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use crate::exercise::{Exercise, ExerciseList}; +use crate::project::RustAnalyzerProject; use crate::run::run; use crate::verify::verify; use argh::FromArgs; @@ -20,6 +21,7 @@ use std::time::Duration; mod ui; mod exercise; +mod project; mod run; mod verify; @@ -47,6 +49,7 @@ enum Subcommands { Run(RunArgs), Hint(HintArgs), List(ListArgs), + Lsp(LspArgs), } #[derive(FromArgs, PartialEq, Debug)] @@ -77,6 +80,12 @@ struct HintArgs { name: String, } +#[derive(FromArgs, PartialEq, Debug)] +#[argh(subcommand, name = "lsp")] +/// Enable rust-analyzer for exercises +struct LspArgs {} + + #[derive(FromArgs, PartialEq, Debug)] #[argh(subcommand, name = "list")] /// Lists the exercises available in Rustlings @@ -206,6 +215,25 @@ fn main() { verify(&exercises, (0, exercises.len()), verbose).unwrap_or_else(|_| std::process::exit(1)); } + Subcommands::Lsp(_subargs) => { + let mut project = RustAnalyzerProject::new(); + project + .get_sysroot_src() + .expect("Couldn't find toolchain path, do you have `rustc` installed?"); + project + .exercies_to_json() + .expect("Couldn't parse rustlings exercises files"); + + if project.crates.is_empty() { + println!("Failed find any exercises, make sure you're in the `rustlings` folder"); + } else if project.write_to_disk().is_err() { + println!("Failed to write rust-project.json to disk for rust-analyzer"); + } else { + println!("Successfully generated rust-project.json"); + println!("rust-analyzer will now parse exercises, restart your language server or editor") + } + } + Subcommands::Watch(_subargs) => match watch(&exercises, verbose) { Err(e) => { println!("Error: Could not watch your progress. Error message was {:?}.", e); @@ -224,6 +252,7 @@ fn main() { } } + fn spawn_watch_shell(failed_exercise_hint: &Arc>>, should_quit: Arc) { let failed_exercise_hint = Arc::clone(failed_exercise_hint); println!("Welcome to watch mode! You can type 'help' to get an overview of the commands you can use here."); @@ -367,6 +396,8 @@ started, here's a couple of notes about how Rustlings operates: 4. If an exercise doesn't make sense to you, feel free to open an issue on GitHub! (https://github.com/rust-lang/rustlings/issues/new). We look at every issue, and sometimes, other learners do too so you can help each other out! +5. If you want to use `rust-analyzer` with exercises, which provides features like + autocompletion, run the command `rustlings lsp`. Got all that? Great! To get started, run `rustlings watch` in order to get the first exercise. Make sure to have your editor open!"#; diff --git a/src/project.rs b/src/project.rs new file mode 100644 index 00000000..0df00b9a --- /dev/null +++ b/src/project.rs @@ -0,0 +1,90 @@ +use glob::glob; +use serde::{Deserialize, Serialize}; +use std::error::Error; +use std::process::Command; + +/// Contains the structure of resulting rust-project.json file +/// and functions to build the data required to create the file +#[derive(Serialize, Deserialize)] +pub struct RustAnalyzerProject { + sysroot_src: String, + pub crates: Vec, +} + +#[derive(Serialize, Deserialize)] +pub struct Crate { + root_module: String, + edition: String, + deps: Vec, + cfg: Vec, +} + +impl RustAnalyzerProject { + pub fn new() -> RustAnalyzerProject { + RustAnalyzerProject { + sysroot_src: String::new(), + crates: Vec::new(), + } + } + + /// Write rust-project.json to disk + pub fn write_to_disk(&self) -> Result<(), std::io::Error> { + std::fs::write( + "./rust-project.json", + serde_json::to_vec(&self).expect("Failed to serialize to JSON"), + )?; + Ok(()) + } + + /// If path contains .rs extension, add a crate to `rust-project.json` + fn path_to_json(&mut self, path: String) { + if let Some((_, ext)) = path.split_once('.') { + if ext == "rs" { + self.crates.push(Crate { + root_module: path, + edition: "2021".to_string(), + deps: Vec::new(), + // This allows rust_analyzer to work inside #[test] blocks + cfg: vec!["test".to_string()], + }) + } + } + } + + /// Parse the exercises folder for .rs files, any matches will create + /// a new `crate` in rust-project.json which allows rust-analyzer to + /// treat it like a normal binary + pub fn exercies_to_json(&mut self) -> Result<(), Box> { + for e in glob("./exercises/**/*")? { + let path = e?.to_string_lossy().to_string(); + self.path_to_json(path); + } + Ok(()) + } + + /// Use `rustc` to determine the default toolchain + pub fn get_sysroot_src(&mut self) -> Result<(), Box> { + let toolchain = Command::new("rustc") + .arg("--print") + .arg("sysroot") + .output()? + .stdout; + + let toolchain = String::from_utf8_lossy(&toolchain); + let mut whitespace_iter = toolchain.split_whitespace(); + + let toolchain = whitespace_iter.next().unwrap_or(&toolchain); + + println!("Determined toolchain: {}\n", &toolchain); + + self.sysroot_src = (std::path::Path::new(&*toolchain) + .join("lib") + .join("rustlib") + .join("src") + .join("rust") + .join("library") + .to_string_lossy()) + .to_string(); + Ok(()) + } +} From 23403546d28c8ebfbb435856a738425c2a411389 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 11:01:03 +0000 Subject: [PATCH 0527/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index a4b6bdf2..4dd7f7b5 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -175,6 +175,7 @@ authors.
pwygab

πŸ’»
Lucas Grigolon Varela

πŸ–‹
Bufo

πŸ–‹ +
Jack Clayton

πŸ’» From e48f634f347fac37e0bec68d906265f7b6a22b8c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 11:01:04 +0000 Subject: [PATCH 0528/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 00566c7e..a5975dc6 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1227,6 +1227,15 @@ "contributions": [ "content" ] + }, + { + "login": "jackos", + "name": "Jack Clayton", + "avatar_url": "https://avatars.githubusercontent.com/u/77730378?v=4", + "profile": "http://rustnote.com", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From be3944072c3954b9570f17f9424f8d93d487d693 Mon Sep 17 00:00:00 2001 From: 0pling Date: Sun, 26 Jun 2022 10:27:18 +0800 Subject: [PATCH 0529/1293] docs: Add missing exercise to book chapter mapping --- exercises/README.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/exercises/README.md b/exercises/README.md index 73754db5..2ea29909 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -1,24 +1,24 @@ # Exercise to Book Chapter mapping -| Exercise | Book Chapter | -|------------------------|--------------| -| variables | Β§3.1 | -| functions | Β§3.3 | -| if | Β§3.5 | -| move_semantics | Β§4.1 | -| primitive_types | Β§4.3 | -| structs | Β§5.1 | -| enums | Β§6 | -| modules | Β§7 | -| collections | Β§8.1, Β§8.3 | -| strings | Β§8.2 | -| error_handling | Β§9 | -| generics | Β§10 | -| option | Β§10.1 | -| traits | Β§10.2 | -| tests | Β§11.1 | -| standard_library_types | Β§13.2 | -| threads | Β§16.1 | -| macros | Β§19.6 | -| clippy | n/a | -| conversions | n/a | +| Exercise | Book Chapter | +| ---------------------- | ------------------- | +| variables | Β§3.1 | +| functions | Β§3.3 | +| if | Β§3.5 | +| move_semantics | Β§4.1, Β§4.2 | +| primitive_types | Β§3.2, Β§4.3 | +| structs | Β§5.1, Β§5.3 | +| enums | Β§6, Β§18.3 | +| modules | Β§7 | +| collections | Β§8.1, Β§8.3 | +| strings | Β§8.2 | +| error_handling | Β§9 | +| generics | Β§10 | +| option | Β§10.1 | +| traits | Β§10.2 | +| tests | Β§11.1 | +| standard_library_types | Β§13.2, Β§15.1, Β§16.3 | +| threads | Β§16.1 | +| macros | Β§19.6 | +| clippy | n/a | +| conversions | n/a | From 6588d9be22b511c98520de4f4df0c3939aae610e Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 1 Jul 2022 16:48:34 +0200 Subject: [PATCH 0530/1293] chore: bump version --- CHANGELOG.md | 21 +++++++++++++++++++++ Cargo.toml | 2 +- src/main.rs | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fc12506..095877b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ + +## 4.8.0 (2022-07-01) + +#### Features + +- Added a progress indicator for `rustlings watch`. +- The installation script now checks for Rustup being installed. +- Added a `rustlings lsp` command to enable `rust-analyzer`. + +#### Bug Fixes + +- **move_semantics5**: Replaced "in vogue" with "in scope" in hint. +- **if2**: Fixed a typo in the hint. +- **variables1**: Fixed an incorrect line reference in the hint. +- Fixed an out of bounds check in the installation Bash script. + +#### Housekeeping + +- Replaced the git.io URL with the fully qualified URL because of git.io's sunsetting. +- Removed the deprecated Rust GitPod extension. + ## 4.7.1 (2022-04-20) diff --git a/Cargo.toml b/Cargo.toml index e2a05aae..f7a1ffb8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "4.7.1" +version = "4.8.0" authors = ["mokou ", "Carol (Nichols || Goulding) "] edition = "2021" diff --git a/src/main.rs b/src/main.rs index 24ffbc5d..15c3095e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "4.7.1"; +const VERSION: &str = "4.8.0"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From a500ed2c3c6e8f8cd595260b54e18589279c5edb Mon Sep 17 00:00:00 2001 From: KatanaFluorescent <60199077+KatanaFluorescent@users.noreply.github.com> Date: Fri, 1 Jul 2022 16:49:36 +0200 Subject: [PATCH 0531/1293] change edition to 2021 in exercices.rs workaround for this issue https://github.com/rust-lang/rustlings/issues/1022 --- src/exercise.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exercise.rs b/src/exercise.rs index 6e49a9aa..4be3a2cc 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -121,7 +121,7 @@ impl Exercise { r#"[package] name = "{}" version = "0.0.1" -edition = "2018" +edition = "2021" [[bin]] name = "{}" path = "{}.rs""#, From df68d1a86e9967f4d05ff2dcc1e369bffe808e52 Mon Sep 17 00:00:00 2001 From: Drew Morris Date: Sat, 9 Jul 2022 16:50:57 -0600 Subject: [PATCH 0532/1293] chore: Update spacing in Cargo.toml --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index f7a1ffb8..e356a2c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ console = "0.15" notify = "4.0" toml = "0.5" regex = "1.5" -serde= { version = "1.0", features = ["derive"] } +serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.81" home = "0.5.3" glob = "0.3.0" From c38d75481e62403cd5e7e446dd38148d77716e0d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 11 Jul 2022 09:51:30 +0000 Subject: [PATCH 0533/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4dd7f7b5..fb42dcfe 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -176,6 +176,7 @@ authors.
Lucas Grigolon Varela

πŸ–‹
Bufo

πŸ–‹
Jack Clayton

πŸ’» +
Konstantin

πŸ–‹ From c9e0d53ed2a6f8c96e4f41510e486e388971f755 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 11 Jul 2022 09:51:31 +0000 Subject: [PATCH 0534/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a5975dc6..f1c0dc75 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1236,6 +1236,15 @@ "contributions": [ "code" ] + }, + { + "login": "klkl0808", + "name": "Konstantin", + "avatar_url": "https://avatars.githubusercontent.com/u/24694249?v=4", + "profile": "https://github.com/klkl0808", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From f73aec1a631051230761f864bb2108aea3cab70a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 11 Jul 2022 09:53:38 +0000 Subject: [PATCH 0535/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index fb42dcfe..a3262582 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -177,6 +177,7 @@ authors.
Bufo

πŸ–‹
Jack Clayton

πŸ’»
Konstantin

πŸ–‹ +
0pling

πŸ–‹ From 995ba213e279d47db20337a765c0643e2dd68259 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 11 Jul 2022 09:53:39 +0000 Subject: [PATCH 0536/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index f1c0dc75..3f8266d8 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1245,6 +1245,15 @@ "contributions": [ "content" ] + }, + { + "login": "0pling", + "name": "0pling", + "avatar_url": "https://avatars.githubusercontent.com/u/104090344?v=4", + "profile": "https://github.com/0pling", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 8835034bd25f692720d6571eaa34aa9dcf6855a8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 11 Jul 2022 09:58:18 +0000 Subject: [PATCH 0537/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index a3262582..b67432cf 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -179,6 +179,9 @@ authors.
Konstantin

πŸ–‹
0pling

πŸ–‹ + +
KatanaFluorescent

πŸ’» + From 440138af84875696f0b07562c29aba64350df05f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 11 Jul 2022 09:58:19 +0000 Subject: [PATCH 0538/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3f8266d8..5a258348 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1254,6 +1254,15 @@ "contributions": [ "content" ] + }, + { + "login": "KatanaFluorescent", + "name": "KatanaFluorescent", + "avatar_url": "https://avatars.githubusercontent.com/u/60199077?v=4", + "profile": "https://github.com/KatanaFluorescent", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 11618b65c07e2759e85d374e0f04d0a18e07a623 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 11 Jul 2022 09:59:32 +0000 Subject: [PATCH 0539/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index b67432cf..c2fe5d99 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -181,6 +181,7 @@ authors.
KatanaFluorescent

πŸ’» +
Drew Morris

πŸ’» From 1caa388e9287316b6c401ec88ad09cb23c63266e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 11 Jul 2022 09:59:33 +0000 Subject: [PATCH 0540/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5a258348..06debdb4 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1263,6 +1263,15 @@ "contributions": [ "code" ] + }, + { + "login": "Drew-Morris", + "name": "Drew Morris", + "avatar_url": "https://avatars.githubusercontent.com/u/95818166?v=4", + "profile": "https://github.com/Drew-Morris", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From ed0f278a8f116a1f69f20bba15485f019bfe2142 Mon Sep 17 00:00:00 2001 From: mokou Date: Mon, 11 Jul 2022 12:53:49 +0200 Subject: [PATCH 0541/1293] chore: remove mod.rs files and exercises feature --- Cargo.lock | 2 +- Cargo.toml | 5 +---- exercises/advanced_errors/mod.rs | 2 -- exercises/clippy/mod.rs | 2 -- exercises/collections/mod.rs | 4 ---- exercises/conversions/mod.rs | 5 ----- exercises/enums/mod.rs | 3 --- exercises/error_handling/mod.rs | 6 ------ exercises/functions/mod.rs | 5 ----- exercises/generics/mod.rs | 3 --- exercises/if/mod.rs | 2 -- exercises/intro/mod.rs | 2 -- exercises/macros/mod.rs | 4 ---- exercises/mod.rs | 26 ------------------------- exercises/modules/mod.rs | 3 --- exercises/move_semantics/mod.rs | 6 ------ exercises/option/mod.rs | 3 --- exercises/primitive_types/mod.rs | 6 ------ exercises/standard_library_types/mod.rs | 7 ------- exercises/strings/mod.rs | 2 -- exercises/structs/mod.rs | 3 --- exercises/tests/mod.rs | 3 --- exercises/threads/mod.rs | 1 - exercises/traits/mod.rs | 2 -- exercises/variables/mod.rs | 6 ------ src/lib.rs | 3 --- 26 files changed, 2 insertions(+), 114 deletions(-) delete mode 100644 exercises/advanced_errors/mod.rs delete mode 100644 exercises/clippy/mod.rs delete mode 100644 exercises/collections/mod.rs delete mode 100644 exercises/conversions/mod.rs delete mode 100644 exercises/enums/mod.rs delete mode 100644 exercises/error_handling/mod.rs delete mode 100644 exercises/functions/mod.rs delete mode 100644 exercises/generics/mod.rs delete mode 100644 exercises/if/mod.rs delete mode 100644 exercises/intro/mod.rs delete mode 100644 exercises/macros/mod.rs delete mode 100644 exercises/mod.rs delete mode 100644 exercises/modules/mod.rs delete mode 100644 exercises/move_semantics/mod.rs delete mode 100644 exercises/option/mod.rs delete mode 100644 exercises/primitive_types/mod.rs delete mode 100644 exercises/standard_library_types/mod.rs delete mode 100644 exercises/strings/mod.rs delete mode 100644 exercises/structs/mod.rs delete mode 100644 exercises/tests/mod.rs delete mode 100644 exercises/threads/mod.rs delete mode 100644 exercises/traits/mod.rs delete mode 100644 exercises/variables/mod.rs delete mode 100644 src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 6737d29c..df190ad8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -459,7 +459,7 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustlings" -version = "4.7.1" +version = "4.8.0" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index e356a2c2..8a3264d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustlings" version = "4.8.0" -authors = ["mokou ", "Carol (Nichols || Goulding) "] +authors = ["Liv ", "Carol (Nichols || Goulding) "] edition = "2021" [dependencies] @@ -24,6 +24,3 @@ path = "src/main.rs" assert_cmd = "0.11.0" predicates = "1.0.1" glob = "0.3.0" - -[features] -exercises = [] diff --git a/exercises/advanced_errors/mod.rs b/exercises/advanced_errors/mod.rs deleted file mode 100644 index e33fb80d..00000000 --- a/exercises/advanced_errors/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod advanced_errs1; -mod advanced_errs2; diff --git a/exercises/clippy/mod.rs b/exercises/clippy/mod.rs deleted file mode 100644 index 689dc95f..00000000 --- a/exercises/clippy/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod clippy1; -mod clippy2; diff --git a/exercises/collections/mod.rs b/exercises/collections/mod.rs deleted file mode 100644 index f46c1424..00000000 --- a/exercises/collections/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -mod hashmap1; -mod hashmap2; -mod vec1; -mod vec2; diff --git a/exercises/conversions/mod.rs b/exercises/conversions/mod.rs deleted file mode 100644 index 69f66ae4..00000000 --- a/exercises/conversions/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod as_ref_mut; -mod from_into; -mod from_str; -mod try_from_into; -mod using_as; diff --git a/exercises/enums/mod.rs b/exercises/enums/mod.rs deleted file mode 100644 index a23fd6e5..00000000 --- a/exercises/enums/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod enums1; -mod enums2; -mod enums3; diff --git a/exercises/error_handling/mod.rs b/exercises/error_handling/mod.rs deleted file mode 100644 index 539fa23d..00000000 --- a/exercises/error_handling/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -mod errors1; -mod errors2; -mod errors3; -mod errors4; -mod errors5; -mod errors6; diff --git a/exercises/functions/mod.rs b/exercises/functions/mod.rs deleted file mode 100644 index 445b6f58..00000000 --- a/exercises/functions/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod functions1; -mod functions2; -mod functions3; -mod functions4; -mod functions5; diff --git a/exercises/generics/mod.rs b/exercises/generics/mod.rs deleted file mode 100644 index 5b93555c..00000000 --- a/exercises/generics/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod generics1; -mod generics2; -mod generics3; diff --git a/exercises/if/mod.rs b/exercises/if/mod.rs deleted file mode 100644 index c5d02445..00000000 --- a/exercises/if/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod if1; -mod if2; diff --git a/exercises/intro/mod.rs b/exercises/intro/mod.rs deleted file mode 100644 index 445c47ab..00000000 --- a/exercises/intro/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod intro1; -mod intro2; diff --git a/exercises/macros/mod.rs b/exercises/macros/mod.rs deleted file mode 100644 index 9f65acf5..00000000 --- a/exercises/macros/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -mod macros1; -mod macros2; -mod macros3; -mod macros4; diff --git a/exercises/mod.rs b/exercises/mod.rs deleted file mode 100644 index 6a143b56..00000000 --- a/exercises/mod.rs +++ /dev/null @@ -1,26 +0,0 @@ -mod advanced_errors; -mod clippy; -mod collections; -mod conversions; -mod enums; -mod error_handling; -mod functions; -mod generics; -mod r#if; -mod intro; -mod macros; -mod modules; -mod move_semantics; -mod option; -mod primitive_types; -mod quiz1; -mod quiz2; -mod quiz3; -mod quiz4; -mod standard_library_types; -mod strings; -mod structs; -mod tests; -mod threads; -mod traits; -mod variables; diff --git a/exercises/modules/mod.rs b/exercises/modules/mod.rs deleted file mode 100644 index 35f96af5..00000000 --- a/exercises/modules/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod modules1; -mod modules2; -mod modules3; diff --git a/exercises/move_semantics/mod.rs b/exercises/move_semantics/mod.rs deleted file mode 100644 index e8eecf0a..00000000 --- a/exercises/move_semantics/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -mod move_semantics1; -mod move_semantics2; -mod move_semantics3; -mod move_semantics4; -mod move_semantics5; -mod move_semantics6; diff --git a/exercises/option/mod.rs b/exercises/option/mod.rs deleted file mode 100644 index b3cdb13d..00000000 --- a/exercises/option/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod option1; -mod option2; -mod option3; diff --git a/exercises/primitive_types/mod.rs b/exercises/primitive_types/mod.rs deleted file mode 100644 index 23355239..00000000 --- a/exercises/primitive_types/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -mod primitive_types1; -mod primitive_types2; -mod primitive_types3; -mod primitive_types4; -mod primitive_types5; -mod primitive_types6; diff --git a/exercises/standard_library_types/mod.rs b/exercises/standard_library_types/mod.rs deleted file mode 100644 index b03acb92..00000000 --- a/exercises/standard_library_types/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -mod arc1; -mod box1; -mod iterators1; -mod iterators2; -mod iterators3; -mod iterators4; -mod iterators5; diff --git a/exercises/strings/mod.rs b/exercises/strings/mod.rs deleted file mode 100644 index b1b460bc..00000000 --- a/exercises/strings/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod strings1; -mod strings2; diff --git a/exercises/structs/mod.rs b/exercises/structs/mod.rs deleted file mode 100644 index 214fed16..00000000 --- a/exercises/structs/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod structs1; -mod structs2; -mod structs3; diff --git a/exercises/tests/mod.rs b/exercises/tests/mod.rs deleted file mode 100644 index 489541be..00000000 --- a/exercises/tests/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod tests1; -mod tests2; -mod tests3; diff --git a/exercises/threads/mod.rs b/exercises/threads/mod.rs deleted file mode 100644 index 24d54007..00000000 --- a/exercises/threads/mod.rs +++ /dev/null @@ -1 +0,0 @@ -mod threads1; diff --git a/exercises/traits/mod.rs b/exercises/traits/mod.rs deleted file mode 100644 index 6f0a9c3f..00000000 --- a/exercises/traits/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod traits1; -mod traits2; diff --git a/exercises/variables/mod.rs b/exercises/variables/mod.rs deleted file mode 100644 index a25f477e..00000000 --- a/exercises/variables/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -mod variables1; -mod variables2; -mod variables3; -mod variables4; -mod variables5; -mod variables6; diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 82c1e7e4..00000000 --- a/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -#[cfg(feature = "exercises")] -#[path = "../exercises/mod.rs"] -mod exercises; From 0aee54a82b699d1e46d190b21d03101e8522b242 Mon Sep 17 00:00:00 2001 From: mokou Date: Mon, 11 Jul 2022 13:12:47 +0200 Subject: [PATCH 0542/1293] chore: unify hint language use --- info.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/info.toml b/info.toml index a9608e65..232908fc 100644 --- a/info.toml +++ b/info.toml @@ -21,7 +21,7 @@ name = "variables1" path = "exercises/variables/variables1.rs" mode = "compile" hint = """ -Hint: The declaration on line 8 is missing a keyword that is needed in Rust +The declaration on line 8 is missing a keyword that is needed in Rust to create a new variable binding.""" [[exercises]] @@ -360,14 +360,14 @@ name = "enums1" path = "exercises/enums/enums1.rs" mode = "compile" hint = """ -Hint: The declaration of the enumeration type has not been defined yet.""" +The declaration of the enumeration type has not been defined yet.""" [[exercises]] name = "enums2" path = "exercises/enums/enums2.rs" mode = "compile" hint = """ -Hint: you can create enumerations that have different variants with different types +You can create enumerations that have different variants with different types such as no data, anonymous structs, a single string, tuples, ...etc""" [[exercises]] @@ -536,7 +536,7 @@ name = "errors5" path = "exercises/error_handling/errors5.rs" mode = "compile" hint = """ -Hint: There are two different possible `Result` types produced within +There are two different possible `Result` types produced within `main()`, which are propagated using `?` operators. How do we declare a return type from `main()` that allows both? @@ -980,7 +980,7 @@ or an Err with an error if the string is not valid. This is almost like the `from_into` exercise, but returning errors instead of falling back to a default value. -Hint: Look at the test cases to see which error variants to return. +Look at the test cases to see which error variants to return. Another hint: You can use the `map_err` method of `Result` with a function or a closure to wrap the error from `parse::`. @@ -998,7 +998,7 @@ hint = """ Follow the steps provided right before the `TryFrom` implementation. You can also use the example at https://doc.rust-lang.org/std/convert/trait.TryFrom.html -Hint: Is there an implementation of `TryFrom` in the standard library that +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? Another hint: Look at the test cases to see which error variants to return. From 0ded8a90c026bf5c6129d96956183c641ac1ad20 Mon Sep 17 00:00:00 2001 From: mokou Date: Mon, 11 Jul 2022 13:19:19 +0200 Subject: [PATCH 0543/1293] feat(intro1): add more hints --- exercises/intro/intro1.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/exercises/intro/intro1.rs b/exercises/intro/intro1.rs index 1c4582de..5d4becf3 100644 --- a/exercises/intro/intro1.rs +++ b/exercises/intro/intro1.rs @@ -4,6 +4,10 @@ // after you already figured it out. If you got everything working and feel // ready for the next exercise, remove the `I AM NOT DONE` comment below. // Execute the command `rustlings hint intro1` for a hint. +// +// If you're running this using `rustlings watch`: The exercise file will be reloaded +// when you change one of the lines below! Try adding a `println!` line, or try changing +// what it outputs in your terminal. Try removing a semicolon and see what happens! // I AM NOT DONE @@ -20,4 +24,7 @@ fn main() { println!("This exercise compiles successfully. The remaining exercises contain a compiler"); println!("or logic error. The central concept behind Rustlings is to fix these errors and"); println!("solve the exercises. Good luck!"); + println!(); + println!("The source for this exercise is in `exercises/intro/intro1.rs`. Have a look!"); + println!("Going forward, the source of the exercises will always be in the success/failure output."); } From 9ed4b0683edcf73ab0fbdcfe479a82898e6d5e42 Mon Sep 17 00:00:00 2001 From: mokou Date: Mon, 11 Jul 2022 13:20:18 +0200 Subject: [PATCH 0544/1293] fix(intro1): link to exercise file in hint --- info.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 232908fc..f3a52177 100644 --- a/info.toml +++ b/info.toml @@ -5,7 +5,8 @@ name = "intro1" path = "exercises/intro/intro1.rs" mode = "compile" hint = """ -Remove the I AM NOT DONE comment to move on to the next exercise.""" +Remove the I AM NOT DONE comment in the exercises/intro/intro1.rs file +to move on to the next exercise.""" [[exercises]] name = "intro2" From c3c21ad91fd66bcffedb85f542c1c830e1a7cdc0 Mon Sep 17 00:00:00 2001 From: mokou Date: Mon, 11 Jul 2022 13:35:16 +0200 Subject: [PATCH 0545/1293] fix(intro): clarify hint usage --- exercises/intro/intro1.rs | 2 +- exercises/intro/intro2.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/intro/intro1.rs b/exercises/intro/intro1.rs index 5d4becf3..45c5acba 100644 --- a/exercises/intro/intro1.rs +++ b/exercises/intro/intro1.rs @@ -3,7 +3,7 @@ // We sometimes encourage you to keep trying things on a given exercise, even // after you already figured it out. If you got everything working and feel // ready for the next exercise, remove the `I AM NOT DONE` comment below. -// Execute the command `rustlings hint intro1` for a hint. +// Execute `rustlings hint intro1` or use the `hint` watch subcommand for a hint. // // If you're running this using `rustlings watch`: The exercise file will be reloaded // when you change one of the lines below! Try adding a `println!` line, or try changing diff --git a/exercises/intro/intro2.rs b/exercises/intro/intro2.rs index 97a073f0..efc1af20 100644 --- a/exercises/intro/intro2.rs +++ b/exercises/intro/intro2.rs @@ -1,6 +1,6 @@ // intro2.rs // Make the code print a greeting to the world. -// Execute `rustlings hint intro2` for a hint. +// Execute `rustlings hint intro2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE From 81edc4234fbe40eee34f83bbc2995c69f9e1e07c Mon Sep 17 00:00:00 2001 From: mokou Date: Mon, 11 Jul 2022 13:43:41 +0200 Subject: [PATCH 0546/1293] fix(variables): reorder and redo hint texts --- exercises/variables/variables1.rs | 2 +- exercises/variables/variables2.rs | 6 +++--- exercises/variables/variables3.rs | 6 ++---- exercises/variables/variables4.rs | 6 ++++-- exercises/variables/variables5.rs | 2 +- exercises/variables/variables6.rs | 2 +- info.toml | 16 ++++++++-------- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/exercises/variables/variables1.rs b/exercises/variables/variables1.rs index d1af8311..f4d182ac 100644 --- a/exercises/variables/variables1.rs +++ b/exercises/variables/variables1.rs @@ -1,6 +1,6 @@ // variables1.rs // Make me compile! -// Execute the command `rustlings hint variables1` if you want a hint :) +// Execute `rustlings hint variables1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/variables/variables2.rs b/exercises/variables/variables2.rs index 7774a8fb..641aeb8e 100644 --- a/exercises/variables/variables2.rs +++ b/exercises/variables/variables2.rs @@ -1,13 +1,13 @@ // variables2.rs -// Make me compile! Execute the command `rustlings hint variables2` if you want a hint :) +// Execute `rustlings hint variables2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE fn main() { let x; if x == 10 { - println!("Ten!"); + println!("x is ten!"); } else { - println!("Not ten!"); + println!("x is not ten!"); } } diff --git a/exercises/variables/variables3.rs b/exercises/variables/variables3.rs index 30ec48ff..819b1bc7 100644 --- a/exercises/variables/variables3.rs +++ b/exercises/variables/variables3.rs @@ -1,11 +1,9 @@ // variables3.rs -// Make me compile! Execute the command `rustlings hint variables3` if you want a hint :) +// Execute `rustlings hint variables3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE fn main() { - let x = 3; - println!("Number {}", x); - x = 5; // don't change this line + let x: i32; println!("Number {}", x); } diff --git a/exercises/variables/variables4.rs b/exercises/variables/variables4.rs index 77f1e9ab..54491b0a 100644 --- a/exercises/variables/variables4.rs +++ b/exercises/variables/variables4.rs @@ -1,9 +1,11 @@ // variables4.rs -// Make me compile! Execute the command `rustlings hint variables4` if you want a hint :) +// Execute `rustlings hint variables4` or use the `hint` watch subcommand for a hint. // I AM NOT DONE fn main() { - let x: i32; + let x = 3; + println!("Number {}", x); + x = 5; // don't change this line println!("Number {}", x); } diff --git a/exercises/variables/variables5.rs b/exercises/variables/variables5.rs index 175eebb3..7042d6fa 100644 --- a/exercises/variables/variables5.rs +++ b/exercises/variables/variables5.rs @@ -1,5 +1,5 @@ // variables5.rs -// Make me compile! Execute the command `rustlings hint variables5` if you want a hint :) +// Execute `rustlings hint variables5` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/variables/variables6.rs b/exercises/variables/variables6.rs index 98666914..a8520122 100644 --- a/exercises/variables/variables6.rs +++ b/exercises/variables/variables6.rs @@ -1,5 +1,5 @@ // variables6.rs -// Make me compile! Execute the command `rustlings hint variables6` if you want a hint :) +// Execute `rustlings hint variables6` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/info.toml b/info.toml index f3a52177..c5f22f92 100644 --- a/info.toml +++ b/info.toml @@ -43,20 +43,20 @@ name = "variables3" path = "exercises/variables/variables3.rs" mode = "compile" hint = """ -In Rust, variable bindings are immutable by default. But here we're trying -to reassign a different value to x! There's a keyword we can use to make -a variable binding mutable instead.""" +Oops! In this exercise, we have a variable binding that we've created on +line 7, and we're trying to use it on line 8, but we haven't given it a +value. We can't print out something that isn't there; try giving x a value! +This is an error that can cause bugs that's very easy to make in any +programming language -- thankfully the Rust compiler has caught this for us!""" [[exercises]] name = "variables4" path = "exercises/variables/variables4.rs" mode = "compile" hint = """ -Oops! In this exercise, we have a variable binding that we've created on -line 7, and we're trying to use it on line 8, but we haven't given it a -value. We can't print out something that isn't there; try giving x a value! -This is an error that can cause bugs that's very easy to make in any -programming language -- thankfully the Rust compiler has caught this for us!""" +In Rust, variable bindings are immutable by default. But here we're trying +to reassign a different value to x! There's a keyword we can use to make +a variable binding mutable instead.""" [[exercises]] name = "variables5" From 60410cfd2ea4f819f633e3c69efe916d3f825536 Mon Sep 17 00:00:00 2001 From: gavin Date: Sun, 20 Feb 2022 10:53:51 +0530 Subject: [PATCH 0547/1293] fix(variables5): Add nudge for shadowing variable --- exercises/variables/variables5.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/variables/variables5.rs b/exercises/variables/variables5.rs index 7042d6fa..0e670d2a 100644 --- a/exercises/variables/variables5.rs +++ b/exercises/variables/variables5.rs @@ -6,6 +6,6 @@ fn main() { let number = "T-H-R-E-E"; // don't change this line println!("Spell a Number : {}", number); - number = 3; + number = 3; // don't rename this variable println!("Number plus two is : {}", number + 2); } From 9688609d0892757b2f0ce769367e7c5821e3f94c Mon Sep 17 00:00:00 2001 From: Cooper Gillan Date: Fri, 25 Feb 2022 02:33:45 +0000 Subject: [PATCH 0548/1293] chore: Update variables6.rs hint book link, wording While the included link for variables6 does navigate to the correct page, the header in the link itself does not actually exist so it only loads the top of the page. There is, however, some text about the difference between variables and constants in the "Constants" section, so reword the hint some and update the link. --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index c5f22f92..042172de 100644 --- a/info.toml +++ b/info.toml @@ -84,7 +84,7 @@ Constants are always immutable and they are declared with keyword 'const' rather than keyword 'let'. Constants types must also always be annotated. -Read more about constants under 'Differences Between Variables and Constants' in the book's section 'Variables and Mutability': +Read more about constants and the differences between variables and constants under 'Constants' in the book's section 'Variables and Mutability': https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#constants """ From b3ec8fe0223eda6ce31e72d464b6a56d71b2204f Mon Sep 17 00:00:00 2001 From: Cooper Gillan Date: Fri, 25 Feb 2022 02:35:43 +0000 Subject: [PATCH 0549/1293] chore: Tweak punctuation in variables6.rs hint While the meaning is still obvious as is, it makes a little more sense to use a colon here =) --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 042172de..d7906431 100644 --- a/info.toml +++ b/info.toml @@ -79,7 +79,7 @@ path = "exercises/variables/variables6.rs" mode = "compile" hint = """ We know about variables and mutability, but there is another important type of -variable available; constants. +variable available: constants. Constants are always immutable and they are declared with keyword 'const' rather than keyword 'let'. Constants types must also always be annotated. From 093a525450bd1d0092d91bb90969bffab2df55a9 Mon Sep 17 00:00:00 2001 From: mokou Date: Mon, 11 Jul 2022 14:00:12 +0200 Subject: [PATCH 0550/1293] fix(functions): clarify README wording --- exercises/functions/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/functions/README.md b/exercises/functions/README.md index 66547bd4..6662d0da 100644 --- a/exercises/functions/README.md +++ b/exercises/functions/README.md @@ -1,6 +1,7 @@ # Functions -Here, you'll learn how to write functions and how Rust's compiler can trace things way back. +Here, you'll learn how to write functions and how the Rust compiler can help you debug errors even +in more complex code. ## Further information From 742fb08e010725868ebdce41038461088d95a3d9 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 12 Jul 2022 11:08:29 +0200 Subject: [PATCH 0551/1293] feat(functions): more small fixes --- exercises/functions/functions1.rs | 2 +- exercises/functions/functions2.rs | 2 +- exercises/functions/functions3.rs | 2 +- exercises/functions/functions4.rs | 5 ++++- exercises/functions/functions5.rs | 4 ++-- info.toml | 9 +++++++-- 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/exercises/functions/functions1.rs b/exercises/functions/functions1.rs index 31125278..03d8af70 100644 --- a/exercises/functions/functions1.rs +++ b/exercises/functions/functions1.rs @@ -1,5 +1,5 @@ // functions1.rs -// Make me compile! Execute `rustlings hint functions1` for hints :) +// Execute `rustlings hint functions1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/functions/functions2.rs b/exercises/functions/functions2.rs index 5721a172..7d40a578 100644 --- a/exercises/functions/functions2.rs +++ b/exercises/functions/functions2.rs @@ -1,5 +1,5 @@ // functions2.rs -// Make me compile! Execute `rustlings hint functions2` for hints :) +// Execute `rustlings hint functions2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/functions/functions3.rs b/exercises/functions/functions3.rs index ed5f839f..3b9e585b 100644 --- a/exercises/functions/functions3.rs +++ b/exercises/functions/functions3.rs @@ -1,5 +1,5 @@ // functions3.rs -// Make me compile! Execute `rustlings hint functions3` for hints :) +// Execute `rustlings hint functions3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/functions/functions4.rs b/exercises/functions/functions4.rs index 58637e4c..65d5be4f 100644 --- a/exercises/functions/functions4.rs +++ b/exercises/functions/functions4.rs @@ -1,8 +1,11 @@ // functions4.rs -// Make me compile! Execute `rustlings hint functions4` for hints :) +// Execute `rustlings hint functions4` or use the `hint` watch subcommand for a hint. // This store is having a sale where if the price is an even number, you get // 10 Rustbucks off, but if it's an odd number, it's 3 Rustbucks off. +// (Don't worry about the function bodies themselves, we're only interested +// in the signatures for now. If anything, this is a good way to peek ahead +// to future exercises!) // I AM NOT DONE diff --git a/exercises/functions/functions5.rs b/exercises/functions/functions5.rs index d22aa6c8..5d762961 100644 --- a/exercises/functions/functions5.rs +++ b/exercises/functions/functions5.rs @@ -1,11 +1,11 @@ // functions5.rs -// Make me compile! Execute `rustlings hint functions5` for hints :) +// Execute `rustlings hint functions5` or use the `hint` watch subcommand for a hint. // I AM NOT DONE fn main() { let answer = square(3); - println!("The answer is {}", answer); + println!("The square of 3 is {}", answer); } fn square(num: i32) -> i32 { diff --git a/info.toml b/info.toml index d7906431..84df9111 100644 --- a/info.toml +++ b/info.toml @@ -114,7 +114,9 @@ path = "exercises/functions/functions3.rs" mode = "compile" hint = """ This time, the function *declaration* is okay, but there's something wrong -with the place where we're calling the function.""" +with the place where we're calling the function. +As a reminder, you can freely play around with different solutions in Rustlings! +Watch mode will only jump to the next exercise if you remove the I AM NOT DONE comment.""" [[exercises]] name = "functions4" @@ -123,7 +125,10 @@ mode = "compile" hint = """ The error message points to line 14 and says it expects a type after the `->`. This is where the function's return type should be-- take a look at -the `is_even` function for an example!""" +the `is_even` function for an example! + +Also: Did you figure out that, technically, u32 would be the more fitting type +for the prices here, since they can't be negative? If so, kudos!""" [[exercises]] name = "functions5" From 4868d18ea315f15ad007086f218c8a1ee68a8eb4 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 12 Jul 2022 11:10:08 +0200 Subject: [PATCH 0552/1293] feat(if): replace hints --- exercises/if/README.md | 2 +- exercises/if/if1.rs | 2 +- exercises/if/if2.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/if/README.md b/exercises/if/README.md index 528d9886..b52c3922 100644 --- a/exercises/if/README.md +++ b/exercises/if/README.md @@ -1,6 +1,6 @@ # If -`if`, the most basic type of control flow, is what you'll learn here. +`if`, the most basic (but still surprisingly versatile!) type of control flow, is what you'll learn here. ## Further information diff --git a/exercises/if/if1.rs b/exercises/if/if1.rs index 90867545..587e03f8 100644 --- a/exercises/if/if1.rs +++ b/exercises/if/if1.rs @@ -1,4 +1,5 @@ // if1.rs +// Execute `rustlings hint if1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE @@ -7,7 +8,6 @@ pub fn bigger(a: i32, b: i32) -> i32 { // Do not use: // - another function call // - additional variables - // Execute `rustlings hint if1` for hints } // Don't mind this for now :) diff --git a/exercises/if/if2.rs b/exercises/if/if2.rs index 80effbdf..6fed6f81 100644 --- a/exercises/if/if2.rs +++ b/exercises/if/if2.rs @@ -2,7 +2,7 @@ // Step 1: Make me compile! // Step 2: Get the bar_for_fuzz and default_to_baz tests passing! -// Execute the command `rustlings hint if2` if you want a hint :) +// Execute `rustlings hint if2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE From 5812f1f27b0e3c2eed6e4606635bb810d0a5727e Mon Sep 17 00:00:00 2001 From: Adam Sherwood Date: Sun, 20 Feb 2022 16:15:56 +0100 Subject: [PATCH 0553/1293] fix(if2): Rename if2 exercise function to foo_if_fizz. The reasoning here is pretty straightforward: you don't say "Hungry, if eat." That doesn't make sense. We want to get "foo" back if given "fizz", so it seems this makes far more sense as "Eat, if hungry," or in this case, return `foo_if_fizz` is given. --- exercises/if/if2.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exercises/if/if2.rs b/exercises/if/if2.rs index 6fed6f81..effddbb6 100644 --- a/exercises/if/if2.rs +++ b/exercises/if/if2.rs @@ -6,7 +6,7 @@ // I AM NOT DONE -pub fn fizz_if_foo(fizzish: &str) -> &str { +pub fn foo_if_fizz(fizzish: &str) -> &str { if fizzish == "fizz" { "foo" } else { @@ -21,16 +21,16 @@ mod tests { #[test] fn foo_for_fizz() { - assert_eq!(fizz_if_foo("fizz"), "foo") + assert_eq!(foo_if_fizz("fizz"), "foo") } #[test] fn bar_for_fuzz() { - assert_eq!(fizz_if_foo("fuzz"), "bar") + assert_eq!(foo_if_fizz("fuzz"), "bar") } #[test] fn default_to_baz() { - assert_eq!(fizz_if_foo("literally anything"), "baz") + assert_eq!(foo_if_fizz("literally anything"), "baz") } } From 6020ec1fe21aa1763821940dcc7029b99fb9d00a Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 12 Jul 2022 14:53:56 +0200 Subject: [PATCH 0554/1293] feat: reorder vec and primtypes before moving --- info.toml | 177 +++++++++++++++++++++++++++--------------------------- 1 file changed, 90 insertions(+), 87 deletions(-) diff --git a/info.toml b/info.toml index 84df9111..717ea95e 100644 --- a/info.toml +++ b/info.toml @@ -175,6 +175,96 @@ path = "exercises/quiz1.rs" mode = "test" hint = "No hints this time ;)" +# PRIMITIVE TYPES + +[[exercises]] +name = "primitive_types1" +path = "exercises/primitive_types/primitive_types1.rs" +mode = "compile" +hint = "No hints this time ;)" + +[[exercises]] +name = "primitive_types2" +path = "exercises/primitive_types/primitive_types2.rs" +mode = "compile" +hint = "No hints this time ;)" + +[[exercises]] +name = "primitive_types3" +path = "exercises/primitive_types/primitive_types3.rs" +mode = "compile" +hint = """ +There's a shorthand to initialize Arrays with a certain size that does not +require you to type in 100 items (but you certainly can if you want!). +For example, you can do: +let array = ["Are we there yet?"; 10]; + +Bonus: what are some other things you could have that would return true +for `a.len() >= 100`?""" + +[[exercises]] +name = "primitive_types4" +path = "exercises/primitive_types/primitive_types4.rs" +mode = "test" +hint = """ +Take a look at the Understanding Ownership -> Slices -> Other Slices section of the book: +https://doc.rust-lang.org/book/ch04-03-slices.html +and use the starting and ending indices of the items in the Array +that you want to end up in the slice. + +If you're curious why the first argument of `assert_eq!` does not +have an ampersand for a reference since the second argument is a +reference, take a look at the coercion chapter of the nomicon: +https://doc.rust-lang.org/nomicon/coercions.html""" + +[[exercises]] +name = "primitive_types5" +path = "exercises/primitive_types/primitive_types5.rs" +mode = "compile" +hint = """ +Take a look at the Data Types -> The Tuple Type section of the book: +https://doc.rust-lang.org/book/ch03-02-data-types.html#the-tuple-type +Particularly the part about destructuring (second to last example in the section). +You'll need to make a pattern to bind `name` and `age` to the appropriate parts +of the tuple. You can do it!!""" + +[[exercises]] +name = "primitive_types6" +path = "exercises/primitive_types/primitive_types6.rs" +mode = "test" +hint = """ +While you could use a destructuring `let` for the tuple here, try +indexing into it instead, as explained in the last example of the +Data Types -> The Tuple Type section of the book: +https://doc.rust-lang.org/book/ch03-02-data-types.html#the-tuple-type +Now you have another tool in your toolbox!""" + +# VECS + +[[exercises]] +name = "vec1" +path = "exercises/collections/vec1.rs" +mode = "test" +hint = """ +In Rust, there are two ways to define a Vector. +1. One way is to use the `Vec::new()` function to create a new vector + and fill it with the `push()` method. +2. The second way, which is simpler is to use the `vec![]` macro and + define your elements inside the square brackets. +Check this chapter: https://doc.rust-lang.org/stable/book/ch08-01-vectors.html +of the Rust book to learn more. +""" + +[[exercises]] +name = "vec2" +path = "exercises/collections/vec2.rs" +mode = "test" +hint = """ +Hint 1: `i` is each element from the Vec as they are being iterated. + Can you try multiplying this? +Hint 2: Check the suggestion from the compiler error ;) +""" + # MOVE SEMANTICS [[exercises]] @@ -258,69 +348,6 @@ Can you figure out how? Another hint: it has to do with the `&` character.""" -# PRIMITIVE TYPES - -[[exercises]] -name = "primitive_types1" -path = "exercises/primitive_types/primitive_types1.rs" -mode = "compile" -hint = "No hints this time ;)" - -[[exercises]] -name = "primitive_types2" -path = "exercises/primitive_types/primitive_types2.rs" -mode = "compile" -hint = "No hints this time ;)" - -[[exercises]] -name = "primitive_types3" -path = "exercises/primitive_types/primitive_types3.rs" -mode = "compile" -hint = """ -There's a shorthand to initialize Arrays with a certain size that does not -require you to type in 100 items (but you certainly can if you want!). -For example, you can do: -let array = ["Are we there yet?"; 10]; - -Bonus: what are some other things you could have that would return true -for `a.len() >= 100`?""" - -[[exercises]] -name = "primitive_types4" -path = "exercises/primitive_types/primitive_types4.rs" -mode = "test" -hint = """ -Take a look at the Understanding Ownership -> Slices -> Other Slices section of the book: -https://doc.rust-lang.org/book/ch04-03-slices.html -and use the starting and ending indices of the items in the Array -that you want to end up in the slice. - -If you're curious why the first argument of `assert_eq!` does not -have an ampersand for a reference since the second argument is a -reference, take a look at the Deref coercions section of the book: -https://doc.rust-lang.org/book/ch15-02-deref.html""" - -[[exercises]] -name = "primitive_types5" -path = "exercises/primitive_types/primitive_types5.rs" -mode = "compile" -hint = """ -Take a look at the Data Types -> The Tuple Type section of the book: -https://doc.rust-lang.org/book/ch03-02-data-types.html#the-tuple-type -Particularly the part about destructuring (second to last example in the section). -You'll need to make a pattern to bind `name` and `age` to the appropriate parts -of the tuple. You can do it!!""" - -[[exercises]] -name = "primitive_types6" -path = "exercises/primitive_types/primitive_types6.rs" -mode = "test" -hint = """ -While you could use a destructuring `let` for the tuple here, try -indexing into it instead, as explained in the last example of the -Data Types -> The Tuple Type section of the book: -https://doc.rust-lang.org/book/ch03-02-data-types.html#the-tuple-type -Now you have another tool in your toolbox!""" # STRUCTS @@ -414,30 +441,6 @@ operator to bring these two in using only one line.""" # COLLECTIONS -[[exercises]] -name = "vec1" -path = "exercises/collections/vec1.rs" -mode = "test" -hint = """ -In Rust, there are two ways to define a Vector. -1. One way is to use the `Vec::new()` function to create a new vector - and fill it with the `push()` method. -2. The second way, which is simpler is to use the `vec![]` macro and - define your elements inside the square brackets. -Check this chapter: https://doc.rust-lang.org/stable/book/ch08-01-vectors.html -of the Rust book to learn more. -""" - -[[exercises]] -name = "vec2" -path = "exercises/collections/vec2.rs" -mode = "test" -hint = """ -Hint 1: `i` is each element from the Vec as they are being iterated. - Can you try multiplying this? -Hint 2: Check the suggestion from the compiler error ;) -""" - [[exercises]] name = "hashmap1" path = "exercises/collections/hashmap1.rs" From 7af12ba9aa45b57730b92cc00c3ddaa1527eb31f Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 12 Jul 2022 14:54:12 +0200 Subject: [PATCH 0555/1293] feat(primitive_types): fixups --- exercises/primitive_types/primitive_types1.rs | 1 + exercises/primitive_types/primitive_types2.rs | 2 ++ exercises/primitive_types/primitive_types3.rs | 2 +- exercises/primitive_types/primitive_types4.rs | 2 +- exercises/primitive_types/primitive_types5.rs | 2 +- 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/exercises/primitive_types/primitive_types1.rs b/exercises/primitive_types/primitive_types1.rs index 09121392..de0d08a6 100644 --- a/exercises/primitive_types/primitive_types1.rs +++ b/exercises/primitive_types/primitive_types1.rs @@ -4,6 +4,7 @@ // I AM NOT DONE +#[test] fn main() { // Booleans (`bool`) diff --git a/exercises/primitive_types/primitive_types2.rs b/exercises/primitive_types/primitive_types2.rs index 6576a4d5..8730baab 100644 --- a/exercises/primitive_types/primitive_types2.rs +++ b/exercises/primitive_types/primitive_types2.rs @@ -7,6 +7,8 @@ fn main() { // Characters (`char`) + // Note the _single_ quotes, these are different from the double quotes + // you've been seeing around. let my_first_initial = 'C'; if my_first_initial.is_alphabetic() { println!("Alphabetical!"); diff --git a/exercises/primitive_types/primitive_types3.rs b/exercises/primitive_types/primitive_types3.rs index aaa518be..fa7d019a 100644 --- a/exercises/primitive_types/primitive_types3.rs +++ b/exercises/primitive_types/primitive_types3.rs @@ -1,6 +1,6 @@ // primitive_types3.rs // Create an array with at least 100 elements in it where the ??? is. -// Execute `rustlings hint primitive_types3` for hints! +// Execute `rustlings hint primitive_types3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/primitive_types/primitive_types4.rs b/exercises/primitive_types/primitive_types4.rs index 10b553e9..71fa243c 100644 --- a/exercises/primitive_types/primitive_types4.rs +++ b/exercises/primitive_types/primitive_types4.rs @@ -1,6 +1,6 @@ // primitive_types4.rs // Get a slice out of Array a where the ??? is so that the test passes. -// Execute `rustlings hint primitive_types4` for hints!! +// Execute `rustlings hint primitive_types4` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/primitive_types/primitive_types5.rs b/exercises/primitive_types/primitive_types5.rs index 680d8d23..4fd9141f 100644 --- a/exercises/primitive_types/primitive_types5.rs +++ b/exercises/primitive_types/primitive_types5.rs @@ -1,6 +1,6 @@ // primitive_types5.rs // Destructure the `cat` tuple so that the println will work. -// Execute `rustlings hint primitive_types5` for hints! +// Execute `rustlings hint primitive_types5` or use the `hint` watch subcommand for a hint. // I AM NOT DONE From 8e1f617d3402cb05b05c6737f60fbbfe74da4d78 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 12 Jul 2022 15:05:47 +0200 Subject: [PATCH 0556/1293] feat(vec): update vec exercises --- exercises/collections/vec1.rs | 2 +- exercises/collections/vec2.rs | 20 ++++++++++++++++++-- info.toml | 12 +++++++++--- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/exercises/collections/vec1.rs b/exercises/collections/vec1.rs index b144fb94..c26f5691 100644 --- a/exercises/collections/vec1.rs +++ b/exercises/collections/vec1.rs @@ -2,7 +2,7 @@ // Your task is to create a `Vec` which holds the exact same elements // as in the array `a`. // Make me compile and pass the test! -// Execute the command `rustlings hint vec1` if you need hints. +// Execute `rustlings hint vec1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/collections/vec2.rs b/exercises/collections/vec2.rs index 6595e401..db37d1d6 100644 --- a/exercises/collections/vec2.rs +++ b/exercises/collections/vec2.rs @@ -4,8 +4,7 @@ // // Make me pass the test! // -// Execute the command `rustlings hint vec2` if you need -// hints. +// Execute `rustlings hint vec2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE @@ -13,12 +12,21 @@ fn vec_loop(mut v: Vec) -> Vec { for i in v.iter_mut() { // TODO: Fill this up so that each element in the Vec `v` is // multiplied by 2. + ??? } // At this point, `v` should be equal to [4, 8, 12, 16, 20]. v } +fn vec_map(v: &Vec) -> Vec { + v.iter().map(|num| { + // TODO: Do the same thing as above - but instead of mutating the + // Vec, you can just return the new number! + ??? + }).collect() +} + #[cfg(test)] mod tests { use super::*; @@ -30,4 +38,12 @@ mod tests { assert_eq!(ans, v.iter().map(|x| x * 2).collect::>()); } + + #[test] + fn test_vec_map() { + let v: Vec = (1..).filter(|x| x % 2 == 0).take(5).collect(); + let ans = vec_map(&v); + + assert_eq!(ans, v.iter().map(|x| x * 2).collect::>()); + } } diff --git a/info.toml b/info.toml index 717ea95e..af4861c2 100644 --- a/info.toml +++ b/info.toml @@ -260,9 +260,15 @@ name = "vec2" path = "exercises/collections/vec2.rs" mode = "test" hint = """ -Hint 1: `i` is each element from the Vec as they are being iterated. - Can you try multiplying this? -Hint 2: Check the suggestion from the compiler error ;) +Hint 1: `i` is each element from the Vec as they are being iterated. Can you try +multiplying this? + +Hint 2: For the first function, there's a way to directly access the numbers stored +in the Vec, using the * dereference operator. You can both access and write to the +number that way. + +After you've completed both functions, decide for yourself which approach you like +better. What do you think is the more commonly used pattern under Rust developers? """ # MOVE SEMANTICS From 2f7fd513041c7c6275552650881a79b9120aaacf Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 12 Jul 2022 15:16:25 +0200 Subject: [PATCH 0557/1293] feat: move vec exercises into their own folder --- exercises/collections/README.md | 24 +++++-------------- exercises/vecs/README.md | 15 ++++++++++++ .../{collections/vec1.rs => vecs/vecs1.rs} | 4 ++-- .../{collections/vec2.rs => vecs/vecs2.rs} | 4 ++-- info.toml | 8 +++---- 5 files changed, 29 insertions(+), 26 deletions(-) create mode 100644 exercises/vecs/README.md rename exercises/{collections/vec1.rs => vecs/vecs1.rs} (84%) rename exercises/{collections/vec2.rs => vecs/vecs2.rs} (92%) diff --git a/exercises/collections/README.md b/exercises/collections/README.md index b6d62acb..30471cf9 100644 --- a/exercises/collections/README.md +++ b/exercises/collections/README.md @@ -1,23 +1,11 @@ -# Collections +# Hashmaps +A *hash map* allows you to associate a value with a particular key. +You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map), +[*dictionary* in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) or an *associative array* in other languages. -Rust’s standard library includes a number of very useful data -structures called collections. Most other data types represent one -specific value, but collections can contain multiple values. Unlike -the built-in array and tuple types, the data these collections point -to is stored on the heap, which means the amount of data does not need -to be known at compile time and can grow or shrink as the program -runs. - -This exercise will get you familiar with two fundamental data -structures that are used very often in Rust programs: - -* A *vector* allows you to store a variable number of values next to - each other. -* A *hash map* allows you to associate a value with a particular key. - You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map), - [*dictionary* in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) or an *associative array* in other languages. +This is the other data structure that we've been talking about before, when +talking about Vecs. ## Further information -- [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html) - [Storing Keys with Associated Values in Hash Maps](https://doc.rust-lang.org/book/ch08-03-hash-maps.html) diff --git a/exercises/vecs/README.md b/exercises/vecs/README.md new file mode 100644 index 00000000..ebe90bf3 --- /dev/null +++ b/exercises/vecs/README.md @@ -0,0 +1,15 @@ +# Vectors + +Vectors are one of the most-used Rust data structures. In other programming +languages, they'd simply be called Arrays, but since Rust operates on a +bit of a lower level, an array in Rust is stored on the stack (meaning it +can't grow or shrink, and the size needs to be known at compile time), +and a Vector is stored in the heap (where these restrictions do not apply). + +Vectors are a bit of a later chapter in the book, but we think that they're +useful enough to talk about them a bit earlier. We shall be talking about +the other useful data structure, hash maps, later. + +## Further information + +- [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html) diff --git a/exercises/collections/vec1.rs b/exercises/vecs/vecs1.rs similarity index 84% rename from exercises/collections/vec1.rs rename to exercises/vecs/vecs1.rs index c26f5691..4e8c4cbb 100644 --- a/exercises/collections/vec1.rs +++ b/exercises/vecs/vecs1.rs @@ -1,8 +1,8 @@ -// vec1.rs +// vecs1.rs // Your task is to create a `Vec` which holds the exact same elements // as in the array `a`. // Make me compile and pass the test! -// Execute `rustlings hint vec1` or use the `hint` watch subcommand for a hint. +// Execute `rustlings hint vecs1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/collections/vec2.rs b/exercises/vecs/vecs2.rs similarity index 92% rename from exercises/collections/vec2.rs rename to exercises/vecs/vecs2.rs index db37d1d6..5bea09a2 100644 --- a/exercises/collections/vec2.rs +++ b/exercises/vecs/vecs2.rs @@ -1,10 +1,10 @@ -// vec2.rs +// vecs2.rs // A Vec of even numbers is given. Your task is to complete the loop // so that each number in the Vec is multiplied by 2. // // Make me pass the test! // -// Execute `rustlings hint vec2` or use the `hint` watch subcommand for a hint. +// Execute `rustlings hint vecs2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/info.toml b/info.toml index af4861c2..1e941e13 100644 --- a/info.toml +++ b/info.toml @@ -242,8 +242,8 @@ Now you have another tool in your toolbox!""" # VECS [[exercises]] -name = "vec1" -path = "exercises/collections/vec1.rs" +name = "vecs1" +path = "exercises/vecs/vecs1.rs" mode = "test" hint = """ In Rust, there are two ways to define a Vector. @@ -256,8 +256,8 @@ of the Rust book to learn more. """ [[exercises]] -name = "vec2" -path = "exercises/collections/vec2.rs" +name = "vecs2" +path = "exercises/vecs/vecs2.rs" mode = "test" hint = """ Hint 1: `i` is each element from the Vec as they are being iterated. Can you try From 3c4c9c54c98142f114018bbbe4d0d96d63646a5b Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 12 Jul 2022 15:18:05 +0200 Subject: [PATCH 0558/1293] feat: remove collections to hashmaps --- exercises/{collections => hashmaps}/README.md | 0 .../{collections/hashmap1.rs => hashmaps/hashmaps1.rs} | 4 ++-- .../{collections/hashmap2.rs => hashmaps/hashmaps2.rs} | 4 ++-- info.toml | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) rename exercises/{collections => hashmaps}/README.md (100%) rename exercises/{collections/hashmap1.rs => hashmaps/hashmaps1.rs} (93%) rename exercises/{collections/hashmap2.rs => hashmaps/hashmaps2.rs} (96%) diff --git a/exercises/collections/README.md b/exercises/hashmaps/README.md similarity index 100% rename from exercises/collections/README.md rename to exercises/hashmaps/README.md diff --git a/exercises/collections/hashmap1.rs b/exercises/hashmaps/hashmaps1.rs similarity index 93% rename from exercises/collections/hashmap1.rs rename to exercises/hashmaps/hashmaps1.rs index 64b5a7f3..26178b0d 100644 --- a/exercises/collections/hashmap1.rs +++ b/exercises/hashmaps/hashmaps1.rs @@ -1,4 +1,4 @@ -// hashmap1.rs +// hashmaps1.rs // A basket of fruits in the form of a hash map needs to be defined. // The key represents the name of the fruit and the value represents // how many of that particular fruit is in the basket. You have to put @@ -8,7 +8,7 @@ // // Make me compile and pass the tests! // -// Execute the command `rustlings hint hashmap1` if you need +// Execute the command `rustlings hint hashmaps1` if you need // hints. // I AM NOT DONE diff --git a/exercises/collections/hashmap2.rs b/exercises/hashmaps/hashmaps2.rs similarity index 96% rename from exercises/collections/hashmap2.rs rename to exercises/hashmaps/hashmaps2.rs index 0abe19ab..1afb8303 100644 --- a/exercises/collections/hashmap2.rs +++ b/exercises/hashmaps/hashmaps2.rs @@ -1,4 +1,4 @@ -// hashmap2.rs +// hashmaps2.rs // A basket of fruits in the form of a hash map is given. The key // represents the name of the fruit and the value represents how many @@ -9,7 +9,7 @@ // // Make me pass the tests! // -// Execute the command `rustlings hint hashmap2` if you need +// Execute the command `rustlings hint hashmaps2` if you need // hints. // I AM NOT DONE diff --git a/info.toml b/info.toml index 1e941e13..c6231203 100644 --- a/info.toml +++ b/info.toml @@ -445,11 +445,11 @@ UNIX_EPOCH and SystemTime are declared in the std::time module. Add a use statem for these two to bring them into scope. You can use nested paths or the glob operator to bring these two in using only one line.""" -# COLLECTIONS +# HASHMAPS [[exercises]] -name = "hashmap1" -path = "exercises/collections/hashmap1.rs" +name = "hashmaps1" +path = "exercises/hashmaps/hashmaps1.rs" mode = "test" hint = """ Hint 1: Take a look at the return type of the function to figure out @@ -459,8 +459,8 @@ Hint 2: Number of fruits should be at least 5. And you have to put """ [[exercises]] -name = "hashmap2" -path = "exercises/collections/hashmap2.rs" +name = "hashmaps2" +path = "exercises/hashmaps/hashmaps2.rs" mode = "test" hint = """ Use the `entry()` and `or_insert()` methods of `HashMap` to achieve this. From 7452d0d60395a9b0247abb3b307ab3437c1f8622 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 12 Jul 2022 15:22:01 +0200 Subject: [PATCH 0559/1293] fix(primitive_types): clean up --- exercises/primitive_types/primitive_types1.rs | 1 - exercises/primitive_types/primitive_types6.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/exercises/primitive_types/primitive_types1.rs b/exercises/primitive_types/primitive_types1.rs index de0d08a6..09121392 100644 --- a/exercises/primitive_types/primitive_types1.rs +++ b/exercises/primitive_types/primitive_types1.rs @@ -4,7 +4,6 @@ // I AM NOT DONE -#[test] fn main() { // Booleans (`bool`) diff --git a/exercises/primitive_types/primitive_types6.rs b/exercises/primitive_types/primitive_types6.rs index b8c9b82b..ddf8b423 100644 --- a/exercises/primitive_types/primitive_types6.rs +++ b/exercises/primitive_types/primitive_types6.rs @@ -1,7 +1,7 @@ // primitive_types6.rs // Use a tuple index to access the second element of `numbers`. // You can put the expression for the second element where ??? is so that the test passes. -// Execute `rustlings hint primitive_types6` for hints! +// Execute `rustlings hint primitive_types6` or use the `hint` watch subcommand for a hint. // I AM NOT DONE From bb0cf92b8b6f0a9db4be92ff5ffc4c507f2847ba Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 12 Jul 2022 15:25:31 +0200 Subject: [PATCH 0560/1293] feat(move_semantics): clarify some hints --- exercises/move_semantics/move_semantics1.rs | 2 +- exercises/move_semantics/move_semantics2.rs | 2 +- info.toml | 15 +++++++++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/exercises/move_semantics/move_semantics1.rs b/exercises/move_semantics/move_semantics1.rs index e2f5876d..aac6dfc3 100644 --- a/exercises/move_semantics/move_semantics1.rs +++ b/exercises/move_semantics/move_semantics1.rs @@ -1,5 +1,5 @@ // move_semantics1.rs -// Make me compile! Execute `rustlings hint move_semantics1` for hints :) +// Execute `rustlings hint move_semantics1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs index 888dc529..64870850 100644 --- a/exercises/move_semantics/move_semantics2.rs +++ b/exercises/move_semantics/move_semantics2.rs @@ -1,6 +1,6 @@ // move_semantics2.rs // Make me compile without changing line 13 or moving line 10! -// Execute `rustlings hint move_semantics2` for hints :) +// Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/info.toml b/info.toml index c6231203..a7c46eb6 100644 --- a/info.toml +++ b/info.toml @@ -280,18 +280,21 @@ mode = "compile" hint = """ So you've got the "cannot borrow immutable local variable `vec1` as mutable" error on line 13, right? The fix for this is going to be adding one keyword, and the addition is NOT on line 13 -where the error is.""" +where the error is. + +Also: Try accessing `vec0` after having called `fill_vec()`. See what happens!""" [[exercises]] name = "move_semantics2" path = "exercises/move_semantics/move_semantics2.rs" mode = "compile" hint = """ -So `vec0` is being *moved* into the function `fill_vec` when we call it on -line 10, which means it gets dropped at the end of `fill_vec`, which means we -can't use `vec0` again on line 13 (or anywhere else in `main` after the -`fill_vec` call for that matter). We could fix this in a few ways, try them -all! +So, `vec0` is passed into the `fill_vec` function as an argument. In Rust, +when an argument is passed to a function and it's not explicitly returned, +you can't use the original variable anymore. We call this "moving" a variable. +Variables that are moved into a function (or block scope) and aren't explicitly +returned get "dropped" at the end of that function. This is also what happens here. +There's a few ways to fix this, try them all if you want: 1. Make another, separate version of the data that's in `vec0` and pass that to `fill_vec` instead. 2. Make `fill_vec` borrow its argument instead of taking ownership of it, From 16ff57bbffe0ab86d9ef880d45486d6625cc9223 Mon Sep 17 00:00:00 2001 From: exdx Date: Tue, 12 Jul 2022 15:26:55 +0200 Subject: [PATCH 0561/1293] fix(move_semantics2): clarify referencing --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index a7c46eb6..899d4c18 100644 --- a/info.toml +++ b/info.toml @@ -300,7 +300,7 @@ There's a few ways to fix this, try them all if you want: 2. Make `fill_vec` borrow its argument instead of taking ownership of it, and then copy the data within the function in order to return an owned `Vec` -3. Make `fill_vec` *mutably* borrow its argument (which will need to be +3. Make `fill_vec` *mutably* borrow a reference to its argument (which will need to be mutable), modify it directly, then not return anything. Then you can get rid of `vec1` entirely -- note that this will change what gets printed by the first `println!`""" From 2e62505143a726c610a60cc8f11fbb4b0449ba8f Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 12 Jul 2022 15:43:26 +0200 Subject: [PATCH 0562/1293] feat(move_semantics): finish updating comments --- exercises/move_semantics/move_semantics3.rs | 2 +- exercises/move_semantics/move_semantics4.rs | 8 ++++---- exercises/move_semantics/move_semantics5.rs | 2 +- exercises/move_semantics/move_semantics6.rs | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/exercises/move_semantics/move_semantics3.rs b/exercises/move_semantics/move_semantics3.rs index 43fef74f..eaa30e33 100644 --- a/exercises/move_semantics/move_semantics3.rs +++ b/exercises/move_semantics/move_semantics3.rs @@ -1,7 +1,7 @@ // move_semantics3.rs // Make me compile without adding new lines-- just changing existing lines! // (no lines with multiple semicolons necessary!) -// Execute `rustlings hint move_semantics3` for hints :) +// Execute `rustlings hint move_semantics3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/move_semantics/move_semantics4.rs b/exercises/move_semantics/move_semantics4.rs index 2a23c710..99834ec3 100644 --- a/exercises/move_semantics/move_semantics4.rs +++ b/exercises/move_semantics/move_semantics4.rs @@ -1,8 +1,8 @@ // move_semantics4.rs -// Refactor this code so that instead of having `vec0` and creating the vector -// in `fn main`, we create it within `fn fill_vec` and transfer the -// freshly created vector from fill_vec to its caller. -// Execute `rustlings hint move_semantics4` for hints! +// Refactor this code so that instead of passing `vec0` into the `fill_vec` function, +// the Vector gets created in the function itself and passed back to the main +// function. +// Execute `rustlings hint move_semantics4` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/move_semantics/move_semantics5.rs b/exercises/move_semantics/move_semantics5.rs index c4704f9e..36eae127 100644 --- a/exercises/move_semantics/move_semantics5.rs +++ b/exercises/move_semantics/move_semantics5.rs @@ -1,7 +1,7 @@ // move_semantics5.rs // Make me compile only by reordering the lines in `main()`, but without // adding, changing or removing any of them. -// Execute `rustlings hint move_semantics5` for hints :) +// Execute `rustlings hint move_semantics5` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/move_semantics/move_semantics6.rs b/exercises/move_semantics/move_semantics6.rs index 457e7ae7..eb52a848 100644 --- a/exercises/move_semantics/move_semantics6.rs +++ b/exercises/move_semantics/move_semantics6.rs @@ -1,6 +1,6 @@ // move_semantics6.rs -// Make me compile! `rustlings hint move_semantics6` for hints -// You can't change anything except adding or removing references +// Execute `rustlings hint move_semantics6` or use the `hint` watch subcommand for a hint. +// You can't change anything except adding or removing references. // I AM NOT DONE From 19bec503998c3c5618254015bada63b44a713f0e Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 11:59:29 +0200 Subject: [PATCH 0563/1293] feat(structs1): convert structs to use i32 types --- exercises/structs/structs1.rs | 11 +++++++---- info.toml | 1 - 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/exercises/structs/structs1.rs b/exercises/structs/structs1.rs index 6d0b2f49..1632b685 100644 --- a/exercises/structs/structs1.rs +++ b/exercises/structs/structs1.rs @@ -1,5 +1,6 @@ // structs1.rs // Address all the TODOs to make the tests pass! +// Execute `rustlings hint structs1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE @@ -21,8 +22,9 @@ mod tests { // TODO: Instantiate a classic c struct! // let green = - assert_eq!(green.name, "green"); - assert_eq!(green.hex, "#00FF00"); + assert_eq!(green.red, 0); + assert_eq!(green.green, 255); + assert_eq!(green.blue, 0); } #[test] @@ -30,8 +32,9 @@ mod tests { // TODO: Instantiate a tuple struct! // let green = - assert_eq!(green.0, "green"); - assert_eq!(green.1, "#00FF00"); + assert_eq!(green.0, 0); + assert_eq!(green.1, 255); + assert_eq!(green.2, 0); } #[test] diff --git a/info.toml b/info.toml index 899d4c18..2dc49a38 100644 --- a/info.toml +++ b/info.toml @@ -357,7 +357,6 @@ Can you figure out how? Another hint: it has to do with the `&` character.""" - # STRUCTS [[exercises]] From 4dffa0d10df61748b0098ad4428848e6f3e90bff Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 12:00:46 +0200 Subject: [PATCH 0564/1293] fix(structs1): rename to unit-like struct --- exercises/structs/structs1.rs | 10 +++++----- info.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/exercises/structs/structs1.rs b/exercises/structs/structs1.rs index 1632b685..0d91c469 100644 --- a/exercises/structs/structs1.rs +++ b/exercises/structs/structs1.rs @@ -11,7 +11,7 @@ struct ColorClassicStruct { struct ColorTupleStruct(/* TODO: Something goes here */); #[derive(Debug)] -struct UnitStruct; +struct UnitLikeStruct; #[cfg(test)] mod tests { @@ -39,10 +39,10 @@ mod tests { #[test] fn unit_structs() { - // TODO: Instantiate a unit struct! - // let unit_struct = - let message = format!("{:?}s are fun!", unit_struct); + // TODO: Instantiate a unit-like struct! + // let unit_like_struct = + let message = format!("{:?}s are fun!", unit_like_struct); - assert_eq!(message, "UnitStructs are fun!"); + assert_eq!(message, "UnitLikeStructs are fun!"); } } diff --git a/info.toml b/info.toml index 2dc49a38..357a25c6 100644 --- a/info.toml +++ b/info.toml @@ -367,7 +367,7 @@ hint = """ Rust has more than one type of struct. Three actually, all variants are used to package related data together. There are normal (or classic) structs. These are named collections of related data stored in fields. Tuple structs are basically just named tuples. -Finally, Unit structs. These don't have any fields and are useful for generics. +Finally, Unit-like structs. These don't have any fields and are useful for generics. In this exercise you need to complete and implement one of each kind. Read more about structs in The Book: https://doc.rust-lang.org/book/ch05-01-defining-structs.html""" From 4531c21bf1b54ff5fa8cc796584043b826cf78e8 Mon Sep 17 00:00:00 2001 From: camperdue42 Date: Fri, 31 Dec 2021 01:05:34 -0500 Subject: [PATCH 0565/1293] fix(structs3): Add panic! statement into structs3 closes #685 --- exercises/structs/structs3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index e84f2ebc..e5666e21 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -16,7 +16,7 @@ struct Package { impl Package { fn new(sender_country: String, recipient_country: String, weight_in_grams: i32) -> Package { if weight_in_grams <= 0 { - // panic statement goes here... + panic!("Can not ship a weightless package.") } else { Package { sender_country, From 886d599c96ad0725cee05c50cf4ea9718fc02746 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 12:04:54 +0200 Subject: [PATCH 0566/1293] fix(structs): add hint comments --- exercises/structs/structs2.rs | 1 + exercises/structs/structs3.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/structs/structs2.rs b/exercises/structs/structs2.rs index f9c6427d..32e311fa 100644 --- a/exercises/structs/structs2.rs +++ b/exercises/structs/structs2.rs @@ -1,5 +1,6 @@ // structs2.rs // Address all the TODOs to make the tests pass! +// Execute `rustlings hint structs2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index e5666e21..0b3615f4 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -2,7 +2,7 @@ // Structs contain data, but can also have logic. In this exercise we have // defined the Package struct and we want to test some logic attached to it. // Make the code compile and the tests pass! -// If you have issues execute `rustlings hint structs3` +// Execute `rustlings hint structs3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE From 8fe02d33a93cd5af8bb9f7a69df8c7f20918465e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Jul 2022 10:06:03 +0000 Subject: [PATCH 0567/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index c2fe5d99..f5af8cbb 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -182,6 +182,7 @@ authors.
KatanaFluorescent

πŸ’»
Drew Morris

πŸ’» +
camperdue42

πŸ–‹ From 62578269eb739c534efb8225d85169bba9951fa1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Jul 2022 10:06:04 +0000 Subject: [PATCH 0568/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 06debdb4..941ee530 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1272,6 +1272,15 @@ "contributions": [ "code" ] + }, + { + "login": "camperdue42", + "name": "camperdue42", + "avatar_url": "https://avatars.githubusercontent.com/u/43047763?v=4", + "profile": "https://github.com/camperdue42", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d0e8efd19ee9a4a7fe9a62ee76bc035371321c09 Mon Sep 17 00:00:00 2001 From: Ryosuke YASUOKA Date: Sun, 9 Jan 2022 19:30:31 +0900 Subject: [PATCH 0569/1293] feat(enums3): Add hint --- info.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 357a25c6..dc176ed0 100644 --- a/info.toml +++ b/info.toml @@ -415,7 +415,11 @@ such as no data, anonymous structs, a single string, tuples, ...etc""" name = "enums3" path = "exercises/enums/enums3.rs" mode = "test" -hint = "No hints this time ;)" +hint = """ +As a first step, you can define enums to compile this code without errors. +and then create a match expression in `process()`. +Note that you need to deconstruct some message variants +in the match expression to get value in the variant.""" # MODULES From c6bc97adc10aecbf6a1ba5ff5c7beda1f421a098 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 12:11:38 +0200 Subject: [PATCH 0570/1293] feat(enums3): add hint comment, remove enums1 hint --- exercises/enums/enums1.rs | 2 +- exercises/enums/enums2.rs | 2 +- exercises/enums/enums3.rs | 1 + info.toml | 3 +-- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exercises/enums/enums1.rs b/exercises/enums/enums1.rs index a2223d33..511ba740 100644 --- a/exercises/enums/enums1.rs +++ b/exercises/enums/enums1.rs @@ -1,5 +1,5 @@ // enums1.rs -// Make me compile! Execute `rustlings hint enums1` for hints! +// No hints this time! ;) // I AM NOT DONE diff --git a/exercises/enums/enums2.rs b/exercises/enums/enums2.rs index ec32d952..18479f87 100644 --- a/exercises/enums/enums2.rs +++ b/exercises/enums/enums2.rs @@ -1,5 +1,5 @@ // enums2.rs -// Make me compile! Execute `rustlings hint enums2` for hints! +// Execute `rustlings hint enums2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs index 178b40c4..55acf6bc 100644 --- a/exercises/enums/enums3.rs +++ b/exercises/enums/enums3.rs @@ -1,5 +1,6 @@ // enums3.rs // Address all the TODOs to make the tests pass! +// Execute `rustlings hint enums3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/info.toml b/info.toml index dc176ed0..b1e448c9 100644 --- a/info.toml +++ b/info.toml @@ -400,8 +400,7 @@ Have a look in The Book, to find out more about method implementations: https:// name = "enums1" path = "exercises/enums/enums1.rs" mode = "compile" -hint = """ -The declaration of the enumeration type has not been defined yet.""" +hint = "No hints this time ;)" [[exercises]] name = "enums2" From 0ddb9970761a645df4c3d6365a142c6333465190 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Jul 2022 10:12:32 +0000 Subject: [PATCH 0571/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index f5af8cbb..4c1cba01 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -183,6 +183,7 @@ authors.
KatanaFluorescent

πŸ’»
Drew Morris

πŸ’»
camperdue42

πŸ–‹ +
YsuOS

πŸ–‹ From c92de1f8a6f7187b02d51cd119e1e301a06981bd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Jul 2022 10:12:33 +0000 Subject: [PATCH 0572/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 941ee530..eceb7666 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1281,6 +1281,15 @@ "contributions": [ "content" ] + }, + { + "login": "YsuOS", + "name": "YsuOS", + "avatar_url": "https://avatars.githubusercontent.com/u/30138661?v=4", + "profile": "https://github.com/YsuOS", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From f5e4c16eed0c9e86398284bb6732981c3cc074c8 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 12:18:21 +0200 Subject: [PATCH 0573/1293] feat(strings): move before modules --- exercises/strings/strings1.rs | 2 +- exercises/strings/strings2.rs | 2 +- info.toml | 46 +++++++++++++++++------------------ 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/exercises/strings/strings1.rs b/exercises/strings/strings1.rs index 80902444..0de86a1d 100644 --- a/exercises/strings/strings1.rs +++ b/exercises/strings/strings1.rs @@ -1,6 +1,6 @@ // strings1.rs // Make me compile without changing the function signature! -// Execute `rustlings hint strings1` for hints ;) +// Execute `rustlings hint strings1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/strings/strings2.rs b/exercises/strings/strings2.rs index 5a2ce74a..0c48ec95 100644 --- a/exercises/strings/strings2.rs +++ b/exercises/strings/strings2.rs @@ -1,6 +1,6 @@ // strings2.rs // Make me compile without changing the function signature! -// Execute `rustlings hint strings2` for hints :) +// Execute `rustlings hint strings2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/info.toml b/info.toml index b1e448c9..8174fc8f 100644 --- a/info.toml +++ b/info.toml @@ -420,6 +420,29 @@ and then create a match expression in `process()`. Note that you need to deconstruct some message variants in the match expression to get value in the variant.""" +# STRINGS + +[[exercises]] +name = "strings1" +path = "exercises/strings/strings1.rs" +mode = "compile" +hint = """ +The `current_favorite_color` function is currently returning a string slice with the `'static` +lifetime. We know this because the data of the string lives in our code itself -- it doesn't +come from a file or user input or another program -- so it will live as long as our program +lives. But it is still a string slice. There's one way to create a `String` by converting a +string slice covered in the Strings chapter of the book, and another way that uses the `From` +trait.""" + +[[exercises]] +name = "strings2" +path = "exercises/strings/strings2.rs" +mode = "compile" +hint = """ +Yes, it would be really easy to fix this by just changing the value bound to `word` to be a +string slice instead of a `String`, wouldn't it?? There is a way to add one character to line +9, though, that will coerce the `String` into a string slice.""" + # MODULES [[exercises]] @@ -472,29 +495,6 @@ Use the `entry()` and `or_insert()` methods of `HashMap` to achieve this. Learn more at https://doc.rust-lang.org/stable/book/ch08-03-hash-maps.html#only-inserting-a-value-if-the-key-has-no-value """ -# STRINGS - -[[exercises]] -name = "strings1" -path = "exercises/strings/strings1.rs" -mode = "compile" -hint = """ -The `current_favorite_color` function is currently returning a string slice with the `'static` -lifetime. We know this because the data of the string lives in our code itself -- it doesn't -come from a file or user input or another program -- so it will live as long as our program -lives. But it is still a string slice. There's one way to create a `String` by converting a -string slice covered in the Strings chapter of the book, and another way that uses the `From` -trait.""" - -[[exercises]] -name = "strings2" -path = "exercises/strings/strings2.rs" -mode = "compile" -hint = """ -Yes, it would be really easy to fix this by just changing the value bound to `word` to be a -string slice instead of a `String`, wouldn't it?? There is a way to add one character to line -9, though, that will coerce the `String` into a string slice.""" - # TEST 2 [[exercises]] From c1ed6b10fe0725846fef8328b328159b6302fe3b Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 12:31:28 +0200 Subject: [PATCH 0574/1293] feat(strings): add strings3 --- exercises/strings/strings3.rs | 41 +++++++++++++++++++++++++++++++++++ info.toml | 11 ++++++++++ 2 files changed, 52 insertions(+) create mode 100644 exercises/strings/strings3.rs diff --git a/exercises/strings/strings3.rs b/exercises/strings/strings3.rs new file mode 100644 index 00000000..bb0a259e --- /dev/null +++ b/exercises/strings/strings3.rs @@ -0,0 +1,41 @@ +// strings3.rs +// Execute `rustlings hint strings3` or use the `hint` watch subcommand for a hint. + +fn trim_me(input: &str) -> String { + // TODO: Remove whitespace from the end of a string! + ??? +} + +fn compose_me(input: &str) -> String { + // TODO: Add " world!" to the string! There's multiple ways to do this! + ??? +} + +fn replace_me(input: &str) -> String { + // TODO: Replace "cars" in the string with "balloons"! + ??? +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn trim_a_string() { + assert_eq!(trim_me("Hello! "), "Hello!"); + assert_eq!(trim_me(" What's up!"), "What's up!"); + assert_eq!(trim_me(" Hola! "), "Hola!"); + } + + #[test] + fn compose_a_string() { + assert_eq!(compose_me("Hello"), "Hello world!"); + assert_eq!(compose_me("Goodbye"), "Goodbye world!"); + } + + #[test] + fn replace_a_string() { + assert_eq!(replace_me("I think cars are cool"), "I think balloons are cool"); + assert_eq!(replace_me("I love to look at cars"), "I love to look at balloons"); + } +} diff --git a/info.toml b/info.toml index 8174fc8f..c54672b3 100644 --- a/info.toml +++ b/info.toml @@ -443,6 +443,17 @@ Yes, it would be really easy to fix this by just changing the value bound to `wo string slice instead of a `String`, wouldn't it?? There is a way to add one character to line 9, though, that will coerce the `String` into a string slice.""" +[[exercises]] +name = "strings3" +path = "exercises/strings/strings3.rs" +mode = "test" +hint = """ +There's tons of useful standard library functions for strings. Let's try and use some of +them! + +For the compose_me method: You can either use the `format!` macro, or convert the string +slice into an owned string, which you can then freely extend.""" + # MODULES [[exercises]] From fe54d0f85b3170ba950bab8be9756c9dbf0098fd Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 12:35:49 +0200 Subject: [PATCH 0575/1293] fix(modules): adjust hint comments --- exercises/modules/modules1.rs | 2 +- exercises/modules/modules2.rs | 3 +-- exercises/modules/modules3.rs | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/exercises/modules/modules1.rs b/exercises/modules/modules1.rs index 1a2bd0dd..8dd0e402 100644 --- a/exercises/modules/modules1.rs +++ b/exercises/modules/modules1.rs @@ -1,5 +1,5 @@ // modules1.rs -// Make me compile! Execute `rustlings hint modules1` for hints :) +// Execute `rustlings hint modules1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/modules/modules2.rs b/exercises/modules/modules2.rs index 87f0c458..c30a3897 100644 --- a/exercises/modules/modules2.rs +++ b/exercises/modules/modules2.rs @@ -1,12 +1,11 @@ // modules2.rs // You can bring module paths into scopes and provide new names for them with the // 'use' and 'as' keywords. Fix these 'use' statements to make the code compile. -// Make me compile! Execute `rustlings hint modules2` for hints :) +// Execute `rustlings hint modules2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE mod delicious_snacks { - // TODO: Fix these use statements use self::fruits::PEAR as ??? use self::veggies::CUCUMBER as ??? diff --git a/exercises/modules/modules3.rs b/exercises/modules/modules3.rs index 8eed77df..35e07990 100644 --- a/exercises/modules/modules3.rs +++ b/exercises/modules/modules3.rs @@ -3,7 +3,7 @@ // and especially from the Rust standard library into your scope. // Bring SystemTime and UNIX_EPOCH // from the std::time module. Bonus style points if you can do it with one line! -// Make me compile! Execute `rustlings hint modules3` for hints :) +// Execute `rustlings hint modules3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE From 1e54bc61e81a81b0647325f724690b376de50a2a Mon Sep 17 00:00:00 2001 From: Sateesh Basavaraju Date: Fri, 4 Jun 2021 16:09:12 +0530 Subject: [PATCH 0576/1293] feat: Add hashmap3 exercise. --- exercises/hashmaps/hashmaps3.rs | 88 +++++++++++++++++++++++++++++++++ info.toml | 12 +++++ 2 files changed, 100 insertions(+) create mode 100644 exercises/hashmaps/hashmaps3.rs diff --git a/exercises/hashmaps/hashmaps3.rs b/exercises/hashmaps/hashmaps3.rs new file mode 100644 index 00000000..60293f2e --- /dev/null +++ b/exercises/hashmaps/hashmaps3.rs @@ -0,0 +1,88 @@ +// hashmaps3.rs + +// A list of scores (one per line) of a soccer match is given. Each line +// is of the form : +// ,,, +// Example: England,France,4,2 (England scored 4 goals, France 2). + +// You have to build a scores table containing the name of the team, goals +// the team scored, and goals the team conceded. One approach to build +// the scores table is to use a Hashmap. The solution is partially +// written to use a Hashmap, complete it to pass the test. + +// Make me pass the tests! + +// Execute the command `rustlings hint hashmap3` if you need +// hints. + +// I AM NOT DONE + +use std::collections::HashMap; + +// A structure to store team name and its goal details. +struct Team { + name: String, + goals_scored: u8, + goals_conceded: u8, +} + +fn build_scores_table(results: String) -> HashMap { + // The name of the team is the key and its associated struct is the value. + let mut scores: HashMap = HashMap::new(); + + for r in results.lines() { + let v: Vec<&str> = r.split(',').collect(); + let team_1_name = v[0].to_string(); + let team_1_score: u8 = v[2].parse().unwrap(); + let team_2_name = v[1].to_string(); + let team_2_score: u8 = v[3].parse().unwrap(); + // TODO: Populate the scores table with details extracted from the + // current line. Keep in mind that goals scored by team_1 + // will be number of goals conceded from team_2, and similarly + // goals scored by team_2 will be the number of goals conceded by + // team_1. + } + scores +} + +#[cfg(test)] +mod tests { + use super::*; + + fn get_results() -> String { + let results = "".to_string() + + "England,France,4,2\n" + + "France,Italy,3,1\n" + + "Poland,Spain,2,0\n" + + "Germany,England,2,1\n"; + results + } + + #[test] + fn build_scores() { + let scores = build_scores_table(get_results()); + + let mut keys: Vec<&String> = scores.keys().collect(); + keys.sort(); + assert_eq!( + keys, + vec!["England", "France", "Germany", "Italy", "Poland", "Spain"] + ); + } + + #[test] + fn validate_team_score_1() { + let scores = build_scores_table(get_results()); + let team = scores.get("England").unwrap(); + assert_eq!(team.goals_scored, 5); + assert_eq!(team.goals_conceded, 4); + } + + #[test] + fn validate_team_score_2() { + let scores = build_scores_table(get_results()); + let team = scores.get("Spain").unwrap(); + assert_eq!(team.goals_scored, 0); + assert_eq!(team.goals_conceded, 2); + } +} diff --git a/info.toml b/info.toml index c54672b3..ec2d8172 100644 --- a/info.toml +++ b/info.toml @@ -506,6 +506,18 @@ Use the `entry()` and `or_insert()` methods of `HashMap` to achieve this. Learn more at https://doc.rust-lang.org/stable/book/ch08-03-hash-maps.html#only-inserting-a-value-if-the-key-has-no-value """ +[[exercises]] +name = "hashmaps3" +path = "exercises/hashmaps/hashmaps3.rs" +mode = "test" +hint = """ +Hint 1: Use the `entry()` and `or_insert()` methods of `HashMap` to insert entries corresponding to each team in the scores table. +Learn more at https://doc.rust-lang.org/stable/book/ch08-03-hash-maps.html#only-inserting-a-value-if-the-key-has-no-value +Hint 2: If there is already an entry for a given key, the value returned by `entry()` can be updated based on the existing value. +Learn more at https://doc.rust-lang.org/book/ch08-03-hash-maps.html#updating-a-value-based-on-the-old-value +""" + + # TEST 2 [[exercises]] From ab8572e15bf6765471490281ba2a1c8f88275e40 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 12:58:28 +0200 Subject: [PATCH 0577/1293] fix(hashmaps): adjust hint comments --- exercises/hashmaps/hashmaps1.rs | 3 +-- exercises/hashmaps/hashmaps2.rs | 3 +-- exercises/hashmaps/hashmaps3.rs | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/exercises/hashmaps/hashmaps1.rs b/exercises/hashmaps/hashmaps1.rs index 26178b0d..fd8dd2f8 100644 --- a/exercises/hashmaps/hashmaps1.rs +++ b/exercises/hashmaps/hashmaps1.rs @@ -8,8 +8,7 @@ // // Make me compile and pass the tests! // -// Execute the command `rustlings hint hashmaps1` if you need -// hints. +// Execute `rustlings hint hashmaps1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/hashmaps/hashmaps2.rs b/exercises/hashmaps/hashmaps2.rs index 1afb8303..454b3e1d 100644 --- a/exercises/hashmaps/hashmaps2.rs +++ b/exercises/hashmaps/hashmaps2.rs @@ -9,8 +9,7 @@ // // Make me pass the tests! // -// Execute the command `rustlings hint hashmaps2` if you need -// hints. +// Execute `rustlings hint hashmaps2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/hashmaps/hashmaps3.rs b/exercises/hashmaps/hashmaps3.rs index 60293f2e..18dd44c9 100644 --- a/exercises/hashmaps/hashmaps3.rs +++ b/exercises/hashmaps/hashmaps3.rs @@ -12,8 +12,7 @@ // Make me pass the tests! -// Execute the command `rustlings hint hashmap3` if you need -// hints. +// Execute `rustlings hint hashmaps3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE From f443f4e7b31467b29271aab477c63eb64aba1be3 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 13:01:40 +0200 Subject: [PATCH 0578/1293] feat: move quiz2 to be strings4 --- exercises/strings/strings4.rs | 29 +++++++++++++++++++++++++++++ info.toml | 11 ++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 exercises/strings/strings4.rs diff --git a/exercises/strings/strings4.rs b/exercises/strings/strings4.rs new file mode 100644 index 00000000..c410b562 --- /dev/null +++ b/exercises/strings/strings4.rs @@ -0,0 +1,29 @@ +// strings4.rs + +// Ok, here are a bunch of values-- some are `String`s, some are `&str`s. Your +// task is to call one of these two functions on each value depending on what +// you think each value is. That is, add either `string_slice` or `string` +// before the parentheses on each line. If you're right, it will compile! +// No hints this time! + +// I AM NOT DONE + +fn string_slice(arg: &str) { + println!("{}", arg); +} +fn string(arg: String) { + println!("{}", arg); +} + +fn main() { + ???("blue"); + ???("red".to_string()); + ???(String::from("hi")); + ???("rust is fun!".to_owned()); + ???("nice weather".into()); + ???(format!("Interpolation {}", "Station")); + ???(&String::from("abc")[0..1]); + ???(" hello there ".trim()); + ???("Happy Monday!".to_string().replace("Mon", "Tues")); + ???("mY sHiFt KeY iS sTiCkY".to_lowercase()); +} diff --git a/info.toml b/info.toml index ec2d8172..0f7d9253 100644 --- a/info.toml +++ b/info.toml @@ -167,7 +167,7 @@ For that first compiler error, it's important in Rust that each conditional block returns the same type! To get the tests passing, you will need a couple conditions checking different input values.""" -# TEST 1 +# QUIZ 1 [[exercises]] name = "quiz1" @@ -454,6 +454,12 @@ them! For the compose_me method: You can either use the `format!` macro, or convert the string slice into an owned string, which you can then freely extend.""" +[[exercises]] +name = "strings4" +path = "exercises/strings/strings4.rs" +mode = "compile" +hint = "No hints this time ;)" + # MODULES [[exercises]] @@ -517,8 +523,7 @@ Hint 2: If there is already an entry for a given key, the value returned by `ent Learn more at https://doc.rust-lang.org/book/ch08-03-hash-maps.html#updating-a-value-based-on-the-old-value """ - -# TEST 2 +# QUIZ 2 [[exercises]] name = "quiz2" From c64b340622a59f60b0b056ed849557bc4872a535 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 13:16:32 +0200 Subject: [PATCH 0579/1293] feat: rework quiz2 --- exercises/quiz2.rs | 73 ++++++++++++++++++++++++++++++++-------------- info.toml | 2 +- 2 files changed, 52 insertions(+), 23 deletions(-) diff --git a/exercises/quiz2.rs b/exercises/quiz2.rs index de0dce95..d2211c7c 100644 --- a/exercises/quiz2.rs +++ b/exercises/quiz2.rs @@ -1,30 +1,59 @@ // quiz2.rs // This is a quiz for the following sections: // - Strings +// - Vecs +// - Move semantics +// - Modules +// - Enums -// Ok, here are a bunch of values-- some are `String`s, some are `&str`s. Your -// task is to call one of these two functions on each value depending on what -// you think each value is. That is, add either `string_slice` or `string` -// before the parentheses on each line. If you're right, it will compile! +// Let's build a little machine in form of a function. +// As input, we're going to give a list of strings and commands. These commands +// determine what action is going to be applied to the string. It can either be: +// - Uppercase the string +// - Trim the string +// - Append "bar" to the string a specified amount of times +// The exact form of this will be: +// - The input is going to be a Vector of a 2-length tuple, +// the first element is the string, the second one is the command. +// - The output element is going to be a Vector of strings. -// I AM NOT DONE - -fn string_slice(arg: &str) { - println!("{}", arg); -} -fn string(arg: String) { - println!("{}", arg); +pub enum Command { + Uppercase, + Trim, + Append(usize), } -fn main() { - ???("blue"); - ???("red".to_string()); - ???(String::from("hi")); - ???("rust is fun!".to_owned()); - ???("nice weather".into()); - ???(format!("Interpolation {}", "Station")); - ???(&String::from("abc")[0..1]); - ???(" hello there ".trim()); - ???("Happy Monday!".to_string().replace("Mon", "Tues")); - ???("mY sHiFt KeY iS sTiCkY".to_lowercase()); +mod my_module { + use super::Command; + + // TODO: Complete the function signature! + pub fn transformer(input: ???) -> ??? { + // TODO: Complete the output declaration! + let mut output: ??? = vec![]; + for (string, command) in input.iter() { + // TODO: Complete the function body. You can do it! + } + output + } +} + +#[cfg(test)] +mod tests { + // TODO: What to we have to import to have `transformer` in scope? + use ???; + use super::Command; + + #[test] + fn it_works() { + let output = transformer(vec![ + ("hello".into(), Command::Uppercase), + (" all roads lead to rome! ".into(), Command::Trim), + ("foo".into(), Command::Append(1)), + ("bar".into(), Command::Append(5)), + ]); + assert_eq!(output[0], "HELLO"); + assert_eq!(output[1], "all roads lead to rome!"); + assert_eq!(output[2], "foobar"); + assert_eq!(output[3], "barbarbarbarbarbar"); + } } diff --git a/info.toml b/info.toml index 0f7d9253..0a94f7de 100644 --- a/info.toml +++ b/info.toml @@ -528,7 +528,7 @@ Learn more at https://doc.rust-lang.org/book/ch08-03-hash-maps.html#updating-a-v [[exercises]] name = "quiz2" path = "exercises/quiz2.rs" -mode = "compile" +mode = "test" hint = "No hints this time ;)" # ERROR HANDLING From 472d7944f95e41d8fa9f78ac2870a3827afdc544 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 17:30:04 +0200 Subject: [PATCH 0580/1293] fix(quiz2): add hint comment --- exercises/quiz2.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/quiz2.rs b/exercises/quiz2.rs index d2211c7c..5d3ccc03 100644 --- a/exercises/quiz2.rs +++ b/exercises/quiz2.rs @@ -16,6 +16,7 @@ // - The input is going to be a Vector of a 2-length tuple, // the first element is the string, the second one is the command. // - The output element is going to be a Vector of strings. +// Execute `rustlings hint quiz2` or use the `hint` watch subcommand for a hint. pub enum Command { Uppercase, From b644558c19dd1f0319204f50c1c162562edb79b1 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 17:34:50 +0200 Subject: [PATCH 0581/1293] fix: rename option to options --- exercises/{option => options}/README.md | 2 +- .../option1.rs => options/options1.rs} | 4 +- .../option2.rs => options/options2.rs} | 2 +- .../option3.rs => options/options3.rs} | 2 +- info.toml | 84 +++++++++---------- 5 files changed, 47 insertions(+), 47 deletions(-) rename exercises/{option => options}/README.md (99%) rename exercises/{option/option1.rs => options/options1.rs} (81%) rename exercises/{option/option2.rs => options/options2.rs} (98%) rename exercises/{option/option3.rs => options/options3.rs} (96%) diff --git a/exercises/option/README.md b/exercises/options/README.md similarity index 99% rename from exercises/option/README.md rename to exercises/options/README.md index 89c00289..6140a167 100644 --- a/exercises/option/README.md +++ b/exercises/options/README.md @@ -1,4 +1,4 @@ -# Option +# Options Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not. Option types are very common in Rust code, as they have a number of uses: diff --git a/exercises/option/option1.rs b/exercises/options/options1.rs similarity index 81% rename from exercises/option/option1.rs rename to exercises/options/options1.rs index 17cf4f60..9d96817b 100644 --- a/exercises/option/option1.rs +++ b/exercises/options/options1.rs @@ -1,5 +1,5 @@ -// option1.rs -// Make me compile! Execute `rustlings hint option1` for hints +// options1.rs +// Execute `rustlings hint options1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/option/option2.rs b/exercises/options/options2.rs similarity index 98% rename from exercises/option/option2.rs rename to exercises/options/options2.rs index c6b83ece..a1c21d3e 100644 --- a/exercises/option/option2.rs +++ b/exercises/options/options2.rs @@ -1,4 +1,4 @@ -// option2.rs +// options2.rs // Make me compile! Execute `rustlings hint option2` for hints // I AM NOT DONE diff --git a/exercises/option/option3.rs b/exercises/options/options3.rs similarity index 96% rename from exercises/option/option3.rs rename to exercises/options/options3.rs index 045d2acb..4cba4ad0 100644 --- a/exercises/option/option3.rs +++ b/exercises/options/options3.rs @@ -1,4 +1,4 @@ -// option3.rs +// options3.rs // Make me compile! Execute `rustlings hint option3` for hints // I AM NOT DONE diff --git a/info.toml b/info.toml index 0a94f7de..6bcf2786 100644 --- a/info.toml +++ b/info.toml @@ -531,6 +531,48 @@ path = "exercises/quiz2.rs" mode = "test" hint = "No hints this time ;)" +# OPTIONS + +[[exercises]] +name = "options1" +path = "exercises/options/options1.rs" +mode = "compile" +hint = """ +Hint 1: Check out some functions of Option: +is_some +is_none +unwrap + +and: +pattern matching + +Hint 2: There are no sensible defaults for the value of an Array; the values need to be filled before use. +""" + +[[exercises]] +name = "options2" +path = "exercises/options/options2.rs" +mode = "compile" +hint = """ +check out: +https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html +https://doc.rust-lang.org/rust-by-example/flow_control/while_let.html + +Remember that Options can be stacked in if let and while let. +For example: Some(Some(variable)) = variable2 +Also see Option::flatten +""" + +[[exercises]] +name = "options3" +path = "exercises/options/options3.rs" +mode = "compile" +hint = """ +The compiler says a partial move happened in the `match` +statement. How can this be avoided? The compiler shows the correction +needed. After making the correction as suggested by the compiler, do +read: https://doc.rust-lang.org/std/keyword.ref.html""" + # ERROR HANDLING [[exercises]] @@ -661,48 +703,6 @@ ReportCard struct generic, but also the correct property - you will need to chan of the struct slightly too...you can do it! """ -# OPTIONS - -[[exercises]] -name = "option1" -path = "exercises/option/option1.rs" -mode = "compile" -hint = """ -Hint 1: Check out some functions of Option: -is_some -is_none -unwrap - -and: -pattern matching - -Hint 2: There are no sensible defaults for the value of an Array; the values need to be filled before use. -""" - -[[exercises]] -name = "option2" -path = "exercises/option/option2.rs" -mode = "compile" -hint = """ -check out: -https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html -https://doc.rust-lang.org/rust-by-example/flow_control/while_let.html - -Remember that Options can be stacked in if let and while let. -For example: Some(Some(variable)) = variable2 -Also see Option::flatten -""" - -[[exercises]] -name = "option3" -path = "exercises/option/option3.rs" -mode = "compile" -hint = """ -The compiler says a partial move happened in the `match` -statement. How can this be avoided? The compiler shows the correction -needed. After making the correction as suggested by the compiler, do -read: https://doc.rust-lang.org/std/keyword.ref.html""" - # TRAITS [[exercises]] From 06e4fd376586709082664a304f0394244d4ab6bd Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 17:53:27 +0200 Subject: [PATCH 0582/1293] feat(options1): rewrite to remove array stuff --- exercises/options/options1.rs | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/exercises/options/options1.rs b/exercises/options/options1.rs index 9d96817b..038fb48e 100644 --- a/exercises/options/options1.rs +++ b/exercises/options/options1.rs @@ -8,16 +8,30 @@ fn print_number(maybe_number: Option) { println!("printing: {}", maybe_number.unwrap()); } -fn main() { - print_number(13); - print_number(99); +// This function returns how much icecream there is left in the fridge. +// If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them +// all, so there'll be no more left :( +// TODO: Return an Option! +fn maybe_icecream(time_of_day: u16) -> Option { + // We use the 24-hour system here, so 10PM is a value of 22 + ??? +} - let mut numbers: [Option; 5]; - for iter in 0..5 { - let number_to_add: u16 = { - ((iter * 1235) + 2) / (4 * 16) - }; +#[cfg(test)] +mod tests { + use super::*; - numbers[iter as usize] = number_to_add; + #[test] + fn check_icecream() { + assert_eq!(maybe_icecream(10), Some(5)); + assert_eq!(maybe_icecream(23), None); + assert_eq!(maybe_icecream(22), None); + } + + #[test] + fn raw_value() { + // TODO: Fix this test. How do you get at the value contained in the Option? + let icecreams = maybe_icecream(12); + assert_eq!(icecreams, 5); } } From b71feed82464f476611765e8621b32e615b5dddc Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 17:53:42 +0200 Subject: [PATCH 0583/1293] feat(options): add hint comments --- exercises/options/options2.rs | 2 +- exercises/options/options3.rs | 2 +- info.toml | 15 ++++----------- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/exercises/options/options2.rs b/exercises/options/options2.rs index a1c21d3e..75b66a37 100644 --- a/exercises/options/options2.rs +++ b/exercises/options/options2.rs @@ -1,5 +1,5 @@ // options2.rs -// Make me compile! Execute `rustlings hint option2` for hints +// Execute `rustlings hint options2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/options/options3.rs b/exercises/options/options3.rs index 4cba4ad0..3f995c52 100644 --- a/exercises/options/options3.rs +++ b/exercises/options/options3.rs @@ -1,5 +1,5 @@ // options3.rs -// Make me compile! Execute `rustlings hint option3` for hints +// Execute `rustlings hint options3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/info.toml b/info.toml index 6bcf2786..b13ed45e 100644 --- a/info.toml +++ b/info.toml @@ -536,18 +536,11 @@ hint = "No hints this time ;)" [[exercises]] name = "options1" path = "exercises/options/options1.rs" -mode = "compile" +mode = "test" hint = """ -Hint 1: Check out some functions of Option: -is_some -is_none -unwrap - -and: -pattern matching - -Hint 2: There are no sensible defaults for the value of an Array; the values need to be filled before use. -""" +Options can have a Some value, with an inner value, or a None value, without an inner value. +There's multiple ways to get at the inner value, you can use unwrap, or pattern match. Unwrapping +is the easiest, but how do you do it safely so that it doesn't panic in your face later?""" [[exercises]] name = "options2" From 582320aded8a9369f8b5a959419f04ea6d3f5b04 Mon Sep 17 00:00:00 2001 From: Steven nguyen Date: Tue, 8 Feb 2022 17:46:22 -0600 Subject: [PATCH 0584/1293] chore(errors1): use `is_empty()` instead of `len() > 0` more idiomatic according to clippy --- exercises/error_handling/errors1.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/error_handling/errors1.rs b/exercises/error_handling/errors1.rs index c417fb26..1a2a8577 100644 --- a/exercises/error_handling/errors1.rs +++ b/exercises/error_handling/errors1.rs @@ -8,11 +8,11 @@ // I AM NOT DONE pub fn generate_nametag_text(name: String) -> Option { - if name.len() > 0 { - Some(format!("Hi! My name is {}", name)) - } else { + if name.is_empty() { // Empty names aren't allowed. None + } else { + Some(format!("Hi! My name is {}", name)) } } From 5e1ca4b99577578a1c92d71eeba49d88f60dcedc Mon Sep 17 00:00:00 2001 From: Noah Cairns Date: Wed, 15 Jun 2022 09:40:30 -0400 Subject: [PATCH 0585/1293] fix(errors5): improve exercise instructions --- exercises/error_handling/errors5.rs | 16 +++++++++++++--- info.toml | 19 +++++++------------ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/exercises/error_handling/errors5.rs b/exercises/error_handling/errors5.rs index 365a8691..9d5ee4b7 100644 --- a/exercises/error_handling/errors5.rs +++ b/exercises/error_handling/errors5.rs @@ -1,7 +1,17 @@ // errors5.rs -// This program uses a completed version of the code from errors4. -// It won't compile right now! Why? +// This program uses an altered version of the code from errors4. + +// This exercise uses some concepts that we won't get to until later in the course, like `Box` and the +// `From` trait. It's not important to understand them in detail right now, but you can read ahead if you like. + +// In short, this particular use case for boxes is for when you want to own a value and you care only that it is a +// type which implements a particular trait. To do so, The Box is declared as of type Box where Trait is the trait +// the compiler looks for on any value used in that context. For this exercise, that context is the potential errors +// which can be returned in a Result. + +// What can we use to describe both errors? In other words, is there a trait which both errors implement? + // Execute `rustlings hint errors5` for hints! // I AM NOT DONE @@ -11,7 +21,7 @@ use std::fmt; use std::num::ParseIntError; // TODO: update the return type of `main()` to make this compile. -fn main() -> Result<(), ParseIntError> { +fn main() -> Result<(), Box> { let pretend_user_input = "42"; let x: i64 = pretend_user_input.parse()?; println!("output={:?}", PositiveNonzeroInteger::new(x)?); diff --git a/info.toml b/info.toml index b13ed45e..97c174f5 100644 --- a/info.toml +++ b/info.toml @@ -619,22 +619,17 @@ name = "errors5" path = "exercises/error_handling/errors5.rs" mode = "compile" hint = """ -There are two different possible `Result` types produced within -`main()`, which are propagated using `?` operators. How do we declare a -return type from `main()` that allows both? +There are two different possible `Result` types produced within `main()`, which are +propagated using `?` operators. How do we declare a return type from `main()` that allows both? + +Under the hood, the `?` operator calls `From::from` on the error value to convert it to a boxed +trait object, a `Box`. This boxed trait object is polymorphic, and since all +errors implement the `error:Error` trait, we can capture lots of different errors in one "Box" +object. -Another hint: under the hood, the `?` operator calls `From::from` -on the error value to convert it to a boxed trait object, a -`Box`, which is polymorphic-- that means that lots of -different kinds of errors can be returned from the same function because -all errors act the same since they all implement the `error::Error` trait. Check out this section of the book: https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html#a-shortcut-for-propagating-errors-the--operator -This exercise uses some concepts that we won't get to until later in the -course, like `Box` and the `From` trait. It's not important to understand -them in detail right now, but you can read ahead if you like. - Read more about boxing errors: https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/boxing_errors.html From c34e2adcbb261f71fbd013d61257457dd84bd849 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 18:02:33 +0200 Subject: [PATCH 0586/1293] feat(errors): Improve comments and hints --- exercises/error_handling/errors1.rs | 2 +- exercises/error_handling/errors2.rs | 3 ++- exercises/error_handling/errors3.rs | 2 +- exercises/error_handling/errors4.rs | 3 ++- exercises/error_handling/errors5.rs | 2 +- exercises/error_handling/errors6.rs | 6 +++++- info.toml | 5 ++++- 7 files changed, 16 insertions(+), 7 deletions(-) diff --git a/exercises/error_handling/errors1.rs b/exercises/error_handling/errors1.rs index 1a2a8577..bcee9723 100644 --- a/exercises/error_handling/errors1.rs +++ b/exercises/error_handling/errors1.rs @@ -3,7 +3,7 @@ // you pass it an empty string. It'd be nicer if it explained what the problem // was, instead of just sometimes returning `None`. Thankfully, Rust has a similar // construct to `Option` that can be used to express error conditions. Let's use it! -// Execute `rustlings hint errors1` for hints! +// Execute `rustlings hint errors1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/error_handling/errors2.rs b/exercises/error_handling/errors2.rs index aad3a93f..1cd8fc66 100644 --- a/exercises/error_handling/errors2.rs +++ b/exercises/error_handling/errors2.rs @@ -14,7 +14,8 @@ // and add. // There are at least two ways to implement this that are both correct-- but -// one is a lot shorter! Execute `rustlings hint errors2` for hints to both ways. +// one is a lot shorter! +// Execute `rustlings hint errors2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/error_handling/errors3.rs b/exercises/error_handling/errors3.rs index 460ac5c4..a2d2d190 100644 --- a/exercises/error_handling/errors3.rs +++ b/exercises/error_handling/errors3.rs @@ -2,7 +2,7 @@ // This is a program that is trying to use a completed version of the // `total_cost` function from the previous exercise. It's not working though! // Why not? What should we do to fix it? -// Execute `rustlings hint errors3` for hints! +// Execute `rustlings hint errors3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/error_handling/errors4.rs b/exercises/error_handling/errors4.rs index 0685c374..0efe8ccd 100644 --- a/exercises/error_handling/errors4.rs +++ b/exercises/error_handling/errors4.rs @@ -1,5 +1,5 @@ // errors4.rs -// Make this test pass! Execute `rustlings hint errors4` for hints :) +// Execute `rustlings hint errors4` or use the `hint` watch subcommand for a hint. // I AM NOT DONE @@ -14,6 +14,7 @@ enum CreationError { impl PositiveNonzeroInteger { fn new(value: i64) -> Result { + // Hmm...? Why is this only returning an Ok value? Ok(PositiveNonzeroInteger(value as u64)) } } diff --git a/exercises/error_handling/errors5.rs b/exercises/error_handling/errors5.rs index 9d5ee4b7..67411c58 100644 --- a/exercises/error_handling/errors5.rs +++ b/exercises/error_handling/errors5.rs @@ -12,7 +12,7 @@ // What can we use to describe both errors? In other words, is there a trait which both errors implement? -// Execute `rustlings hint errors5` for hints! +// Execute `rustlings hint errors5` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/error_handling/errors6.rs b/exercises/error_handling/errors6.rs index 847a049a..1306fb03 100644 --- a/exercises/error_handling/errors6.rs +++ b/exercises/error_handling/errors6.rs @@ -6,7 +6,7 @@ // we define a custom error type to make it possible for callers to decide // what to do next when our function returns an error. -// Make these tests pass! Execute `rustlings hint errors6` for hints :) +// Execute `rustlings hint errors6` or use the `hint` watch subcommand for a hint. // I AM NOT DONE @@ -20,7 +20,11 @@ enum ParsePosNonzeroError { } impl ParsePosNonzeroError { + fn from_creation(err: CreationError) -> ParsePosNonzeroError { + ParsePosNonzeroError::Creation(err) + } // TODO: add another error conversion function here. + // fn from_parseint... } fn parse_pos_nonzero(s: &str) diff --git a/info.toml b/info.toml index 97c174f5..cb49a973 100644 --- a/info.toml +++ b/info.toml @@ -603,7 +603,10 @@ name = "errors3" path = "exercises/error_handling/errors3.rs" mode = "compile" hint = """ -If other functions can return a `Result`, why shouldn't `main`?""" +If other functions can return a `Result`, why shouldn't `main`? It's a fairly common +convention to return something like Result<(), ErrorType> from your main function. +The unit (`()`) type is there because nothing is really needed in terms of positive +results.""" [[exercises]] name = "errors4" From 5d02f6e5163f799b727e8baa9c12a5219da6941b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Jul 2022 16:03:14 +0000 Subject: [PATCH 0587/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4c1cba01..9952c333 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -184,6 +184,7 @@ authors.
Drew Morris

πŸ’»
camperdue42

πŸ–‹
YsuOS

πŸ–‹ +
Steven Nguyen

πŸ–‹ From 34c8833d066f54331292c80ed4d8e048e4048716 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Jul 2022 16:03:15 +0000 Subject: [PATCH 0588/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index eceb7666..a364a852 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1290,6 +1290,15 @@ "contributions": [ "content" ] + }, + { + "login": "icecream17", + "name": "Steven Nguyen", + "avatar_url": "https://avatars.githubusercontent.com/u/58114641?v=4", + "profile": "https://lichess.org/@/StevenEmily", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From b2c82d9018367e4237f4658dd3b49369cc406036 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Jul 2022 16:03:57 +0000 Subject: [PATCH 0589/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 9952c333..720db577 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -185,6 +185,7 @@ authors.
camperdue42

πŸ–‹
YsuOS

πŸ–‹
Steven Nguyen

πŸ–‹ +
nacairns1

πŸ–‹ From 537abe273a20adac617e4a81a6fb45fec86bc2c5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Jul 2022 16:03:58 +0000 Subject: [PATCH 0590/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a364a852..e2c0bc2a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1299,6 +1299,15 @@ "contributions": [ "content" ] + }, + { + "login": "nacairns1", + "name": "nacairns1", + "avatar_url": "https://avatars.githubusercontent.com/u/94420090?v=4", + "profile": "https://noahcairns.dev", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d61f79595a8929c118e76f78c6ec26ca49219062 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 18:11:05 +0200 Subject: [PATCH 0591/1293] feat(generics): add hint comments --- exercises/generics/generics1.rs | 2 +- exercises/generics/generics2.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/generics/generics1.rs b/exercises/generics/generics1.rs index f93e64a0..4c34ae47 100644 --- a/exercises/generics/generics1.rs +++ b/exercises/generics/generics1.rs @@ -1,7 +1,7 @@ // This shopping list program isn't compiling! // Use your knowledge of generics to fix it. -// Execute `rustlings hint generics1` for hints! +// Execute `rustlings hint generics1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/generics/generics2.rs b/exercises/generics/generics2.rs index 1501529c..aedbd55c 100644 --- a/exercises/generics/generics2.rs +++ b/exercises/generics/generics2.rs @@ -1,7 +1,7 @@ // This powerful wrapper provides the ability to store a positive integer value. // Rewrite it using generics so that it supports wrapping ANY type. -// Execute `rustlings hint generics2` for hints! +// Execute `rustlings hint generics2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE From 5979d408a9d3f174bf748b82d1a031a25b548af6 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 18:11:18 +0200 Subject: [PATCH 0592/1293] feat: move generics3 to be quiz3 --- exercises/generics/generics3.rs | 58 --------------------------------- exercises/quiz3.rs | 58 +++++++++++++++++++++++++-------- info.toml | 31 ++++++------------ 3 files changed, 55 insertions(+), 92 deletions(-) delete mode 100644 exercises/generics/generics3.rs diff --git a/exercises/generics/generics3.rs b/exercises/generics/generics3.rs deleted file mode 100644 index 64dd9bc1..00000000 --- a/exercises/generics/generics3.rs +++ /dev/null @@ -1,58 +0,0 @@ -// An imaginary magical school has a new report card generation system written in Rust! -// Currently the system only supports creating report cards where the student's grade -// is represented numerically (e.g. 1.0 -> 5.5). -// However, the school also issues alphabetical grades (A+ -> F-) and needs -// to be able to print both types of report card! - -// Make the necessary code changes in the struct ReportCard and the impl block -// to support alphabetical report cards. Change the Grade in the second test to "A+" -// to show that your changes allow alphabetical grades. - -// Execute 'rustlings hint generics3' for hints! - -// I AM NOT DONE - -pub struct ReportCard { - pub grade: f32, - pub student_name: String, - pub student_age: u8, -} - -impl ReportCard { - pub fn print(&self) -> String { - format!("{} ({}) - achieved a grade of {}", - &self.student_name, &self.student_age, &self.grade) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn generate_numeric_report_card() { - let report_card = ReportCard { - grade: 2.1, - student_name: "Tom Wriggle".to_string(), - student_age: 12, - }; - assert_eq!( - report_card.print(), - "Tom Wriggle (12) - achieved a grade of 2.1" - ); - } - - #[test] - fn generate_alphabetic_report_card() { - // TODO: Make sure to change the grade here after you finish the exercise. - let report_card = ReportCard { - grade: 2.1, - student_name: "Gary Plotter".to_string(), - student_age: 11, - }; - assert_eq!( - report_card.print(), - "Gary Plotter (11) - achieved a grade of A+" - ); - } -} diff --git a/exercises/quiz3.rs b/exercises/quiz3.rs index fae0eedb..15dc4699 100644 --- a/exercises/quiz3.rs +++ b/exercises/quiz3.rs @@ -1,16 +1,32 @@ // quiz3.rs -// This is a quiz for the following sections: -// - Tests +// This quiz tests: +// - Generics +// - Traits +// An imaginary magical school has a new report card generation system written in Rust! +// Currently the system only supports creating report cards where the student's grade +// is represented numerically (e.g. 1.0 -> 5.5). +// However, the school also issues alphabetical grades (A+ -> F-) and needs +// to be able to print both types of report card! -// This quiz isn't testing our function -- make it do that in such a way that -// the test passes. Then write a second test that tests that we get the result -// we expect to get when we call `times_two` with a negative number. -// No hints, you can do this :) +// Make the necessary code changes in the struct ReportCard and the impl block +// to support alphabetical report cards. Change the Grade in the second test to "A+" +// to show that your changes allow alphabetical grades. + +// Execute `rustlings hint quiz3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE -pub fn times_two(num: i32) -> i32 { - num * 2 +pub struct ReportCard { + pub grade: f32, + pub student_name: String, + pub student_age: u8, +} + +impl ReportCard { + pub fn print(&self) -> String { + format!("{} ({}) - achieved a grade of {}", + &self.student_name, &self.student_age, &self.grade) + } } #[cfg(test)] @@ -18,13 +34,29 @@ mod tests { use super::*; #[test] - fn returns_twice_of_positive_numbers() { - assert_eq!(times_two(4), ???); + fn generate_numeric_report_card() { + let report_card = ReportCard { + grade: 2.1, + student_name: "Tom Wriggle".to_string(), + student_age: 12, + }; + assert_eq!( + report_card.print(), + "Tom Wriggle (12) - achieved a grade of 2.1" + ); } #[test] - fn returns_twice_of_negative_numbers() { - // TODO replace unimplemented!() with an assert for `times_two(-4)` - unimplemented!() + fn generate_alphabetic_report_card() { + // TODO: Make sure to change the grade here after you finish the exercise. + let report_card = ReportCard { + grade: 2.1, + student_name: "Gary Plotter".to_string(), + student_age: 11, + }; + assert_eq!( + report_card.print(), + "Gary Plotter (11) - achieved a grade of A+" + ); } } diff --git a/info.toml b/info.toml index cb49a973..70f66e02 100644 --- a/info.toml +++ b/info.toml @@ -681,19 +681,6 @@ Maybe we could update the explicit references to this data type somehow? If you are still stuck https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-method-definitions """ -[[exercises]] -name = "generics3" -path = "exercises/generics/generics3.rs" -mode = "test" -hint = """ -To find the best solution to this challenge you're going to need to think back to your -knowledge of traits, specifically Trait Bound Syntax - you may also need this: "use std::fmt::Display;" - -This is definitely harder than the last two exercises! You need to think about not only making the -ReportCard struct generic, but also the correct property - you will need to change the implementation -of the struct slightly too...you can do it! -""" - # TRAITS [[exercises]] @@ -716,6 +703,16 @@ Try mutating the incoming string vector. Vectors provide suitable methods for adding an element at the end. See the documentation at: https://doc.rust-lang.org/std/vec/struct.Vec.html""" +# QUIZ 3 + +[[exercises]] +name = "quiz3" +path = "exercises/quiz3.rs" +mode = "test" +hint = """ +To find the best solution to this challenge you're going to need to think back to your +knowledge of traits, specifically Trait Bound Syntax - you may also need this: "use std::fmt::Display;"""" + # TESTS [[exercises]] @@ -748,14 +745,6 @@ You can call a function right where you're passing arguments to `assert!` -- so something like `assert!(having_fun())`. If you want to check that you indeed get false, you can negate the result of what you're doing using `!`, like `assert!(!having_fun())`.""" -# TEST 3 - -[[exercises]] -name = "quiz3" -path = "exercises/quiz3.rs" -mode = "test" -hint = "No hints this time ;)" - # STANDARD LIBRARY TYPES [[exercises]] From 98b8d3f17d770acf5e618f1e1e62696af6fb00cf Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 18:14:41 +0200 Subject: [PATCH 0593/1293] feat(traits): add hint comments --- exercises/traits/traits1.rs | 1 + exercises/traits/traits2.rs | 1 + info.toml | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/exercises/traits/traits1.rs b/exercises/traits/traits1.rs index 15e08f24..5b9d8d50 100644 --- a/exercises/traits/traits1.rs +++ b/exercises/traits/traits1.rs @@ -7,6 +7,7 @@ // The trait AppendBar has only one function, // which appends "Bar" to any object // implementing this trait. +// Execute `rustlings hint traits1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/traits/traits2.rs b/exercises/traits/traits2.rs index 916c3c4b..708bb19a 100644 --- a/exercises/traits/traits2.rs +++ b/exercises/traits/traits2.rs @@ -9,6 +9,7 @@ // // No boiler plate code this time, // you can do this! +// Execute `rustlings hint traits2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/info.toml b/info.toml index 70f66e02..0213878c 100644 --- a/info.toml +++ b/info.toml @@ -698,7 +698,8 @@ path = "exercises/traits/traits2.rs" mode = "test" hint = """ Notice how the trait takes ownership of 'self',and returns `Self'. -Try mutating the incoming string vector. +Try mutating the incoming string vector. Have a look at the tests to see +what the result should look like! Vectors provide suitable methods for adding an element at the end. See the documentation at: https://doc.rust-lang.org/std/vec/struct.Vec.html""" From 016d718a286f6ccacaecdaa81d9245e96424bae1 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 18:15:47 +0200 Subject: [PATCH 0594/1293] feat(tests): add hint comments --- exercises/tests/tests1.rs | 3 ++- exercises/tests/tests2.rs | 3 ++- exercises/tests/tests3.rs | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/exercises/tests/tests1.rs b/exercises/tests/tests1.rs index 50586a19..8b6ea374 100644 --- a/exercises/tests/tests1.rs +++ b/exercises/tests/tests1.rs @@ -4,7 +4,8 @@ // rustlings run tests1 // This test has a problem with it -- make the test compile! Make the test -// pass! Make the test fail! Execute `rustlings hint tests1` for hints :) +// pass! Make the test fail! +// Execute `rustlings hint tests1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/tests/tests2.rs b/exercises/tests/tests2.rs index 0d981ad1..a5ac15b1 100644 --- a/exercises/tests/tests2.rs +++ b/exercises/tests/tests2.rs @@ -1,6 +1,7 @@ // tests2.rs // This test has a problem with it -- make the test compile! Make the test -// pass! Make the test fail! Execute `rustlings hint tests2` for hints :) +// pass! Make the test fail! +// Execute `rustlings hint tests2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/tests/tests3.rs b/exercises/tests/tests3.rs index 3424f940..196a81a0 100644 --- a/exercises/tests/tests3.rs +++ b/exercises/tests/tests3.rs @@ -2,7 +2,7 @@ // This test isn't testing our function -- make it do that in such a way that // the test passes. Then write a second test that tests whether we get the result // we expect to get when we call `is_even(5)`. -// Execute `rustlings hint tests3` for hints :) +// Execute `rustlings hint tests3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE From cf9629cb0ea54220085cc33257613157ac830ab1 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 18:17:23 +0200 Subject: [PATCH 0595/1293] feat: move box/arc behind iterators --- exercises/standard_library_types/arc1.rs | 2 +- exercises/standard_library_types/box1.rs | 2 +- info.toml | 70 ++++++++++++------------ 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/exercises/standard_library_types/arc1.rs b/exercises/standard_library_types/arc1.rs index f60061e7..93a27036 100644 --- a/exercises/standard_library_types/arc1.rs +++ b/exercises/standard_library_types/arc1.rs @@ -16,7 +16,7 @@ // Make this code compile by filling in a value for `shared_numbers` where the // first TODO comment is, and create an initial binding for `child_numbers` // where the second TODO comment is. Try not to create any copies of the `numbers` Vec! -// Execute `rustlings hint arc1` for hints :) +// Execute `rustlings hint arc1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/standard_library_types/box1.rs b/exercises/standard_library_types/box1.rs index f312f3d6..9d9237c1 100644 --- a/exercises/standard_library_types/box1.rs +++ b/exercises/standard_library_types/box1.rs @@ -14,7 +14,7 @@ // // Note: the tests should not be changed // -// Execute `rustlings hint box1` for hints :) +// Execute `rustlings hint box1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/info.toml b/info.toml index 0213878c..1ba90d18 100644 --- a/info.toml +++ b/info.toml @@ -748,41 +748,6 @@ can negate the result of what you're doing using `!`, like `assert!(!having_fun( # STANDARD LIBRARY TYPES -[[exercises]] -name = "box1" -path = "exercises/standard_library_types/box1.rs" -mode = "test" -hint = """ -Step 1 -The compiler's message should help: since we cannot store the value of the actual type -when working with recursive types, we need to store a reference (pointer) to its value. -We should, therefore, place our `List` inside a `Box`. More details in the book here: -https://doc.rust-lang.org/book/ch15-01-box.html#enabling-recursive-types-with-boxes - -Step 2 -Creating an empty list should be fairly straightforward (hint: peek at the assertions). -For a non-empty list keep in mind that we want to use our Cons "list builder". -Although the current list is one of integers (i32), feel free to change the definition -and try other types! -""" - -[[exercises]] -name = "arc1" -path = "exercises/standard_library_types/arc1.rs" -mode = "compile" -hint = """ -Make `shared_numbers` be an `Arc` from the numbers vector. Then, in order -to avoid creating a copy of `numbers`, you'll need to create `child_numbers` -inside the loop but still in the main thread. - -`child_numbers` should be a clone of the Arc of the numbers instead of a -thread-local copy of the numbers. - -This is a simple exercise if you understand the underlying concepts, but if this -is too much of a struggle, consider reading through all of Chapter 16 in the book: -https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html -""" - [[exercises]] name = "iterators1" path = "exercises/standard_library_types/iterators1.rs" @@ -868,6 +833,41 @@ The fold method can be useful in the count_collection_iterator function. For a further challenge, consult the documentation for Iterator to find a different method that could make your code more compact than using fold.""" +[[exercises]] +name = "box1" +path = "exercises/standard_library_types/box1.rs" +mode = "test" +hint = """ +Step 1 +The compiler's message should help: since we cannot store the value of the actual type +when working with recursive types, we need to store a reference (pointer) to its value. +We should, therefore, place our `List` inside a `Box`. More details in the book here: +https://doc.rust-lang.org/book/ch15-01-box.html#enabling-recursive-types-with-boxes + +Step 2 +Creating an empty list should be fairly straightforward (hint: peek at the assertions). +For a non-empty list keep in mind that we want to use our Cons "list builder". +Although the current list is one of integers (i32), feel free to change the definition +and try other types! +""" + +[[exercises]] +name = "arc1" +path = "exercises/standard_library_types/arc1.rs" +mode = "compile" +hint = """ +Make `shared_numbers` be an `Arc` from the numbers vector. Then, in order +to avoid creating a copy of `numbers`, you'll need to create `child_numbers` +inside the loop but still in the main thread. + +`child_numbers` should be a clone of the Arc of the numbers instead of a +thread-local copy of the numbers. + +This is a simple exercise if you understand the underlying concepts, but if this +is too much of a struggle, consider reading through all of Chapter 16 in the book: +https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html +""" + # THREADS [[exercises]] From 3c63ef06683410b63f191b3e43a7e499e9a02d33 Mon Sep 17 00:00:00 2001 From: Ryosuke YASUOKA Date: Fri, 14 Jan 2022 00:26:46 +0900 Subject: [PATCH 0596/1293] fix(iterators3): insert todo!() into divide() to compile without error --- exercises/standard_library_types/iterators3.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exercises/standard_library_types/iterators3.rs b/exercises/standard_library_types/iterators3.rs index 8c66c05b..ec2e36d1 100644 --- a/exercises/standard_library_types/iterators3.rs +++ b/exercises/standard_library_types/iterators3.rs @@ -22,7 +22,9 @@ pub struct NotDivisibleError { // Calculate `a` divided by `b` if `a` is evenly divisible by `b`. // Otherwise, return a suitable error. -pub fn divide(a: i32, b: i32) -> Result {} +pub fn divide(a: i32, b: i32) -> Result { + todo!(); +} // Complete the function and return a value of the correct type so the test passes. // Desired output: Ok([1, 11, 1426, 3]) From 251d0dda345e6b3d067232a32db7afad098c8522 Mon Sep 17 00:00:00 2001 From: Paulo Gabriel Justino Bezerra Date: Thu, 13 Jan 2022 18:11:52 -0300 Subject: [PATCH 0597/1293] feat(iterators4): add factorial of zero test --- exercises/standard_library_types/iterators4.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/standard_library_types/iterators4.rs b/exercises/standard_library_types/iterators4.rs index 88862838..0b3b5d88 100644 --- a/exercises/standard_library_types/iterators4.rs +++ b/exercises/standard_library_types/iterators4.rs @@ -18,6 +18,11 @@ pub fn factorial(num: u64) -> u64 { mod tests { use super::*; + #[test] + fn factorial_of_0() { + assert_eq!(1, factorial(0)); + } + #[test] fn factorial_of_1() { assert_eq!(1, factorial(1)); From 20024d40c5e121202f283b420d7da1deecf4ebc0 Mon Sep 17 00:00:00 2001 From: mokou Date: Thu, 14 Jul 2022 18:29:09 +0200 Subject: [PATCH 0598/1293] feat(iterators): update hint comments --- exercises/standard_library_types/iterators1.rs | 2 +- exercises/standard_library_types/iterators2.rs | 2 +- exercises/standard_library_types/iterators3.rs | 2 +- exercises/standard_library_types/iterators4.rs | 1 + exercises/standard_library_types/iterators5.rs | 4 +++- info.toml | 7 +++++-- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/exercises/standard_library_types/iterators1.rs b/exercises/standard_library_types/iterators1.rs index 5aa49b64..0379c6bb 100644 --- a/exercises/standard_library_types/iterators1.rs +++ b/exercises/standard_library_types/iterators1.rs @@ -6,7 +6,7 @@ // This module helps you get familiar with the structure of using an iterator and // how to go through elements within an iterable collection. // -// Execute `rustlings hint iterators1` for hints :D +// Execute `rustlings hint iterators1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/standard_library_types/iterators2.rs b/exercises/standard_library_types/iterators2.rs index 87b4eaa1..29c53afb 100644 --- a/exercises/standard_library_types/iterators2.rs +++ b/exercises/standard_library_types/iterators2.rs @@ -1,7 +1,7 @@ // iterators2.rs // In this exercise, you'll learn some of the unique advantages that iterators // can offer. Follow the steps to complete the exercise. -// As always, there are hints if you execute `rustlings hint iterators2`! +// Execute `rustlings hint iterators2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/standard_library_types/iterators3.rs b/exercises/standard_library_types/iterators3.rs index ec2e36d1..c97a6258 100644 --- a/exercises/standard_library_types/iterators3.rs +++ b/exercises/standard_library_types/iterators3.rs @@ -4,7 +4,7 @@ // 1. Complete the divide function to get the first four tests to pass. // 2. Get the remaining tests to pass by completing the result_with_list and // list_of_results functions. -// Execute `rustlings hint iterators3` to get some hints! +// Execute `rustlings hint iterators3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/standard_library_types/iterators4.rs b/exercises/standard_library_types/iterators4.rs index 0b3b5d88..a02470ec 100644 --- a/exercises/standard_library_types/iterators4.rs +++ b/exercises/standard_library_types/iterators4.rs @@ -1,4 +1,5 @@ // iterators4.rs +// Execute `rustlings hint iterators4` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/standard_library_types/iterators5.rs b/exercises/standard_library_types/iterators5.rs index 93f3ae11..0593d123 100644 --- a/exercises/standard_library_types/iterators5.rs +++ b/exercises/standard_library_types/iterators5.rs @@ -6,7 +6,7 @@ // imperative style for loops. Recreate this counting functionality using // iterators. Only the two iterator methods (count_iterator and // count_collection_iterator) need to be modified. -// Execute `rustlings hint iterators5` for hints. +// Execute `rustlings hint iterators5` or use the `hint` watch subcommand for a hint. // // Make the code compile and the tests pass. @@ -34,6 +34,7 @@ fn count_for(map: &HashMap, value: Progress) -> usize { fn count_iterator(map: &HashMap, value: Progress) -> usize { // map is a hashmap with String keys and Progress values. // map = { "variables1": Complete, "from_str": None, ... } + todo!(); } fn count_collection_for(collection: &[HashMap], value: Progress) -> usize { @@ -52,6 +53,7 @@ fn count_collection_iterator(collection: &[HashMap], value: Pr // collection is a slice of hashmaps. // collection = [{ "variables1": Complete, "from_str": None, ... }, // { "variables2": Complete, ... }, ... ] + todo!(); } #[cfg(test)] diff --git a/info.toml b/info.toml index 1ba90d18..33f126e1 100644 --- a/info.toml +++ b/info.toml @@ -802,7 +802,8 @@ case is a vector of integers and the failure case is a DivisionError. The list_of_results function needs to return a vector of results. See https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect for how -the `FromIterator` trait is used in `collect()`.""" +the `FromIterator` trait is used in `collect()`. This trait is REALLY powerful! It +can make the solution to this exercise infinitely easier.""" [[exercises]] name = "iterators4" @@ -812,7 +813,9 @@ hint = """ In an imperative language, you might write a for loop that updates a mutable variable. Or, you might write code utilizing recursion and a match clause. In Rust you can take another functional -approach, computing the factorial elegantly with ranges and iterators.""" +approach, computing the factorial elegantly with ranges and iterators. + +Hint 2: Check out the `fold` and `rfold` methods!""" [[exercises]] name = "iterators5" From 3e7e65b9f0e6e9a2f8ddd55f8403a5e3c2c852da Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Jul 2022 16:29:50 +0000 Subject: [PATCH 0599/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 720db577..229e0759 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -186,6 +186,7 @@ authors.
YsuOS

πŸ–‹
Steven Nguyen

πŸ–‹
nacairns1

πŸ–‹ +
Paulo Gabriel Justino Bezerra

πŸ–‹ From 09ccadeec64e447a07868f4abd1cc2af577623de Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 14 Jul 2022 16:29:51 +0000 Subject: [PATCH 0600/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e2c0bc2a..ddd5d057 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1308,6 +1308,15 @@ "contributions": [ "content" ] + }, + { + "login": "pgjbz", + "name": "Paulo Gabriel Justino Bezerra", + "avatar_url": "https://avatars.githubusercontent.com/u/22059237?v=4", + "profile": "https://github.com/pgjbz", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From b4f52cb937e9f2b90913402964ae014240705a5f Mon Sep 17 00:00:00 2001 From: jaystile <46078028+jaystile@users.noreply.github.com> Date: Thu, 23 Dec 2021 06:19:39 -0800 Subject: [PATCH 0601/1293] feat: Adding threads1.rs with a focus on JoinHandles and waiting for spawned threads to finish. Moved the original threads1.rs to threads2.rs with the focus on the Mutex and modifying shared data. #892 --- exercises/threads/threads1.rs | 39 +++++++++++++++++------------------ exercises/threads/threads2.rs | 34 ++++++++++++++++++++++++++++++ info.toml | 24 ++++++++++++++------- 3 files changed, 69 insertions(+), 28 deletions(-) create mode 100644 exercises/threads/threads2.rs diff --git a/exercises/threads/threads1.rs b/exercises/threads/threads1.rs index f31b317e..ddb61552 100644 --- a/exercises/threads/threads1.rs +++ b/exercises/threads/threads1.rs @@ -1,32 +1,31 @@ // threads1.rs -// Make this compile! Execute `rustlings hint threads1` for hints :) -// The idea is the thread spawned on line 22 is completing jobs while the main thread is -// monitoring progress until 10 jobs are completed. Because of the difference between the -// spawned threads' sleep time, and the waiting threads sleep time, when you see 6 lines -// of "waiting..." and the program ends without timing out when running, -// you've got it :) +// Make this compile and run! Execute 'rustlings hint threads1' for hints :) +// This program should wait until all the spawned threads have finished before exiting. // I AM NOT DONE -use std::sync::Arc; use std::thread; use std::time::Duration; -struct JobStatus { - jobs_completed: u32, -} fn main() { - let status = Arc::new(JobStatus { jobs_completed: 0 }); - let status_shared = status.clone(); - thread::spawn(move || { - for _ in 0..10 { + + let mut handles = vec![]; + for i in 0..10 { + thread::spawn(move || { thread::sleep(Duration::from_millis(250)); - status_shared.jobs_completed += 1; - } - }); - while status.jobs_completed < 10 { - println!("waiting... "); - thread::sleep(Duration::from_millis(500)); + println!("thread {} is complete", i); + }); } + + let mut completed_threads = 0; + for handle in handles { + // TODO: a struct is returned from thread::spawn, can you use it? + completed_threads += 1; + } + + if completed_threads != 10 { + panic!("Oh no! All the spawned threads did not finish!"); + } + } diff --git a/exercises/threads/threads2.rs b/exercises/threads/threads2.rs new file mode 100644 index 00000000..2cb0d041 --- /dev/null +++ b/exercises/threads/threads2.rs @@ -0,0 +1,34 @@ +// threads2.rs +// Make this compile! Execute `rustlings hint threads2` for hints :) +// Building on the last exercise, we want all of the threads to complete their work but this time +// the spawned threads need to be in charge of updating a shared value: JobStatus.jobs_completed + +// I AM NOT DONE + +use std::sync::Arc; +use std::thread; +use std::time::Duration; + +struct JobStatus { + jobs_completed: u32, +} + +fn main() { + let status = Arc::new(JobStatus { jobs_completed: 0 }); + let mut handles = vec![]; + for _ in 0..10 { + let status_shared = status.clone(); + let handle = thread::spawn(move || { + thread::sleep(Duration::from_millis(250)); + // TODO: You must take an action before you update a shared value + status_shared.jobs_completed += 1; + }); + handles.push(handle); + } + for handle in handles { + handle.join().unwrap(); + // TODO: Print the value of the JobStatus.jobs_completed. Did you notice anything + // interesting in the output? Do you have to 'join' on all the handles? + println!("jobs completed {}", ???); + } +} diff --git a/info.toml b/info.toml index 33f126e1..94d5bf86 100644 --- a/info.toml +++ b/info.toml @@ -878,6 +878,22 @@ name = "threads1" path = "exercises/threads/threads1.rs" mode = "compile" hint = """ +`JoinHandle` is a struct that is returned from a spawned thread: +https://doc.rust-lang.org/std/thread/fn.spawn.html + +A challenge with multi-threaded applications is that the main thread can +finish before the spawned threads are completed. +https://doc.rust-lang.org/book/ch16-01-threads.html#waiting-for-all-threads-to-finish-using-join-handle + +Collect the JoinHandles and wait for them to finish. +https://doc.rust-lang.org/std/thread/struct.JoinHandle.html +""" + +[[exercises]] +name = "threads2" +path = "exercises/threads/threads2.rs" +mode = "compile" +hint = """ `Arc` is an Atomic Reference Counted pointer that allows safe, shared access to **immutable** data. But we want to *change* the number of `jobs_completed` so we'll need to also use another type that will only allow one thread to @@ -898,14 +914,6 @@ while they are sleeping, since this will prevent the other thread from being allowed to get the lock. Locks are automatically released when they go out of scope. -Ok, so, real talk, this was actually tricky for *me* to do too. And -I could see a lot of different problems you might run into, so at this -point I'm not sure which one you've hit :) - -Please open an issue if you're still running into a problem that -these hints are not helping you with, or if you've looked at the sample -answers and don't understand why they work and yours doesn't. - If you've learned from the sample solutions, I encourage you to come back to this exercise and try it again in a few days to reinforce what you've learned :)""" From f99eafc56f49852d4b801b5c4cfedf47ef4968ae Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 11:59:53 +0200 Subject: [PATCH 0602/1293] fix(threads): add hint comments --- exercises/threads/threads1.rs | 2 +- exercises/threads/threads2.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/threads/threads1.rs b/exercises/threads/threads1.rs index ddb61552..e59f4ce4 100644 --- a/exercises/threads/threads1.rs +++ b/exercises/threads/threads1.rs @@ -1,5 +1,5 @@ // threads1.rs -// Make this compile and run! Execute 'rustlings hint threads1' for hints :) +// Execute `rustlings hint threads1` or use the `hint` watch subcommand for a hint. // This program should wait until all the spawned threads have finished before exiting. // I AM NOT DONE diff --git a/exercises/threads/threads2.rs b/exercises/threads/threads2.rs index 2cb0d041..d0f8578f 100644 --- a/exercises/threads/threads2.rs +++ b/exercises/threads/threads2.rs @@ -1,5 +1,5 @@ // threads2.rs -// Make this compile! Execute `rustlings hint threads2` for hints :) +// Execute `rustlings hint threads2` or use the `hint` watch subcommand for a hint. // Building on the last exercise, we want all of the threads to complete their work but this time // the spawned threads need to be in charge of updating a shared value: JobStatus.jobs_completed From 7b371afc0638ddb56dc7c706384272a886fce3c6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 10:01:48 +0000 Subject: [PATCH 0603/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 229e0759..53044946 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -187,6 +187,7 @@ authors.
Steven Nguyen

πŸ–‹
nacairns1

πŸ–‹
Paulo Gabriel Justino Bezerra

πŸ–‹ +
Jason

πŸ–‹ From b1f82890c9aaec6f642b71c99c11712d965b35cb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 10:01:49 +0000 Subject: [PATCH 0604/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ddd5d057..7bdfe974 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1317,6 +1317,15 @@ "contributions": [ "content" ] + }, + { + "login": "jaystile", + "name": "Jason", + "avatar_url": "https://avatars.githubusercontent.com/u/46078028?v=4", + "profile": "https://github.com/jaystile", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d3a335bc64234738adb9d7514a5930bd6f9d38ee Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 12:05:26 +0200 Subject: [PATCH 0605/1293] feat(macros): add hint comments --- exercises/macros/macros1.rs | 2 +- exercises/macros/macros2.rs | 2 +- exercises/macros/macros3.rs | 2 +- exercises/macros/macros4.rs | 2 +- info.toml | 7 ++++++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/exercises/macros/macros1.rs b/exercises/macros/macros1.rs index ed0dac85..634d0a70 100644 --- a/exercises/macros/macros1.rs +++ b/exercises/macros/macros1.rs @@ -1,5 +1,5 @@ // macros1.rs -// Make me compile! Execute `rustlings hint macros1` for hints :) +// Execute `rustlings hint macros1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/macros/macros2.rs b/exercises/macros/macros2.rs index d0be1236..f6092cab 100644 --- a/exercises/macros/macros2.rs +++ b/exercises/macros/macros2.rs @@ -1,5 +1,5 @@ // macros2.rs -// Make me compile! Execute `rustlings hint macros2` for hints :) +// Execute `rustlings hint macros2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/macros/macros3.rs b/exercises/macros/macros3.rs index 93a43113..106f1c6d 100644 --- a/exercises/macros/macros3.rs +++ b/exercises/macros/macros3.rs @@ -1,6 +1,6 @@ // macros3.rs // Make me compile, without taking the macro out of the module! -// Execute `rustlings hint macros3` for hints :) +// Execute `rustlings hint macros3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/macros/macros4.rs b/exercises/macros/macros4.rs index 3a748078..c1fc5e8b 100644 --- a/exercises/macros/macros4.rs +++ b/exercises/macros/macros4.rs @@ -1,5 +1,5 @@ // macros4.rs -// Make me compile! Execute `rustlings hint macros4` for hints :) +// Execute `rustlings hint macros4` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/info.toml b/info.toml index 94d5bf86..1e7fa1ad 100644 --- a/info.toml +++ b/info.toml @@ -958,7 +958,12 @@ mode = "compile" hint = """ You only need to add a single character to make this compile. The way macros are written, it wants to see something between each -"macro arm", so it can separate them.""" +"macro arm", so it can separate them. + +That's all the macro exercises we have in here, but it's barely even +scratching the surface of what you can do with Rust's macros. For a more +thorough introduction, you can have a read through the little book of Rust +macros: https://veykril.github.io/tlborm/""" # TEST 4 From 7fc393bed4689d4e106a199dd956bef796976935 Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 12:13:40 +0200 Subject: [PATCH 0606/1293] chore: remove quiz4 --- exercises/quiz4.rs | 23 ----------------------- info.toml | 8 -------- 2 files changed, 31 deletions(-) delete mode 100644 exercises/quiz4.rs diff --git a/exercises/quiz4.rs b/exercises/quiz4.rs deleted file mode 100644 index 6c47480d..00000000 --- a/exercises/quiz4.rs +++ /dev/null @@ -1,23 +0,0 @@ -// quiz4.rs -// This quiz covers the sections: -// - Modules -// - Macros - -// Write a macro that passes the quiz! No hints this time, you can do it! - -// I AM NOT DONE - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_my_macro_world() { - assert_eq!(my_macro!("world!"), "Hello world!"); - } - - #[test] - fn test_my_macro_goodbye() { - assert_eq!(my_macro!("goodbye!"), "Hello goodbye!"); - } -} diff --git a/info.toml b/info.toml index 1e7fa1ad..95674955 100644 --- a/info.toml +++ b/info.toml @@ -965,14 +965,6 @@ scratching the surface of what you can do with Rust's macros. For a more thorough introduction, you can have a read through the little book of Rust macros: https://veykril.github.io/tlborm/""" -# TEST 4 - -[[exercises]] -name = "quiz4" -path = "exercises/quiz4.rs" -mode = "test" -hint = "No hints this time ;)" - # CLIPPY [[exercises]] From 8cfedb16738e613ab90894386e299f5cb6292932 Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 12:28:47 +0200 Subject: [PATCH 0607/1293] feat(clippy): add clippy3 --- .gitignore | 1 + exercises/clippy/clippy1.rs | 2 +- exercises/clippy/clippy2.rs | 2 +- exercises/clippy/clippy3.rs | 26 ++++++++++++++++++++++++++ info.toml | 6 ++++++ 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 exercises/clippy/clippy3.rs diff --git a/.gitignore b/.gitignore index 253d85bd..534453bc 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ rust-project.json .idea .vscode *.iml +*.o diff --git a/exercises/clippy/clippy1.rs b/exercises/clippy/clippy1.rs index c5f84a9c..bad46891 100644 --- a/exercises/clippy/clippy1.rs +++ b/exercises/clippy/clippy1.rs @@ -4,7 +4,7 @@ // // For these exercises the code will fail to compile when there are clippy warnings // check clippy's suggestions from the output to solve the exercise. -// Execute `rustlings hint clippy1` for hints :) +// Execute `rustlings hint clippy1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/clippy/clippy2.rs b/exercises/clippy/clippy2.rs index 37af9ed0..dac40dbe 100644 --- a/exercises/clippy/clippy2.rs +++ b/exercises/clippy/clippy2.rs @@ -1,5 +1,5 @@ // clippy2.rs -// Make me compile! Execute `rustlings hint clippy2` for hints :) +// Execute `rustlings hint clippy2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/clippy/clippy3.rs b/exercises/clippy/clippy3.rs new file mode 100644 index 00000000..13733c0b --- /dev/null +++ b/exercises/clippy/clippy3.rs @@ -0,0 +1,26 @@ +// clippy3.rs +// Here's a couple more easy Clippy fixes, so you can see its utility. + +#[allow(unused_variables, unused_assignments)] +fn main() { + let my_option: Option<()> = None; + if my_option.is_none() { + my_option.unwrap(); + } + + let my_arr = &[ + -1, -2, -3 + -4, -5, -6 + ]; + println!("My array! Here it is: {:?}", my_arr); + + let my_empty_vec = vec![1, 2, 3, 4, 5].resize(0, 5); + println!("This Vec is empty, see? {:?}", my_empty_vec); + + let mut value_a = 45; + let mut value_b = 66; + // Let's swap these two! + value_a = value_b; + value_b = value_a; + println!("value a: {}; value b: {}", value_a, value_b); +} diff --git a/info.toml b/info.toml index 95674955..3c37f95b 100644 --- a/info.toml +++ b/info.toml @@ -989,6 +989,12 @@ mode = "clippy" hint = """ `for` loops over Option values are more clearly expressed as an `if let`""" +[[exercises]] +name = "clippy3" +path = "exercises/clippy/clippy3.rs" +mode = "clippy" +hint = "No hints this time!" + # TYPE CONVERSIONS [[exercises]] From 74f44f55e381384dc89ec421568aa1509cd7f277 Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 12:34:10 +0200 Subject: [PATCH 0608/1293] feat(conversions): add hint comments --- exercises/conversions/from_into.rs | 2 ++ exercises/conversions/from_str.rs | 5 +++++ exercises/conversions/try_from_into.rs | 2 ++ exercises/conversions/using_as.rs | 1 + 4 files changed, 10 insertions(+) diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs index 9d84174d..6c272c3b 100644 --- a/exercises/conversions/from_into.rs +++ b/exercises/conversions/from_into.rs @@ -1,6 +1,8 @@ // The From trait is used for value-to-value conversions. // If From is implemented correctly for a type, the Into trait should work conversely. // You can read more about it at https://doc.rust-lang.org/std/convert/trait.From.html +// Execute `rustlings hint from_into` or use the `hint` watch subcommand for a hint. + #[derive(Debug)] struct Person { name: String, diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index ece0b3cf..fe168159 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -4,6 +4,8 @@ // Additionally, upon implementing FromStr, you can use the `parse` method // on strings to generate an object of the implementor type. // You can read more about it at https://doc.rust-lang.org/std/str/trait.FromStr.html +// Execute `rustlings hint from_str` or use the `hint` watch subcommand for a hint. + use std::num::ParseIntError; use std::str::FromStr; @@ -37,6 +39,9 @@ enum ParsePersonError { // with something like `"4".parse::()` // 6. If while extracting the name and the age something goes wrong, an error should be returned // If everything goes well, then return a Result of a Person object +// +// As an aside: `Box` implements `From<&'_ str>`. This means that if you want to return a +// string error message, you can do so via just using return `Err("my error message".into())`. impl FromStr for Person { type Err = ParsePersonError; diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index b8ec4455..09f730eb 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -3,6 +3,8 @@ // Basically, this is the same as From. The main difference is that this should return a Result type // instead of the target type itself. // You can read more about it at https://doc.rust-lang.org/std/convert/trait.TryFrom.html +// Execute `rustlings hint from_str` or use the `hint` watch subcommand for a hint. + use std::convert::{TryFrom, TryInto}; #[derive(Debug, PartialEq)] diff --git a/exercises/conversions/using_as.rs b/exercises/conversions/using_as.rs index f3f745ff..8c9b7113 100644 --- a/exercises/conversions/using_as.rs +++ b/exercises/conversions/using_as.rs @@ -4,6 +4,7 @@ // // The goal is to make sure that the division does not fail to compile // and returns the proper type. +// Execute `rustlings hint using_as` or use the `hint` watch subcommand for a hint. // I AM NOT DONE From 81d25aecff01643221131743b48f6b63377eeb59 Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 12:49:49 +0200 Subject: [PATCH 0609/1293] feat(try_from_into): add hint comments --- exercises/conversions/try_from_into.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index 09f730eb..bc71a3c3 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -3,7 +3,7 @@ // Basically, this is the same as From. The main difference is that this should return a Result type // instead of the target type itself. // You can read more about it at https://doc.rust-lang.org/std/convert/trait.TryFrom.html -// Execute `rustlings hint from_str` or use the `hint` watch subcommand for a hint. +// Execute `rustlings hint try_from_into` or use the `hint` watch subcommand for a hint. use std::convert::{TryFrom, TryInto}; From 4bebdb5f02f492081568900b739ad76dc05ea4ef Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 12:50:01 +0200 Subject: [PATCH 0610/1293] feat(as_ref_mut): add AsMut section --- exercises/conversions/as_ref_mut.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index 84f4a60c..9f479739 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -1,6 +1,7 @@ // AsRef and AsMut allow for cheap reference-to-reference conversions. // Read more about them at https://doc.rust-lang.org/std/convert/trait.AsRef.html // and https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively. +// Execute `rustlings hint as_ref_mut` or use the `hint` watch subcommand for a hint. // I AM NOT DONE @@ -16,10 +17,10 @@ fn char_counter(arg: T) -> usize { arg.as_ref().chars().count() } -fn main() { - let s = "CafΓ© au lait"; - println!("{}", char_counter(s)); - println!("{}", byte_counter(s)); +// Squares a number using AsMut. Add the trait bound as is appropriate and +// implement the function body. +fn num_sq(arg: &mut T) { + ??? } #[cfg(test)] @@ -49,4 +50,11 @@ mod tests { let s = String::from("Cafe au lait"); assert_eq!(char_counter(s.clone()), byte_counter(s)); } + + #[test] + fn mult_box() { + let mut num: Box = Box::new(3); + num_sq(&mut num); + assert_eq!(*num, 9); + } } From b609f0431c0031c8aa9113fea4de4b23db05cf77 Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 12:51:12 +0200 Subject: [PATCH 0611/1293] feat: remove advanced_errs --- exercises/advanced_errors/advanced_errs1.rs | 98 ---------- exercises/advanced_errors/advanced_errs2.rs | 202 -------------------- info.toml | 52 ----- 3 files changed, 352 deletions(-) delete mode 100644 exercises/advanced_errors/advanced_errs1.rs delete mode 100644 exercises/advanced_errors/advanced_errs2.rs diff --git a/exercises/advanced_errors/advanced_errs1.rs b/exercises/advanced_errors/advanced_errs1.rs deleted file mode 100644 index 4bc7b635..00000000 --- a/exercises/advanced_errors/advanced_errs1.rs +++ /dev/null @@ -1,98 +0,0 @@ -// advanced_errs1.rs - -// Remember back in errors6, we had multiple mapping functions so that we -// could translate lower-level errors into our custom error type using -// `map_err()`? What if we could use the `?` operator directly instead? - -// Make this code compile! Execute `rustlings hint advanced_errs1` for -// hints :) - -// I AM NOT DONE - -use std::num::ParseIntError; -use std::str::FromStr; - -// This is a custom error type that we will be using in the `FromStr` -// implementation. -#[derive(PartialEq, Debug)] -enum ParsePosNonzeroError { - Creation(CreationError), - ParseInt(ParseIntError), -} - -impl From for ParsePosNonzeroError { - fn from(e: CreationError) -> Self { - // TODO: complete this implementation so that the `?` operator will - // work for `CreationError` - } -} - -// TODO: implement another instance of the `From` trait here so that the -// `?` operator will work in the other place in the `FromStr` -// implementation below. - -// Don't change anything below this line. - -impl FromStr for PositiveNonzeroInteger { - type Err = ParsePosNonzeroError; - fn from_str(s: &str) -> Result { - let x: i64 = s.parse()?; - Ok(PositiveNonzeroInteger::new(x)?) - } -} - -#[derive(PartialEq, Debug)] -struct PositiveNonzeroInteger(u64); - -#[derive(PartialEq, Debug)] -enum CreationError { - Negative, - Zero, -} - -impl PositiveNonzeroInteger { - fn new(value: i64) -> Result { - match value { - x if x < 0 => Err(CreationError::Negative), - x if x == 0 => Err(CreationError::Zero), - x => Ok(PositiveNonzeroInteger(x as u64)), - } - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_parse_error() { - // We can't construct a ParseIntError, so we have to pattern match. - assert!(matches!( - PositiveNonzeroInteger::from_str("not a number"), - Err(ParsePosNonzeroError::ParseInt(_)) - )); - } - - #[test] - fn test_negative() { - assert_eq!( - PositiveNonzeroInteger::from_str("-555"), - Err(ParsePosNonzeroError::Creation(CreationError::Negative)) - ); - } - - #[test] - fn test_zero() { - assert_eq!( - PositiveNonzeroInteger::from_str("0"), - Err(ParsePosNonzeroError::Creation(CreationError::Zero)) - ); - } - - #[test] - fn test_positive() { - let x = PositiveNonzeroInteger::new(42); - assert!(x.is_ok()); - assert_eq!(PositiveNonzeroInteger::from_str("42"), Ok(x.unwrap())); - } -} diff --git a/exercises/advanced_errors/advanced_errs2.rs b/exercises/advanced_errors/advanced_errs2.rs deleted file mode 100644 index 54e669fd..00000000 --- a/exercises/advanced_errors/advanced_errs2.rs +++ /dev/null @@ -1,202 +0,0 @@ -// advanced_errs2.rs - -// This exercise demonstrates a few traits that are useful for custom error -// types to implement, especially so that other code can consume the custom -// error type more usefully. - -// Make this compile, and make the tests pass! -// Execute `rustlings hint advanced_errs2` for hints. - -// Steps: -// 1. Implement a missing trait so that `main()` will compile. -// 2. Complete the partial implementation of `From` for -// `ParseClimateError`. -// 3. Handle the missing error cases in the `FromStr` implementation for -// `Climate`. -// 4. Complete the partial implementation of `Display` for -// `ParseClimateError`. - -// I AM NOT DONE - -use std::error::Error; -use std::fmt::{self, Display, Formatter}; -use std::num::{ParseFloatError, ParseIntError}; -use std::str::FromStr; - -// This is the custom error type that we will be using for the parser for -// `Climate`. -#[derive(Debug, PartialEq)] -enum ParseClimateError { - Empty, - BadLen, - NoCity, - ParseInt(ParseIntError), - ParseFloat(ParseFloatError), -} - -// This `From` implementation allows the `?` operator to work on -// `ParseIntError` values. -impl From for ParseClimateError { - fn from(e: ParseIntError) -> Self { - Self::ParseInt(e) - } -} - -// This `From` implementation allows the `?` operator to work on -// `ParseFloatError` values. -impl From for ParseClimateError { - fn from(e: ParseFloatError) -> Self { - // TODO: Complete this function - } -} - -// TODO: Implement a missing trait so that `main()` below will compile. It -// is not necessary to implement any methods inside the missing trait. - -// The `Display` trait allows for other code to obtain the error formatted -// as a user-visible string. -impl Display for ParseClimateError { - // TODO: Complete this function so that it produces the correct strings - // for each error variant. - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - // Imports the variants to make the following code more compact. - use ParseClimateError::*; - match self { - NoCity => write!(f, "no city name"), - ParseFloat(e) => write!(f, "error parsing temperature: {}", e), - } - } -} - -#[derive(Debug, PartialEq)] -struct Climate { - city: String, - year: u32, - temp: f32, -} - -// Parser for `Climate`. -// 1. Split the input string into 3 fields: city, year, temp. -// 2. Return an error if the string is empty or has the wrong number of -// fields. -// 3. Return an error if the city name is empty. -// 4. Parse the year as a `u32` and return an error if that fails. -// 5. Parse the temp as a `f32` and return an error if that fails. -// 6. Return an `Ok` value containing the completed `Climate` value. -impl FromStr for Climate { - type Err = ParseClimateError; - // TODO: Complete this function by making it handle the missing error - // cases. - fn from_str(s: &str) -> Result { - let v: Vec<_> = s.split(',').collect(); - let (city, year, temp) = match &v[..] { - [city, year, temp] => (city.to_string(), year, temp), - _ => return Err(ParseClimateError::BadLen), - }; - let year: u32 = year.parse()?; - let temp: f32 = temp.parse()?; - Ok(Climate { city, year, temp }) - } -} - -// Don't change anything below this line (other than to enable ignored -// tests). - -fn main() -> Result<(), Box> { - println!("{:?}", "Hong Kong,1999,25.7".parse::()?); - println!("{:?}", "".parse::()?); - Ok(()) -} - -#[cfg(test)] -mod test { - use super::*; - #[test] - fn test_empty() { - let res = "".parse::(); - assert_eq!(res, Err(ParseClimateError::Empty)); - assert_eq!(res.unwrap_err().to_string(), "empty input"); - } - #[test] - fn test_short() { - let res = "Boston,1991".parse::(); - assert_eq!(res, Err(ParseClimateError::BadLen)); - assert_eq!(res.unwrap_err().to_string(), "incorrect number of fields"); - } - #[test] - fn test_long() { - let res = "Paris,1920,17.2,extra".parse::(); - assert_eq!(res, Err(ParseClimateError::BadLen)); - assert_eq!(res.unwrap_err().to_string(), "incorrect number of fields"); - } - #[test] - fn test_no_city() { - let res = ",1997,20.5".parse::(); - assert_eq!(res, Err(ParseClimateError::NoCity)); - assert_eq!(res.unwrap_err().to_string(), "no city name"); - } - #[test] - fn test_parse_int_neg() { - let res = "Barcelona,-25,22.3".parse::(); - assert!(matches!(res, Err(ParseClimateError::ParseInt(_)))); - let err = res.unwrap_err(); - if let ParseClimateError::ParseInt(ref inner) = err { - assert_eq!( - err.to_string(), - format!("error parsing year: {}", inner.to_string()) - ); - } else { - unreachable!(); - }; - } - #[test] - fn test_parse_int_bad() { - let res = "Beijing,foo,15.0".parse::(); - assert!(matches!(res, Err(ParseClimateError::ParseInt(_)))); - let err = res.unwrap_err(); - if let ParseClimateError::ParseInt(ref inner) = err { - assert_eq!( - err.to_string(), - format!("error parsing year: {}", inner.to_string()) - ); - } else { - unreachable!(); - }; - } - #[test] - fn test_parse_float() { - let res = "Manila,2001,bar".parse::(); - assert!(matches!(res, Err(ParseClimateError::ParseFloat(_)))); - let err = res.unwrap_err(); - if let ParseClimateError::ParseFloat(ref inner) = err { - assert_eq!( - err.to_string(), - format!("error parsing temperature: {}", inner.to_string()) - ); - } else { - unreachable!(); - }; - } - #[test] - fn test_parse_good() { - let res = "Munich,2015,23.1".parse::(); - assert_eq!( - res, - Ok(Climate { - city: "Munich".to_string(), - year: 2015, - temp: 23.1, - }) - ); - } - #[test] - #[ignore] - fn test_downcast() { - let res = "SΓ£o Paulo,-21,28.5".parse::(); - assert!(matches!(res, Err(ParseClimateError::ParseInt(_)))); - let err = res.unwrap_err(); - let inner: Option<&(dyn Error + 'static)> = err.source(); - assert!(inner.is_some()); - assert!(inner.unwrap().is::()); - } -} diff --git a/info.toml b/info.toml index 3c37f95b..c239121d 100644 --- a/info.toml +++ b/info.toml @@ -1061,55 +1061,3 @@ path = "exercises/conversions/as_ref_mut.rs" mode = "test" hint = """ Add AsRef as a trait bound to the functions.""" - -# ADVANCED ERRORS - -[[exercises]] -name = "advanced_errs1" -path = "exercises/advanced_errors/advanced_errs1.rs" -mode = "test" -hint = """ -This exercise uses an updated version of the code in errors6. The parsing -code is now in an implementation of the `FromStr` trait. Note that the -parsing code uses `?` directly, without any calls to `map_err()`. There is -one partial implementation of the `From` trait example that you should -complete. - -Details: The `?` operator calls `From::from()` on the error type to convert -it to the error type of the return type of the surrounding function. - -Hint: You will need to write another implementation of `From` that has a -different input type. -""" - -[[exercises]] -name = "advanced_errs2" -path = "exercises/advanced_errors/advanced_errs2.rs" -mode = "test" -hint = """ -This exercise demonstrates a few traits that are useful for custom error -types to implement. These traits make it easier for other code to consume -the custom error type. - -Follow the steps in the comment near the top of the file. You will have to -supply a missing trait implementation, and complete a few incomplete ones. - -You may find these pages to be helpful references: -https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/define_error_type.html -https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/boxing_errors.html -https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/wrap_error.html - -Hint: What trait must our error type have for `main()` to return the return -type that it returns? - -Another hint: It's not necessary to implement any methods inside the missing -trait. (Some methods have default implementations that are supplied by the -trait.) - -Another hint: Consult the tests to determine which error variants (and which -error message text) to produce for certain error conditions. - -Challenge: There is one test that is marked `#[ignore]`. Can you supply the -missing code that will make it pass? You may want to consult the standard -library documentation for a certain trait for more hints. -""" From 0784f54141325bf9b6dbea886aaa5002f7cc9a75 Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 12:57:54 +0200 Subject: [PATCH 0612/1293] doc: update contributing --- CONTRIBUTING.md | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2ca0e341..cc8ac923 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,7 @@ _implement a new feature! ➑️ [open an Issue to discuss it first, then a Pull `rustlings` is basically a glorified `rustc` wrapper. Therefore the source code isn't really that complicated since the bulk of the work is done by `rustc`. -`src/main.rs` contains a simple `clap` CLI that loads from `src/verify.rs` and `src/run.rs`. +`src/main.rs` contains a simple `argh` CLI that connects to most of the other source files. ### Adding an exercise @@ -29,7 +29,7 @@ isn't really that complicated since the bulk of the work is done by `rustc`. The first step is to add the exercise! Name the file `exercises/yourTopic/yourTopicN.rs`, make sure to put in some helpful links, and link to sections of the book in `exercises/yourTopic/README.md`. -Next make sure it runs with `rustlings`. The exercise metadata is stored in `info.toml`, under the `exercises` array. The order of the `exercises` array determines the order the exercises are run by `rustlings verify`. +Next make sure it runs with `rustlings`. The exercise metadata is stored in `info.toml`, under the `exercises` array. The order of the `exercises` array determines the order the exercises are run by `rustlings verify` and `rustlings watch`. Add the metadata for your exercise in the correct order in the `exercises` array. If you are unsure of the correct ordering, add it at the bottom and ask in your pull request. The exercise metadata should contain the following: ```diff @@ -43,7 +43,7 @@ Add the metadata for your exercise in the correct order in the `exercises` array ... ``` -The `mode` attribute decides whether Rustlings will only compile your exercise, or compile and test it. If you have tests to verify in your exercise, choose `test`, otherwise `compile`. +The `mode` attribute decides whether Rustlings will only compile your exercise, or compile and test it. If you have tests to verify in your exercise, choose `test`, otherwise `compile`. If you're working on a Clippy exercise, use `mode = "clippy"`. That's all! Feel free to put up a pull request. @@ -67,19 +67,19 @@ changes. There's a couple of things to watch out for: #### Write correct commit messages We follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0-beta.4/) -specification, because it makes it easier to generate changelogs automatically. +specification. This means that you have to format your commit messages in a specific way. Say you're working on adding a new exercise called `foobar1.rs`. You could write the following commit message: ``` -feat: Add foobar1.rs exercise +feat: add foobar1.rs exercise ``` If you're just fixing a bug, please use the `fix` type: ``` -fix(verify): Make sure verify doesn't self-destruct +fix(verify): make sure verify doesn't self-destruct ``` The scope within the brackets is optional, but should be any of these: @@ -96,7 +96,7 @@ When the commit also happens to close an existing issue, link it in the message body: ``` -fix: Update foobar +fix: update foobar closes #101029908 ``` @@ -104,13 +104,13 @@ closes #101029908 If you're doing simple changes, like updating a book link, use `chore`: ``` -chore: Update exercise1.rs book link +chore: update exercise1.rs book link ``` If you're updating documentation, use `docs`: ``` -docs: Add more information to Readme +docs: add more information to Readme ``` If, and only if, you're absolutely sure you want to make a breaking change @@ -118,7 +118,7 @@ If, and only if, you're absolutely sure you want to make a breaking change explain the breaking change in the message body: ``` -fix!: Completely change verification +fix!: completely change verification BREAKING CHANGE: This has to be done because lorem ipsum dolor ``` @@ -126,6 +126,5 @@ BREAKING CHANGE: This has to be done because lorem ipsum dolor #### Pull Request Workflow Once you open a Pull Request, it may be reviewed or labeled (or both) until -the maintainers accept your change. Then, [bors](https://github.com/bors) will -run the test suite with your changes and if it's successful, automatically -merge it in! +the maintainers accept your change. Please be patient, it may take some time +for this to happen! From a6e86fc995f8e6555b80dc5e73b4d7d78c050706 Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 13:22:29 +0200 Subject: [PATCH 0613/1293] doc: update readme --- README.md | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 12a77810..103aec8b 100644 --- a/README.md +++ b/README.md @@ -44,9 +44,9 @@ Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. -When you get a permission denied message then you have to exclude the directory where you placed the rustlings in your virus-scanner +If you get a permission denied message, you might have to exclude the directory where you cloned Rustlings in your antivirus. -## Browser: +## Browser [Run on Repl.it](https://repl.it/github/rust-lang/rustlings) @@ -150,24 +150,6 @@ cargo uninstall rustlings Now you should be done! -## Completion - -Rustlings isn't done; there are a couple of sections that are very experimental and don't have proper documentation. These include: - -- Errors (`exercises/errors/`) -- Option (`exercises/option/`) -- Result (`exercises/result/`) -- Move Semantics (could still be improved, `exercises/move_semantics/`) - -Additionally, we could use exercises on a couple of topics: - -- Structs -- Better ownership stuff -- `impl` -- ??? probably more - -If you are interested in improving or adding new ones, please feel free to contribute! Read on for more information :) - ## Contributing See [CONTRIBUTING.md](./CONTRIBUTING.md). From a3c4c1ccb4d7de6638b296387607c0a44b10e11f Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 13:24:11 +0200 Subject: [PATCH 0614/1293] fix: re-add missing done comments --- exercises/clippy/clippy3.rs | 2 ++ exercises/quiz2.rs | 2 ++ exercises/strings/strings3.rs | 2 ++ 3 files changed, 6 insertions(+) diff --git a/exercises/clippy/clippy3.rs b/exercises/clippy/clippy3.rs index 13733c0b..b0159ebe 100644 --- a/exercises/clippy/clippy3.rs +++ b/exercises/clippy/clippy3.rs @@ -1,6 +1,8 @@ // clippy3.rs // Here's a couple more easy Clippy fixes, so you can see its utility. +// I AM NOT DONE + #[allow(unused_variables, unused_assignments)] fn main() { let my_option: Option<()> = None; diff --git a/exercises/quiz2.rs b/exercises/quiz2.rs index 5d3ccc03..f7437fd2 100644 --- a/exercises/quiz2.rs +++ b/exercises/quiz2.rs @@ -18,6 +18,8 @@ // - The output element is going to be a Vector of strings. // Execute `rustlings hint quiz2` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + pub enum Command { Uppercase, Trim, diff --git a/exercises/strings/strings3.rs b/exercises/strings/strings3.rs index bb0a259e..9e25d307 100644 --- a/exercises/strings/strings3.rs +++ b/exercises/strings/strings3.rs @@ -1,6 +1,8 @@ // strings3.rs // Execute `rustlings hint strings3` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn trim_me(input: &str) -> String { // TODO: Remove whitespace from the end of a string! ??? From a3b5278b4259da83bad1f645e19ba6b0d36f4dde Mon Sep 17 00:00:00 2001 From: exdx Date: Fri, 15 Jul 2022 13:28:49 +0200 Subject: [PATCH 0615/1293] feat: add threads3.rs exercise --- exercises/threads/threads3.rs | 64 +++++++++++++++++++++++++++++++++++ info.toml | 14 ++++++++ 2 files changed, 78 insertions(+) create mode 100644 exercises/threads/threads3.rs diff --git a/exercises/threads/threads3.rs b/exercises/threads/threads3.rs new file mode 100644 index 00000000..27e99088 --- /dev/null +++ b/exercises/threads/threads3.rs @@ -0,0 +1,64 @@ +// threads3.rs +// Execute `rustlings hint threads3` or use the `hint` watch subcommand for a hint. + +// I AM NOT DONE + +use std::sync::mpsc; +use std::sync::Arc; +use std::thread; +use std::time::Duration; + +struct Queue { + length: u32, + first_half: Vec, + second_half: Vec, +} + +impl Queue { + fn new() -> Self { + Queue { + length: 10, + first_half: vec![1, 2, 3, 4, 5], + second_half: vec![6, 7, 8, 9, 10], + } + } +} + +fn send_tx(q: Queue, tx: mpsc::Sender) -> () { + let qc = Arc::new(q); + let qc1 = qc.clone(); + let qc2 = qc.clone(); + + thread::spawn(move || { + for val in &qc1.first_half { + println!("sending {:?}", val); + tx.send(*val).unwrap(); + thread::sleep(Duration::from_secs(1)); + } + }); + + thread::spawn(move || { + for val in &qc2.second_half { + println!("sending {:?}", val); + tx.send(*val).unwrap(); + thread::sleep(Duration::from_secs(1)); + } + }); +} + +fn main() { + let (tx, rx) = mpsc::channel(); + let queue = Queue::new(); + let queue_length = queue.length; + + send_tx(queue, tx); + + let mut total_received: u32 = 0; + for received in rx { + println!("Got: {}", received); + total_received += 1; + } + + println!("total numbers received: {}", total_received); + assert_eq!(total_received, queue_length) +} diff --git a/info.toml b/info.toml index c239121d..8871c15b 100644 --- a/info.toml +++ b/info.toml @@ -918,6 +918,20 @@ If you've learned from the sample solutions, I encourage you to come back to this exercise and try it again in a few days to reinforce what you've learned :)""" +[[exercises]] +name = "threads3" +path = "exercises/threads/threads3.rs" +mode = "compile" +hint = """ +An alternate way to handle concurrency between threads is to use +a mpsc (multiple producer, single consumer) channel to communicate. +With both a sending end and a receiving end, it's possible to +send values in one thread and receieve them in another. +Multiple producers are possibile by using clone() to create a duplicate +of the original sending end. +See https://doc.rust-lang.org/book/ch16-02-message-passing.html for more info. +""" + # MACROS [[exercises]] From b71429bef03158398dafc3e537fa6db1495622ff Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 11:29:44 +0000 Subject: [PATCH 0616/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 53044946..2bafe713 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -189,6 +189,9 @@ authors.
Paulo Gabriel Justino Bezerra

πŸ–‹
Jason

πŸ–‹ + +
exdx

πŸ–‹ + From c9332062ce3687905638c681140ad5d57ea162d8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 11:29:45 +0000 Subject: [PATCH 0617/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7bdfe974..523aff2d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1326,6 +1326,15 @@ "contributions": [ "content" ] + }, + { + "login": "exdx", + "name": "exdx", + "avatar_url": "https://avatars.githubusercontent.com/u/31546601?v=4", + "profile": "https://exdx.github.io", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 1cc5df0e144ef3551062c162e2e1618c27d97ae0 Mon Sep 17 00:00:00 2001 From: James Zow Date: Fri, 15 Jul 2022 13:46:03 +0200 Subject: [PATCH 0618/1293] feat: add github actions config --- .github/workflows/rust.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/rust.yml diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 00000000..bf2a041a --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,20 @@ +name: Rustlings Tests + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Build + run: cargo build --verbose + - name: Run tests + run: cargo test --verbose From bda4d548b4b4684be39153d3a6d63c047159167f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 11:49:08 +0000 Subject: [PATCH 0619/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 2bafe713..3f687161 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -191,6 +191,7 @@ authors.
exdx

πŸ–‹ +
James Zow

πŸ–‹ From 9329c51df0d2abc766a8fefc1eaac255d66370e9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 11:49:09 +0000 Subject: [PATCH 0620/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 523aff2d..c0097f7f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1335,6 +1335,15 @@ "contributions": [ "content" ] + }, + { + "login": "Jzow", + "name": "James Zow", + "avatar_url": "https://avatars.githubusercontent.com/u/68860495?v=4", + "profile": "https://github.com/Jzow", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 1ef8dacaf69e3ad1418355eeea128c00f09bdcb3 Mon Sep 17 00:00:00 2001 From: jayber Date: Fri, 15 Jul 2022 14:01:32 +0200 Subject: [PATCH 0621/1293] feat: add lifetimes exercises --- exercises/lifetimes/README.md | 17 +++++++++++++++++ exercises/lifetimes/lifetimes1.rs | 26 ++++++++++++++++++++++++++ exercises/lifetimes/lifetimes2.rs | 27 +++++++++++++++++++++++++++ exercises/lifetimes/lifetimes3.rs | 20 ++++++++++++++++++++ info.toml | 24 ++++++++++++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 exercises/lifetimes/README.md create mode 100644 exercises/lifetimes/lifetimes1.rs create mode 100644 exercises/lifetimes/lifetimes2.rs create mode 100644 exercises/lifetimes/lifetimes3.rs diff --git a/exercises/lifetimes/README.md b/exercises/lifetimes/README.md new file mode 100644 index 00000000..72befb3e --- /dev/null +++ b/exercises/lifetimes/README.md @@ -0,0 +1,17 @@ +# Lifetimes + +Lifetimes tell the compiler how to check whether references live long +enough to be valid in any given situation. For example lifetimes say +"make sure parameter 'a' lives as long as parameter 'b' so that the return +value is valid". + +They are only necessary on borrows, i.e. references, +since copied parameters or moves are owned in their scope and cannot +be referenced outside. Lifetimes mean that calling code of e.g. functions +can be checked to make sure their arguments are valid. Lifetimes are +restrictive of their callers. + +## Further information + +- [Validating References with Lifetimes](https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html) +- [Lifetimes (in Rust By Example)](https://doc.rust-lang.org/stable/rust-by-example/scope/lifetime.html) diff --git a/exercises/lifetimes/lifetimes1.rs b/exercises/lifetimes/lifetimes1.rs new file mode 100644 index 00000000..58e995c6 --- /dev/null +++ b/exercises/lifetimes/lifetimes1.rs @@ -0,0 +1,26 @@ +// lifetimes1.rs +// +// The Rust compiler needs to know how to check whether supplied references are +// valid, so that it can let the programmer know if a reference is at risk +// of going out of scope before it is used. Remember, references are borrows +// and do not own their own data. What if their owner goes out of scope? +// +// Execute `rustlings hint lifetimes1` or use the `hint` watch subcommand for a hint. + +// I AM NOT DONE + +fn longest(x: &str, y: &str) -> &str { + if x.len() > y.len() { + x + } else { + y + } +} + +fn main() { + let string1 = String::from("abcd"); + let string2 = "xyz"; + + let result = longest(string1.as_str(), string2); + println!("The longest string is {}", result); +} diff --git a/exercises/lifetimes/lifetimes2.rs b/exercises/lifetimes/lifetimes2.rs new file mode 100644 index 00000000..c73a28ad --- /dev/null +++ b/exercises/lifetimes/lifetimes2.rs @@ -0,0 +1,27 @@ +// lifetimes2.rs +// +// So if the compiler is just validating the references passed +// to the annotated parameters and the return type, what do +// we need to change? +// +// Execute `rustlings hint lifetimes2` or use the `hint` watch subcommand for a hint. + +// I AM NOT DONE + +fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { + if x.len() > y.len() { + x + } else { + y + } +} + +fn main() { + let string1 = String::from("long string is long"); + let result; + { + let string2 = String::from("xyz"); + result = longest(string1.as_str(), string2.as_str()); + } + println!("The longest string is {}", result); +} diff --git a/exercises/lifetimes/lifetimes3.rs b/exercises/lifetimes/lifetimes3.rs new file mode 100644 index 00000000..ea483708 --- /dev/null +++ b/exercises/lifetimes/lifetimes3.rs @@ -0,0 +1,20 @@ +// lifetimes3.rs +// +// Lifetimes are also needed when structs hold references. +// +// Execute `rustlings hint lifetimes3` or use the `hint` watch subcommand for a hint. + +// I AM NOT DONE + +struct Book { + author: &str, + title: &str, +} + +fn main() { + let name = String::from("Jill Smith"); + let title = String::from("Fish Flying"); + let book = Book { author: &name, title: &title }; + + println!("{} by {}", book.title, book.author); +} diff --git a/info.toml b/info.toml index 8871c15b..bc2a91c9 100644 --- a/info.toml +++ b/info.toml @@ -746,6 +746,30 @@ You can call a function right where you're passing arguments to `assert!` -- so something like `assert!(having_fun())`. If you want to check that you indeed get false, you can negate the result of what you're doing using `!`, like `assert!(!having_fun())`.""" +# LIFETIMES + +[[exercises]] +name = "lifetimes1" +path = "exercises/lifetimes/lifetimes1.rs" +mode = "compile" +hint = """ +Let the compiler guide you. Also take a look at the book if you need help: +https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html""" + +[[exercises]] +name = "lifetimes2" +path = "exercises/lifetimes/lifetimes2.rs" +mode = "compile" +hint = """ +What is the compiler checking? How could you change how long an owned variable lives?""" + +[[exercises]] +name = "lifetimes3" +path = "exercises/lifetimes/lifetimes3.rs" +mode = "compile" +hint = """ +If you use a lifetime annotation in a struct's fields, where else does it need to be added?""" + # STANDARD LIBRARY TYPES [[exercises]] From 75ba60bda652d29a58c46b4404dcf53dd6cbe691 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 12:05:35 +0000 Subject: [PATCH 0622/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 3f687161..a6451709 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -192,6 +192,7 @@ authors.
exdx

πŸ–‹
James Zow

πŸ–‹ +
James Bromley

πŸ–‹ From 2427184017cea2008277ccaf4da362e308a9ab88 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 12:05:36 +0000 Subject: [PATCH 0623/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c0097f7f..b9802601 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1344,6 +1344,15 @@ "contributions": [ "content" ] + }, + { + "login": "jayber", + "name": "James Bromley", + "avatar_url": "https://avatars.githubusercontent.com/u/2474334?v=4", + "profile": "https://jamesabromley.wordpress.com/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 9b66b2a0e981269c0b22e3b5b4057fb4c45fbba1 Mon Sep 17 00:00:00 2001 From: Rod Elias Date: Fri, 15 Jul 2022 14:08:51 +0200 Subject: [PATCH 0624/1293] fix(try_from_into): fix function name --- exercises/conversions/try_from_into.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index bc71a3c3..fa98bc90 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -56,7 +56,7 @@ impl TryFrom<&[i16]> for Color { } fn main() { - // Use the `from` function + // Use the `try_from` function let c1 = Color::try_from((183, 65, 14)); println!("{:?}", c1); From f43c6d78770ac90725490344dad98b9d3c076484 Mon Sep 17 00:00:00 2001 From: Sam White Date: Fri, 25 Feb 2022 16:40:38 +0000 Subject: [PATCH 0625/1293] feat: Add traits3.rs exercise --- exercises/traits/traits3.rs | 40 +++++++++++++++++++++++++++++++++++++ info.toml | 12 +++++++++++ 2 files changed, 52 insertions(+) create mode 100644 exercises/traits/traits3.rs diff --git a/exercises/traits/traits3.rs b/exercises/traits/traits3.rs new file mode 100644 index 00000000..917ded70 --- /dev/null +++ b/exercises/traits/traits3.rs @@ -0,0 +1,40 @@ +// traits3.rs +// +// Your task is to implement the Licensed trait for +// both structures and have them return the same +// information without writing the same function twice. +// +// Consider what you can add to the Licensed trait. + +// I AM NOT DONE + +pub trait Licensed { + fn licensing_info(&self) -> String; +} + +struct SomeSoftware { + version_number: i32, +} + +struct OtherSoftware { + version_number: String, +} + +impl Licensed for SomeSoftware {} // Don't edit this line +impl Licensed for OtherSoftware {} // Don't edit this line + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn is_licensing_info_the_same() { + let licensing_info = String::from("Some information"); + let some_software = SomeSoftware { version_number: 1 }; + let other_software = OtherSoftware { + version_number: "v2.0.0".to_string(), + }; + assert_eq!(some_software.licensing_info(), licensing_info); + assert_eq!(other_software.licensing_info(), licensing_info); + } +} diff --git a/info.toml b/info.toml index bc2a91c9..971f5155 100644 --- a/info.toml +++ b/info.toml @@ -704,6 +704,18 @@ what the result should look like! Vectors provide suitable methods for adding an element at the end. See the documentation at: https://doc.rust-lang.org/std/vec/struct.Vec.html""" +[[exercises]] +name = "traits3" +path = "exercises/traits/traits3.rs" +mode = "test" +hint = """ +Traits can have a default implementation for functions. Structs that implement +the trait can then use the default version of these functions if they choose not +implement the function themselves. + +See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#default-implementations +""" + # QUIZ 3 [[exercises]] From 599d634ee2277d1071dd803346993c24ab13462b Mon Sep 17 00:00:00 2001 From: Sam White Date: Fri, 25 Feb 2022 16:41:10 +0000 Subject: [PATCH 0626/1293] feat: Add traits4.rs exercise --- exercises/traits/traits4.rs | 44 +++++++++++++++++++++++++++++++++++++ info.toml | 11 ++++++++++ 2 files changed, 55 insertions(+) create mode 100644 exercises/traits/traits4.rs diff --git a/exercises/traits/traits4.rs b/exercises/traits/traits4.rs new file mode 100644 index 00000000..cc5fe168 --- /dev/null +++ b/exercises/traits/traits4.rs @@ -0,0 +1,44 @@ +// traits4.rs +// +// Your task is to replace the '??' sections so the code compiles. +// Don't change any line other than 21. + +// I AM NOT DONE + +pub trait Licensed { + fn licensing_info(&self) -> String { + "some information".to_string() + } +} + +struct SomeSoftware {} + +struct OtherSoftware {} + +impl Licensed for SomeSoftware {} +impl Licensed for OtherSoftware {} + +fn compare_license_types(software: ??, software_two: ??) -> bool { + software.licensing_info() == software_two.licensing_info() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn compare_license_information() { + let some_software = SomeSoftware {}; + let other_software = OtherSoftware {}; + + assert!(compare_license_types(some_software, other_software)); + } + + #[test] + fn compare_license_information_backwards() { + let some_software = SomeSoftware {}; + let other_software = OtherSoftware {}; + + assert!(compare_license_types(other_software, some_software)); + } +} diff --git a/info.toml b/info.toml index 971f5155..2ad9a0eb 100644 --- a/info.toml +++ b/info.toml @@ -716,6 +716,17 @@ implement the function themselves. See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#default-implementations """ +[[exercises]] +name = "traits4" +path = "exercises/traits/traits4.rs" +mode = "test" +hint = """ +Instead of using concrete types as parameters you can use traits. Try replacing the +'??' with 'impl ' + +See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters +""" + # QUIZ 3 [[exercises]] From 63b0c7e399ad11246bf5bf3acac4517f67c890da Mon Sep 17 00:00:00 2001 From: Sam White Date: Fri, 25 Feb 2022 16:41:36 +0000 Subject: [PATCH 0627/1293] feat: add traits5.rs exercise --- exercises/traits/traits5.rs | 31 +++++++++++++++++++++++++++++++ info.toml | 11 +++++++++++ 2 files changed, 42 insertions(+) create mode 100644 exercises/traits/traits5.rs diff --git a/exercises/traits/traits5.rs b/exercises/traits/traits5.rs new file mode 100644 index 00000000..ed2afb1e --- /dev/null +++ b/exercises/traits/traits5.rs @@ -0,0 +1,31 @@ +// traits5.rs +// +// Your task is to replace the '??' sections so the code compiles. +// Don't change any line other than 27. + +// I AM NOT DONE + +pub trait SomeTrait { + fn some_function(&self) -> bool { + true + } +} + +pub trait OtherTrait { + fn other_function(&self) -> bool { + true + } +} + +struct SomeStruct { + name: String, +} + +impl SomeTrait for SomeStruct {} +impl OtherTrait for SomeStruct {} + +fn some_func(item: ??) -> bool { + item.some_function() && item.other_function() +} + +fn main() {} diff --git a/info.toml b/info.toml index 2ad9a0eb..5b7b9b43 100644 --- a/info.toml +++ b/info.toml @@ -727,6 +727,17 @@ Instead of using concrete types as parameters you can use traits. Try replacing See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters """ +[[exercises]] +name = "traits5" +path = "exercises/traits/traits5.rs" +mode = "compile" +hint = """ +To ensure a paramter implements multiple traits use the '+ syntax'. Try replacing the +'??' with 'impl <> + <>'. + +See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#specifying-multiple-trait-bounds-with-the--syntax +""" + # QUIZ 3 [[exercises]] From 1a7a3f5c8e4544873d25ec5338dbdf366aba9f8a Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 15 Jul 2022 14:14:48 +0200 Subject: [PATCH 0628/1293] fix(traits): update hint comments --- exercises/traits/traits3.rs | 1 + exercises/traits/traits4.rs | 1 + exercises/traits/traits5.rs | 1 + 3 files changed, 3 insertions(+) diff --git a/exercises/traits/traits3.rs b/exercises/traits/traits3.rs index 917ded70..6d2fd6c3 100644 --- a/exercises/traits/traits3.rs +++ b/exercises/traits/traits3.rs @@ -5,6 +5,7 @@ // information without writing the same function twice. // // Consider what you can add to the Licensed trait. +// Execute `rustlings hint traits3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/traits/traits4.rs b/exercises/traits/traits4.rs index cc5fe168..280aaade 100644 --- a/exercises/traits/traits4.rs +++ b/exercises/traits/traits4.rs @@ -2,6 +2,7 @@ // // Your task is to replace the '??' sections so the code compiles. // Don't change any line other than 21. +// Execute `rustlings hint traits4` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/traits/traits5.rs b/exercises/traits/traits5.rs index ed2afb1e..290c0479 100644 --- a/exercises/traits/traits5.rs +++ b/exercises/traits/traits5.rs @@ -2,6 +2,7 @@ // // Your task is to replace the '??' sections so the code compiles. // Don't change any line other than 27. +// Execute `rustlings hint traits5` or use the `hint` watch subcommand for a hint. // I AM NOT DONE From 2b349e3b28d4d3aac2ba4c82590e64edfeb4217c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 12:15:56 +0000 Subject: [PATCH 0629/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index a6451709..f8de046d 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -193,6 +193,7 @@ authors.
exdx

πŸ–‹
James Zow

πŸ–‹
James Bromley

πŸ–‹ +
swhiteCQC

πŸ–‹ From 211528c31b08b727a955e0996d9a895f806d1097 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 12:15:57 +0000 Subject: [PATCH 0630/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b9802601..0c612452 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1353,6 +1353,15 @@ "contributions": [ "content" ] + }, + { + "login": "swhiteCQC", + "name": "swhiteCQC", + "avatar_url": "https://avatars.githubusercontent.com/u/77438466?v=4", + "profile": "https://github.com/swhiteCQC", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From c265b681b188ea21b3f8585e65ea363fc02c4b50 Mon Sep 17 00:00:00 2001 From: Neil Pate Date: Fri, 15 Jul 2022 14:18:31 +0200 Subject: [PATCH 0631/1293] fix(quiz1): change function name --- exercises/quiz1.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index 7bd3f589..8d05b110 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -11,14 +11,14 @@ // I AM NOT DONE // Put your function here! -// fn calculate_apple_price { +// fn calculate_price_of_apples { // Don't modify this function! #[test] fn verify_test() { - let price1 = calculate_apple_price(35); - let price2 = calculate_apple_price(40); - let price3 = calculate_apple_price(65); + let price1 = calculate_price_of_apples(35); + let price2 = calculate_price_of_apples(40); + let price3 = calculate_price_of_apples(65); assert_eq!(70, price1); assert_eq!(80, price2); From bc253097634dddb116f4ef656531931d8f8074e7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 12:19:26 +0000 Subject: [PATCH 0632/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index f8de046d..1a0c167f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -194,6 +194,7 @@ authors.
James Zow

πŸ–‹
James Bromley

πŸ–‹
swhiteCQC

πŸ–‹ +
Neil Pate

πŸ–‹ From e36c95bb3a5a57821ea6b431c3d2304d4eb5ab5b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 12:19:27 +0000 Subject: [PATCH 0633/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0c612452..bd4e3902 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1362,6 +1362,15 @@ "contributions": [ "content" ] + }, + { + "login": "neilpate", + "name": "Neil Pate", + "avatar_url": "https://avatars.githubusercontent.com/u/7802334?v=4", + "profile": "https://github.com/neilpate", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From cc3e1a851118b13ce3b2774d6437665b5aca0dc4 Mon Sep 17 00:00:00 2001 From: mokou Date: Sat, 16 Jul 2022 14:17:24 +0200 Subject: [PATCH 0634/1293] doc: update changelog --- CHANGELOG.md | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 095877b6..8aae3138 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,76 @@ + +## 5.0.0 (2022-07-16) + +#### Features + +- Hint comments in exercises now also include a reference to the + `hint` watch mode subcommand. +- **intro1**: Added more hints to point the user to the source file. +- **variables**: Switched variables3 and variables4. +- Moved `vec` and `primitive_types` exercises before `move_semantics`. +- Renamed `vec` to `vecs` to be more in line with the naming in general. +- Split up the `collections` exercises in their own folders. +- **vec2**: Added a second part of the function that provides an alternative, + immutable way of modifying vec values. +- **enums3**: Added a hint. +- Moved `strings` before `modules`. +- Added a `strings3` exercise to teach modifying strings. +- Added a `hashmaps3` exercise for some advanced usage of hashmaps. +- Moved the original `quiz2` to be `strings4`, since it only tested strings + anyways. +- Reworked `quiz2` into a new exercise that tests more chapters. +- Renamed `option` to `options`. +- **options1**: Rewrote parts of the exercise to remove the weird array + iteration stuff. +- Moved `generics3` to be `quiz3`. +- Moved box/arc exercises behind `iterators`. +- **iterators4**: Added a test for factorials of zero. +- Split `threads1` between two exercises, the first one focusing more on + `JoinHandle`s. +- Added a `threads3` exercises that uses `std::sync::mpsc`. +- Added a `clippy3` exercises with some more interesting checks. +- **as_ref_mut**: Added a section that actually tests `AsMut`. +- Added 3 new lifetimes exercises. +- Added 3 new traits exercises. + +#### Bug Fixes + +- **variables2**: Made output messages more verbose. +- **variables5**: Added a nudging hint about shadowing. +- **variables6**: Fixed link to book. +- **functions**: Clarified the README wording. Generally cleaned up + some hints and added some extra comments. +- **if2**: Renamed function name to `foo_if_fizz`. +- **move_semantics**: Clarified some hints. +- **quiz1**: Renamed the function name to be more verbose. +- **structs1**: Use an integer type instead of strings. Renamed "unit structs" + to "unit-like structs", as is used in the book. +- **structs3**: Added the `panic!` statement in from the beginning. +- **errors1**: Use `is_empty()` instead of `len() > 0` +- **errors3**: Improved the hint. +- **errors5**: Improved exercise instructions and the hint. +- **errors6**: Provided the skeleton of one of the functions that's supposed + to be implemented. +- **iterators3**: Inserted `todo!` into `divide()` to keep a compiler error + from happening. +- **from_str**: Added a hint comment about string error message conversion with + `Box`. +- **try_from_into**: Fixed the function name in comment. + +#### Removed + +- Removed the legacy LSP feature that was using `mod.rs` files. +- Removed `quiz4`. +- Removed `advanced_errs`. These were the last exercises in the recommended + order, and I've always felt like they didn't quite fit in with the mostly + simple, book-following style we've had in Rustlings. + +#### Housekeeping + +- Added missing exercises to the book index. +- Updated spacing in Cargo.toml. +- Added a GitHub actions config so that tests run on every PR/commit. + ## 4.8.0 (2022-07-01) From 5138f22e00137768054147b022f3f269190d3eb8 Mon Sep 17 00:00:00 2001 From: mokou Date: Sat, 16 Jul 2022 14:25:10 +0200 Subject: [PATCH 0635/1293] doc: update book links --- exercises/README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/exercises/README.md b/exercises/README.md index 2ea29909..e52137ca 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -5,20 +5,22 @@ | variables | Β§3.1 | | functions | Β§3.3 | | if | Β§3.5 | -| move_semantics | Β§4.1, Β§4.2 | | primitive_types | Β§3.2, Β§4.3 | +| vecs | Β§8.1 | +| move_semantics | Β§4.1, Β§4.2 | | structs | Β§5.1, Β§5.3 | | enums | Β§6, Β§18.3 | -| modules | Β§7 | -| collections | Β§8.1, Β§8.3 | | strings | Β§8.2 | +| modules | Β§7 | +| hashmaps | Β§8.3 | +| options | Β§10.1 | | error_handling | Β§9 | | generics | Β§10 | -| option | Β§10.1 | | traits | Β§10.2 | | tests | Β§11.1 | +| lifetimes | Β§10.3 | | standard_library_types | Β§13.2, Β§15.1, Β§16.3 | -| threads | Β§16.1 | +| threads | Β§16.1, Β§16.2, Β§16.3 | | macros | Β§19.6 | | clippy | n/a | | conversions | n/a | From 5435b8084177941c8cf86e17a8fccaf1cef359a4 Mon Sep 17 00:00:00 2001 From: mokou Date: Sat, 16 Jul 2022 14:30:04 +0200 Subject: [PATCH 0636/1293] chore: bump version --- Cargo.toml | 2 +- README.md | 4 ++-- src/main.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8a3264d9..910b5389 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "4.8.0" +version = "5.0.0" authors = ["Liv ", "Carol (Nichols || Goulding) "] edition = "2021" diff --git a/README.md b/README.md index 103aec8b..f2387328 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ If you get a permission denied message, you might have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 4.7.1) -git clone -b 4.7.1 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.0.0) +git clone -b 5.0.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/src/main.rs b/src/main.rs index 15c3095e..0ddb7331 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "4.8.0"; +const VERSION: &str = "5.0.0"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From 55900c65cbcd88a8458ea5ba29e06c1897f344d5 Mon Sep 17 00:00:00 2001 From: wojexe <21208490+wojexe@users.noreply.github.com> Date: Sat, 16 Jul 2022 17:28:13 +0200 Subject: [PATCH 0637/1293] fix: make strings3.rs comment wording more clear fixes #1063 --- exercises/strings/strings3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/strings/strings3.rs b/exercises/strings/strings3.rs index 9e25d307..e2353aec 100644 --- a/exercises/strings/strings3.rs +++ b/exercises/strings/strings3.rs @@ -4,7 +4,7 @@ // I AM NOT DONE fn trim_me(input: &str) -> String { - // TODO: Remove whitespace from the end of a string! + // TODO: Remove whitespace from both ends of a string! ??? } From e8cf9b262882adc77dd15e958ae038882ee10719 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 16 Jul 2022 16:27:40 +0000 Subject: [PATCH 0638/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 1a0c167f..ba75fe62 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -195,6 +195,7 @@ authors.
James Bromley

πŸ–‹
swhiteCQC

πŸ–‹
Neil Pate

πŸ–‹ +
wojexe

πŸ–‹ From 3bb008ebbb52a4ab24131918bb8809f1eeba8480 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 16 Jul 2022 16:27:41 +0000 Subject: [PATCH 0639/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index bd4e3902..cc6939f4 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1371,6 +1371,15 @@ "contributions": [ "content" ] + }, + { + "login": "wojexe", + "name": "wojexe", + "avatar_url": "https://avatars.githubusercontent.com/u/21208490?v=4", + "profile": "https://wojexe.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From b0e070c743d1f9a4a4eeb5c33a1e9ded8ab9bc12 Mon Sep 17 00:00:00 2001 From: wojexe <21208490+wojexe@users.noreply.github.com> Date: Sat, 16 Jul 2022 19:51:50 +0200 Subject: [PATCH 0640/1293] fix(traits4.rs): wrong line number fixes #1067 --- exercises/traits/traits4.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/traits/traits4.rs b/exercises/traits/traits4.rs index 280aaade..6b541665 100644 --- a/exercises/traits/traits4.rs +++ b/exercises/traits/traits4.rs @@ -1,7 +1,7 @@ // traits4.rs // // Your task is to replace the '??' sections so the code compiles. -// Don't change any line other than 21. +// Don't change any line other than the marked one. // Execute `rustlings hint traits4` or use the `hint` watch subcommand for a hint. // I AM NOT DONE @@ -19,6 +19,7 @@ struct OtherSoftware {} impl Licensed for SomeSoftware {} impl Licensed for OtherSoftware {} +// YOU MAY ONLY CHANGE THE NEXT LINE fn compare_license_types(software: ??, software_two: ??) -> bool { software.licensing_info() == software_two.licensing_info() } From ce86d252e529385704fe9111e305ac0ec48c2de4 Mon Sep 17 00:00:00 2001 From: Denton24646 Date: Sat, 16 Jul 2022 15:31:37 -0400 Subject: [PATCH 0641/1293] feat: add rc1.rs exercise --- exercises/standard_library_types/rc1.rs | 98 +++++++++++++++++++++++++ info.toml | 14 ++++ 2 files changed, 112 insertions(+) create mode 100644 exercises/standard_library_types/rc1.rs diff --git a/exercises/standard_library_types/rc1.rs b/exercises/standard_library_types/rc1.rs new file mode 100644 index 00000000..9b907fde --- /dev/null +++ b/exercises/standard_library_types/rc1.rs @@ -0,0 +1,98 @@ +// rc1.rs +// In this exercise, we want to express the concept of multiple owners via the Rc type. +// This is a model of our solar system - there is a Sun type and multiple Planets. +// The Planets take ownership of the sun, indicating that they revolve around the sun. + +// Make this code compile by using the proper Rc primitives to express that the sun has multiple owners. + +// I AM NOT DONE +use std::rc::Rc; + +#[derive(Debug)] +struct Sun {} + +#[derive(Debug)] +enum Planet { + Mercury(Rc), + Venus(Rc), + Earth(Rc), + Mars(Rc), + Jupiter(Rc), + Saturn(Rc), + Uranus(Rc), + Neptune(Rc), +} + +impl Planet { + fn details(&self) { + println!("Hi from {:?}!", self) + } +} + +fn main() { + let sun = Rc::new(Sun {}); + println!("reference count = {}", Rc::strong_count(&sun)); // 1 reference + + let mercury = Planet::Mercury(Rc::clone(&sun)); + println!("reference count = {}", Rc::strong_count(&sun)); // 2 references + mercury.details(); + + let venus = Planet::Venus(Rc::clone(&sun)); + println!("reference count = {}", Rc::strong_count(&sun)); // 3 references + venus.details(); + + let earth = Planet::Earth(Rc::clone(&sun)); + println!("reference count = {}", Rc::strong_count(&sun)); // 4 references + earth.details(); + + let mars = Planet::Mars(Rc::clone(&sun)); + println!("reference count = {}", Rc::strong_count(&sun)); // 5 references + mars.details(); + + let jupiter = Planet::Jupiter(Rc::clone(&sun)); + println!("reference count = {}", Rc::strong_count(&sun)); // 6 references + jupiter.details(); + + // TODO + let saturn = Planet::Saturn(Rc::new(Sun {})); + println!("reference count = {}", Rc::strong_count(&sun)); // 7 references + saturn.details(); + + // TODO + let uranus = Planet::Uranus(Rc::new(Sun {})); + println!("reference count = {}", Rc::strong_count(&sun)); // 8 references + uranus.details(); + + // TODO + let neptune = Planet::Neptune(Rc::new(Sun {})); + println!("reference count = {}", Rc::strong_count(&sun)); // 9 references + neptune.details(); + + assert_eq!(Rc::strong_count(&sun), 9); + + drop(neptune); + println!("reference count = {}", Rc::strong_count(&sun)); // 8 references + + drop(uranus); + println!("reference count = {}", Rc::strong_count(&sun)); // 7 references + + drop(saturn); + println!("reference count = {}", Rc::strong_count(&sun)); // 6 references + + drop(jupiter); + println!("reference count = {}", Rc::strong_count(&sun)); // 5 references + + drop(mars); + println!("reference count = {}", Rc::strong_count(&sun)); // 4 references + + // TODO + println!("reference count = {}", Rc::strong_count(&sun)); // 3 references + + // TODO + println!("reference count = {}", Rc::strong_count(&sun)); // 2 references + + // TODO + println!("reference count = {}", Rc::strong_count(&sun)); // 1 reference + + assert_eq!(Rc::strong_count(&sun), 1); +} diff --git a/info.toml b/info.toml index 5b7b9b43..a72c0147 100644 --- a/info.toml +++ b/info.toml @@ -929,6 +929,20 @@ is too much of a struggle, consider reading through all of Chapter 16 in the boo https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html """ +[[exercises]] +name = "rc1" +path = "exercises/standard_library_types/rc1.rs" +mode = "compile" +hint = """ +This is a straightforward exercise to use the Rc type. Each Planet has +ownership of the Sun, and uses Rc::clone() to increment the reference count of the Sun. +After using drop() to move the Planets out of scope individually, the reference count goes down. +In the end the sun only has one reference again, to itself. See more at: +https://doc.rust-lang.org/book/ch15-04-rc.html + +* Unforunately Pluto is no longer considered a planet :( +""" + # THREADS [[exercises]] From 7035d6787cd551ece7d582d052685c52875a6a72 Mon Sep 17 00:00:00 2001 From: Tostapunk Date: Mon, 18 Jul 2022 00:27:57 +0200 Subject: [PATCH 0642/1293] fix(traits5.rs): wrong line number --- exercises/traits/traits5.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/traits/traits5.rs b/exercises/traits/traits5.rs index 290c0479..89174dde 100644 --- a/exercises/traits/traits5.rs +++ b/exercises/traits/traits5.rs @@ -1,7 +1,7 @@ // traits5.rs // // Your task is to replace the '??' sections so the code compiles. -// Don't change any line other than 27. +// Don't change any line other than the marked one. // Execute `rustlings hint traits5` or use the `hint` watch subcommand for a hint. // I AM NOT DONE @@ -25,6 +25,7 @@ struct SomeStruct { impl SomeTrait for SomeStruct {} impl OtherTrait for SomeStruct {} +// YOU MAY ONLY CHANGE THE NEXT LINE fn some_func(item: ??) -> bool { item.some_function() && item.other_function() } From 2f113b9b06b986d17c4da86ae5a5bd8a4405f83d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 18 Jul 2022 08:47:49 +0000 Subject: [PATCH 0643/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index ba75fe62..f015c8fd 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -196,6 +196,7 @@ authors.
swhiteCQC

πŸ–‹
Neil Pate

πŸ–‹
wojexe

πŸ–‹ +
Mattia Schiavon

πŸ–‹ From 1aecf32748fbccec18b044e91a533165bc52e226 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 18 Jul 2022 08:47:49 +0000 Subject: [PATCH 0644/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index cc6939f4..9659044a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1380,6 +1380,15 @@ "contributions": [ "content" ] + }, + { + "login": "Tostapunk", + "name": "Mattia Schiavon", + "avatar_url": "https://avatars.githubusercontent.com/u/25140297?v=4", + "profile": "https://github.com/Tostapunk", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 02d78c3e84c8f160b6f6487be0a368b5720bb67b Mon Sep 17 00:00:00 2001 From: Tostapunk Date: Mon, 18 Jul 2022 14:11:51 +0200 Subject: [PATCH 0645/1293] fix: Improve hint of lifetimes2 fixes #1071 --- info.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 5b7b9b43..3ec15d7c 100644 --- a/info.toml +++ b/info.toml @@ -795,7 +795,10 @@ name = "lifetimes2" path = "exercises/lifetimes/lifetimes2.rs" mode = "compile" hint = """ -What is the compiler checking? How could you change how long an owned variable lives?""" +Remember that the generic lifetime 'a will get the concrete lifetime that is equal to the smaller of the lifetimes of x and y. +You can take at leats two paths to achieve the desidered result while keeping the inner block: +1. move string2 declaration to make it live as long as string1 (how is result declared?) +2. move println! into the inner block""" [[exercises]] name = "lifetimes3" From e1d6abb4c919386fd5c728a30db73d160c6fe373 Mon Sep 17 00:00:00 2001 From: Mattia Schiavon Date: Mon, 18 Jul 2022 14:44:16 +0200 Subject: [PATCH 0646/1293] Apply suggestions from code review Co-authored-by: liv --- info.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/info.toml b/info.toml index 3ec15d7c..0be3e91a 100644 --- a/info.toml +++ b/info.toml @@ -796,9 +796,9 @@ path = "exercises/lifetimes/lifetimes2.rs" mode = "compile" hint = """ Remember that the generic lifetime 'a will get the concrete lifetime that is equal to the smaller of the lifetimes of x and y. -You can take at leats two paths to achieve the desidered result while keeping the inner block: -1. move string2 declaration to make it live as long as string1 (how is result declared?) -2. move println! into the inner block""" +You can take at least two paths to achieve the desired result while keeping the inner block: +1. Move the string2 declaration to make it live as long as string1 (how is result declared?) +2. Move println! into the inner block""" [[exercises]] name = "lifetimes3" From 4910bae10f057e7dbf75682062ea2c91ef608d7d Mon Sep 17 00:00:00 2001 From: rzrymiak <106121613+rzrymiak@users.noreply.github.com> Date: Mon, 18 Jul 2022 17:00:16 -0700 Subject: [PATCH 0647/1293] Update README.md Minor grammatical edit in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f2387328..3e73934b 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ Once you've completed Rustlings, put your new knowledge to good use! Continue pr ## Uninstalling Rustlings -If you want to remove Rustlings from your system, there's two steps. First, you'll need to remove the exercises folder that the install script created +If you want to remove Rustlings from your system, there are two steps. First, you'll need to remove the exercises folder that the install script created for you: ```bash From 8a4dca5fa63913d42eddd443485f5a7c9d9f5319 Mon Sep 17 00:00:00 2001 From: Eric Jolibois Date: Tue, 19 Jul 2022 11:45:34 +0200 Subject: [PATCH 0648/1293] remove small typo in hint of threads3 --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 0be3e91a..f90d10a0 100644 --- a/info.toml +++ b/info.toml @@ -988,7 +988,7 @@ An alternate way to handle concurrency between threads is to use a mpsc (multiple producer, single consumer) channel to communicate. With both a sending end and a receiving end, it's possible to send values in one thread and receieve them in another. -Multiple producers are possibile by using clone() to create a duplicate +Multiple producers are possible by using clone() to create a duplicate of the original sending end. See https://doc.rust-lang.org/book/ch16-02-message-passing.html for more info. """ From 3b74f5dae88f6097d2eb07694ec2bd0823db9c0a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 19 Jul 2022 12:40:22 +0000 Subject: [PATCH 0649/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index f015c8fd..ca763de2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -197,6 +197,7 @@ authors.
Neil Pate

πŸ–‹
wojexe

πŸ–‹
Mattia Schiavon

πŸ–‹ +
Eric Jolibois

πŸ–‹ From 82c41a61b6c6389244814a56ee272687bc8e262b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 19 Jul 2022 12:40:23 +0000 Subject: [PATCH 0650/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9659044a..3903233f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1389,6 +1389,15 @@ "contributions": [ "content" ] + }, + { + "login": "PrettyWood", + "name": "Eric Jolibois", + "avatar_url": "https://avatars.githubusercontent.com/u/18406791?v=4", + "profile": "http://toucantoco.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From f9413b8ae1c9fe8bd9ebed01f27450e8b98f233e Mon Sep 17 00:00:00 2001 From: Greg Leonard Date: Tue, 19 Jul 2022 20:05:04 +0100 Subject: [PATCH 0651/1293] fix(traits5): fix "paramter" spelling --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index f90d10a0..14031118 100644 --- a/info.toml +++ b/info.toml @@ -732,7 +732,7 @@ name = "traits5" path = "exercises/traits/traits5.rs" mode = "compile" hint = """ -To ensure a paramter implements multiple traits use the '+ syntax'. Try replacing the +To ensure a parameter implements multiple traits use the '+ syntax'. Try replacing the '??' with 'impl <> + <>'. See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#specifying-multiple-trait-bounds-with-the--syntax From f34d390bba3d60df0766df432bca9bc5eb171478 Mon Sep 17 00:00:00 2001 From: Edwin Chang Date: Wed, 20 Jul 2022 18:23:31 -0400 Subject: [PATCH 0652/1293] fix: Fix typo in .editorconfig --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 89cf181d..aab09aa3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,6 +2,6 @@ root = true [*.rs] end_of_line = lf -insert_final_newfile = true +insert_final_newline = true indent_style = space indent_size = 4 From e9f5c9423c8004fdccbe3dc300479497ed27c067 Mon Sep 17 00:00:00 2001 From: Greg Leonard Date: Thu, 21 Jul 2022 23:13:22 +0100 Subject: [PATCH 0653/1293] fix(run): correct "PAS" in `integration_tests.rs` --- tests/integration_tests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index fc46b983..0be191f0 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -176,7 +176,7 @@ fn run_single_test_success_with_output() { .current_dir("tests/fixture/success/") .assert() .code(0) - .stdout(predicates::str::contains("THIS TEST TOO SHALL PAS")); + .stdout(predicates::str::contains("THIS TEST TOO SHALL PASS")); } #[test] @@ -187,7 +187,7 @@ fn run_single_test_success_without_output() { .current_dir("tests/fixture/success/") .assert() .code(0) - .stdout(predicates::str::contains("THIS TEST TOO SHALL PAS").not()); + .stdout(predicates::str::contains("THIS TEST TOO SHALL PASS").not()); } #[test] From 2356b5c1b6a68cbcafb7643ba900adba4483d38a Mon Sep 17 00:00:00 2001 From: Saikat Das Date: Sat, 23 Jul 2022 15:55:30 +0530 Subject: [PATCH 0654/1293] Fix manual installation with install to the current directory --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f2387328..afa55c86 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ If you get a permission denied message, you might have to exclude the directory ## Manually -Basically: Clone the repository at the latest tag, run `cargo install`. +Basically: Clone the repository at the latest tag, run `cargo install --path .`. ```bash # find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.0.0) From 56c05f6232a1cd4cfa5444b1d391f88feef98e7b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 23 Jul 2022 15:37:05 +0000 Subject: [PATCH 0655/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index ca763de2..27103bff 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -199,6 +199,9 @@ authors.
Mattia Schiavon

πŸ–‹
Eric Jolibois

πŸ–‹ + +
Edwin Chang

πŸ–‹ + From e858fd94fbed689b4533605ea133c8030a93197a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 23 Jul 2022 15:37:06 +0000 Subject: [PATCH 0656/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3903233f..cd436694 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1398,6 +1398,15 @@ "contributions": [ "content" ] + }, + { + "login": "EdwinChang24", + "name": "Edwin Chang", + "avatar_url": "https://avatars.githubusercontent.com/u/88263098?v=4", + "profile": "http://edwinchang.vercel.app", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From c1fc77e50ffdca83f5f5cb03d28aef3c60bd76f2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 23 Jul 2022 15:41:02 +0000 Subject: [PATCH 0657/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 27103bff..212bd602 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -201,6 +201,7 @@ authors.
Edwin Chang

πŸ–‹ +
Saikat Das

πŸ–‹ From 7a6079b46adb5e9c81e5c83ebce614b359a57239 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 23 Jul 2022 15:41:03 +0000 Subject: [PATCH 0658/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index cd436694..6450a9c6 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1407,6 +1407,15 @@ "contributions": [ "content" ] + }, + { + "login": "saikatdas0790", + "name": "Saikat Das", + "avatar_url": "https://avatars.githubusercontent.com/u/7412443?v=4", + "profile": "https://saikat.dev/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From f88c7d1e8c89d26f5180082d68d4b79e4ec47b48 Mon Sep 17 00:00:00 2001 From: Jeremy Goh <30731072+thatlittleboy@users.noreply.github.com> Date: Sun, 24 Jul 2022 00:36:27 +0800 Subject: [PATCH 0659/1293] fix: reference to variables4 --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 14031118..7bb753ef 100644 --- a/info.toml +++ b/info.toml @@ -63,7 +63,7 @@ name = "variables5" path = "exercises/variables/variables5.rs" mode = "compile" hint = """ -In variables3 we already learned how to make an immutable variable mutable +In variables4 we already learned how to make an immutable variable mutable using a special keyword. Unfortunately this doesn't help us much in this exercise because we want to assign a different typed value to an existing variable. Sometimes you may also like to reuse existing variable names because you are just converting From 301bc52857554e047eabf32fec323f7a10e2b853 Mon Sep 17 00:00:00 2001 From: Jeremy Goh <30731072+thatlittleboy@users.noreply.github.com> Date: Sun, 24 Jul 2022 00:37:40 +0800 Subject: [PATCH 0660/1293] fix: lineno typo --- info.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/info.toml b/info.toml index 7bb753ef..f07b9267 100644 --- a/info.toml +++ b/info.toml @@ -123,8 +123,8 @@ name = "functions4" path = "exercises/functions/functions4.rs" mode = "compile" hint = """ -The error message points to line 14 and says it expects a type after the -`->`. This is where the function's return type should be-- take a look at +The error message points to line 17 and says it expects a type after the +`->`. This is where the function's return type should be -- take a look at the `is_even` function for an example! Also: Did you figure out that, technically, u32 would be the more fitting type From 72e21a2a6c2654cb1d2e292291e2e40914957776 Mon Sep 17 00:00:00 2001 From: Denton24646 Date: Sat, 23 Jul 2022 17:57:03 -0400 Subject: [PATCH 0661/1293] feat: add cow1.rs exercise --- exercises/standard_library_types/cow1.rs | 48 ++++++++++++++++++++++++ info.toml | 11 ++++++ 2 files changed, 59 insertions(+) create mode 100644 exercises/standard_library_types/cow1.rs diff --git a/exercises/standard_library_types/cow1.rs b/exercises/standard_library_types/cow1.rs new file mode 100644 index 00000000..5fba2519 --- /dev/null +++ b/exercises/standard_library_types/cow1.rs @@ -0,0 +1,48 @@ +// cow1.rs + +// This exercise explores the Cow, or Clone-On-Write type. +// Cow is a clone-on-write smart pointer. +// It can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required. +// The type is designed to work with general borrowed data via the Borrow trait. + +// I AM NOT DONE + +use std::borrow::Cow; + +fn abs_all<'a, 'b>(input: &'a mut Cow<'b, [i32]>) -> &'a mut Cow<'b, [i32]> { + for i in 0..input.len() { + let v = input[i]; + if v < 0 { + // Clones into a vector if not already owned. + input.to_mut()[i] = -v; + } + } + input +} + +fn main() { + // No clone occurs because `input` doesn't need to be mutated. + let slice = [0, 1, 2]; + let mut input = Cow::from(&slice[..]); + match abs_all(&mut input) { + Cow::Borrowed(_) => println!("I borrowed the slice!"), + _ => panic!("expected borrowed value"), + } + + // Clone occurs because `input` needs to be mutated. + let slice = [-1, 0, 1]; + let mut input = Cow::from(&slice[..]); + match abs_all(&mut input) { + Cow::Owned(_) => println!("I modified the slice and now own it!"), + _ => panic!("expected owned value"), + } + + // No clone occurs because `input` is already owned. + let slice = vec![-1, 0, 1]; + let mut input = Cow::from(slice); + match abs_all(&mut input) { + // TODO + Cow::Borrowed(_) => println!("I own this slice!"), + _ => panic!("expected borrowed value"), + } +} diff --git a/info.toml b/info.toml index 14031118..230fc724 100644 --- a/info.toml +++ b/info.toml @@ -932,6 +932,17 @@ is too much of a struggle, consider reading through all of Chapter 16 in the boo https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html """ +[[exercises]] +name = "cow1" +path = "exercises/standard_library_types/cow1.rs" +mode = "compile" +hint = """ +Since the vector is already owned, the `Cow` type doesn't need to clone it. + +Checkout https://doc.rust-lang.org/std/borrow/enum.Cow.html for documentation +on the `Cow` type. +""" + # THREADS [[exercises]] From 32687cc66e04cc8b4975672847c7def48d9bb08a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 24 Jul 2022 21:26:12 +0000 Subject: [PATCH 0662/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 212bd602..ca641859 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -202,6 +202,7 @@ authors.
Edwin Chang

πŸ–‹
Saikat Das

πŸ–‹ +
Jeremy Goh

πŸ–‹ From 4bee3399f8be446c414cdad3c2c2a9983a3f3e35 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 24 Jul 2022 21:26:13 +0000 Subject: [PATCH 0663/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6450a9c6..ae6156a6 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1416,6 +1416,15 @@ "contributions": [ "content" ] + }, + { + "login": "thatlittleboy", + "name": "Jeremy Goh", + "avatar_url": "https://avatars.githubusercontent.com/u/30731072?v=4", + "profile": "https://github.com/thatlittleboy", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From a3a5fbeddf7ad891514a7cf4d51a582efdedb0f1 Mon Sep 17 00:00:00 2001 From: Claire Wang Date: Mon, 25 Jul 2022 17:54:09 -0700 Subject: [PATCH 0664/1293] fix: remove extra " typo in info.toml --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index f07b9267..dc1485d7 100644 --- a/info.toml +++ b/info.toml @@ -746,7 +746,7 @@ path = "exercises/quiz3.rs" mode = "test" hint = """ To find the best solution to this challenge you're going to need to think back to your -knowledge of traits, specifically Trait Bound Syntax - you may also need this: "use std::fmt::Display;"""" +knowledge of traits, specifically Trait Bound Syntax - you may also need this: `use std::fmt::Display;`.""" # TESTS From a56f648ccefc18292c2fbc2e61043348c7cde79d Mon Sep 17 00:00:00 2001 From: Tristan Nicholls Date: Tue, 26 Jul 2022 21:01:09 +0200 Subject: [PATCH 0665/1293] feat(options1): update expected result Expected result is updated to better showcase the difference between - a valid result with no ice-creams `Some(0)`, and - an invalid result `None`. --- exercises/options/options1.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/exercises/options/options1.rs b/exercises/options/options1.rs index 038fb48e..c93ffbae 100644 --- a/exercises/options/options1.rs +++ b/exercises/options/options1.rs @@ -14,6 +14,7 @@ fn print_number(maybe_number: Option) { // TODO: Return an Option! fn maybe_icecream(time_of_day: u16) -> Option { // We use the 24-hour system here, so 10PM is a value of 22 + // The Option output should gracefully handle cases where time_of_day > 24. ??? } @@ -24,8 +25,9 @@ mod tests { #[test] fn check_icecream() { assert_eq!(maybe_icecream(10), Some(5)); - assert_eq!(maybe_icecream(23), None); - assert_eq!(maybe_icecream(22), None); + assert_eq!(maybe_icecream(23), Some(0)); + assert_eq!(maybe_icecream(22), Some(0)); + assert_eq!(maybe_icecream(25), None); } #[test] From 5ff23a286185daef544c72b00f90567183898929 Mon Sep 17 00:00:00 2001 From: Mikael Frosthage Date: Tue, 26 Jul 2022 22:02:50 +0200 Subject: [PATCH 0666/1293] Improve hint for as_ref_mut --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index f07b9267..c3b0ca84 100644 --- a/info.toml +++ b/info.toml @@ -1135,4 +1135,4 @@ name = "as_ref_mut" path = "exercises/conversions/as_ref_mut.rs" mode = "test" hint = """ -Add AsRef as a trait bound to the functions.""" +Add AsRef or AsMut as a trait bound to the functions.""" From c5ecc37a9afd8eaad3b184d97a0e532eef163b41 Mon Sep 17 00:00:00 2001 From: Lioness100 Date: Sat, 30 Jul 2022 10:50:07 -0400 Subject: [PATCH 0667/1293] refactor(box1): prefer todo! over unimplemented! --- exercises/standard_library_types/box1.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/standard_library_types/box1.rs b/exercises/standard_library_types/box1.rs index 9d9237c1..66cf00f3 100644 --- a/exercises/standard_library_types/box1.rs +++ b/exercises/standard_library_types/box1.rs @@ -10,7 +10,7 @@ // elements: the value of the current item and the next item. The last item is a value called `Nil`. // // Step 1: use a `Box` in the enum definition to make the code compile -// Step 2: create both empty and non-empty cons lists by replacing `unimplemented!()` +// Step 2: create both empty and non-empty cons lists by replacing `todo!()` // // Note: the tests should not be changed // @@ -33,11 +33,11 @@ fn main() { } pub fn create_empty_list() -> List { - unimplemented!() + todo!() } pub fn create_non_empty_list() -> List { - unimplemented!() + todo!() } #[cfg(test)] From a04d62372fcf6023fceb0f2e8202de61ca774585 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 15:13:18 +0000 Subject: [PATCH 0668/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index ca641859..e6f7a35e 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -203,6 +203,7 @@ authors.
Edwin Chang

πŸ–‹
Saikat Das

πŸ–‹
Jeremy Goh

πŸ–‹ +
Lioness100

πŸ–‹ From 08f42761f9b04dd63ac30ae3a503577ded560f3f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 15:13:19 +0000 Subject: [PATCH 0669/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ae6156a6..7d6ec037 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1425,6 +1425,15 @@ "contributions": [ "content" ] + }, + { + "login": "Lioness100", + "name": "Lioness100", + "avatar_url": "https://avatars.githubusercontent.com/u/65814829?v=4", + "profile": "https://github.com/Lioness100", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From af301a2efe7309b3a59df4f236322eb246140402 Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 3 Aug 2022 17:31:42 +0200 Subject: [PATCH 0670/1293] feat(errors5): add simpler explanation for box dyn --- Cargo.lock | 2 +- exercises/error_handling/errors5.rs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index df190ad8..862a8a2e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -459,7 +459,7 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustlings" -version = "4.8.0" +version = "5.0.0" dependencies = [ "argh", "assert_cmd", diff --git a/exercises/error_handling/errors5.rs b/exercises/error_handling/errors5.rs index 67411c58..2ba8f903 100644 --- a/exercises/error_handling/errors5.rs +++ b/exercises/error_handling/errors5.rs @@ -4,6 +4,8 @@ // This exercise uses some concepts that we won't get to until later in the course, like `Box` and the // `From` trait. It's not important to understand them in detail right now, but you can read ahead if you like. +// For now, think of the `Box` type as an "I want anything that does ???" type, which, given +// Rust's usual standards for runtime safety, should strike you as somewhat lenient! // In short, this particular use case for boxes is for when you want to own a value and you care only that it is a // type which implements a particular trait. To do so, The Box is declared as of type Box where Trait is the trait From e3b65186fde9690180a0efe9283f466a2e13076d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 15:34:59 +0000 Subject: [PATCH 0671/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index e6f7a35e..263bc2f8 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -204,6 +204,7 @@ authors.
Saikat Das

πŸ–‹
Jeremy Goh

πŸ–‹
Lioness100

πŸ–‹ +
Tristan Nicholls

πŸ–‹ From 6289238d1d35d13fe44d7385ebe0016519db7adc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 15:35:00 +0000 Subject: [PATCH 0672/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7d6ec037..5ff2c661 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1434,6 +1434,15 @@ "contributions": [ "content" ] + }, + { + "login": "tvkn", + "name": "Tristan Nicholls", + "avatar_url": "https://avatars.githubusercontent.com/u/79277926?v=4", + "profile": "https://github.com/tvkn", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d27c12e35d7a1290ad1daccfe69e309da765e810 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 15:36:07 +0000 Subject: [PATCH 0673/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 263bc2f8..e0689dbf 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -205,6 +205,7 @@ authors.
Jeremy Goh

πŸ–‹
Lioness100

πŸ–‹
Tristan Nicholls

πŸ–‹ +
Claire

πŸ–‹ From 7a7281764c03beb3560e7dba8759bcb7eab71f99 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 15:36:08 +0000 Subject: [PATCH 0674/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5ff2c661..5fc58e7b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1443,6 +1443,15 @@ "contributions": [ "content" ] + }, + { + "login": "clairew", + "name": "Claire", + "avatar_url": "https://avatars.githubusercontent.com/u/9344258?v=4", + "profile": "http://clairewang.net", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From a0a06232ce30ff7ec52367033865cad9cac6ae76 Mon Sep 17 00:00:00 2001 From: John Mendelewski III Date: Sun, 7 Aug 2022 14:51:16 -0400 Subject: [PATCH 0675/1293] fix(traits5): make exercise prefer trait-based solution closes #1088 --- exercises/traits/traits5.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/exercises/traits/traits5.rs b/exercises/traits/traits5.rs index 89174dde..0fbca28a 100644 --- a/exercises/traits/traits5.rs +++ b/exercises/traits/traits5.rs @@ -18,16 +18,20 @@ pub trait OtherTrait { } } -struct SomeStruct { - name: String, -} +struct SomeStruct {} +struct OtherStruct {} impl SomeTrait for SomeStruct {} impl OtherTrait for SomeStruct {} +impl SomeTrait for OtherStruct {} +impl OtherTrait for OtherStruct {} // YOU MAY ONLY CHANGE THE NEXT LINE fn some_func(item: ??) -> bool { item.some_function() && item.other_function() } -fn main() {} +fn main() { + some_func(SomeStruct {}); + some_func(OtherStruct {}); +} From f25f77e915035dc913f680593bc4892e5f8edeaf Mon Sep 17 00:00:00 2001 From: Brian Fakhoury Date: Mon, 8 Aug 2022 15:39:35 -0400 Subject: [PATCH 0676/1293] Fix minor spelling --- exercises/quiz2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/quiz2.rs b/exercises/quiz2.rs index f7437fd2..d8fa954a 100644 --- a/exercises/quiz2.rs +++ b/exercises/quiz2.rs @@ -42,7 +42,7 @@ mod my_module { #[cfg(test)] mod tests { - // TODO: What to we have to import to have `transformer` in scope? + // TODO: What do we have to import to have `transformer` in scope? use ???; use super::Command; From ef70ad907f4615b34abe3e65c7b21fffe7661f35 Mon Sep 17 00:00:00 2001 From: Mouwrice Date: Tue, 9 Aug 2022 20:27:27 +0200 Subject: [PATCH 0677/1293] fix(macros-readme): update the book link to the more recent version of the book --- exercises/macros/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/macros/README.md b/exercises/macros/README.md index 319d8408..31a941b7 100644 --- a/exercises/macros/README.md +++ b/exercises/macros/README.md @@ -7,4 +7,4 @@ macros. Instead, we'll show you how to use and create them. ## Further information - [Macros](https://doc.rust-lang.org/book/ch19-06-macros.html) -- [The Little Book of Rust Macros](https://danielkeep.github.io/tlborm/book/index.html) +- [The Little Book of Rust Macros](https://veykril.github.io/tlborm/) From bf84fe029f05e05c65efaaaa36f04cf6ed19235b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 11 Aug 2022 10:27:27 +0000 Subject: [PATCH 0678/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index e0689dbf..66f4b9e2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -206,6 +206,7 @@ authors.
Lioness100

πŸ–‹
Tristan Nicholls

πŸ–‹
Claire

πŸ–‹ +
Maurice Van Wassenhove

πŸ–‹ From 8d9df94b6c6682d607976001f16cba851f5979a9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 11 Aug 2022 10:27:28 +0000 Subject: [PATCH 0679/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5fc58e7b..d97c45fb 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1452,6 +1452,15 @@ "contributions": [ "content" ] + }, + { + "login": "Mouwrice", + "name": "Maurice Van Wassenhove", + "avatar_url": "https://avatars.githubusercontent.com/u/56763273?v=4", + "profile": "https://github.com/Mouwrice", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From dcf4efe62851823c31ea78b929b4450de86fecfe Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 11 Aug 2022 10:30:24 +0000 Subject: [PATCH 0680/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 66f4b9e2..6dcbbeee 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -207,6 +207,7 @@ authors.
Tristan Nicholls

πŸ–‹
Claire

πŸ–‹
Maurice Van Wassenhove

πŸ–‹ +
John Mendelewski

πŸ’» From c1c4f863172bf36ce6822e05d210bc2d82fdcbce Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 11 Aug 2022 10:30:25 +0000 Subject: [PATCH 0681/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d97c45fb..4133fc21 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1461,6 +1461,15 @@ "contributions": [ "content" ] + }, + { + "login": "johnmendel", + "name": "John Mendelewski", + "avatar_url": "https://avatars.githubusercontent.com/u/77524?v=4", + "profile": "http://jmthree.com", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 7e1a4c03637f38ff8f380652c26fcfee637fe47c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 11 Aug 2022 10:38:00 +0000 Subject: [PATCH 0682/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 6dcbbeee..613a2c0d 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -209,6 +209,9 @@ authors.
Maurice Van Wassenhove

πŸ–‹
John Mendelewski

πŸ’» + +
Brian Fakhoury

πŸ–‹ + From a16e7b918a1ce3e257f39db6182289cad047748c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 11 Aug 2022 10:38:01 +0000 Subject: [PATCH 0683/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4133fc21..87af2a52 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1470,6 +1470,15 @@ "contributions": [ "code" ] + }, + { + "login": "brianfakhoury", + "name": "Brian Fakhoury", + "avatar_url": "https://avatars.githubusercontent.com/u/20828724?v=4", + "profile": "http://fakhoury.xyz", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 3c84cc1702200eea4d3e57feff34e69705dc8ed1 Mon Sep 17 00:00:00 2001 From: Markus Boehme Date: Thu, 11 Aug 2022 22:52:06 +0200 Subject: [PATCH 0684/1293] fix(options1): remove unused code Since rewriting the exercise in commit 06e4fd376586 the print_number function goes unused. Remove it. --- exercises/options/options1.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/exercises/options/options1.rs b/exercises/options/options1.rs index c93ffbae..99c95911 100644 --- a/exercises/options/options1.rs +++ b/exercises/options/options1.rs @@ -3,11 +3,6 @@ // I AM NOT DONE -// you can modify anything EXCEPT for this function's signature -fn print_number(maybe_number: Option) { - println!("printing: {}", maybe_number.unwrap()); -} - // This function returns how much icecream there is left in the fridge. // If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them // all, so there'll be no more left :( From cf813b707cf9ef0593ae58853eb693594c5fc03c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 12 Aug 2022 08:25:12 +0000 Subject: [PATCH 0685/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 613a2c0d..9648f33c 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -211,6 +211,7 @@ authors.
Brian Fakhoury

πŸ–‹ +
Markus Boehme

πŸ’» From f107e2f31d961b949868967cd2f66dc78136411c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 12 Aug 2022 08:25:13 +0000 Subject: [PATCH 0686/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 87af2a52..0df89f7e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1479,6 +1479,15 @@ "contributions": [ "content" ] + }, + { + "login": "markusboehme", + "name": "Markus Boehme", + "avatar_url": "https://avatars.githubusercontent.com/u/5074759?v=4", + "profile": "https://github.com/markusboehme", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From e8122daa8709274226c40fe8008fdfc86ad4493a Mon Sep 17 00:00:00 2001 From: Nico Vromans <48183857+nico-vromans@users.noreply.github.com> Date: Mon, 15 Aug 2022 10:05:50 +0200 Subject: [PATCH 0687/1293] Update options1.rs Added extra test for before 10PM and updated the test for at 10PM (when it's 10PM there should already not be any ice cream left, as per the description). Also fixed the `raw_value` test, as it is later than 10PM, so there should be no more ice cream left. --- exercises/options/options1.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/exercises/options/options1.rs b/exercises/options/options1.rs index 99c95911..022d3d66 100644 --- a/exercises/options/options1.rs +++ b/exercises/options/options1.rs @@ -19,7 +19,8 @@ mod tests { #[test] fn check_icecream() { - assert_eq!(maybe_icecream(10), Some(5)); + assert_eq!(maybe_icecream(9), Some(5)); + assert_eq!(maybe_icecream(10), Some(0)); assert_eq!(maybe_icecream(23), Some(0)); assert_eq!(maybe_icecream(22), Some(0)); assert_eq!(maybe_icecream(25), None); @@ -29,6 +30,6 @@ mod tests { fn raw_value() { // TODO: Fix this test. How do you get at the value contained in the Option? let icecreams = maybe_icecream(12); - assert_eq!(icecreams, 5); + assert_eq!(icecreams, 0); } } From 4400ce2892188044d510cbabdfead1f0c704bdf8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Aug 2022 07:32:31 +0000 Subject: [PATCH 0688/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 9648f33c..0c07a933 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -212,6 +212,7 @@ authors.
Brian Fakhoury

πŸ–‹
Markus Boehme

πŸ’» +
Nico Vromans

πŸ–‹ From 2f2f141564f3bfc34c9a0a0d5449ea376f7835f8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Aug 2022 07:32:32 +0000 Subject: [PATCH 0689/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0df89f7e..be5dc21a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1488,6 +1488,15 @@ "contributions": [ "code" ] + }, + { + "login": "nico-vromans", + "name": "Nico Vromans", + "avatar_url": "https://avatars.githubusercontent.com/u/48183857?v=4", + "profile": "https://github.com/nico-vromans", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From bb6b9e1704a5bbe16a57adc95616409c8c3ea0e2 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 16 Aug 2022 09:41:41 +0200 Subject: [PATCH 0690/1293] doc: add zulip link --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index afa55c86..b2ac6b92 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,10 @@ Now you should be done! See [CONTRIBUTING.md](./CONTRIBUTING.md). +Development-focused discussion about Rustlings happens in the [**rustlings** stream](https://rust-lang.zulipchat.com/#narrow/stream/334454-rustlings) +on the [Rust Project Zulip](https://rust-lang.zulipchat.com). Feel free to start a new thread there +if you have ideas or suggestions! + ## Contributors ✨ Thanks goes to the wonderful people listed in [AUTHORS.md](./AUTHORS.md) πŸŽ‰ From 0a9d34a25a6a262b3f947625a3fa87e8fa10ed7e Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 16 Aug 2022 09:53:40 +0200 Subject: [PATCH 0691/1293] doc: update changelog --- CHANGELOG.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8aae3138..8c782c86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,38 @@ + +## 5.1.0 (2022-08-16) + +#### Features + +- Added a new `rc1` exercise. +- Added a new `cow1` exercise. + +#### Bug Fixes + +- **variables5**: Corrected reference to previous exercise +- **functions4**: Fixed line number reference +- **strings3**: Clarified comment wording +- **traits4, traits5**: Fixed line number reference +- **traits5**: + - Fixed typo in "parameter" + - Made exercise prefer a traits-based solution +- **lifetimes2**: Improved hint +- **threads3**: Fixed typo in hint +- **box1**: Replaced `unimplemented!` with `todo!` +- **errors5**: Provided an explanation for usage of `Box` +- **quiz2**: Fixed a typo +- **macros**: Updated the macros book link +- **options1**: + - Removed unused code + - Added more granular tests +- Fixed some comment syntax shenanigans in info.toml + +#### Housekeeping + +- Fixed a typo in .editorconfig +- Fixed a typo in integration_tests.rs +- Clarified manual installation instructions using `cargo install --path .` +- Added a link to our Zulip in the readme file + ## 5.0.0 (2022-07-16) From 714a8075cc34e3823513cd3ea26bd4a92c1c1129 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 16 Aug 2022 09:54:25 +0200 Subject: [PATCH 0692/1293] chore: bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 4 ++-- src/main.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 862a8a2e..d28d2c82 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -459,7 +459,7 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustlings" -version = "5.0.0" +version = "5.1.0" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index 910b5389..ae01278b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "5.0.0" +version = "5.1.0" authors = ["Liv ", "Carol (Nichols || Goulding) "] edition = "2021" diff --git a/README.md b/README.md index b2ac6b92..f7ed07ca 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ If you get a permission denied message, you might have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install --path .`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.0.0) -git clone -b 5.0.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.1.0) +git clone -b 5.1.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/src/main.rs b/src/main.rs index 0ddb7331..3719f66a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "5.0.0"; +const VERSION: &str = "5.1.0"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From 4455c22b9aa5e4a6735e3ae67a4c9e75af24128a Mon Sep 17 00:00:00 2001 From: vostok92 Date: Wed, 17 Aug 2022 13:51:17 +0900 Subject: [PATCH 0693/1293] Update options1.rs Fix assertions --- exercises/options/options1.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/options/options1.rs b/exercises/options/options1.rs index 022d3d66..d1735c2f 100644 --- a/exercises/options/options1.rs +++ b/exercises/options/options1.rs @@ -20,7 +20,7 @@ mod tests { #[test] fn check_icecream() { assert_eq!(maybe_icecream(9), Some(5)); - assert_eq!(maybe_icecream(10), Some(0)); + assert_eq!(maybe_icecream(10), Some(5)); assert_eq!(maybe_icecream(23), Some(0)); assert_eq!(maybe_icecream(22), Some(0)); assert_eq!(maybe_icecream(25), None); @@ -30,6 +30,6 @@ mod tests { fn raw_value() { // TODO: Fix this test. How do you get at the value contained in the Option? let icecreams = maybe_icecream(12); - assert_eq!(icecreams, 0); + assert_eq!(icecreams, 5); } } From 3c1fe226f0a4e651bdb498330ca3ded6ffb477c4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 17 Aug 2022 08:41:49 +0000 Subject: [PATCH 0694/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 0c07a933..b7bf94b0 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -213,6 +213,7 @@ authors.
Brian Fakhoury

πŸ–‹
Markus Boehme

πŸ’»
Nico Vromans

πŸ–‹ +
vostok92

πŸ–‹ From 34392662a635f56fc59901f51f92b906f44e822d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 17 Aug 2022 08:41:50 +0000 Subject: [PATCH 0695/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index be5dc21a..c5d783f1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1497,6 +1497,15 @@ "contributions": [ "content" ] + }, + { + "login": "vostok92", + "name": "vostok92", + "avatar_url": "https://avatars.githubusercontent.com/u/540339?v=4", + "profile": "https://github.com/vostok92", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d0c7b06eff3e8959b261145e10f1aaa57ba1e4c3 Mon Sep 17 00:00:00 2001 From: mokou Date: Wed, 17 Aug 2022 10:43:50 +0200 Subject: [PATCH 0696/1293] chore: release 5.1.1 --- CHANGELOG.md | 7 +++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 4 ++-- src/main.rs | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c782c86..cec41c59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ + +## 5.1.1 (2022-08-17) + +#### Bug Fixes + +- Fixed an incorrect assertion in options1 + ## 5.1.0 (2022-08-16) diff --git a/Cargo.lock b/Cargo.lock index d28d2c82..2370e8dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -459,7 +459,7 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustlings" -version = "5.1.0" +version = "5.1.1" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index ae01278b..d5fd93c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "5.1.0" +version = "5.1.1" authors = ["Liv ", "Carol (Nichols || Goulding) "] edition = "2021" diff --git a/README.md b/README.md index f7ed07ca..2392ba9d 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ If you get a permission denied message, you might have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install --path .`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.1.0) -git clone -b 5.1.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.1.1) +git clone -b 5.1.1 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/src/main.rs b/src/main.rs index 3719f66a..531533ea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "5.1.0"; +const VERSION: &str = "5.1.1"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From 52a29aa84be2a89894f2ad1f5ebdcf153c49f399 Mon Sep 17 00:00:00 2001 From: magnusrodseth <59113973+magnusrodseth@users.noreply.github.com> Date: Wed, 17 Aug 2022 12:50:34 +0200 Subject: [PATCH 0697/1293] test: Convert main function to working tests --- exercises/options/options2.rs | 41 ++++++++++++++++++++++------------- info.toml | 2 +- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/exercises/options/options2.rs b/exercises/options/options2.rs index 75b66a37..eca03f0d 100644 --- a/exercises/options/options2.rs +++ b/exercises/options/options2.rs @@ -3,23 +3,34 @@ // I AM NOT DONE -fn main() { - let optional_word = Some(String::from("rustlings")); - // TODO: Make this an if let statement whose value is "Some" type - word = optional_word { - println!("The word is: {}", word); - } else { - println!("The optional word doesn't contain anything"); +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn simple_option() { + let target = "rustlings"; + let optional_target = Some(target); + + // TODO: Make this an if let statement whose value is "Some" type + if let Some(word) = optional_target { + assert_eq!(word, target); + } } - let mut optional_integers_vec: Vec> = Vec::new(); - for x in 1..10 { - optional_integers_vec.push(Some(x)); - } + #[test] + fn layered_option() { + let mut range = 10; + let mut optional_integers: Vec> = Vec::new(); + for i in 0..(range + 1) { + optional_integers.push(Some(i)); + } - // TODO: make this a while let statement - remember that vector.pop also adds another layer of Option - // You can stack `Option`'s into while let and if let - integer = optional_integers_vec.pop() { - println!("current value: {}", integer); + // TODO: make this a while let statement - remember that vector.pop also adds another layer of Option + // You can stack `Option`'s into while let and if let + while let Some(Some(integer)) = optional_integers.pop() { + assert_eq!(integer, range); + range -= 1; + } } } diff --git a/info.toml b/info.toml index 9aa11e8a..8bce7216 100644 --- a/info.toml +++ b/info.toml @@ -545,7 +545,7 @@ is the easiest, but how do you do it safely so that it doesn't panic in your fac [[exercises]] name = "options2" path = "exercises/options/options2.rs" -mode = "compile" +mode = "test" hint = """ check out: https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html From 6f44cb1dd237f4d53aa3ecd4676e50cf850c99fe Mon Sep 17 00:00:00 2001 From: magnusrodseth <59113973+magnusrodseth@users.noreply.github.com> Date: Wed, 17 Aug 2022 16:31:53 +0200 Subject: [PATCH 0698/1293] feat: Add reset command, given a filename --- src/main.rs | 78 ++++++++++++++++++++++++++++++++++++++++------------- src/run.rs | 15 +++++++++++ 2 files changed, 74 insertions(+), 19 deletions(-) diff --git a/src/main.rs b/src/main.rs index 531533ea..3610f827 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,10 @@ -use crate::exercise::{Exercise, ExerciseList}; use crate::project::RustAnalyzerProject; use crate::run::run; use crate::verify::verify; +use crate::{ + exercise::{Exercise, ExerciseList}, + run::reset, +}; use argh::FromArgs; use console::Emoji; use notify::DebouncedEvent; @@ -47,6 +50,7 @@ enum Subcommands { Verify(VerifyArgs), Watch(WatchArgs), Run(RunArgs), + Reset(ResetArgs), Hint(HintArgs), List(ListArgs), Lsp(LspArgs), @@ -71,6 +75,15 @@ struct RunArgs { name: String, } +#[derive(FromArgs, PartialEq, Debug)] +#[argh(subcommand, name = "reset")] +/// Resets a single exercise +struct ResetArgs { + #[argh(positional)] + /// the name of the exercise + name: String, +} + #[derive(FromArgs, PartialEq, Debug)] #[argh(subcommand, name = "hint")] /// Returns a hint for the given exercise @@ -85,7 +98,6 @@ struct HintArgs { /// Enable rust-analyzer for exercises struct LspArgs {} - #[derive(FromArgs, PartialEq, Debug)] #[argh(subcommand, name = "list")] /// Lists the exercises available in Rustlings @@ -164,7 +176,9 @@ fn main() { "Pending" }; let solve_cond = { - (e.looks_done() && subargs.solved) || (!e.looks_done() && subargs.unsolved) || (!subargs.solved && !subargs.unsolved) + (e.looks_done() && subargs.solved) + || (!e.looks_done() && subargs.unsolved) + || (!subargs.solved && !subargs.unsolved) }; if solve_cond && (filter_cond || subargs.filter.is_none()) { let line = if subargs.paths { @@ -205,6 +219,12 @@ fn main() { run(exercise, verbose).unwrap_or_else(|_| std::process::exit(1)); } + Subcommands::Reset(subargs) => { + let exercise = find_exercise(&subargs.name, &exercises); + + reset(exercise).unwrap_or_else(|_| std::process::exit(1)); + } + Subcommands::Hint(subargs) => { let exercise = find_exercise(&subargs.name, &exercises); @@ -212,7 +232,8 @@ fn main() { } Subcommands::Verify(_subargs) => { - verify(&exercises, (0, exercises.len()), verbose).unwrap_or_else(|_| std::process::exit(1)); + verify(&exercises, (0, exercises.len()), verbose) + .unwrap_or_else(|_| std::process::exit(1)); } Subcommands::Lsp(_subargs) => { @@ -236,12 +257,18 @@ fn main() { Subcommands::Watch(_subargs) => match watch(&exercises, verbose) { Err(e) => { - println!("Error: Could not watch your progress. Error message was {:?}.", e); + println!( + "Error: Could not watch your progress. Error message was {:?}.", + e + ); println!("Most likely you've run out of disk space or your 'inotify limit' has been reached."); std::process::exit(1); } Ok(WatchStatus::Finished) => { - println!("{emoji} All exercises completed! {emoji}", emoji = Emoji("πŸŽ‰", "β˜…")); + println!( + "{emoji} All exercises completed! {emoji}", + emoji = Emoji("πŸŽ‰", "β˜…") + ); println!("\n{}\n", FENISH_LINE); } Ok(WatchStatus::Unfinished) => { @@ -252,8 +279,10 @@ fn main() { } } - -fn spawn_watch_shell(failed_exercise_hint: &Arc>>, should_quit: Arc) { +fn spawn_watch_shell( + failed_exercise_hint: &Arc>>, + should_quit: Arc, +) { let failed_exercise_hint = Arc::clone(failed_exercise_hint); println!("Welcome to watch mode! You can type 'help' to get an overview of the commands you can use here."); thread::spawn(move || loop { @@ -290,16 +319,22 @@ fn spawn_watch_shell(failed_exercise_hint: &Arc>>, should_q fn find_exercise<'a>(name: &str, exercises: &'a [Exercise]) -> &'a Exercise { if name.eq("next") { - exercises.iter().find(|e| !e.looks_done()).unwrap_or_else(|| { - println!("πŸŽ‰ Congratulations! You have done all the exercises!"); - println!("πŸ”š There are no more exercises to do next!"); - std::process::exit(1) - }) + exercises + .iter() + .find(|e| !e.looks_done()) + .unwrap_or_else(|| { + println!("πŸŽ‰ Congratulations! You have done all the exercises!"); + println!("πŸ”š There are no more exercises to do next!"); + std::process::exit(1) + }) } else { - exercises.iter().find(|e| e.name == name).unwrap_or_else(|| { - println!("No exercise found for '{}'!", name); - std::process::exit(1) - }) + exercises + .iter() + .find(|e| e.name == name) + .unwrap_or_else(|| { + println!("No exercise found for '{}'!", name); + std::process::exit(1) + }) } } @@ -337,8 +372,13 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result { let filepath = b.as_path().canonicalize().unwrap(); let pending_exercises = exercises .iter() - .find(|e| filepath.ends_with(&e.path)).into_iter() - .chain(exercises.iter().filter(|e| !e.looks_done() && !filepath.ends_with(&e.path))); + .find(|e| filepath.ends_with(&e.path)) + .into_iter() + .chain( + exercises + .iter() + .filter(|e| !e.looks_done() && !filepath.ends_with(&e.path)), + ); let num_done = exercises.iter().filter(|e| e.looks_done()).count(); clear_screen(); match verify(pending_exercises, (num_done, exercises.len()), verbose) { diff --git a/src/run.rs b/src/run.rs index eb558850..826f00a6 100644 --- a/src/run.rs +++ b/src/run.rs @@ -1,3 +1,5 @@ +use std::process::Command; + use crate::exercise::{Exercise, Mode}; use crate::verify::test; use indicatif::ProgressBar; @@ -15,6 +17,19 @@ pub fn run(exercise: &Exercise, verbose: bool) -> Result<(), ()> { Ok(()) } +// Resets the exercise by stashing the changes. +pub fn reset(exercise: &Exercise) -> Result<(), ()> { + let command = Command::new("git") + .args(["stash", "--"]) + .arg(&exercise.path) + .spawn(); + + match command { + Ok(_) => Ok(()), + Err(_) => Err(()), + } +} + // Invoke the rust compiler on the path of the given exercise // and run the ensuing binary. // This is strictly for non-test binaries, so output is displayed From 0aff5340b5e225b394ac0fdf496824eaa201e19c Mon Sep 17 00:00:00 2001 From: magnusrodseth <59113973+magnusrodseth@users.noreply.github.com> Date: Wed, 17 Aug 2022 16:43:48 +0200 Subject: [PATCH 0699/1293] test: Add integration tests --- tests/integration_tests.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 0be191f0..1a729232 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -110,6 +110,27 @@ fn run_single_test_no_exercise() { .code(1); } +#[test] +fn reset_single_exercise() { + Command::cargo_bin("rustlings") + .unwrap() + .args(&["reset", "intro1"]) + .assert() + .code(0); +} + +#[test] +fn reset_no_exercise() { + Command::cargo_bin("rustlings") + .unwrap() + .arg("reset") + .assert() + .code(1) + .stderr(predicates::str::contains( + "positional arguments not provided", + )); +} + #[test] fn get_hint_for_single_test() { Command::cargo_bin("rustlings") @@ -126,7 +147,7 @@ fn all_exercises_require_confirmation() { for exercise in glob("exercises/**/*.rs").unwrap() { let path = exercise.unwrap(); if path.file_name().unwrap() == "mod.rs" { - continue + continue; } let source = { let mut file = File::open(&path).unwrap(); From 99ea2cbba7dabb011fc76e4480e27f0bbc6149ad Mon Sep 17 00:00:00 2001 From: magnusrodseth <59113973+magnusrodseth@users.noreply.github.com> Date: Wed, 17 Aug 2022 12:54:23 +0200 Subject: [PATCH 0700/1293] chore: make options2 not compile deliberately --- exercises/options/options2.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/options/options2.rs b/exercises/options/options2.rs index eca03f0d..b1120471 100644 --- a/exercises/options/options2.rs +++ b/exercises/options/options2.rs @@ -13,7 +13,7 @@ mod tests { let optional_target = Some(target); // TODO: Make this an if let statement whose value is "Some" type - if let Some(word) = optional_target { + word = optional_target { assert_eq!(word, target); } } @@ -28,7 +28,7 @@ mod tests { // TODO: make this a while let statement - remember that vector.pop also adds another layer of Option // You can stack `Option`'s into while let and if let - while let Some(Some(integer)) = optional_integers.pop() { + integer = optional_integers.pop() { assert_eq!(integer, range); range -= 1; } From e889c5bb60a123c62b9cb4acbab84c817a2fecfa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 18 Aug 2022 09:53:54 +0000 Subject: [PATCH 0701/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index b7bf94b0..09a77046 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -214,6 +214,7 @@ authors.
Markus Boehme

πŸ’»
Nico Vromans

πŸ–‹
vostok92

πŸ–‹ +
Magnus RΓΈdseth

πŸ–‹ From 2088dfbaf6944b637c436a92a5f2a1e290390aec Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 18 Aug 2022 09:53:55 +0000 Subject: [PATCH 0702/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c5d783f1..0792bd27 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1506,6 +1506,15 @@ "contributions": [ "content" ] + }, + { + "login": "magnusrodseth", + "name": "Magnus RΓΈdseth", + "avatar_url": "https://avatars.githubusercontent.com/u/59113973?v=4", + "profile": "http://magnusrodseth.vercel.app", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 93f60d3f8d31c209a1e49d1dd149dbe964b1d2a2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 18 Aug 2022 09:54:29 +0000 Subject: [PATCH 0703/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 09a77046..868f0c8e 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -215,6 +215,7 @@ authors.
Nico Vromans

πŸ–‹
vostok92

πŸ–‹
Magnus RΓΈdseth

πŸ–‹ +
rubiesonthesky

πŸ–‹ From 50272a58e2a86537a558c0e93d02e6c9ef44a3f2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 18 Aug 2022 09:54:30 +0000 Subject: [PATCH 0704/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0792bd27..6b811617 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1515,6 +1515,15 @@ "contributions": [ "content" ] + }, + { + "login": "rubiesonthesky", + "name": "rubiesonthesky", + "avatar_url": "https://avatars.githubusercontent.com/u/2591240?v=4", + "profile": "https://github.com/rubiesonthesky", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d59dde320b90ac5f5679a8f044746e37faa7289f Mon Sep 17 00:00:00 2001 From: magnusrodseth <59113973+magnusrodseth@users.noreply.github.com> Date: Thu, 18 Aug 2022 12:47:26 +0200 Subject: [PATCH 0705/1293] chore: Add suggested changes --- src/main.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3610f827..9bf75e38 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,7 @@ +use crate::exercise::{Exercise, ExerciseList}; use crate::project::RustAnalyzerProject; -use crate::run::run; +use crate::run::{reset, run}; use crate::verify::verify; -use crate::{ - exercise::{Exercise, ExerciseList}, - run::reset, -}; use argh::FromArgs; use console::Emoji; use notify::DebouncedEvent; @@ -77,7 +74,7 @@ struct RunArgs { #[derive(FromArgs, PartialEq, Debug)] #[argh(subcommand, name = "reset")] -/// Resets a single exercise +/// Resets a single exercise using "git stash -- " struct ResetArgs { #[argh(positional)] /// the name of the exercise From 86506fa5fd5441c98e4ac74169d10578b77cd770 Mon Sep 17 00:00:00 2001 From: Gabriel Bianconi <1275491+GabrielBianconi@users.noreply.github.com> Date: Mon, 22 Aug 2022 23:47:23 -0400 Subject: [PATCH 0706/1293] Fix typo in `threads3` hint --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 8bce7216..060643d7 100644 --- a/info.toml +++ b/info.toml @@ -1012,7 +1012,7 @@ hint = """ An alternate way to handle concurrency between threads is to use a mpsc (multiple producer, single consumer) channel to communicate. With both a sending end and a receiving end, it's possible to -send values in one thread and receieve them in another. +send values in one thread and receive them in another. Multiple producers are possible by using clone() to create a duplicate of the original sending end. See https://doc.rust-lang.org/book/ch16-02-message-passing.html for more info. From 6c2630afcff34b634cdf0843d6b01cade2efc622 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 24 Aug 2022 09:15:51 +0000 Subject: [PATCH 0707/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 868f0c8e..02cbf0ed 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -216,6 +216,7 @@ authors.
vostok92

πŸ–‹
Magnus RΓΈdseth

πŸ–‹
rubiesonthesky

πŸ–‹ +
Gabriel Bianconi

πŸ–‹ From b92e7b968ffb1343f6ee11c392c29099afbdae66 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 24 Aug 2022 09:15:52 +0000 Subject: [PATCH 0708/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6b811617..e061d153 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1524,6 +1524,15 @@ "contributions": [ "content" ] + }, + { + "login": "GabrielBianconi", + "name": "Gabriel Bianconi", + "avatar_url": "https://avatars.githubusercontent.com/u/1275491?v=4", + "profile": "http://www.gabrielbianconi.com/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d6e26bb350e423a8f2a90d9405060fdaf9893736 Mon Sep 17 00:00:00 2001 From: Kody Low Date: Wed, 24 Aug 2022 08:33:17 -0700 Subject: [PATCH 0709/1293] 2nd assert is for greater than or equal to, not "more than" like it says in the instructions --- exercises/quiz1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index 8d05b110..d1e76e59 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -5,7 +5,7 @@ // - If // Mary is buying apples. One apple usually costs 2 Rustbucks, but if you buy -// more than 40 at once, each apple only costs 1! Write a function that calculates +// 40 or more at once, each apple only costs 1! Write a function that calculates // the price of an order of apples given the quantity bought. No hints this time! // I AM NOT DONE From 33e501981aa71a986db5db72fea5e6635e6c58b4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 25 Aug 2022 10:12:14 +0000 Subject: [PATCH 0710/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 02cbf0ed..8edf09bf 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -217,6 +217,7 @@ authors.
Magnus RΓΈdseth

πŸ–‹
rubiesonthesky

πŸ–‹
Gabriel Bianconi

πŸ–‹ +
Kody Low

πŸ–‹ From bf95a345533605d8fec4dbd011d4269961ed415d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 25 Aug 2022 10:12:15 +0000 Subject: [PATCH 0711/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e061d153..f2033dcd 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1533,6 +1533,15 @@ "contributions": [ "content" ] + }, + { + "login": "Kodylow", + "name": "Kody Low", + "avatar_url": "https://avatars.githubusercontent.com/u/74332828?v=4", + "profile": "https://github.com/Kodylow", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 3309a01b5e7f18da6409435151e8ebe0c0a697dc Mon Sep 17 00:00:00 2001 From: mokou Date: Sat, 27 Aug 2022 19:48:15 +0100 Subject: [PATCH 0712/1293] chore: release 5.2.0 --- CHANGELOG.md | 17 +++++++++++++++++ Cargo.toml | 2 +- src/main.rs | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cec41c59..0b15cf99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ + +## 5.2.0 (2022-08-27) + +#### Added + +- Added a `reset` command + +#### Changed + +- **options2**: Convert the exercise to use tests + +#### Fixed + +- **threads3**: Fixed a typo +- **quiz1**: Adjusted the explanations to be consistent with + the tests + ## 5.1.1 (2022-08-17) diff --git a/Cargo.toml b/Cargo.toml index d5fd93c7..25cd7bfe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "5.1.1" +version = "5.2.0" authors = ["Liv ", "Carol (Nichols || Goulding) "] edition = "2021" diff --git a/src/main.rs b/src/main.rs index 9bf75e38..8eebc086 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "5.1.1"; +const VERSION: &str = "5.2.0"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From 94bdb708fee17b6a87097cfbbcd697322c7a2141 Mon Sep 17 00:00:00 2001 From: Magnus Markling Date: Sun, 28 Aug 2022 15:10:29 +0200 Subject: [PATCH 0713/1293] Add quotes --- exercises/lifetimes/lifetimes1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/lifetimes/lifetimes1.rs b/exercises/lifetimes/lifetimes1.rs index 58e995c6..0236470d 100644 --- a/exercises/lifetimes/lifetimes1.rs +++ b/exercises/lifetimes/lifetimes1.rs @@ -22,5 +22,5 @@ fn main() { let string2 = "xyz"; let result = longest(string1.as_str(), string2); - println!("The longest string is {}", result); + println!("The longest string is '{}'", result); } From 291da61fda51c4bbb43e48997ede007b9f3a0251 Mon Sep 17 00:00:00 2001 From: Magnus Markling Date: Sun, 28 Aug 2022 15:12:15 +0200 Subject: [PATCH 0714/1293] Add quotes --- exercises/lifetimes/lifetimes2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/lifetimes/lifetimes2.rs b/exercises/lifetimes/lifetimes2.rs index c73a28ad..b48feabc 100644 --- a/exercises/lifetimes/lifetimes2.rs +++ b/exercises/lifetimes/lifetimes2.rs @@ -23,5 +23,5 @@ fn main() { let string2 = String::from("xyz"); result = longest(string1.as_str(), string2.as_str()); } - println!("The longest string is {}", result); + println!("The longest string is '{}'", result); } From c97e659d782fbd26337f52941aff9e0a66fabce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Raz=20Guzm=C3=A1n=20Macedo?= Date: Mon, 5 Sep 2022 10:18:45 -0500 Subject: [PATCH 0715/1293] typox fix --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 060643d7..6feeb186 100644 --- a/info.toml +++ b/info.toml @@ -943,7 +943,7 @@ After using drop() to move the Planets out of scope individually, the reference In the end the sun only has one reference again, to itself. See more at: https://doc.rust-lang.org/book/ch15-04-rc.html -* Unforunately Pluto is no longer considered a planet :( +* Unfortunately Pluto is no longer considered a planet :( """ [[exercises]] From 96552e07c20ef9ad6b2d64d6f853cb8ff1da1b01 Mon Sep 17 00:00:00 2001 From: liv Date: Tue, 6 Sep 2022 12:09:43 +0200 Subject: [PATCH 0716/1293] fix(quiz1): correct explanation once again --- exercises/quiz1.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index d1e76e59..3c2f8789 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -4,9 +4,11 @@ // - Functions // - If -// Mary is buying apples. One apple usually costs 2 Rustbucks, but if you buy -// 40 or more at once, each apple only costs 1! Write a function that calculates -// the price of an order of apples given the quantity bought. No hints this time! +// Mary is buying apples. The price of an apple is calculated as follows: +// - An apple costs 2 rustbucks. +// - If Mary buys more than 40 apples, each apple only costs 1 rustbuck! +// Write a function that calculates the price of an order of apples given +// the quantity bought. No hints this time! // I AM NOT DONE From 1d5700e58a6f55a5549dc217aa9c4d071cdf8d2e Mon Sep 17 00:00:00 2001 From: liv Date: Tue, 6 Sep 2022 12:10:53 +0200 Subject: [PATCH 0717/1293] fix(quiz1): add fourth assert --- exercises/quiz1.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index 3c2f8789..dbb5cdc9 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -20,9 +20,11 @@ fn verify_test() { let price1 = calculate_price_of_apples(35); let price2 = calculate_price_of_apples(40); - let price3 = calculate_price_of_apples(65); + let price3 = calculate_price_of_apples(41); + let price4 = calculate_price_of_apples(65); assert_eq!(70, price1); assert_eq!(80, price2); - assert_eq!(65, price3); + assert_eq!(41, price3); + assert_eq!(65, price4); } From c9c743967f1a8b44407d44a86ffa0421d485dd39 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 6 Sep 2022 10:13:26 +0000 Subject: [PATCH 0718/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 8edf09bf..5dcace66 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -219,6 +219,9 @@ authors.
Gabriel Bianconi

πŸ–‹
Kody Low

πŸ–‹ + +
rzrymiak

πŸ–‹ + From f437f8e9eaa991063cf46a195a1319c11b15b412 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 6 Sep 2022 10:13:27 +0000 Subject: [PATCH 0719/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index f2033dcd..2da6a47f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1542,6 +1542,15 @@ "contributions": [ "content" ] + }, + { + "login": "rzrymiak", + "name": "rzrymiak", + "avatar_url": "https://avatars.githubusercontent.com/u/106121613?v=4", + "profile": "https://github.com/rzrymiak", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 900d58d05481847bb9968a612c35504533d20648 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 6 Sep 2022 10:14:05 +0000 Subject: [PATCH 0720/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 5dcace66..e038de0b 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -221,6 +221,7 @@ authors.
rzrymiak

πŸ–‹ +
Miguel Raz GuzmΓ‘n Macedo

πŸ–‹ From 742200d14bb3552fc595aed8d2fdf80e2c6b2084 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 6 Sep 2022 10:14:06 +0000 Subject: [PATCH 0721/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2da6a47f..c7789419 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1551,6 +1551,15 @@ "contributions": [ "content" ] + }, + { + "login": "miguelraz", + "name": "Miguel Raz GuzmΓ‘n Macedo", + "avatar_url": "https://avatars.githubusercontent.com/u/13056181?v=4", + "profile": "https://github.com/miguelraz", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 7b5ef323c5d3ecb6cd16ff7172e45dae0c5d2360 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 6 Sep 2022 10:17:07 +0000 Subject: [PATCH 0722/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index e038de0b..29d330d2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -222,6 +222,7 @@ authors.
rzrymiak

πŸ–‹
Miguel Raz GuzmΓ‘n Macedo

πŸ–‹ +
Magnus Markling

πŸ–‹ From 50323a3977f5e8f9a99da9413413514d077863ff Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 6 Sep 2022 10:17:08 +0000 Subject: [PATCH 0723/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c7789419..0917089a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1560,6 +1560,15 @@ "contributions": [ "content" ] + }, + { + "login": "memark", + "name": "Magnus Markling", + "avatar_url": "https://avatars.githubusercontent.com/u/318504?v=4", + "profile": "https://github.com/memark", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From c923e7af73a91970d2e63e03babbca9cc0817551 Mon Sep 17 00:00:00 2001 From: mokou Date: Tue, 6 Sep 2022 12:22:17 +0200 Subject: [PATCH 0724/1293] chore: release 5.2.1 --- CHANGELOG.md | 14 ++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 4 ++-- src/main.rs | 2 +- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b15cf99..9925e3db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ + +## 5.2.1 (2022-09-06) + +#### Fixed + +- **quiz1**: Reworded the comment to actually reflect what's going on in the tests. + Also added another assert just to make sure. +- **rc1**: Fixed a typo in the hint. +- **lifetimes**: Add quotes to the `println!` output, for readability. + +#### Housekeeping + +- Fixed a typo in README.md + ## 5.2.0 (2022-08-27) diff --git a/Cargo.lock b/Cargo.lock index 2370e8dc..948d0f42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -459,7 +459,7 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustlings" -version = "5.1.1" +version = "5.2.1" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index 25cd7bfe..dadded68 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "5.2.0" +version = "5.2.1" authors = ["Liv ", "Carol (Nichols || Goulding) "] edition = "2021" diff --git a/README.md b/README.md index 39a31c96..9b619d6f 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ If you get a permission denied message, you might have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install --path .`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.1.1) -git clone -b 5.1.1 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.2.1) +git clone -b 5.2.1 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/src/main.rs b/src/main.rs index 8eebc086..cd79d9ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "5.2.0"; +const VERSION: &str = "5.2.1"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From 34ed2358855e187990636621fdd6e435308532e3 Mon Sep 17 00:00:00 2001 From: Arkid <39987510+aaarkid@users.noreply.github.com> Date: Fri, 9 Sep 2022 02:40:22 +0200 Subject: [PATCH 0725/1293] fix: Add a deref in the test code It's virtually impossible to write a the `num_sq` function to take the Box since it doesn't implement `MulAssign`. --- exercises/conversions/as_ref_mut.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index 9f479739..dafbdb98 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -54,7 +54,7 @@ mod tests { #[test] fn mult_box() { let mut num: Box = Box::new(3); - num_sq(&mut num); + num_sq(&mut *num); assert_eq!(*num, 9); } } From 68fe97bbc23d33b7cb2be5439711029c2e4826c0 Mon Sep 17 00:00:00 2001 From: Tiago De Gaspari <3237254+gasparitiago@users.noreply.github.com> Date: Mon, 12 Sep 2022 10:53:59 -0300 Subject: [PATCH 0726/1293] fix(quiz2): fix comment regarding hints Change the comment on quiz2.rs, since there are no hints. --- exercises/quiz2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/quiz2.rs b/exercises/quiz2.rs index d8fa954a..606d3c70 100644 --- a/exercises/quiz2.rs +++ b/exercises/quiz2.rs @@ -16,7 +16,7 @@ // - The input is going to be a Vector of a 2-length tuple, // the first element is the string, the second one is the command. // - The output element is going to be a Vector of strings. -// Execute `rustlings hint quiz2` or use the `hint` watch subcommand for a hint. +// No hints this time! // I AM NOT DONE From d3c0c18946b56223d5282587c3adb51959f14588 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 13 Sep 2022 08:11:12 +0000 Subject: [PATCH 0727/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 433 +++++++++++++++++++++++++++-------------------------- 1 file changed, 218 insertions(+), 215 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index 29d330d2..43e11b1a 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -9,221 +9,224 @@ authors. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Carol (Nichols || Goulding)

πŸ’» πŸ–‹

QuietMisdreavus

πŸ’» πŸ–‹

Robert M Lugg

πŸ–‹

Hynek Schlawack

πŸ’»

Katharina Fey

πŸ’»

lukabavdaz

πŸ’» πŸ–‹

Erik Vesteraas

πŸ’»

delet0r

πŸ’»

Shaun Bennett

πŸ’»

Andrew Bagshaw

πŸ’»

Kyle Isom

πŸ’»

Colin Pitrat

πŸ’»

Zac Anger

πŸ’»

Matthias Geier

πŸ’»

Chris Pearce

πŸ’»

Yvan Sraka

πŸ’»

Denys Smirnov

πŸ’»

eddyp

πŸ’»

Brian Kung

πŸ’» πŸ–‹

Russell

πŸ’»

Dan Wilhelm

πŸ“–

Jesse

πŸ’» πŸ–‹

Fredrik JambrΓ©n

πŸ’»

Pete McFarlane

πŸ–‹

nkanderson

πŸ’» πŸ–‹

Ajax M

πŸ“–

Dylan Nugent

πŸ–‹

vyaslav

πŸ’» πŸ–‹

George

πŸ’»

Thomas Holloway

πŸ’» πŸ–‹

Jubilee

πŸ’»

WofWca

πŸ’»

Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧

Jens

πŸ“–

Rahat Ahmed

πŸ“–

Abdou Seck

πŸ’» πŸ–‹ πŸ‘€

Katie

πŸ’»

Socrates

πŸ“–

gnodarse

πŸ–‹

Harrison Metzger

πŸ’»

Torben Jonas

πŸ’» πŸ–‹

Paul Bissex

πŸ“–

Steven Mann

πŸ’» πŸ–‹

Mario Reder

πŸ’» πŸ–‹

skim

πŸ’»

Sanjay K

πŸ’» πŸ–‹

Rohan Jain

πŸ’»

Said Aspen

πŸ’» πŸ–‹

Ufuk Celebi

πŸ’»

lebedevsergey

πŸ“–

Aleksei Trifonov

πŸ–‹

Darren Meehan

πŸ–‹

Jihchi Lee

πŸ–‹

Christofer Bertonha

πŸ–‹

Vivek Bharath Akupatni

πŸ’» ⚠️

DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹

Rob Story

πŸ’»

Siobhan Jacobson

πŸ’»

Evan Carroll

πŸ–‹

Jawaad Mahmood

πŸ–‹

Gaurang Tandon

πŸ–‹

Stefan Kupresak

πŸ–‹

Greg Leonard

πŸ–‹

Ryan McQuen

πŸ’»

Annika

πŸ‘€

Axel Viala

πŸ’»

Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»

Caleb Webber

🚧

Peter N

🚧

seancad

🚧

Will Hayworth

πŸ–‹

Christian Zeller

πŸ–‹

Jean-Francois Chevrette

πŸ–‹ πŸ’»

John Baber-Lucero

πŸ–‹

Tal

πŸ–‹

apogeeoak

πŸ–‹ πŸ’»

Larry Garfield

πŸ–‹

circumspect

πŸ–‹

Cyrus Wyett

πŸ–‹

cadolphs

πŸ’»

Pascal H.

πŸ–‹

Rod Elias

πŸ–‹

Matt Lebl

πŸ’»

Ignacio Le Fluk

πŸ–‹

Taylor Yu

πŸ’» πŸ–‹

Patrick Hintermayer

πŸ’»

Pete Pavlovski

πŸ–‹

k12ish

πŸ–‹

Shao Yang Hong

πŸ–‹

Brandon Macer

πŸ–‹

Stoian Dan

πŸ–‹

Pi Delport

πŸ–‹

Sateesh

πŸ’» πŸ–‹

ZC

πŸ–‹

hyperparabolic

πŸ’»

arlecchino

πŸ“–

Richthofen

πŸ’»

Ivan Nerazumov

πŸ“–

lauralindzey

πŸ“–

Rakshit Sinha

πŸ–‹

Damian

πŸ–‹

Ben Armstead

πŸ’»

anuk909

πŸ–‹ πŸ’»

granddaifuku

πŸ–‹

Weilet

πŸ–‹

LIU JIE

πŸ–‹

Antoine BΓΌsch

πŸ’»

frogtd

πŸ–‹

Zhenghao Lu

πŸ–‹

Fredrik Enestad

πŸ–‹

xuesong

πŸ–‹

Michael Walsh

πŸ’»

alirezaghey

πŸ–‹

Franklin van Nes

πŸ’»

nekonako

πŸ’»

ZX

πŸ–‹

Yang Wen

πŸ–‹

Brandon High

πŸ“–

x-hgg-x

πŸ’»

Kisaragi

πŸ“–

Lucas Aries

πŸ–‹

ragreenburg

πŸ–‹

stevenfukase

πŸ–‹

J-S-Kim

πŸ–‹

Fointard

πŸ–‹

Ryan Lowe

πŸ’»

cui fliter

πŸ–‹

Ron Lusk

πŸ–‹

Bryan Lee

πŸ–‹

Nandaja Varma

πŸ“–

pwygab

πŸ’»

Lucas Grigolon Varela

πŸ–‹

Bufo

πŸ–‹

Jack Clayton

πŸ’»

Konstantin

πŸ–‹

0pling

πŸ–‹

KatanaFluorescent

πŸ’»

Drew Morris

πŸ’»

camperdue42

πŸ–‹

YsuOS

πŸ–‹

Steven Nguyen

πŸ–‹

nacairns1

πŸ–‹

Paulo Gabriel Justino Bezerra

πŸ–‹

Jason

πŸ–‹

exdx

πŸ–‹

James Zow

πŸ–‹

James Bromley

πŸ–‹

swhiteCQC

πŸ–‹

Neil Pate

πŸ–‹

wojexe

πŸ–‹

Mattia Schiavon

πŸ–‹

Eric Jolibois

πŸ–‹

Edwin Chang

πŸ–‹

Saikat Das

πŸ–‹

Jeremy Goh

πŸ–‹

Lioness100

πŸ–‹

Tristan Nicholls

πŸ–‹

Claire

πŸ–‹

Maurice Van Wassenhove

πŸ–‹

John Mendelewski

πŸ’»

Brian Fakhoury

πŸ–‹

Markus Boehme

πŸ’»

Nico Vromans

πŸ–‹

vostok92

πŸ–‹

Magnus RΓΈdseth

πŸ–‹

rubiesonthesky

πŸ–‹

Gabriel Bianconi

πŸ–‹

Kody Low

πŸ–‹

rzrymiak

πŸ–‹

Miguel Raz GuzmΓ‘n Macedo

πŸ–‹

Magnus Markling

πŸ–‹

Carol (Nichols || Goulding)

πŸ’» πŸ–‹

QuietMisdreavus

πŸ’» πŸ–‹

Robert M Lugg

πŸ–‹

Hynek Schlawack

πŸ’»

Katharina Fey

πŸ’»

lukabavdaz

πŸ’» πŸ–‹

Erik Vesteraas

πŸ’»

delet0r

πŸ’»

Shaun Bennett

πŸ’»

Andrew Bagshaw

πŸ’»

Kyle Isom

πŸ’»

Colin Pitrat

πŸ’»

Zac Anger

πŸ’»

Matthias Geier

πŸ’»

Chris Pearce

πŸ’»

Yvan Sraka

πŸ’»

Denys Smirnov

πŸ’»

eddyp

πŸ’»

Brian Kung

πŸ’» πŸ–‹

Russell

πŸ’»

Dan Wilhelm

πŸ“–

Jesse

πŸ’» πŸ–‹

Fredrik JambrΓ©n

πŸ’»

Pete McFarlane

πŸ–‹

nkanderson

πŸ’» πŸ–‹

Ajax M

πŸ“–

Dylan Nugent

πŸ–‹

vyaslav

πŸ’» πŸ–‹

George

πŸ’»

Thomas Holloway

πŸ’» πŸ–‹

Jubilee

πŸ’»

WofWca

πŸ’»

Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧

Jens

πŸ“–

Rahat Ahmed

πŸ“–

Abdou Seck

πŸ’» πŸ–‹ πŸ‘€

Katie

πŸ’»

Socrates

πŸ“–

gnodarse

πŸ–‹

Harrison Metzger

πŸ’»

Torben Jonas

πŸ’» πŸ–‹

Paul Bissex

πŸ“–

Steven Mann

πŸ’» πŸ–‹

Mario Reder

πŸ’» πŸ–‹

skim

πŸ’»

Sanjay K

πŸ’» πŸ–‹

Rohan Jain

πŸ’»

Said Aspen

πŸ’» πŸ–‹

Ufuk Celebi

πŸ’»

lebedevsergey

πŸ“–

Aleksei Trifonov

πŸ–‹

Darren Meehan

πŸ–‹

Jihchi Lee

πŸ–‹

Christofer Bertonha

πŸ–‹

Vivek Bharath Akupatni

πŸ’» ⚠️

DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹

Rob Story

πŸ’»

Siobhan Jacobson

πŸ’»

Evan Carroll

πŸ–‹

Jawaad Mahmood

πŸ–‹

Gaurang Tandon

πŸ–‹

Stefan Kupresak

πŸ–‹

Greg Leonard

πŸ–‹

Ryan McQuen

πŸ’»

Annika

πŸ‘€

Axel Viala

πŸ’»

Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»

Caleb Webber

🚧

Peter N

🚧

seancad

🚧

Will Hayworth

πŸ–‹

Christian Zeller

πŸ–‹

Jean-Francois Chevrette

πŸ–‹ πŸ’»

John Baber-Lucero

πŸ–‹

Tal

πŸ–‹

apogeeoak

πŸ–‹ πŸ’»

Larry Garfield

πŸ–‹

circumspect

πŸ–‹

Cyrus Wyett

πŸ–‹

cadolphs

πŸ’»

Pascal H.

πŸ–‹

Rod Elias

πŸ–‹

Matt Lebl

πŸ’»

Ignacio Le Fluk

πŸ–‹

Taylor Yu

πŸ’» πŸ–‹

Patrick Hintermayer

πŸ’»

Pete Pavlovski

πŸ–‹

k12ish

πŸ–‹

Shao Yang Hong

πŸ–‹

Brandon Macer

πŸ–‹

Stoian Dan

πŸ–‹

Pi Delport

πŸ–‹

Sateesh

πŸ’» πŸ–‹

ZC

πŸ–‹

hyperparabolic

πŸ’»

arlecchino

πŸ“–

Richthofen

πŸ’»

Ivan Nerazumov

πŸ“–

lauralindzey

πŸ“–

Rakshit Sinha

πŸ–‹

Damian

πŸ–‹

Ben Armstead

πŸ’»

anuk909

πŸ–‹ πŸ’»

granddaifuku

πŸ–‹

Weilet

πŸ–‹

LIU JIE

πŸ–‹

Antoine BΓΌsch

πŸ’»

frogtd

πŸ–‹

Zhenghao Lu

πŸ–‹

Fredrik Enestad

πŸ–‹

xuesong

πŸ–‹

Michael Walsh

πŸ’»

alirezaghey

πŸ–‹

Franklin van Nes

πŸ’»

nekonako

πŸ’»

ZX

πŸ–‹

Yang Wen

πŸ–‹

Brandon High

πŸ“–

x-hgg-x

πŸ’»

Kisaragi

πŸ“–

Lucas Aries

πŸ–‹

ragreenburg

πŸ–‹

stevenfukase

πŸ–‹

J-S-Kim

πŸ–‹

Fointard

πŸ–‹

Ryan Lowe

πŸ’»

cui fliter

πŸ–‹

Ron Lusk

πŸ–‹

Bryan Lee

πŸ–‹

Nandaja Varma

πŸ“–

pwygab

πŸ’»

Lucas Grigolon Varela

πŸ–‹

Bufo

πŸ–‹

Jack Clayton

πŸ’»

Konstantin

πŸ–‹

0pling

πŸ–‹

KatanaFluorescent

πŸ’»

Drew Morris

πŸ’»

camperdue42

πŸ–‹

YsuOS

πŸ–‹

Steven Nguyen

πŸ–‹

nacairns1

πŸ–‹

Paulo Gabriel Justino Bezerra

πŸ–‹

Jason

πŸ–‹

exdx

πŸ–‹

James Zow

πŸ–‹

James Bromley

πŸ–‹

swhiteCQC

πŸ–‹

Neil Pate

πŸ–‹

wojexe

πŸ–‹

Mattia Schiavon

πŸ–‹

Eric Jolibois

πŸ–‹

Edwin Chang

πŸ–‹

Saikat Das

πŸ–‹

Jeremy Goh

πŸ–‹

Lioness100

πŸ–‹

Tristan Nicholls

πŸ–‹

Claire

πŸ–‹

Maurice Van Wassenhove

πŸ–‹

John Mendelewski

πŸ’»

Brian Fakhoury

πŸ–‹

Markus Boehme

πŸ’»

Nico Vromans

πŸ–‹

vostok92

πŸ–‹

Magnus RΓΈdseth

πŸ–‹

rubiesonthesky

πŸ–‹

Gabriel Bianconi

πŸ–‹

Kody Low

πŸ–‹

rzrymiak

πŸ–‹

Miguel Raz GuzmΓ‘n Macedo

πŸ–‹

Magnus Markling

πŸ–‹

Tiago De Gaspari

πŸ–‹
From 072847943af3884ce0ae21dc594649a86be54e2e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 13 Sep 2022 08:11:13 +0000 Subject: [PATCH 0728/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0917089a..a5a6dd60 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1569,6 +1569,15 @@ "contributions": [ "content" ] + }, + { + "login": "gasparitiago", + "name": "Tiago De Gaspari", + "avatar_url": "https://avatars.githubusercontent.com/u/3237254?v=4", + "profile": "https://github.com/gasparitiago", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, @@ -1576,5 +1585,6 @@ "projectOwner": "rust-lang", "repoType": "github", "repoHost": "https://github.com", - "skipCi": true + "skipCi": true, + "commitConvention": "angular" } From 3028d1395cfa1bc2dbf49f7678d8f083e9042a56 Mon Sep 17 00:00:00 2001 From: skaunov <65976143+skaunov@users.noreply.github.com> Date: Tue, 13 Sep 2022 16:33:03 +0300 Subject: [PATCH 0729/1293] Add link to `std` in `strings3` hint Seems like it's the first place, where `std` is introduced in Rustlings, and it's a good place to facilitate docs discovery for user. As _the book_ seems to have no Rustlings-sized solutions for this exercise. --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 6feeb186..e80d8a9c 100644 --- a/info.toml +++ b/info.toml @@ -449,7 +449,7 @@ path = "exercises/strings/strings3.rs" mode = "test" hint = """ There's tons of useful standard library functions for strings. Let's try and use some of -them! +them: ! For the compose_me method: You can either use the `format!` macro, or convert the string slice into an owned string, which you can then freely extend.""" From 3375b67b2b72a25960aa9e37612f8f1d3d2c05b2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 15 Sep 2022 09:29:14 +0000 Subject: [PATCH 0730/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 43e11b1a..9f63f5dd 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -225,6 +225,7 @@ authors.
Miguel Raz GuzmΓ‘n Macedo

πŸ–‹
Magnus Markling

πŸ–‹
Tiago De Gaspari

πŸ–‹ +
skaunov

πŸ–‹ From 37a734421992deab8e15286245e4429919d3a93d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 15 Sep 2022 09:29:15 +0000 Subject: [PATCH 0731/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a5a6dd60..4fd4b1d5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1578,6 +1578,15 @@ "contributions": [ "content" ] + }, + { + "login": "skaunov", + "name": "skaunov", + "avatar_url": "https://avatars.githubusercontent.com/u/65976143?v=4", + "profile": "https://github.com/skaunov", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From c0b3194a55da75c6404944e01f032c2a92ea5b0c Mon Sep 17 00:00:00 2001 From: skaunov <65976143+skaunov@users.noreply.github.com> Date: Sat, 17 Sep 2022 00:26:05 +0300 Subject: [PATCH 0732/1293] Correct a link in `threads1` `hint` It didn't work without last character --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index e80d8a9c..263b23eb 100644 --- a/info.toml +++ b/info.toml @@ -969,7 +969,7 @@ https://doc.rust-lang.org/std/thread/fn.spawn.html A challenge with multi-threaded applications is that the main thread can finish before the spawned threads are completed. -https://doc.rust-lang.org/book/ch16-01-threads.html#waiting-for-all-threads-to-finish-using-join-handle +https://doc.rust-lang.org/book/ch16-01-threads.html#waiting-for-all-threads-to-finish-using-join-handles Collect the JoinHandles and wait for them to finish. https://doc.rust-lang.org/std/thread/struct.JoinHandle.html From efdebd48b6239b29d69d684fae575ca738cacf41 Mon Sep 17 00:00:00 2001 From: Cal Jacobson Date: Sun, 25 Sep 2022 15:22:15 -0500 Subject: [PATCH 0733/1293] improve hint for iterators1 --- info.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/info.toml b/info.toml index e80d8a9c..acc9fc3e 100644 --- a/info.toml +++ b/info.toml @@ -818,9 +818,9 @@ Step 1: We need to apply something to the collection `my_fav_fruits` before we start to go through it. What could that be? Take a look at the struct definition for a vector for inspiration: https://doc.rust-lang.org/std/vec/struct.Vec.html. -Step 2 & step 2.1: +Step 2 & step 3: Very similar to the lines above and below. You've got this! -Step 3: +Step 4: An iterator goes through all elements in a collection, but what if we've run out of elements? What should we expect here? If you're stuck, take a look at https://doc.rust-lang.org/std/iter/trait.Iterator.html for some ideas. From 1660f1647eb16692f5dd1367395416c9b261848d Mon Sep 17 00:00:00 2001 From: Tostapunk Date: Wed, 28 Sep 2022 23:40:00 +0200 Subject: [PATCH 0734/1293] fix: Fix typo in errors5 hint fixes #1205 --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index e80d8a9c..ecf307d7 100644 --- a/info.toml +++ b/info.toml @@ -627,7 +627,7 @@ propagated using `?` operators. How do we declare a return type from `main()` th Under the hood, the `?` operator calls `From::from` on the error value to convert it to a boxed trait object, a `Box`. This boxed trait object is polymorphic, and since all -errors implement the `error:Error` trait, we can capture lots of different errors in one "Box" +errors implement the `error::Error` trait, we can capture lots of different errors in one "Box" object. Check out this section of the book: From 58cba835f2d79665a11017483d5df7c62c5c1607 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 08:45:06 +0000 Subject: [PATCH 0735/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 350 +++++++++++++++++++++++++++-------------------------- 1 file changed, 177 insertions(+), 173 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index 9f63f5dd..bfc8b99a 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -11,223 +11,227 @@ authors. - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - + + + + + + + + +

Carol (Nichols || Goulding)

πŸ’» πŸ–‹

QuietMisdreavus

πŸ’» πŸ–‹

Robert M Lugg

πŸ–‹

Hynek Schlawack

πŸ’»

Katharina Fey

πŸ’»

lukabavdaz

πŸ’» πŸ–‹

Erik Vesteraas

πŸ’»

delet0r

πŸ’»
Carol (Nichols || Goulding)
Carol (Nichols || Goulding)

πŸ’» πŸ–‹
QuietMisdreavus
QuietMisdreavus

πŸ’» πŸ–‹
Robert M Lugg
Robert M Lugg

πŸ–‹
Hynek Schlawack
Hynek Schlawack

πŸ’»
Katharina Fey
Katharina Fey

πŸ’»
lukabavdaz
lukabavdaz

πŸ’» πŸ–‹
Erik Vesteraas
Erik Vesteraas

πŸ’»
delet0r
delet0r

πŸ’»

Shaun Bennett

πŸ’»

Andrew Bagshaw

πŸ’»

Kyle Isom

πŸ’»

Colin Pitrat

πŸ’»

Zac Anger

πŸ’»

Matthias Geier

πŸ’»

Chris Pearce

πŸ’»

Yvan Sraka

πŸ’»
Shaun Bennett
Shaun Bennett

πŸ’»
Andrew Bagshaw
Andrew Bagshaw

πŸ’»
Kyle Isom
Kyle Isom

πŸ’»
Colin Pitrat
Colin Pitrat

πŸ’»
Zac Anger
Zac Anger

πŸ’»
Matthias Geier
Matthias Geier

πŸ’»
Chris Pearce
Chris Pearce

πŸ’»
Yvan Sraka
Yvan Sraka

πŸ’»

Denys Smirnov

πŸ’»

eddyp

πŸ’»

Brian Kung

πŸ’» πŸ–‹

Russell

πŸ’»

Dan Wilhelm

πŸ“–

Jesse

πŸ’» πŸ–‹

Fredrik JambrΓ©n

πŸ’»

Pete McFarlane

πŸ–‹
Denys Smirnov
Denys Smirnov

πŸ’»
eddyp
eddyp

πŸ’»
Brian Kung
Brian Kung

πŸ’» πŸ–‹
Russell
Russell

πŸ’»
Dan Wilhelm
Dan Wilhelm

πŸ“–
Jesse
Jesse

πŸ’» πŸ–‹
Fredrik JambrΓ©n
Fredrik JambrΓ©n

πŸ’»
Pete McFarlane
Pete McFarlane

πŸ–‹

nkanderson

πŸ’» πŸ–‹

Ajax M

πŸ“–

Dylan Nugent

πŸ–‹

vyaslav

πŸ’» πŸ–‹

George

πŸ’»

Thomas Holloway

πŸ’» πŸ–‹

Jubilee

πŸ’»

WofWca

πŸ’»
nkanderson
nkanderson

πŸ’» πŸ–‹
Ajax M
Ajax M

πŸ“–
Dylan Nugent
Dylan Nugent

πŸ–‹
vyaslav
vyaslav

πŸ’» πŸ–‹
George
George

πŸ’»
Thomas Holloway
Thomas Holloway

πŸ’» πŸ–‹
Jubilee
Jubilee

πŸ’»
WofWca
WofWca

πŸ’»

Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧

Jens

πŸ“–

Rahat Ahmed

πŸ“–

Abdou Seck

πŸ’» πŸ–‹ πŸ‘€

Katie

πŸ’»

Socrates

πŸ“–

gnodarse

πŸ–‹

Harrison Metzger

πŸ’»
Roberto Vidal
Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧
Jens
Jens

πŸ“–
Rahat Ahmed
Rahat Ahmed

πŸ“–
Abdou Seck
Abdou Seck

πŸ’» πŸ–‹ πŸ‘€
Katie
Katie

πŸ’»
Socrates
Socrates

πŸ“–
gnodarse
gnodarse

πŸ–‹
Harrison Metzger
Harrison Metzger

πŸ’»

Torben Jonas

πŸ’» πŸ–‹

Paul Bissex

πŸ“–

Steven Mann

πŸ’» πŸ–‹

Mario Reder

πŸ’» πŸ–‹

skim

πŸ’»

Sanjay K

πŸ’» πŸ–‹

Rohan Jain

πŸ’»

Said Aspen

πŸ’» πŸ–‹
Torben Jonas
Torben Jonas

πŸ’» πŸ–‹
Paul Bissex
Paul Bissex

πŸ“–
Steven Mann
Steven Mann

πŸ’» πŸ–‹
Mario Reder
Mario Reder

πŸ’» πŸ–‹
skim
skim

πŸ’»
Sanjay K
Sanjay K

πŸ’» πŸ–‹
Rohan Jain
Rohan Jain

πŸ’»
Said Aspen
Said Aspen

πŸ’» πŸ–‹

Ufuk Celebi

πŸ’»

lebedevsergey

πŸ“–

Aleksei Trifonov

πŸ–‹

Darren Meehan

πŸ–‹

Jihchi Lee

πŸ–‹

Christofer Bertonha

πŸ–‹

Vivek Bharath Akupatni

πŸ’» ⚠️

DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹
Ufuk Celebi
Ufuk Celebi

πŸ’»
lebedevsergey
lebedevsergey

πŸ“–
Aleksei Trifonov
Aleksei Trifonov

πŸ–‹
Darren Meehan
Darren Meehan

πŸ–‹
Jihchi Lee
Jihchi Lee

πŸ–‹
Christofer Bertonha
Christofer Bertonha

πŸ–‹
Vivek Bharath Akupatni
Vivek Bharath Akupatni

πŸ’» ⚠️
DΓ­dac SementΓ© FernΓ‘ndez
DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹

Rob Story

πŸ’»

Siobhan Jacobson

πŸ’»

Evan Carroll

πŸ–‹

Jawaad Mahmood

πŸ–‹

Gaurang Tandon

πŸ–‹

Stefan Kupresak

πŸ–‹

Greg Leonard

πŸ–‹

Ryan McQuen

πŸ’»
Rob Story
Rob Story

πŸ’»
Siobhan Jacobson
Siobhan Jacobson

πŸ’»
Evan Carroll
Evan Carroll

πŸ–‹
Jawaad Mahmood
Jawaad Mahmood

πŸ–‹
Gaurang Tandon
Gaurang Tandon

πŸ–‹
Stefan Kupresak
Stefan Kupresak

πŸ–‹
Greg Leonard
Greg Leonard

πŸ–‹
Ryan McQuen
Ryan McQuen

πŸ’»

Annika

πŸ‘€

Axel Viala

πŸ’»

Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»

Caleb Webber

🚧

Peter N

🚧

seancad

🚧

Will Hayworth

πŸ–‹

Christian Zeller

πŸ–‹
Annika
Annika

πŸ‘€
Axel Viala
Axel Viala

πŸ’»
Mohammed Sazid Al Rashid
Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»
Caleb Webber
Caleb Webber

🚧
Peter N
Peter N

🚧
seancad
seancad

🚧
Will Hayworth
Will Hayworth

πŸ–‹
Christian Zeller
Christian Zeller

πŸ–‹

Jean-Francois Chevrette

πŸ–‹ πŸ’»

John Baber-Lucero

πŸ–‹

Tal

πŸ–‹

apogeeoak

πŸ–‹ πŸ’»

Larry Garfield

πŸ–‹

circumspect

πŸ–‹

Cyrus Wyett

πŸ–‹

cadolphs

πŸ’»
Jean-Francois Chevrette
Jean-Francois Chevrette

πŸ–‹ πŸ’»
John Baber-Lucero
John Baber-Lucero

πŸ–‹
Tal
Tal

πŸ–‹
apogeeoak
apogeeoak

πŸ–‹ πŸ’»
Larry Garfield
Larry Garfield

πŸ–‹
circumspect
circumspect

πŸ–‹
Cyrus Wyett
Cyrus Wyett

πŸ–‹
cadolphs
cadolphs

πŸ’»

Pascal H.

πŸ–‹

Rod Elias

πŸ–‹

Matt Lebl

πŸ’»

Ignacio Le Fluk

πŸ–‹

Taylor Yu

πŸ’» πŸ–‹

Patrick Hintermayer

πŸ’»

Pete Pavlovski

πŸ–‹

k12ish

πŸ–‹
Pascal H.
Pascal H.

πŸ–‹
Rod Elias
Rod Elias

πŸ–‹
Matt Lebl
Matt Lebl

πŸ’»
Ignacio Le Fluk
Ignacio Le Fluk

πŸ–‹
Taylor Yu
Taylor Yu

πŸ’» πŸ–‹
Patrick Hintermayer
Patrick Hintermayer

πŸ’»
Pete Pavlovski
Pete Pavlovski

πŸ–‹
k12ish
k12ish

πŸ–‹

Shao Yang Hong

πŸ–‹

Brandon Macer

πŸ–‹

Stoian Dan

πŸ–‹

Pi Delport

πŸ–‹

Sateesh

πŸ’» πŸ–‹

ZC

πŸ–‹

hyperparabolic

πŸ’»

arlecchino

πŸ“–
Shao Yang Hong
Shao Yang Hong

πŸ–‹
Brandon Macer
Brandon Macer

πŸ–‹
Stoian Dan
Stoian Dan

πŸ–‹
Pi Delport
Pi Delport

πŸ–‹
Sateesh
Sateesh

πŸ’» πŸ–‹
ZC
ZC

πŸ–‹
hyperparabolic
hyperparabolic

πŸ’»
arlecchino
arlecchino

πŸ“–

Richthofen

πŸ’»

Ivan Nerazumov

πŸ“–

lauralindzey

πŸ“–

Rakshit Sinha

πŸ–‹

Damian

πŸ–‹

Ben Armstead

πŸ’»

anuk909

πŸ–‹ πŸ’»

granddaifuku

πŸ–‹
Richthofen
Richthofen

πŸ’»
Ivan Nerazumov
Ivan Nerazumov

πŸ“–
lauralindzey
lauralindzey

πŸ“–
Rakshit Sinha
Rakshit Sinha

πŸ–‹
Damian
Damian

πŸ–‹
Ben Armstead
Ben Armstead

πŸ’»
anuk909
anuk909

πŸ–‹ πŸ’»
granddaifuku
granddaifuku

πŸ–‹

Weilet

πŸ–‹

LIU JIE

πŸ–‹

Antoine BΓΌsch

πŸ’»

frogtd

πŸ–‹

Zhenghao Lu

πŸ–‹

Fredrik Enestad

πŸ–‹

xuesong

πŸ–‹

Michael Walsh

πŸ’»
Weilet
Weilet

πŸ–‹
LIU JIE
LIU JIE

πŸ–‹
Antoine BΓΌsch
Antoine BΓΌsch

πŸ’»
frogtd
frogtd

πŸ–‹
Zhenghao Lu
Zhenghao Lu

πŸ–‹
Fredrik Enestad
Fredrik Enestad

πŸ–‹
xuesong
xuesong

πŸ–‹
Michael Walsh
Michael Walsh

πŸ’»

alirezaghey

πŸ–‹

Franklin van Nes

πŸ’»

nekonako

πŸ’»

ZX

πŸ–‹

Yang Wen

πŸ–‹

Brandon High

πŸ“–

x-hgg-x

πŸ’»

Kisaragi

πŸ“–
alirezaghey
alirezaghey

πŸ–‹
Franklin van Nes
Franklin van Nes

πŸ’»
nekonako
nekonako

πŸ’»
ZX
ZX

πŸ–‹
Yang Wen
Yang Wen

πŸ–‹
Brandon High
Brandon High

πŸ“–
x-hgg-x
x-hgg-x

πŸ’»
Kisaragi
Kisaragi

πŸ“–

Lucas Aries

πŸ–‹

ragreenburg

πŸ–‹

stevenfukase

πŸ–‹

J-S-Kim

πŸ–‹

Fointard

πŸ–‹

Ryan Lowe

πŸ’»

cui fliter

πŸ–‹

Ron Lusk

πŸ–‹
Lucas Aries
Lucas Aries

πŸ–‹
ragreenburg
ragreenburg

πŸ–‹
stevenfukase
stevenfukase

πŸ–‹
J-S-Kim
J-S-Kim

πŸ–‹
Fointard
Fointard

πŸ–‹
Ryan Lowe
Ryan Lowe

πŸ’»
cui fliter
cui fliter

πŸ–‹
Ron Lusk
Ron Lusk

πŸ–‹

Bryan Lee

πŸ–‹

Nandaja Varma

πŸ“–

pwygab

πŸ’»

Lucas Grigolon Varela

πŸ–‹

Bufo

πŸ–‹

Jack Clayton

πŸ’»

Konstantin

πŸ–‹

0pling

πŸ–‹
Bryan Lee
Bryan Lee

πŸ–‹
Nandaja Varma
Nandaja Varma

πŸ“–
pwygab
pwygab

πŸ’»
Lucas Grigolon Varela
Lucas Grigolon Varela

πŸ–‹
Bufo
Bufo

πŸ–‹
Jack Clayton
Jack Clayton

πŸ’»
Konstantin
Konstantin

πŸ–‹
0pling
0pling

πŸ–‹

KatanaFluorescent

πŸ’»

Drew Morris

πŸ’»

camperdue42

πŸ–‹

YsuOS

πŸ–‹

Steven Nguyen

πŸ–‹

nacairns1

πŸ–‹

Paulo Gabriel Justino Bezerra

πŸ–‹

Jason

πŸ–‹
KatanaFluorescent
KatanaFluorescent

πŸ’»
Drew Morris
Drew Morris

πŸ’»
camperdue42
camperdue42

πŸ–‹
YsuOS
YsuOS

πŸ–‹
Steven Nguyen
Steven Nguyen

πŸ–‹
nacairns1
nacairns1

πŸ–‹
Paulo Gabriel Justino Bezerra
Paulo Gabriel Justino Bezerra

πŸ–‹
Jason
Jason

πŸ–‹

exdx

πŸ–‹

James Zow

πŸ–‹

James Bromley

πŸ–‹

swhiteCQC

πŸ–‹

Neil Pate

πŸ–‹

wojexe

πŸ–‹

Mattia Schiavon

πŸ–‹

Eric Jolibois

πŸ–‹
exdx
exdx

πŸ–‹
James Zow
James Zow

πŸ–‹
James Bromley
James Bromley

πŸ–‹
swhiteCQC
swhiteCQC

πŸ–‹
Neil Pate
Neil Pate

πŸ–‹
wojexe
wojexe

πŸ–‹
Mattia Schiavon
Mattia Schiavon

πŸ–‹
Eric Jolibois
Eric Jolibois

πŸ–‹

Edwin Chang

πŸ–‹

Saikat Das

πŸ–‹

Jeremy Goh

πŸ–‹

Lioness100

πŸ–‹

Tristan Nicholls

πŸ–‹

Claire

πŸ–‹

Maurice Van Wassenhove

πŸ–‹

John Mendelewski

πŸ’»
Edwin Chang
Edwin Chang

πŸ–‹
Saikat Das
Saikat Das

πŸ–‹
Jeremy Goh
Jeremy Goh

πŸ–‹
Lioness100
Lioness100

πŸ–‹
Tristan Nicholls
Tristan Nicholls

πŸ–‹
Claire
Claire

πŸ–‹
Maurice Van Wassenhove
Maurice Van Wassenhove

πŸ–‹
John Mendelewski
John Mendelewski

πŸ’»

Brian Fakhoury

πŸ–‹

Markus Boehme

πŸ’»

Nico Vromans

πŸ–‹

vostok92

πŸ–‹

Magnus RΓΈdseth

πŸ–‹

rubiesonthesky

πŸ–‹

Gabriel Bianconi

πŸ–‹

Kody Low

πŸ–‹
Brian Fakhoury
Brian Fakhoury

πŸ–‹
Markus Boehme
Markus Boehme

πŸ’»
Nico Vromans
Nico Vromans

πŸ–‹
vostok92
vostok92

πŸ–‹
Magnus RΓΈdseth
Magnus RΓΈdseth

πŸ–‹
rubiesonthesky
rubiesonthesky

πŸ–‹
Gabriel Bianconi
Gabriel Bianconi

πŸ–‹
Kody Low
Kody Low

πŸ–‹

rzrymiak

πŸ–‹

Miguel Raz GuzmΓ‘n Macedo

πŸ–‹

Magnus Markling

πŸ–‹

Tiago De Gaspari

πŸ–‹

skaunov

πŸ–‹
rzrymiak
rzrymiak

πŸ–‹
Miguel Raz GuzmΓ‘n Macedo
Miguel Raz GuzmΓ‘n Macedo

πŸ–‹
Magnus Markling
Magnus Markling

πŸ–‹
Tiago De Gaspari
Tiago De Gaspari

πŸ–‹
skaunov
skaunov

πŸ–‹
Cal Jacobson
Cal Jacobson

πŸ–‹
From a59e305665f0cb52f29cc77f76cf09f6f3acae03 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 08:45:07 +0000 Subject: [PATCH 0736/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4fd4b1d5..76dd3ad7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1587,6 +1587,15 @@ "contributions": [ "content" ] + }, + { + "login": "cj81499", + "name": "Cal Jacobson", + "avatar_url": "https://avatars.githubusercontent.com/u/9152032?v=4", + "profile": "http://caljacobson.dev", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From b4c7507b4d979c5c14870045e148afb6cec83103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Faug=C3=A8re?= Date: Fri, 30 Sep 2022 15:50:45 +0200 Subject: [PATCH 0737/1293] feat: Add VSCode extension recommendation --- .gitignore | 3 ++- .vscode/extensions.json | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .vscode/extensions.json diff --git a/.gitignore b/.gitignore index 534453bc..c14f9227 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ exercises/clippy/Cargo.toml exercises/clippy/Cargo.lock rust-project.json .idea -.vscode +.vscode/* +!.vscode/extensions.json *.iml *.o diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..b85de749 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "rust-lang.rust-analyzer" + ] +} From 4749768734fd14e38eea555034f3586c11280933 Mon Sep 17 00:00:00 2001 From: Duchoud Nicolas <34117620+duchonic@users.noreply.github.com> Date: Tue, 4 Oct 2022 11:36:18 +0200 Subject: [PATCH 0738/1293] additional test for fees --- exercises/structs/structs3.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index 0b3615f4..4c2a6610 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -78,5 +78,6 @@ mod tests { let package = Package::new(sender_country, recipient_country, 1500); assert_eq!(package.get_fees(cents_per_gram), 4500); + assert_eq!(package.get_fees(cents_per_gram*2), 9000); } } From 76392d81fa2689d22ccf8dc0cf774e8d345cb80d Mon Sep 17 00:00:00 2001 From: Duchoud Nicolas <34117620+duchonic@users.noreply.github.com> Date: Tue, 4 Oct 2022 11:43:23 +0200 Subject: [PATCH 0739/1293] Added spaces around * --- exercises/structs/structs3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index 4c2a6610..3536a457 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -78,6 +78,6 @@ mod tests { let package = Package::new(sender_country, recipient_country, 1500); assert_eq!(package.get_fees(cents_per_gram), 4500); - assert_eq!(package.get_fees(cents_per_gram*2), 9000); + assert_eq!(package.get_fees(cents_per_gram * 2), 9000); } } From 1e1b689775b01c0b5fb7d63d26b2d29898d4ab87 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 10 Oct 2022 09:29:27 +0000 Subject: [PATCH 0740/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index bfc8b99a..abd0d185 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -227,11 +227,9 @@ authors. Tiago De Gaspari
Tiago De Gaspari

πŸ–‹ skaunov
skaunov

πŸ–‹ Cal Jacobson
Cal Jacobson

πŸ–‹ + Duchoud Nicolas
Duchoud Nicolas

πŸ–‹ - - - From 88a767f39a643f0240bc8e928327ffcbdaa0bad4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 10 Oct 2022 09:29:28 +0000 Subject: [PATCH 0741/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 76dd3ad7..6deddfca 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1596,6 +1596,15 @@ "contributions": [ "content" ] + }, + { + "login": "duchonic", + "name": "Duchoud Nicolas", + "avatar_url": "https://avatars.githubusercontent.com/u/34117620?v=4", + "profile": "https://github.com/duchonic", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From bfdc1991a5244610992fd3633b36750d539ccabb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 10 Oct 2022 09:39:59 +0000 Subject: [PATCH 0742/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index abd0d185..704021ab 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -228,6 +228,7 @@ authors. skaunov
skaunov

πŸ–‹ Cal Jacobson
Cal Jacobson

πŸ–‹ Duchoud Nicolas
Duchoud Nicolas

πŸ–‹ + GaΓ«tan FaugΓ¨re
Gaëtan Faugère

πŸ”§ From d00f7783db431ac918e2d56a54def3e6e7d7beb2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 10 Oct 2022 09:40:00 +0000 Subject: [PATCH 0743/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6deddfca..7374951b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1605,6 +1605,15 @@ "contributions": [ "content" ] + }, + { + "login": "gfaugere", + "name": "GaΓ«tan FaugΓ¨re", + "avatar_url": "https://avatars.githubusercontent.com/u/11901979?v=4", + "profile": "https://github.com/gfaugere", + "contributions": [ + "tool" + ] } ], "contributorsPerLine": 8, From da6178bdc6b8a88d2bfdac82e0281f45b177a299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20=C5=BBur?= Date: Tue, 11 Oct 2022 10:43:32 +0200 Subject: [PATCH 0744/1293] Removed unnecessary use statement --- exercises/options/options2.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/exercises/options/options2.rs b/exercises/options/options2.rs index b1120471..4e36443f 100644 --- a/exercises/options/options2.rs +++ b/exercises/options/options2.rs @@ -5,8 +5,6 @@ #[cfg(test)] mod tests { - use super::*; - #[test] fn simple_option() { let target = "rustlings"; From c157c53983d67d209e7ffc63896f9a9030f5154c Mon Sep 17 00:00:00 2001 From: bhbuehler <25541343+bhbuehler@users.noreply.github.com> Date: Tue, 11 Oct 2022 12:05:37 -0500 Subject: [PATCH 0745/1293] docs(options1): fix and clarify 24 hour time instruction --- exercises/options/options1.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/options/options1.rs b/exercises/options/options1.rs index d1735c2f..1149af08 100644 --- a/exercises/options/options1.rs +++ b/exercises/options/options1.rs @@ -8,8 +8,8 @@ // all, so there'll be no more left :( // TODO: Return an Option! fn maybe_icecream(time_of_day: u16) -> Option { - // We use the 24-hour system here, so 10PM is a value of 22 - // The Option output should gracefully handle cases where time_of_day > 24. + // We use the 24-hour system here, so 10PM is a value of 22 and 12AM is a value of 0 + // The Option output should gracefully handle cases where time_of_day > 23. ??? } From 08df6224af229429598c7da027e3738781bb750b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 12 Oct 2022 14:51:21 +0000 Subject: [PATCH 0746/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 704021ab..8dd71163 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -230,6 +230,9 @@ authors. Duchoud Nicolas
Duchoud Nicolas

πŸ–‹ GaΓ«tan FaugΓ¨re
Gaëtan Faugère

πŸ”§ + + bhbuehler
bhbuehler

πŸ–‹ + From a50dcc97280644740939e64140bc313be7e5cb8a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 12 Oct 2022 14:51:22 +0000 Subject: [PATCH 0747/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7374951b..5235b389 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1614,6 +1614,15 @@ "contributions": [ "tool" ] + }, + { + "login": "bhbuehler", + "name": "bhbuehler", + "avatar_url": "https://avatars.githubusercontent.com/u/25541343?v=4", + "profile": "https://github.com/bhbuehler", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 2940ad059d7f0fa1dbcbed2a6c522ba3cbfd0ec7 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Wed, 12 Oct 2022 16:30:52 -0400 Subject: [PATCH 0748/1293] Apply uninlined-format-args clippy lint This lint should also be applied to the excersies, but I am not certain how to run it for all non-crate individual files. To re-run: ``` rustup run nightly cargo clippy --fix -- -A clippy::all -W clippy::uninlined_format_args ``` --- src/exercise.rs | 2 +- src/main.rs | 22 +++++++++++----------- src/run.rs | 4 ++-- src/verify.rs | 14 +++++++------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 4be3a2cc..c0dae34e 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -20,7 +20,7 @@ fn temp_file() -> String { .filter(|c| c.is_alphanumeric()) .collect(); - format!("./temp_{}_{}", process::id(), thread_id) + format!("./temp_{}_{thread_id}", process::id()) } // The mode of the exercise. diff --git a/src/main.rs b/src/main.rs index cd79d9ff..3e78333a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -121,12 +121,12 @@ fn main() { let args: Args = argh::from_env(); if args.version { - println!("v{}", VERSION); + println!("v{VERSION}"); std::process::exit(0); } if args.nested.is_none() { - println!("\n{}\n", WELCOME); + println!("\n{WELCOME}\n"); } if !Path::new("info.toml").exists() { @@ -150,7 +150,7 @@ fn main() { let verbose = args.nocapture; let command = args.nested.unwrap_or_else(|| { - println!("{}\n", DEFAULT_OUT); + println!("{DEFAULT_OUT}\n"); std::process::exit(0); }); match command { @@ -179,11 +179,11 @@ fn main() { }; if solve_cond && (filter_cond || subargs.filter.is_none()) { let line = if subargs.paths { - format!("{}\n", fname) + format!("{fname}\n") } else if subargs.names { format!("{}\n", e.name) } else { - format!("{:<17}\t{:<46}\t{:<7}\n", e.name, fname, status) + format!("{:<17}\t{fname:<46}\t{status:<7}\n", e.name) }; // Somehow using println! leads to the binary panicking // when its output is piped. @@ -266,7 +266,7 @@ fn main() { "{emoji} All exercises completed! {emoji}", emoji = Emoji("πŸŽ‰", "β˜…") ); - println!("\n{}\n", FENISH_LINE); + println!("\n{FENISH_LINE}\n"); } Ok(WatchStatus::Unfinished) => { println!("We hope you're enjoying learning about Rust!"); @@ -289,7 +289,7 @@ fn spawn_watch_shell( let input = input.trim(); if input == "hint" { if let Some(hint) = &*failed_exercise_hint.lock().unwrap() { - println!("{}", hint); + println!("{hint}"); } } else if input == "clear" { println!("\x1B[2J\x1B[1;1H"); @@ -306,10 +306,10 @@ fn spawn_watch_shell( println!("Watch mode automatically re-evaluates the current exercise"); println!("when you edit a file's contents.") } else { - println!("unknown command: {}", input); + println!("unknown command: {input}"); } } - Err(error) => println!("error reading command: {}", error), + Err(error) => println!("error reading command: {error}"), } }); } @@ -329,7 +329,7 @@ fn find_exercise<'a>(name: &str, exercises: &'a [Exercise]) -> &'a Exercise { .iter() .find(|e| e.name == name) .unwrap_or_else(|| { - println!("No exercise found for '{}'!", name); + println!("No exercise found for '{name}'!"); std::process::exit(1) }) } @@ -392,7 +392,7 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result { Err(RecvTimeoutError::Timeout) => { // the timeout expired, just check the `should_quit` variable below then loop again } - Err(e) => println!("watch error: {:?}", e), + Err(e) => println!("watch error: {e:?}"), } // Check if we need to exit if should_quit.load(Ordering::SeqCst) { diff --git a/src/run.rs b/src/run.rs index 826f00a6..1e2e56cf 100644 --- a/src/run.rs +++ b/src/run.rs @@ -35,7 +35,7 @@ pub fn reset(exercise: &Exercise) -> Result<(), ()> { // This is strictly for non-test binaries, so output is displayed fn compile_and_run(exercise: &Exercise) -> Result<(), ()> { let progress_bar = ProgressBar::new_spinner(); - progress_bar.set_message(format!("Compiling {}...", exercise)); + progress_bar.set_message(format!("Compiling {exercise}...")); progress_bar.enable_steady_tick(100); let compilation_result = exercise.compile(); @@ -52,7 +52,7 @@ fn compile_and_run(exercise: &Exercise) -> Result<(), ()> { } }; - progress_bar.set_message(format!("Running {}...", exercise)); + progress_bar.set_message(format!("Running {exercise}...")); let result = compilation.run(); progress_bar.finish_and_clear(); diff --git a/src/verify.rs b/src/verify.rs index 6f877831..95ccbe50 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -48,7 +48,7 @@ pub fn test(exercise: &Exercise, verbose: bool) -> Result<(), ()> { // Invoke the rust compiler without running the resulting binary fn compile_only(exercise: &Exercise) -> Result { let progress_bar = ProgressBar::new_spinner(); - progress_bar.set_message(format!("Compiling {}...", exercise)); + progress_bar.set_message(format!("Compiling {exercise}...")); progress_bar.enable_steady_tick(100); let _ = compile(exercise, &progress_bar)?; @@ -60,12 +60,12 @@ fn compile_only(exercise: &Exercise) -> Result { // Compile the given Exercise and run the resulting binary in an interactive mode fn compile_and_run_interactively(exercise: &Exercise) -> Result { let progress_bar = ProgressBar::new_spinner(); - progress_bar.set_message(format!("Compiling {}...", exercise)); + progress_bar.set_message(format!("Compiling {exercise}...")); progress_bar.enable_steady_tick(100); let compilation = compile(exercise, &progress_bar)?; - progress_bar.set_message(format!("Running {}...", exercise)); + progress_bar.set_message(format!("Running {exercise}...")); let result = compilation.run(); progress_bar.finish_and_clear(); @@ -86,7 +86,7 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result { // the output if verbose is set to true fn compile_and_test(exercise: &Exercise, run_mode: RunMode, verbose: bool) -> Result { let progress_bar = ProgressBar::new_spinner(); - progress_bar.set_message(format!("Testing {}...", exercise)); + progress_bar.set_message(format!("Testing {exercise}...")); progress_bar.enable_steady_tick(100); let compilation = compile(exercise, &progress_bar)?; @@ -165,16 +165,16 @@ fn prompt_for_completion(exercise: &Exercise, prompt_output: Option) -> println!(); if no_emoji { - println!("~*~ {} ~*~", success_msg) + println!("~*~ {success_msg} ~*~") } else { - println!("πŸŽ‰ πŸŽ‰ {} πŸŽ‰ πŸŽ‰", success_msg) + println!("πŸŽ‰ πŸŽ‰ {success_msg} πŸŽ‰ πŸŽ‰") } println!(); if let Some(output) = prompt_output { println!("Output:"); println!("{}", separator()); - println!("{}", output); + println!("{output}"); println!("{}", separator()); println!(); } From 68388e5d4f73ca7717eff0e668aa89f5c3a2124e Mon Sep 17 00:00:00 2001 From: azzamsa Date: Mon, 3 Oct 2022 19:56:46 +0700 Subject: [PATCH 0749/1293] feat(verify): add progress percentage in watch mode --- src/main.rs | 2 +- src/verify.rs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index cd79d9ff..8a17a35f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -202,7 +202,7 @@ fn main() { }); let percentage_progress = exercises_done as f32 / exercises.len() as f32 * 100.0; println!( - "Progress: You completed {} / {} exercises ({:.2} %).", + "Progress: You completed {} / {} exercises ({:.1} %).", exercises_done, exercises.len(), percentage_progress diff --git a/src/verify.rs b/src/verify.rs index 6f877831..595990d2 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -16,7 +16,7 @@ pub fn verify<'a>( let (num_done, total) = progress; let bar = ProgressBar::new(total as u64); bar.set_style(ProgressStyle::default_bar() - .template("Progress: [{bar:60.green/red}] {pos}/{len}") + .template("Progress: [{bar:60.green/red}] {pos}/{len} {msg}") .progress_chars("#>-") ); bar.set_position(num_done as u64); @@ -29,6 +29,8 @@ pub fn verify<'a>( if !compile_result.unwrap_or(false) { return Err(exercise); } + let percentage = num_done as f32 / total as f32 * 100.0; + bar.set_message(format!("({:.1} %)", percentage)); bar.inc(1); } Ok(()) From c96fbc71809e913cacde12a5859404490a2f783a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 14 Oct 2022 09:26:50 +0000 Subject: [PATCH 0750/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 8dd71163..3e7f916d 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -232,6 +232,7 @@ authors. bhbuehler
bhbuehler

πŸ–‹ + Yuri Astrakhan
Yuri Astrakhan

πŸ’» From 8b251a202f09b24fa1c009e32b69bfa82d4ca75e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 14 Oct 2022 09:26:51 +0000 Subject: [PATCH 0751/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5235b389..eaaf6244 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1623,6 +1623,15 @@ "contributions": [ "content" ] + }, + { + "login": "nyurik", + "name": "Yuri Astrakhan", + "avatar_url": "https://avatars.githubusercontent.com/u/1641515?v=4", + "profile": "https://github.com/nyurik", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From eea039b025c22e0103cea3cb980c985d6e0ff9b6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 14 Oct 2022 09:30:47 +0000 Subject: [PATCH 0752/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 3e7f916d..642659b2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -233,6 +233,7 @@ authors. bhbuehler
bhbuehler

πŸ–‹ Yuri Astrakhan
Yuri Astrakhan

πŸ’» + azzamsa
azzamsa

πŸ’» From 3cb9825033f1d77e51a769db0300a62b525dbb1b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 14 Oct 2022 09:30:48 +0000 Subject: [PATCH 0753/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index eaaf6244..208d52ef 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1632,6 +1632,15 @@ "contributions": [ "code" ] + }, + { + "login": "azzamsa", + "name": "azzamsa", + "avatar_url": "https://avatars.githubusercontent.com/u/17734314?v=4", + "profile": "http://azzamsa.com", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From ccd73c0a815bbf5bdb1d215e0e0417f5ea216e68 Mon Sep 17 00:00:00 2001 From: Matthew Van Schellebeeck Date: Sun, 16 Oct 2022 08:18:56 -0400 Subject: [PATCH 0754/1293] style: explicitly use Arc::clone --- exercises/threads/threads2.rs | 2 +- exercises/threads/threads3.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/threads/threads2.rs b/exercises/threads/threads2.rs index d0f8578f..ada3d14a 100644 --- a/exercises/threads/threads2.rs +++ b/exercises/threads/threads2.rs @@ -17,7 +17,7 @@ fn main() { let status = Arc::new(JobStatus { jobs_completed: 0 }); let mut handles = vec![]; for _ in 0..10 { - let status_shared = status.clone(); + let status_shared = Arc::clone(&status); let handle = thread::spawn(move || { thread::sleep(Duration::from_millis(250)); // TODO: You must take an action before you update a shared value diff --git a/exercises/threads/threads3.rs b/exercises/threads/threads3.rs index 27e99088..9e9f285a 100644 --- a/exercises/threads/threads3.rs +++ b/exercises/threads/threads3.rs @@ -26,8 +26,8 @@ impl Queue { fn send_tx(q: Queue, tx: mpsc::Sender) -> () { let qc = Arc::new(q); - let qc1 = qc.clone(); - let qc2 = qc.clone(); + let qc1 = Arc::clone(&qc); + let qc2 = Arc::clone(&qc); thread::spawn(move || { for val in &qc1.first_half { From 5e6207bb90919d71a68c852f1c46eb6f23b09c10 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 09:38:01 +0000 Subject: [PATCH 0755/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 642659b2..0a21049d 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -234,6 +234,7 @@ authors. bhbuehler
bhbuehler

πŸ–‹ Yuri Astrakhan
Yuri Astrakhan

πŸ’» azzamsa
azzamsa

πŸ’» + mvanschellebeeck
mvanschellebeeck

πŸ–‹ From 61c086b2429d7a7ea5d7aa98ddeaa6870b564a9b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 09:38:02 +0000 Subject: [PATCH 0756/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 208d52ef..f46e1ade 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1641,6 +1641,15 @@ "contributions": [ "code" ] + }, + { + "login": "mvanschellebeeck", + "name": "mvanschellebeeck", + "avatar_url": "https://avatars.githubusercontent.com/u/17671052?v=4", + "profile": "https://github.com/mvanschellebeeck", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From a20452489720a59f4b080c6c241d8df1d0e06e75 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 09:39:49 +0000 Subject: [PATCH 0757/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 0a21049d..b994508c 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -235,6 +235,7 @@ authors. Yuri Astrakhan
Yuri Astrakhan

πŸ’» azzamsa
azzamsa

πŸ’» mvanschellebeeck
mvanschellebeeck

πŸ–‹ + Arkid
Arkid

πŸ–‹ From ee841311714ebb8baa1fe46e00281d00f38bf3ad Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 09:39:50 +0000 Subject: [PATCH 0758/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index f46e1ade..6e9ece99 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1650,6 +1650,15 @@ "contributions": [ "content" ] + }, + { + "login": "aaarkid", + "name": "Arkid", + "avatar_url": "https://avatars.githubusercontent.com/u/39987510?v=4", + "profile": "https://github.com/aaarkid", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 623161e50dd8dc1960452c7e5bd7d66bfbab483f Mon Sep 17 00:00:00 2001 From: Arkid <39987510+aaarkid@users.noreply.github.com> Date: Fri, 21 Oct 2022 02:45:31 +0200 Subject: [PATCH 0759/1293] fix: Revert deref change Revert the addition of a deref in PR #1192 by me, which should not be there. Apologies for the inconvenience caused. --- exercises/conversions/as_ref_mut.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index dafbdb98..c9eed7d0 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -17,7 +17,7 @@ fn char_counter(arg: T) -> usize { arg.as_ref().chars().count() } -// Squares a number using AsMut. Add the trait bound as is appropriate and +// Squares a number using as_mut(). Add the trait bound as is appropriate and // implement the function body. fn num_sq(arg: &mut T) { ??? @@ -54,7 +54,7 @@ mod tests { #[test] fn mult_box() { let mut num: Box = Box::new(3); - num_sq(&mut *num); + num_sq(&mut num); assert_eq!(*num, 9); } } From da995b24ebbc210b5fe22eef3c52fbdde89a9d01 Mon Sep 17 00:00:00 2001 From: Tom Kunc Date: Mon, 24 Oct 2022 13:57:44 +1100 Subject: [PATCH 0760/1293] feat(macros-readme): Add link to MacroKata --- exercises/macros/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/exercises/macros/README.md b/exercises/macros/README.md index 31a941b7..e34bc3a8 100644 --- a/exercises/macros/README.md +++ b/exercises/macros/README.md @@ -4,6 +4,10 @@ Rust's macro system is very powerful, but also kind of difficult to wrap your head around. We're not going to teach you how to write your own fully-featured macros. Instead, we'll show you how to use and create them. +If you'd like to learn more about writing your own macros, the +[macrokata](https://github.com/tfpk/macrokata) project has a similar style +of exercises to Rustlings, but is all about learning to write Macros. + ## Further information - [Macros](https://doc.rust-lang.org/book/ch19-06-macros.html) From 8e0f5bf1256e1485ea9f1d2ed81ad1059c21f2e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20B=C3=B6hme?= Date: Tue, 25 Jan 2022 11:47:16 +0100 Subject: [PATCH 0761/1293] feat: Add flake.nix for nix users Co-authored-by: Winter --- README.md | 13 ++++++++++++ flake.lock | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 53 +++++++++++++++++++++++++++++++++++++++++++++++ shell.nix | 6 ++++++ 4 files changed, 132 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 shell.nix diff --git a/README.md b/README.md index 9b619d6f..29f3e5de 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,19 @@ curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | This will install Rustlings and give you access to the `rustlings` command. Run it to get started! +### Nix +Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`. + +```bash +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.2.1) +git clone -b 5.2.1 --depth 1 https://github.com/rust-lang/rustlings +cd rustlings +# if nix version > 2.3 +nix develop +# if nix version <= 2.3 +nix-shell +``` + ## Windows In PowerShell (Run as Administrator), set `ExecutionPolicy` to `RemoteSigned`: diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..ceb62c6d --- /dev/null +++ b/flake.lock @@ -0,0 +1,60 @@ +{ + "nodes": { + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1666629043, + "narHash": "sha256-Yoq6Ut2F3Ol73yO9hG93x6ts5c4F5BhKTbcF3DtBEAw=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "b39fd6e4edef83cb4a135ebef98751ce23becc33", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..15c82b77 --- /dev/null +++ b/flake.nix @@ -0,0 +1,53 @@ +{ + description = "Small exercises to get you used to reading and writing Rust code"; + + inputs = { + flake-compat = { + url = "github:edolstra/flake-compat"; + flake = false; + }; + flake-utils.url = "github:numtide/flake-utils"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + }; + + outputs = { self, flake-utils, nixpkgs, ... }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + rustlings = + pkgs.rustPlatform.buildRustPackage { + name = "rustlings"; + version = "5.2.1"; + + src = with pkgs.lib; cleanSourceWith { + src = self; + # a function that returns a bool determining if the path should be included in the cleaned source + filter = path: type: + let + # filename + baseName = builtins.baseNameOf (toString path); + # path from root directory + path' = builtins.replaceStrings [ "${self}/" ] [ "" ] path; + # checks if path is in the directory + inDirectory = directory: hasPrefix directory path'; + in + inDirectory "src" || + inDirectory "tests" || + hasPrefix "Cargo" baseName || + baseName == "info.toml"; + }; + + cargoLock.lockFile = ./Cargo.lock; + }; + in + { + devShell = pkgs.mkShell { + buildInputs = with pkgs; [ + cargo + rustc + rust-analyzer + rustlings + ]; + }; + }); +} diff --git a/shell.nix b/shell.nix new file mode 100644 index 00000000..fa2a56c7 --- /dev/null +++ b/shell.nix @@ -0,0 +1,6 @@ +(import (let lock = builtins.fromJSON (builtins.readFile ./flake.lock); +in fetchTarball { + url = + "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz"; + sha256 = lock.nodes.flake-compat.locked.narHash; +}) { src = ./.; }).shellNix From a2134d70c6968ec4bc37e4e42a8f09a6e27b7962 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 26 Oct 2022 08:49:52 +0000 Subject: [PATCH 0762/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index b994508c..84f29b43 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -236,6 +236,7 @@ authors. azzamsa
azzamsa

πŸ’» mvanschellebeeck
mvanschellebeeck

πŸ–‹ Arkid
Arkid

πŸ–‹ + Tom Kunc
Tom Kunc

πŸ–‹ From a0b10af1a355da8684e942ccc1d7e0d4cef1089d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 26 Oct 2022 08:49:53 +0000 Subject: [PATCH 0763/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6e9ece99..523202d3 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1659,6 +1659,15 @@ "contributions": [ "content" ] + }, + { + "login": "tfpk", + "name": "Tom Kunc", + "avatar_url": "https://avatars.githubusercontent.com/u/10906982?v=4", + "profile": "http://tfpk.dev", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d01ce8304e018b815cbd4488034f2339c749b6b1 Mon Sep 17 00:00:00 2001 From: mfurak Date: Sun, 6 Nov 2022 20:28:34 +0100 Subject: [PATCH 0764/1293] style: format errors5 with rustfmt --- exercises/error_handling/errors5.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/error_handling/errors5.rs b/exercises/error_handling/errors5.rs index 2ba8f903..6da06ef3 100644 --- a/exercises/error_handling/errors5.rs +++ b/exercises/error_handling/errors5.rs @@ -7,7 +7,7 @@ // For now, think of the `Box` type as an "I want anything that does ???" type, which, given // Rust's usual standards for runtime safety, should strike you as somewhat lenient! -// In short, this particular use case for boxes is for when you want to own a value and you care only that it is a +// In short, this particular use case for boxes is for when you want to own a value and you care only that it is a // type which implements a particular trait. To do so, The Box is declared as of type Box where Trait is the trait // the compiler looks for on any value used in that context. For this exercise, that context is the potential errors // which can be returned in a Result. @@ -46,7 +46,7 @@ impl PositiveNonzeroInteger { match value { x if x < 0 => Err(CreationError::Negative), x if x == 0 => Err(CreationError::Zero), - x => Ok(PositiveNonzeroInteger(x as u64)) + x => Ok(PositiveNonzeroInteger(x as u64)), } } } From 152193b459085c2bdfe41f65df7ea04a032d2a4c Mon Sep 17 00:00:00 2001 From: mfurak Date: Sun, 6 Nov 2022 20:42:17 +0100 Subject: [PATCH 0765/1293] style: format errors6 with rustfmt --- exercises/error_handling/errors6.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/exercises/error_handling/errors6.rs b/exercises/error_handling/errors6.rs index 1306fb03..8097b490 100644 --- a/exercises/error_handling/errors6.rs +++ b/exercises/error_handling/errors6.rs @@ -16,7 +16,7 @@ use std::num::ParseIntError; #[derive(PartialEq, Debug)] enum ParsePosNonzeroError { Creation(CreationError), - ParseInt(ParseIntError) + ParseInt(ParseIntError), } impl ParsePosNonzeroError { @@ -27,14 +27,11 @@ impl ParsePosNonzeroError { // fn from_parseint... } -fn parse_pos_nonzero(s: &str) - -> Result -{ +fn parse_pos_nonzero(s: &str) -> Result { // TODO: change this to return an appropriate error instead of panicking // when `parse()` returns an error. let x: i64 = s.parse().unwrap(); - PositiveNonzeroInteger::new(x) - .map_err(ParsePosNonzeroError::from_creation) + PositiveNonzeroInteger::new(x).map_err(ParsePosNonzeroError::from_creation) } // Don't change anything below this line. @@ -53,7 +50,7 @@ impl PositiveNonzeroInteger { match value { x if x < 0 => Err(CreationError::Negative), x if x == 0 => Err(CreationError::Zero), - x => Ok(PositiveNonzeroInteger(x as u64)) + x => Ok(PositiveNonzeroInteger(x as u64)), } } } From 6413f5b5d4c56b0a07931f75ecba5ea57694b8d9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:14:20 +0000 Subject: [PATCH 0766/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 84f29b43..379e9865 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -237,6 +237,7 @@ authors. mvanschellebeeck
mvanschellebeeck

πŸ–‹ Arkid
Arkid

πŸ–‹ Tom Kunc
Tom Kunc

πŸ–‹ + Marek FurΓ‘k
Marek FurΓ‘k

πŸ–‹ From 70f9f08d2cc9a1b0dc40ef1ab3f393417551c5aa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:14:21 +0000 Subject: [PATCH 0767/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 523202d3..4caffea7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1668,6 +1668,15 @@ "contributions": [ "content" ] + }, + { + "login": "mfurak", + "name": "Marek FurΓ‘k", + "avatar_url": "https://avatars.githubusercontent.com/u/38523093?v=4", + "profile": "https://github.com/mfurak", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 2e1630c712892f83cb1cc3adfb034f9e358e7a5e Mon Sep 17 00:00:00 2001 From: mokou Date: Fri, 11 Nov 2022 16:12:09 +0100 Subject: [PATCH 0768/1293] chore: style fixes --- Cargo.toml | 5 ++++- README.md | 2 +- info.toml | 18 +++++++++--------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index dadded68..3f5b253d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "rustlings" version = "5.2.1" -authors = ["Liv ", "Carol (Nichols || Goulding) "] +authors = [ + "Liv ", + "Carol (Nichols || Goulding) ", +] edition = "2021" [dependencies] diff --git a/README.md b/README.md index 9b619d6f..4e0bbf0b 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ After every couple of sections, there will be a quiz that'll test your knowledge ## Enabling `rust-analyzer` -Run the command `rustlings lsp` which will generate a `rust-project.json` at the root of the project, this allows [rust-analyzer](https://rust-analyzer.github.io/) to parse each exercise. +Run the command `rustlings lsp` which will generate a `rust-project.json` at the root of the project, this allows [rust-analyzer](https://rust-analyzer.github.io/) to parse each exercise. ## Continuing On diff --git a/info.toml b/info.toml index a840f9ba..5a177506 100644 --- a/info.toml +++ b/info.toml @@ -416,8 +416,8 @@ path = "exercises/enums/enums3.rs" mode = "test" hint = """ As a first step, you can define enums to compile this code without errors. -and then create a match expression in `process()`. -Note that you need to deconstruct some message variants +and then create a match expression in `process()`. +Note that you need to deconstruct some message variants in the match expression to get value in the variant.""" # STRINGS @@ -476,7 +476,7 @@ name = "modules2" path = "exercises/modules/modules2.rs" mode = "compile" hint = """ -The delicious_snacks module is trying to present an external interface that is +The delicious_snacks module is trying to present an external interface that is different than its internal structure (the `fruits` and `veggies` modules and associated constants). Complete the `use` statements to fit the uses in main and find the one keyword missing for both constants.""" @@ -623,12 +623,12 @@ path = "exercises/error_handling/errors5.rs" mode = "compile" hint = """ There are two different possible `Result` types produced within `main()`, which are -propagated using `?` operators. How do we declare a return type from `main()` that allows both? +propagated using `?` operators. How do we declare a return type from `main()` that allows both? Under the hood, the `?` operator calls `From::from` on the error value to convert it to a boxed trait object, a `Box`. This boxed trait object is polymorphic, and since all errors implement the `error::Error` trait, we can capture lots of different errors in one "Box" -object. +object. Check out this section of the book: https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html#a-shortcut-for-propagating-errors-the--operator @@ -862,7 +862,7 @@ case is a vector of integers and the failure case is a DivisionError. The list_of_results function needs to return a vector of results. -See https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect for how +See https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect for how the `FromIterator` trait is used in `collect()`. This trait is REALLY powerful! It can make the solution to this exercise infinitely easier.""" @@ -964,10 +964,10 @@ name = "threads1" path = "exercises/threads/threads1.rs" mode = "compile" hint = """ -`JoinHandle` is a struct that is returned from a spawned thread: +`JoinHandle` is a struct that is returned from a spawned thread: https://doc.rust-lang.org/std/thread/fn.spawn.html -A challenge with multi-threaded applications is that the main thread can +A challenge with multi-threaded applications is that the main thread can finish before the spawned threads are completed. https://doc.rust-lang.org/book/ch16-01-threads.html#waiting-for-all-threads-to-finish-using-join-handles @@ -1077,7 +1077,7 @@ mathematical constants in the rust standard library. https://doc.rust-lang.org/stable/std/f32/consts/index.html We may be tempted to use our own approximations for certain mathematical constants, -but clippy recognizes those imprecise mathematical constants as a source of +but clippy recognizes those imprecise mathematical constants as a source of potential error. See the suggestions of the clippy warning in compile output and use the appropriate replacement constant from std::f32::consts...""" From ef3ef82057d2e8d499d7bcaa204aeb0edea8a3c7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 12 Nov 2022 15:44:31 +0000 Subject: [PATCH 0769/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 379e9865..515f28da 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -238,6 +238,7 @@ authors. Arkid
Arkid

πŸ–‹ Tom Kunc
Tom Kunc

πŸ–‹ Marek FurΓ‘k
Marek FurΓ‘k

πŸ–‹ + Winter
Winter

πŸ’» From 78e2685d5fd7902c0be9b441846841a9f9cd57c4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 12 Nov 2022 15:44:32 +0000 Subject: [PATCH 0770/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4caffea7..7d5b26da 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1677,6 +1677,15 @@ "contributions": [ "content" ] + }, + { + "login": "winterqt", + "name": "Winter", + "avatar_url": "https://avatars.githubusercontent.com/u/78392041?v=4", + "profile": "https://winter.cafe", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 43c049df753b3a26b4d018a553ef53ffb63efa33 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 12 Nov 2022 15:45:16 +0000 Subject: [PATCH 0771/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 515f28da..b0a5b64c 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -240,6 +240,9 @@ authors. Marek FurΓ‘k
Marek FurΓ‘k

πŸ–‹ Winter
Winter

πŸ’» + + Moritz BΓΆhme
Moritz BΓΆhme

πŸ’» + From 28d78e288b3f267865c1c18a465cb3c6b0ff1645 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 12 Nov 2022 15:45:16 +0000 Subject: [PATCH 0772/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7d5b26da..bb021499 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1686,6 +1686,15 @@ "contributions": [ "code" ] + }, + { + "login": "MoritzBoehme", + "name": "Moritz BΓΆhme", + "avatar_url": "https://avatars.githubusercontent.com/u/42215704?v=4", + "profile": "https://moritzboeh.me", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 2ceb59a11d7e2c8aa31d3bd7e1c7cb2c94d61300 Mon Sep 17 00:00:00 2001 From: craymel <71062756+craymel@users.noreply.github.com> Date: Fri, 18 Nov 2022 23:38:27 +1100 Subject: [PATCH 0773/1293] fix: Update structs3 hint --- info.toml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/info.toml b/info.toml index 5a177506..df3820d2 100644 --- a/info.toml +++ b/info.toml @@ -386,11 +386,9 @@ name = "structs3" path = "exercises/structs/structs3.rs" mode = "test" hint = """ -The new method needs to panic if the weight is physically impossible :), how do we do that in Rust? - For is_international: What makes a package international? Seems related to the places it goes through right? -For calculate_transport_fees: Bigger is more expensive usually, we don't have size, but something may fit the bill here :) +For get_fees: This method takes an additional argument, is there a field in the Package struct that this relates to? Have a look in The Book, to find out more about method implementations: https://doc.rust-lang.org/book/ch05-03-method-syntax.html""" From e8ef4fe5d612e554c2efa55835d351bc7f24f76e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Nov 2022 23:35:51 +0000 Subject: [PATCH 0774/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index b0a5b64c..44d8a0ff 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -242,6 +242,7 @@ authors. Moritz BΓΆhme
Moritz BΓΆhme

πŸ’» + craymel
craymel

πŸ–‹ From a8033e0193b39effead5e280fb5ee71a91fde8a1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Nov 2022 23:35:52 +0000 Subject: [PATCH 0775/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index bb021499..9e2f307f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1695,6 +1695,15 @@ "contributions": [ "code" ] + }, + { + "login": "craymel", + "name": "craymel", + "avatar_url": "https://avatars.githubusercontent.com/u/71062756?v=4", + "profile": "https://github.com/craymel", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From be0b7e084ed5713d74c7f1bacdfd563fb2145a95 Mon Sep 17 00:00:00 2001 From: TK Buristrakul Date: Thu, 24 Nov 2022 19:20:59 +0000 Subject: [PATCH 0776/1293] chore: minor change in comment --- exercises/quiz2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/quiz2.rs b/exercises/quiz2.rs index 606d3c70..715788b8 100644 --- a/exercises/quiz2.rs +++ b/exercises/quiz2.rs @@ -42,7 +42,7 @@ mod my_module { #[cfg(test)] mod tests { - // TODO: What do we have to import to have `transformer` in scope? + // TODO: What do we need to import to have `transformer` in scope? use ???; use super::Command; From a315f2fefb963c2facfd80efe336b8be3b8f6bfa Mon Sep 17 00:00:00 2001 From: TK Buristrakul Date: Thu, 24 Nov 2022 19:39:54 +0000 Subject: [PATCH 0777/1293] chore: added more descriptive TODOs --- exercises/conversions/as_ref_mut.rs | 13 +++++++------ exercises/options/options1.rs | 2 +- exercises/traits/traits1.rs | 2 +- exercises/traits/traits2.rs | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index c9eed7d0..e6a9d114 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -5,21 +5,22 @@ // I AM NOT DONE -// Obtain the number of bytes (not characters) in the given argument -// Add the AsRef trait appropriately as a trait bound +// Obtain the number of bytes (not characters) in the given argument. +// TODO: Add the AsRef trait appropriately as a trait bound. fn byte_counter(arg: T) -> usize { arg.as_ref().as_bytes().len() } -// Obtain the number of characters (not bytes) in the given argument -// Add the AsRef trait appropriately as a trait bound +// Obtain the number of characters (not bytes) in the given argument. +// TODO: Add the AsRef trait appropriately as a trait bound. fn char_counter(arg: T) -> usize { arg.as_ref().chars().count() } -// Squares a number using as_mut(). Add the trait bound as is appropriate and -// implement the function body. +// Squares a number using as_mut(). +// TODO: Add the appropriate trait bound. fn num_sq(arg: &mut T) { + // TODO: Implement the function body. ??? } diff --git a/exercises/options/options1.rs b/exercises/options/options1.rs index 1149af08..1f891b0e 100644 --- a/exercises/options/options1.rs +++ b/exercises/options/options1.rs @@ -6,10 +6,10 @@ // This function returns how much icecream there is left in the fridge. // If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them // all, so there'll be no more left :( -// TODO: Return an Option! fn maybe_icecream(time_of_day: u16) -> Option { // We use the 24-hour system here, so 10PM is a value of 22 and 12AM is a value of 0 // The Option output should gracefully handle cases where time_of_day > 23. + // TODO: Complete the function body - remember to return an Option! ??? } diff --git a/exercises/traits/traits1.rs b/exercises/traits/traits1.rs index 5b9d8d50..43500b86 100644 --- a/exercises/traits/traits1.rs +++ b/exercises/traits/traits1.rs @@ -16,7 +16,7 @@ trait AppendBar { } impl AppendBar for String { - //Add your code here + // TODO: Implement `AppendBar` for type `String`. } fn main() { diff --git a/exercises/traits/traits2.rs b/exercises/traits/traits2.rs index 708bb19a..99dc1cbc 100644 --- a/exercises/traits/traits2.rs +++ b/exercises/traits/traits2.rs @@ -17,7 +17,7 @@ trait AppendBar { fn append_bar(self) -> Self; } -//TODO: Add your code here +// TODO: Implement trait `AppendBar` for a vector of strings. #[cfg(test)] mod tests { From db53dbc12615888ddd021025379fbab8e00e5067 Mon Sep 17 00:00:00 2001 From: TK Buristrakul Date: Thu, 24 Nov 2022 19:41:25 +0000 Subject: [PATCH 0778/1293] chore: tidied up unmatched backticks --- exercises/traits/traits1.rs | 2 +- exercises/traits/traits2.rs | 2 +- info.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/traits/traits1.rs b/exercises/traits/traits1.rs index 43500b86..f5320a5a 100644 --- a/exercises/traits/traits1.rs +++ b/exercises/traits/traits1.rs @@ -2,7 +2,7 @@ // Time to implement some traits! // // Your task is to implement the trait -// `AppendBar' for the type `String'. +// `AppendBar` for the type `String`. // // The trait AppendBar has only one function, // which appends "Bar" to any object diff --git a/exercises/traits/traits2.rs b/exercises/traits/traits2.rs index 99dc1cbc..288b4983 100644 --- a/exercises/traits/traits2.rs +++ b/exercises/traits/traits2.rs @@ -1,7 +1,7 @@ // traits2.rs // // Your task is to implement the trait -// `AppendBar' for a vector of strings. +// `AppendBar` for a vector of strings. // // To implement this trait, consider for // a moment what it means to 'append "Bar"' diff --git a/info.toml b/info.toml index df3820d2..4b878193 100644 --- a/info.toml +++ b/info.toml @@ -695,7 +695,7 @@ name = "traits2" path = "exercises/traits/traits2.rs" mode = "test" hint = """ -Notice how the trait takes ownership of 'self',and returns `Self'. +Notice how the trait takes ownership of 'self',and returns `Self`. Try mutating the incoming string vector. Have a look at the tests to see what the result should look like! From f94f365e146fa37b66e5c2e6b392d282f8c049f1 Mon Sep 17 00:00:00 2001 From: Emmanuel Roullit Date: Thu, 1 Dec 2022 14:05:10 +0100 Subject: [PATCH 0779/1293] dev: add basic devcontainer settings file Theses settings files are the base needed to declare and bootstrap development environment on codespaces Signed-off-by: Emmanuel Roullit --- .devcontainer/devcontainer.json | 17 +++++++++++++++++ .devcontainer/setup.sh | 4 ++++ 2 files changed, 21 insertions(+) create mode 100644 .devcontainer/devcontainer.json create mode 100755 .devcontainer/setup.sh diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..0fd90cc9 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,17 @@ +{ + "image": "mcr.microsoft.com/devcontainers/universal:2", + "waitFor": "onCreateCommand", + "onCreateCommand": ".devcontainer/setup.sh", + "updateContentCommand": "cargo build", + "postCreateCommand": "", + "postAttachCommand": { + "server": "rustlings watch" + }, + "customizations": { + "vscode": { + "extensions": [ + "rust-lang.rust-analyzer" + ] + } + } +} diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 00000000..e50bde34 --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,4 @@ +#!/bin/bash +curl https://sh.rustup.rs -sSf | sh -s -- -y +rustup install stable +bash install.sh From 4972bede48001fb4ae6838a98c2bfce2399d7293 Mon Sep 17 00:00:00 2001 From: Emmanuel Roullit Date: Thu, 1 Dec 2022 14:30:03 +0100 Subject: [PATCH 0780/1293] dev: source cargo env files to find rustup Signed-off-by: Emmanuel Roullit --- .devcontainer/setup.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh index e50bde34..0e090a86 100755 --- a/.devcontainer/setup.sh +++ b/.devcontainer/setup.sh @@ -1,4 +1,7 @@ #!/bin/bash curl https://sh.rustup.rs -sSf | sh -s -- -y + +# Update current shell environment variables after install to find rustup +. "$HOME/.cargo/env" rustup install stable bash install.sh From b653d4848a52701d2240f130ab74c158dd5d7069 Mon Sep 17 00:00:00 2001 From: Emmanuel Roullit Date: Thu, 1 Dec 2022 16:15:13 +0100 Subject: [PATCH 0781/1293] doc: add hint on how to create codespace Signed-off-by: Emmanuel Roullit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 38972a4b..f1adae87 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,8 @@ If you get a permission denied message, you might have to exclude the directory [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/rust-lang/rustlings) +Open up Rustlings in [Codespaces](https://docs.github.com/en/codespaces/developing-in-codespaces/creating-a-codespace-for-a-repository#creating-a-codespace-for-a-repository) + ## Manually Basically: Clone the repository at the latest tag, run `cargo install --path .`. From 71873e676f665b57c6d6362739d8283ec5441f49 Mon Sep 17 00:00:00 2001 From: Tyson Liddell Date: Fri, 9 Dec 2022 20:42:39 +0000 Subject: [PATCH 0782/1293] fix: Remove superfluous &self indirection --- exercises/enums/enums2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/enums/enums2.rs b/exercises/enums/enums2.rs index 18479f87..167a6b2e 100644 --- a/exercises/enums/enums2.rs +++ b/exercises/enums/enums2.rs @@ -10,7 +10,7 @@ enum Message { impl Message { fn call(&self) { - println!("{:?}", &self); + println!("{:?}", self); } } From 3d693634b5dbb284a4c4712b45215005287bb92c Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 10 Dec 2022 13:23:15 +0100 Subject: [PATCH 0783/1293] fix nix build on Darwin --- flake.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/flake.nix b/flake.nix index 15c82b77..4cfe7d9a 100644 --- a/flake.nix +++ b/flake.nix @@ -19,6 +19,10 @@ name = "rustlings"; version = "5.2.1"; + buildInputs = with pkgs; lib.optionals stdenv.isDarwin [ + darwin.apple_sdk.frameworks.CoreServices + ]; + src = with pkgs.lib; cleanSourceWith { src = self; # a function that returns a bool determining if the path should be included in the cleaned source From 1ce671528e40eab7f5d09f6579537a297858d284 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 10 Dec 2022 13:57:26 +0100 Subject: [PATCH 0784/1293] add missing RUST_SRC_PATH --- flake.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flake.nix b/flake.nix index 4cfe7d9a..3fabe0fe 100644 --- a/flake.nix +++ b/flake.nix @@ -46,6 +46,8 @@ in { devShell = pkgs.mkShell { + RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; + buildInputs = with pkgs; [ cargo rustc From b2df015fe6c76203d55ee1c916b4f3a27b327d67 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 10 Dec 2022 14:05:44 +0100 Subject: [PATCH 0785/1293] when generating lsp config use RUST_SRC_PATH if set --- src/project.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/project.rs b/src/project.rs index 0df00b9a..a6e3acfa 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,5 +1,6 @@ use glob::glob; use serde::{Deserialize, Serialize}; +use std::env; use std::error::Error; use std::process::Command; @@ -64,6 +65,12 @@ impl RustAnalyzerProject { /// Use `rustc` to determine the default toolchain pub fn get_sysroot_src(&mut self) -> Result<(), Box> { + // check if RUST_SRC_PATH is set + if let Ok(path) = env::var("RUST_SRC_PATH") { + self.sysroot_src = path; + return Ok(()); + } + let toolchain = Command::new("rustc") .arg("--print") .arg("sysroot") From e519b5079e93f4555d712771343fa159232cbf96 Mon Sep 17 00:00:00 2001 From: William Webb Date: Tue, 20 Dec 2022 21:17:32 -0600 Subject: [PATCH 0786/1293] fix(hashmaps3): fix typo in todo hint --- exercises/hashmaps/hashmaps3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/hashmaps/hashmaps3.rs b/exercises/hashmaps/hashmaps3.rs index 18dd44c9..ad3baa68 100644 --- a/exercises/hashmaps/hashmaps3.rs +++ b/exercises/hashmaps/hashmaps3.rs @@ -37,7 +37,7 @@ fn build_scores_table(results: String) -> HashMap { let team_2_score: u8 = v[3].parse().unwrap(); // TODO: Populate the scores table with details extracted from the // current line. Keep in mind that goals scored by team_1 - // will be number of goals conceded from team_2, and similarly + // will be the number of goals conceded from team_2, and similarly // goals scored by team_2 will be the number of goals conceded by // team_1. } From e0eef0e1901b80b5401a8c61346ab32eb54561cd Mon Sep 17 00:00:00 2001 From: liv Date: Fri, 23 Dec 2022 16:16:24 +0100 Subject: [PATCH 0787/1293] docs: add note about powershell compat Closes #1299. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 38972a4b..44ca4bdd 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Then, you can run: Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 ``` -To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. +To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. Keep in mind that this works best in PowerShell, and any other terminals may give you errors. If you get a permission denied message, you might have to exclude the directory where you cloned Rustlings in your antivirus. From 130e57ec60519c269d6477eef0ad681f1ac96d5c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 23 Dec 2022 15:44:14 +0000 Subject: [PATCH 0788/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 44d8a0ff..2fc637f2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -243,6 +243,7 @@ authors. Moritz BΓΆhme
Moritz BΓΆhme

πŸ’» craymel
craymel

πŸ–‹ + TK Buristrakul
TK Buristrakul

πŸ–‹ From 5e583770f7922b45889cd5e252be0fb87578c088 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 23 Dec 2022 15:44:15 +0000 Subject: [PATCH 0789/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9e2f307f..94141140 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1704,6 +1704,15 @@ "contributions": [ "content" ] + }, + { + "login": "tkburis", + "name": "TK Buristrakul", + "avatar_url": "https://avatars.githubusercontent.com/u/20501289?v=4", + "profile": "https://github.com/tkburis", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 40b1b079150e8554b595374d3b72a84108109cc5 Mon Sep 17 00:00:00 2001 From: liv Date: Fri, 23 Dec 2022 16:47:48 +0100 Subject: [PATCH 0790/1293] fix(enums3): add extra tuple comment --- exercises/enums/enums3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs index 55acf6bc..54fd6f60 100644 --- a/exercises/enums/enums3.rs +++ b/exercises/enums/enums3.rs @@ -52,7 +52,7 @@ mod tests { position: Point { x: 0, y: 0 }, color: (0, 0, 0), }; - state.process(Message::ChangeColor((255, 0, 255))); + state.process(Message::ChangeColor((255, 0, 255))); // Remember: The extra parentheses mark a tuple type. state.process(Message::Echo(String::from("hello world"))); state.process(Message::Move(Point { x: 10, y: 15 })); state.process(Message::Quit); From 9ad884aadb0758baf2c14b949c79d51adcf9b8fb Mon Sep 17 00:00:00 2001 From: liv Date: Fri, 23 Dec 2022 16:53:03 +0100 Subject: [PATCH 0791/1293] chore: bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 8 ++++---- flake.nix | 2 +- src/main.rs | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 948d0f42..49f20b66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -459,7 +459,7 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustlings" -version = "5.2.1" +version = "5.3.0" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index 3f5b253d..c2c54fd2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "5.2.1" +version = "5.3.0" authors = [ "Liv ", "Carol (Nichols || Goulding) ", diff --git a/README.md b/README.md index 44ca4bdd..956bb6d0 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,8 @@ This will install Rustlings and give you access to the `rustlings` command. Run Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.2.1) -git clone -b 5.2.1 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.3.0) +git clone -b 5.3.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings # if nix version > 2.3 nix develop @@ -70,8 +70,8 @@ If you get a permission denied message, you might have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install --path .`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.2.1) -git clone -b 5.2.1 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.3.0) +git clone -b 5.3.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/flake.nix b/flake.nix index 15c82b77..a6703199 100644 --- a/flake.nix +++ b/flake.nix @@ -17,7 +17,7 @@ rustlings = pkgs.rustPlatform.buildRustPackage { name = "rustlings"; - version = "5.2.1"; + version = "5.3.0"; src = with pkgs.lib; cleanSourceWith { src = self; diff --git a/src/main.rs b/src/main.rs index bf8503d0..6dc18e8b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "5.2.1"; +const VERSION: &str = "5.3.0"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From 32b234c9f0de2f63f905d461639d9f7ed94776bc Mon Sep 17 00:00:00 2001 From: liv Date: Fri, 23 Dec 2022 17:09:04 +0100 Subject: [PATCH 0792/1293] chore: update changelog --- CHANGELOG.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9925e3db..c351fce8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,36 @@ + +## 5.3.0 (2022-12-23) + +#### Added + +- **cli**: Added a percentage display in watch mode +- Added a `flake.nix` for Nix users + +#### Changed + +- **structs3**: Added an additional test +- **macros**: Added a link to MacroKata in the README + +#### Fixed + +- **strings3**: Added a link to `std` in the hint +- **threads1**: Corrected a hint link +- **iterators1**: Clarified hint steps +- **errors5**: Fix a typo in the hint +- **options1**: Clarified on the usage of the 24-hour system +- **threads2, threads3**: Explicitly use `Arc::clone` +- **structs3**: Clarifed the hint +- **quiz2, as_ref_mut, options1, traits1, traits2**: Clarified hints +- **traits1, traits2, cli**: Tidied up unmatching backticks +- **enums2**: Removed unneccessary indirection of self +- **enums3**: Added an extra tuple comment + +#### Housekeeping + +- Added a VSCode extension recommendation +- Applied some Clippy and rustfmt formatting +- Added a note on Windows PowerShell and other shell compatibility + ## 5.2.1 (2022-09-06) From 430371795133488f9daa1b7d390997fb3d3a7e7b Mon Sep 17 00:00:00 2001 From: Petr Pucil Date: Sun, 25 Dec 2022 17:57:28 +0100 Subject: [PATCH 0793/1293] chore: "rust" -> "Rust" in exercise hints --- info.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/info.toml b/info.toml index 4b878193..8356f6ab 100644 --- a/info.toml +++ b/info.toml @@ -665,7 +665,7 @@ name = "generics1" path = "exercises/generics/generics1.rs" mode = "compile" hint = """ -Vectors in rust make use of generics to create dynamically sized arrays of any type. +Vectors in Rust make use of generics to create dynamically sized arrays of any type. You need to tell the compiler what type we are pushing onto this vector.""" [[exercises]] @@ -1071,7 +1071,7 @@ path = "exercises/clippy/clippy1.rs" mode = "clippy" hint = """ Rust stores the highest precision version of any long or inifinite precision -mathematical constants in the rust standard library. +mathematical constants in the Rust standard library. https://doc.rust-lang.org/stable/std/f32/consts/index.html We may be tempted to use our own approximations for certain mathematical constants, From 7e4ce386816a380e66dca482c57349cd1a049aeb Mon Sep 17 00:00:00 2001 From: platformer Date: Mon, 26 Dec 2022 02:25:43 -0600 Subject: [PATCH 0794/1293] fix(threads1): make program panic if threads are not joined closes #1298 --- exercises/threads/threads1.rs | 25 ++++++++++++++++--------- info.toml | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/exercises/threads/threads1.rs b/exercises/threads/threads1.rs index e59f4ce4..d6376db2 100644 --- a/exercises/threads/threads1.rs +++ b/exercises/threads/threads1.rs @@ -1,31 +1,38 @@ // threads1.rs // Execute `rustlings hint threads1` or use the `hint` watch subcommand for a hint. -// This program should wait until all the spawned threads have finished before exiting. + +// This program spawns multiple threads that each run for at least 250ms, +// and each thread returns how much time they took to complete. +// The program should wait until all the spawned threads have finished and +// should collect their return values into a vector. // I AM NOT DONE use std::thread; -use std::time::Duration; - +use std::time::{Duration, Instant}; fn main() { - let mut handles = vec![]; for i in 0..10 { - thread::spawn(move || { + handles.push(thread::spawn(move || { + let start = Instant::now(); thread::sleep(Duration::from_millis(250)); println!("thread {} is complete", i); - }); + start.elapsed().as_millis() + })); } - let mut completed_threads = 0; + let mut results: Vec = vec![]; for handle in handles { // TODO: a struct is returned from thread::spawn, can you use it? - completed_threads += 1; } - if completed_threads != 10 { + if results.len() != 10 { panic!("Oh no! All the spawned threads did not finish!"); } + println!(); + for (i, result) in results.into_iter().enumerate() { + println!("thread {} took {}ms", i, result); + } } diff --git a/info.toml b/info.toml index 4b878193..dd8b78ab 100644 --- a/info.toml +++ b/info.toml @@ -969,7 +969,7 @@ A challenge with multi-threaded applications is that the main thread can finish before the spawned threads are completed. https://doc.rust-lang.org/book/ch16-01-threads.html#waiting-for-all-threads-to-finish-using-join-handles -Collect the JoinHandles and wait for them to finish. +Use the JoinHandles to wait for each thread to finish and collect their results. https://doc.rust-lang.org/std/thread/struct.JoinHandle.html """ From 2f821aa30da3640060741de552e5e6fd27d35778 Mon Sep 17 00:00:00 2001 From: HerschelW Date: Fri, 30 Dec 2022 08:14:13 -0600 Subject: [PATCH 0795/1293] chore: update enums3.rs addressing extra parentheses usage with tuples --- exercises/enums/enums3.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs index 54fd6f60..a2a9d586 100644 --- a/exercises/enums/enums3.rs +++ b/exercises/enums/enums3.rs @@ -38,6 +38,7 @@ impl State { fn process(&mut self, message: Message) { // TODO: create a match expression to process the different message variants + // Remember: When passing a tuple as a function argument, you'll need extra parentheses: fn function((t, u, p, l, e)) } } @@ -52,7 +53,7 @@ mod tests { position: Point { x: 0, y: 0 }, color: (0, 0, 0), }; - state.process(Message::ChangeColor((255, 0, 255))); // Remember: The extra parentheses mark a tuple type. + state.process(Message::ChangeColor(255, 0, 255)); state.process(Message::Echo(String::from("hello world"))); state.process(Message::Move(Point { x: 10, y: 15 })); state.process(Message::Quit); From 25fc7814cc2507e472a3ce670303370dc01df06f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 15:52:49 +0000 Subject: [PATCH 0796/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 2fc637f2..160eed57 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -244,6 +244,7 @@ authors. Moritz BΓΆhme
Moritz BΓΆhme

πŸ’» craymel
craymel

πŸ–‹ TK Buristrakul
TK Buristrakul

πŸ–‹ + Kent Worthington
Kent Worthington

πŸ–‹ From 6367697d926a0421528400fa394f3d7ecc45cf87 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 15:52:50 +0000 Subject: [PATCH 0797/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 94141140..97d38f5b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1713,6 +1713,15 @@ "contributions": [ "content" ] + }, + { + "login": "HerschelW", + "name": "Kent Worthington", + "avatar_url": "https://avatars.githubusercontent.com/u/17935816?v=4", + "profile": "https://github.com/HerschelW", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From cb79be921d54b2a631c50d78df43bed0988a8f62 Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 01:32:38 +0100 Subject: [PATCH 0798/1293] reordered smart pointer exercises Switched rc and arc so rc comes first, since arc is, like the name implies, atomic rc. This gives the exercises a more logical progression. Moved all smart pointer exercises (box, rc, arc, cow) under threads into their own section. Threads are used in the smart pointer exercises, so they should be introduced first. --- info.toml | 122 +++++++++++++++++++++++++++--------------------------- 1 file changed, 62 insertions(+), 60 deletions(-) diff --git a/info.toml b/info.toml index 8356f6ab..7512aee3 100644 --- a/info.toml +++ b/info.toml @@ -895,66 +895,6 @@ The fold method can be useful in the count_collection_iterator function. For a further challenge, consult the documentation for Iterator to find a different method that could make your code more compact than using fold.""" -[[exercises]] -name = "box1" -path = "exercises/standard_library_types/box1.rs" -mode = "test" -hint = """ -Step 1 -The compiler's message should help: since we cannot store the value of the actual type -when working with recursive types, we need to store a reference (pointer) to its value. -We should, therefore, place our `List` inside a `Box`. More details in the book here: -https://doc.rust-lang.org/book/ch15-01-box.html#enabling-recursive-types-with-boxes - -Step 2 -Creating an empty list should be fairly straightforward (hint: peek at the assertions). -For a non-empty list keep in mind that we want to use our Cons "list builder". -Although the current list is one of integers (i32), feel free to change the definition -and try other types! -""" - -[[exercises]] -name = "arc1" -path = "exercises/standard_library_types/arc1.rs" -mode = "compile" -hint = """ -Make `shared_numbers` be an `Arc` from the numbers vector. Then, in order -to avoid creating a copy of `numbers`, you'll need to create `child_numbers` -inside the loop but still in the main thread. - -`child_numbers` should be a clone of the Arc of the numbers instead of a -thread-local copy of the numbers. - -This is a simple exercise if you understand the underlying concepts, but if this -is too much of a struggle, consider reading through all of Chapter 16 in the book: -https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html -""" - -[[exercises]] -name = "rc1" -path = "exercises/standard_library_types/rc1.rs" -mode = "compile" -hint = """ -This is a straightforward exercise to use the Rc type. Each Planet has -ownership of the Sun, and uses Rc::clone() to increment the reference count of the Sun. -After using drop() to move the Planets out of scope individually, the reference count goes down. -In the end the sun only has one reference again, to itself. See more at: -https://doc.rust-lang.org/book/ch15-04-rc.html - -* Unfortunately Pluto is no longer considered a planet :( -""" - -[[exercises]] -name = "cow1" -path = "exercises/standard_library_types/cow1.rs" -mode = "compile" -hint = """ -Since the vector is already owned, the `Cow` type doesn't need to clone it. - -Checkout https://doc.rust-lang.org/std/borrow/enum.Cow.html for documentation -on the `Cow` type. -""" - # THREADS [[exercises]] @@ -1016,6 +956,68 @@ of the original sending end. See https://doc.rust-lang.org/book/ch16-02-message-passing.html for more info. """ +# SMART POINTERS + +[[exercises]] +name = "box1" +path = "exercises/standard_library_types/box1.rs" +mode = "test" +hint = """ +Step 1 +The compiler's message should help: since we cannot store the value of the actual type +when working with recursive types, we need to store a reference (pointer) to its value. +We should, therefore, place our `List` inside a `Box`. More details in the book here: +https://doc.rust-lang.org/book/ch15-01-box.html#enabling-recursive-types-with-boxes + +Step 2 +Creating an empty list should be fairly straightforward (hint: peek at the assertions). +For a non-empty list keep in mind that we want to use our Cons "list builder". +Although the current list is one of integers (i32), feel free to change the definition +and try other types! +""" + +[[exercises]] +name = "rc1" +path = "exercises/standard_library_types/rc1.rs" +mode = "compile" +hint = """ +This is a straightforward exercise to use the Rc type. Each Planet has +ownership of the Sun, and uses Rc::clone() to increment the reference count of the Sun. +After using drop() to move the Planets out of scope individually, the reference count goes down. +In the end the sun only has one reference again, to itself. See more at: +https://doc.rust-lang.org/book/ch15-04-rc.html + +* Unfortunately Pluto is no longer considered a planet :( +""" + +[[exercises]] +name = "arc1" +path = "exercises/standard_library_types/arc1.rs" +mode = "compile" +hint = """ +Make `shared_numbers` be an `Arc` from the numbers vector. Then, in order +to avoid creating a copy of `numbers`, you'll need to create `child_numbers` +inside the loop but still in the main thread. + +`child_numbers` should be a clone of the Arc of the numbers instead of a +thread-local copy of the numbers. + +This is a simple exercise if you understand the underlying concepts, but if this +is too much of a struggle, consider reading through all of Chapter 16 in the book: +https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html +""" + +[[exercises]] +name = "cow1" +path = "exercises/standard_library_types/cow1.rs" +mode = "compile" +hint = """ +Since the vector is already owned, the `Cow` type doesn't need to clone it. + +Checkout https://doc.rust-lang.org/std/borrow/enum.Cow.html for documentation +on the `Cow` type. +""" + # MACROS [[exercises]] From 05592acf4053262c7cffe824076322da8b13e6e2 Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 01:44:47 +0100 Subject: [PATCH 0799/1293] move arc to smart_pointers --- exercises/{standard_library_types => smart_pointers}/arc1.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises/{standard_library_types => smart_pointers}/arc1.rs (100%) diff --git a/exercises/standard_library_types/arc1.rs b/exercises/smart_pointers/arc1.rs similarity index 100% rename from exercises/standard_library_types/arc1.rs rename to exercises/smart_pointers/arc1.rs From c3bab88fda6311b34bc3f8091c2e3cf442148d6f Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 01:51:27 +0100 Subject: [PATCH 0800/1293] moved box to smart_pointers --- exercises/{standard_library_types => smart_pointers}/box1.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises/{standard_library_types => smart_pointers}/box1.rs (100%) diff --git a/exercises/standard_library_types/box1.rs b/exercises/smart_pointers/box1.rs similarity index 100% rename from exercises/standard_library_types/box1.rs rename to exercises/smart_pointers/box1.rs From e8c4aab643062da2a44b764198a5077cc1bd97a0 Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 01:52:05 +0100 Subject: [PATCH 0801/1293] moved cow to smart_pointers --- exercises/{standard_library_types => smart_pointers}/cow1.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises/{standard_library_types => smart_pointers}/cow1.rs (100%) diff --git a/exercises/standard_library_types/cow1.rs b/exercises/smart_pointers/cow1.rs similarity index 100% rename from exercises/standard_library_types/cow1.rs rename to exercises/smart_pointers/cow1.rs From a8fd315e099e4b5c24b450eb6ba6ec3cccd96854 Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 01:52:47 +0100 Subject: [PATCH 0802/1293] moved rc to smart_pointers --- exercises/{standard_library_types => smart_pointers}/rc1.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises/{standard_library_types => smart_pointers}/rc1.rs (100%) diff --git a/exercises/standard_library_types/rc1.rs b/exercises/smart_pointers/rc1.rs similarity index 100% rename from exercises/standard_library_types/rc1.rs rename to exercises/smart_pointers/rc1.rs From a0c5a892d3f1a5b4fa1d2bba41fb1dca145460f3 Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 01:58:04 +0100 Subject: [PATCH 0803/1293] refactoring standard_library_types as iterators --- exercises/iterators/README.md | 8 ++++++++ exercises/standard_library_types/README.md | 10 ---------- 2 files changed, 8 insertions(+), 10 deletions(-) create mode 100644 exercises/iterators/README.md delete mode 100644 exercises/standard_library_types/README.md diff --git a/exercises/iterators/README.md b/exercises/iterators/README.md new file mode 100644 index 00000000..0e8b671e --- /dev/null +++ b/exercises/iterators/README.md @@ -0,0 +1,8 @@ +# Iterators + +This section will teach you about Iterators. + +## Further information + +- [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html) +- [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/) diff --git a/exercises/standard_library_types/README.md b/exercises/standard_library_types/README.md deleted file mode 100644 index 809d61fe..00000000 --- a/exercises/standard_library_types/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Standard library types - -This section will teach you about Box, Shared-State Concurrency and Iterators. - -## Further information - -- [Using Box to Point to Data on the Heap](https://doc.rust-lang.org/book/ch15-01-box.html) -- [Shared-State Concurrency](https://doc.rust-lang.org/book/ch16-03-shared-state.html) -- [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html) -- [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/) From e9dc52c2d3abb60c532634ffbda7f435b4c3d140 Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 01:58:57 +0100 Subject: [PATCH 0804/1293] moved iterator exercises --- exercises/{standard_library_types => iterators}/iterators1.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises/{standard_library_types => iterators}/iterators1.rs (100%) diff --git a/exercises/standard_library_types/iterators1.rs b/exercises/iterators/iterators1.rs similarity index 100% rename from exercises/standard_library_types/iterators1.rs rename to exercises/iterators/iterators1.rs From 5b0d587c223cff097d824fbd5f8a5003f88036a0 Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 01:59:35 +0100 Subject: [PATCH 0805/1293] moved iterator exercises --- exercises/{standard_library_types => iterators}/iterators2.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises/{standard_library_types => iterators}/iterators2.rs (100%) diff --git a/exercises/standard_library_types/iterators2.rs b/exercises/iterators/iterators2.rs similarity index 100% rename from exercises/standard_library_types/iterators2.rs rename to exercises/iterators/iterators2.rs From 0f02a9b9af80e8b62709d2c50b0fcdf5f7478ea7 Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 02:00:36 +0100 Subject: [PATCH 0806/1293] moved iterator exercises --- exercises/{standard_library_types => iterators}/iterators3.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises/{standard_library_types => iterators}/iterators3.rs (100%) diff --git a/exercises/standard_library_types/iterators3.rs b/exercises/iterators/iterators3.rs similarity index 100% rename from exercises/standard_library_types/iterators3.rs rename to exercises/iterators/iterators3.rs From e3e298cfa21f671f32280f576c3092c62dc81b2a Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 02:02:15 +0100 Subject: [PATCH 0807/1293] moved iterator exercises --- exercises/{standard_library_types => iterators}/iterators4.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises/{standard_library_types => iterators}/iterators4.rs (100%) diff --git a/exercises/standard_library_types/iterators4.rs b/exercises/iterators/iterators4.rs similarity index 100% rename from exercises/standard_library_types/iterators4.rs rename to exercises/iterators/iterators4.rs From 8405a61b07583e6d09b8811c253a8e83aa972c46 Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 02:02:49 +0100 Subject: [PATCH 0808/1293] moved iterator exercises --- exercises/{standard_library_types => iterators}/iterators5.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises/{standard_library_types => iterators}/iterators5.rs (100%) diff --git a/exercises/standard_library_types/iterators5.rs b/exercises/iterators/iterators5.rs similarity index 100% rename from exercises/standard_library_types/iterators5.rs rename to exercises/iterators/iterators5.rs From 3fad2a9c8364c6994fa5de0ed58612ddceaf2f25 Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 02:17:23 +0100 Subject: [PATCH 0809/1293] gave smart_pointers its own README.md --- exercises/smart_pointers/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 exercises/smart_pointers/README.md diff --git a/exercises/smart_pointers/README.md b/exercises/smart_pointers/README.md new file mode 100644 index 00000000..3893e78d --- /dev/null +++ b/exercises/smart_pointers/README.md @@ -0,0 +1,11 @@ +## Smart Pointers +In Rust, smart pointers are variables that contain an address in memory and reference some other data, but they also have additional metadata and capabilities. +Smart pointers in Rust often own the data they point to, while references only borrow data. + +## Further Information + +- [Smart Pointers](https://doc.rust-lang.org/book/ch15-00-smart-pointers.html) +- [Using Box to Point to Data on the Heap](https://doc.rust-lang.org/book/ch15-01-box.html) +- [Rc\, the Reference Counted Smart Pointer](https://doc.rust-lang.org/book/ch15-04-rc.html) +- [Shared-State Concurrency](https://doc.rust-lang.org/book/ch16-03-shared-state.html) +- [Cow Documentation](https://doc.rust-lang.org/std/borrow/enum.Cow.html) From 66eaaf7b6e5f7a5fe0ec0472c7ef9610b332bb2f Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 02:17:53 +0100 Subject: [PATCH 0810/1293] fixed formatting --- exercises/smart_pointers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/smart_pointers/README.md b/exercises/smart_pointers/README.md index 3893e78d..c517ae31 100644 --- a/exercises/smart_pointers/README.md +++ b/exercises/smart_pointers/README.md @@ -1,4 +1,4 @@ -## Smart Pointers +# Smart Pointers In Rust, smart pointers are variables that contain an address in memory and reference some other data, but they also have additional metadata and capabilities. Smart pointers in Rust often own the data they point to, while references only borrow data. From b2b6e6900fbe8b63a7d965240715ad56fa81403a Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 02:29:45 +0100 Subject: [PATCH 0811/1293] reformatted exercise->chapter mapping Added and removed rows according to changes to exercise order and grouping. --- exercises/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/exercises/README.md b/exercises/README.md index e52137ca..26fcdf8f 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -7,7 +7,7 @@ | if | Β§3.5 | | primitive_types | Β§3.2, Β§4.3 | | vecs | Β§8.1 | -| move_semantics | Β§4.1, Β§4.2 | +| move_semantics | Β§4.1-2 | | structs | Β§5.1, Β§5.3 | | enums | Β§6, Β§18.3 | | strings | Β§8.2 | @@ -19,8 +19,9 @@ | traits | Β§10.2 | | tests | Β§11.1 | | lifetimes | Β§10.3 | -| standard_library_types | Β§13.2, Β§15.1, Β§16.3 | -| threads | Β§16.1, Β§16.2, Β§16.3 | +| iterators | Β§13.2-4 | +| threads | Β§16.1-3 | +| smart_pointers | Β§15, Β§16.3 | | macros | Β§19.6 | | clippy | n/a | | conversions | n/a | From 9860976af92ea9578980587b57f992073f6ff5ea Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 02:34:58 +0100 Subject: [PATCH 0812/1293] added existing chapter for clippy to mapping It's real! https://doc.rust-lang.org/book/appendix-04-useful-development-tools.html --- exercises/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/README.md b/exercises/README.md index 26fcdf8f..c7effa95 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -23,5 +23,5 @@ | threads | Β§16.1-3 | | smart_pointers | Β§15, Β§16.3 | | macros | Β§19.6 | -| clippy | n/a | +| clippy | Β§21.4 | | conversions | n/a | From a5429d59f9495535f5113a4236905d86df1657ff Mon Sep 17 00:00:00 2001 From: seporterfield <107010978+seporterfield@users.noreply.github.com> Date: Sun, 1 Jan 2023 02:46:40 +0100 Subject: [PATCH 0813/1293] updated file paths for iterators, smart_pointers --- info.toml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/info.toml b/info.toml index 7512aee3..1135c914 100644 --- a/info.toml +++ b/info.toml @@ -809,7 +809,7 @@ If you use a lifetime annotation in a struct's fields, where else does it need t [[exercises]] name = "iterators1" -path = "exercises/standard_library_types/iterators1.rs" +path = "exercises/iterators/iterators1.rs" mode = "compile" hint = """ Step 1: @@ -826,7 +826,7 @@ https://doc.rust-lang.org/std/iter/trait.Iterator.html for some ideas. [[exercises]] name = "iterators2" -path = "exercises/standard_library_types/iterators2.rs" +path = "exercises/iterators/iterators2.rs" mode = "test" hint = """ Step 1 @@ -847,7 +847,7 @@ and very general. Rust just needs to know the desired type.""" [[exercises]] name = "iterators3" -path = "exercises/standard_library_types/iterators3.rs" +path = "exercises/iterators/iterators3.rs" mode = "test" hint = """ The divide function needs to return the correct error when even division is not @@ -866,7 +866,7 @@ can make the solution to this exercise infinitely easier.""" [[exercises]] name = "iterators4" -path = "exercises/standard_library_types/iterators4.rs" +path = "exercises/iterators/iterators4.rs" mode = "test" hint = """ In an imperative language, you might write a for loop that updates @@ -878,7 +878,7 @@ Hint 2: Check out the `fold` and `rfold` methods!""" [[exercises]] name = "iterators5" -path = "exercises/standard_library_types/iterators5.rs" +path = "exercises/iterators/iterators5.rs" mode = "test" hint = """ The documentation for the std::iter::Iterator trait contains numerous methods @@ -960,7 +960,7 @@ See https://doc.rust-lang.org/book/ch16-02-message-passing.html for more info. [[exercises]] name = "box1" -path = "exercises/standard_library_types/box1.rs" +path = "exercises/smart_pointers/box1.rs" mode = "test" hint = """ Step 1 @@ -978,7 +978,7 @@ and try other types! [[exercises]] name = "rc1" -path = "exercises/standard_library_types/rc1.rs" +path = "exercises/smart_pointers/rc1.rs" mode = "compile" hint = """ This is a straightforward exercise to use the Rc type. Each Planet has @@ -992,7 +992,7 @@ https://doc.rust-lang.org/book/ch15-04-rc.html [[exercises]] name = "arc1" -path = "exercises/standard_library_types/arc1.rs" +path = "exercises/smart_pointers/arc1.rs" mode = "compile" hint = """ Make `shared_numbers` be an `Arc` from the numbers vector. Then, in order @@ -1009,7 +1009,7 @@ https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html [[exercises]] name = "cow1" -path = "exercises/standard_library_types/cow1.rs" +path = "exercises/smart_pointers/cow1.rs" mode = "compile" hint = """ Since the vector is already owned, the `Cow` type doesn't need to clone it. From 3001f1ae02951e9194c0ed07755b1f150165dac2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 2 Jan 2023 09:52:14 +0000 Subject: [PATCH 0814/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 160eed57..5f9dc6d3 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -245,6 +245,7 @@ authors. craymel
craymel

πŸ–‹ TK Buristrakul
TK Buristrakul

πŸ–‹ Kent Worthington
Kent Worthington

πŸ–‹ + seporterfield
seporterfield

πŸ–‹ From cb5371f86f36f941e5b1c2d473b536889f23c559 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 2 Jan 2023 09:52:15 +0000 Subject: [PATCH 0815/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 97d38f5b..904d1994 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1722,6 +1722,15 @@ "contributions": [ "content" ] + }, + { + "login": "seporterfield", + "name": "seporterfield", + "avatar_url": "https://avatars.githubusercontent.com/u/107010978?v=4", + "profile": "https://github.com/seporterfield", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From e6bc13ff04502066540db427780c442fe9690295 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Tue, 3 Jan 2023 08:26:12 +0100 Subject: [PATCH 0816/1293] added common cargoBuildInputs to all flake outputs --- flake.nix | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index 3fabe0fe..4fec6acc 100644 --- a/flake.nix +++ b/flake.nix @@ -14,14 +14,17 @@ flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; + + cargoBuildInputs = with pkgs; lib.optionals stdenv.isDarwin [ + darwin.apple_sdk.frameworks.CoreServices + ]; + rustlings = pkgs.rustPlatform.buildRustPackage { name = "rustlings"; version = "5.2.1"; - buildInputs = with pkgs; lib.optionals stdenv.isDarwin [ - darwin.apple_sdk.frameworks.CoreServices - ]; + buildInputs = cargoBuildInputs; src = with pkgs.lib; cleanSourceWith { src = self; @@ -53,7 +56,9 @@ rustc rust-analyzer rustlings - ]; + rustfmt + clippy + ] ++ cargoBuildInputs; }; }); } From 7ed047436469b27174294ac47d623f2acfed38cb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 09:21:40 +0000 Subject: [PATCH 0817/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 5f9dc6d3..6d8a05e6 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -246,6 +246,7 @@ authors. TK Buristrakul
TK Buristrakul

πŸ–‹ Kent Worthington
Kent Worthington

πŸ–‹ seporterfield
seporterfield

πŸ–‹ + David Barroso
David Barroso

πŸš‡ From 2be582fb2794c7245b649b8c2821a42462d8c0c4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 09:21:41 +0000 Subject: [PATCH 0818/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 904d1994..b5b4ffdb 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1731,6 +1731,15 @@ "contributions": [ "content" ] + }, + { + "login": "dbarrosop", + "name": "David Barroso", + "avatar_url": "https://avatars.githubusercontent.com/u/6246622?v=4", + "profile": "https://www.linkedin.com/in/dbarrosop", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 8, From 1b9d4bbf723b9fc6a4f8fdd7bf10d6b39b3f2f62 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 3 Jan 2023 14:14:07 +0100 Subject: [PATCH 0819/1293] Fix typo in method name --- src/main.rs | 2 +- src/project.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6dc18e8b..7e9156fb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -239,7 +239,7 @@ fn main() { .get_sysroot_src() .expect("Couldn't find toolchain path, do you have `rustc` installed?"); project - .exercies_to_json() + .exercises_to_json() .expect("Couldn't parse rustlings exercises files"); if project.crates.is_empty() { diff --git a/src/project.rs b/src/project.rs index 0df00b9a..f093cdf5 100644 --- a/src/project.rs +++ b/src/project.rs @@ -54,7 +54,7 @@ impl RustAnalyzerProject { /// Parse the exercises folder for .rs files, any matches will create /// a new `crate` in rust-project.json which allows rust-analyzer to /// treat it like a normal binary - pub fn exercies_to_json(&mut self) -> Result<(), Box> { + pub fn exercises_to_json(&mut self) -> Result<(), Box> { for e in glob("./exercises/**/*")? { let path = e?.to_string_lossy().to_string(); self.path_to_json(path); From ceb03cfb2c8343c6b323764b448a7f643f470c61 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 13:19:32 +0000 Subject: [PATCH 0820/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 6d8a05e6..06b56818 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -247,6 +247,7 @@ authors. Kent Worthington
Kent Worthington

πŸ–‹ seporterfield
seporterfield

πŸ–‹ David Barroso
David Barroso

πŸš‡ + Tobias Klauser
Tobias Klauser

πŸ’» From b985b1d6eaa3b0e696cf1d7c378abf47c37098fb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 13:19:33 +0000 Subject: [PATCH 0821/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b5b4ffdb..66056aa7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1740,6 +1740,15 @@ "contributions": [ "infra" ] + }, + { + "login": "tklauser", + "name": "Tobias Klauser", + "avatar_url": "https://avatars.githubusercontent.com/u/539708?v=4", + "profile": "https://distanz.ch", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 57834e9f8c4a005ba210b69932e62506ea12a998 Mon Sep 17 00:00:00 2001 From: Jarrod Sanders <50600614+kawaiiPlat@users.noreply.github.com> Date: Tue, 3 Jan 2023 09:22:52 -0500 Subject: [PATCH 0822/1293] Minor Grammar --- exercises/quiz2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/quiz2.rs b/exercises/quiz2.rs index 715788b8..5c42dae0 100644 --- a/exercises/quiz2.rs +++ b/exercises/quiz2.rs @@ -6,7 +6,7 @@ // - Modules // - Enums -// Let's build a little machine in form of a function. +// Let's build a little machine in the form of a function. // As input, we're going to give a list of strings and commands. These commands // determine what action is going to be applied to the string. It can either be: // - Uppercase the string From 951826e6b59ac930393c88c74f89c35fabb9fe8f Mon Sep 17 00:00:00 2001 From: himanshu soni Date: Tue, 3 Jan 2023 23:54:01 +0930 Subject: [PATCH 0823/1293] fix(verify): progress bar proportion now updates with the number of files verified --- src/verify.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/verify.rs b/src/verify.rs index 97471b8f..cf319e47 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -13,13 +13,15 @@ pub fn verify<'a>( progress: (usize, usize), verbose: bool, ) -> Result<(), &'a Exercise> { - let (num_done, total) = progress; + let (mut num_done, total) = progress; let bar = ProgressBar::new(total as u64); bar.set_style(ProgressStyle::default_bar() .template("Progress: [{bar:60.green/red}] {pos}/{len} {msg}") .progress_chars("#>-") ); bar.set_position(num_done as u64); + bar.set_message(format!("({:.1} %)", 0.)); + for exercise in exercises { let compile_result = match exercise.mode { Mode::Test => compile_and_test(exercise, RunMode::Interactive, verbose), @@ -29,9 +31,10 @@ pub fn verify<'a>( if !compile_result.unwrap_or(false) { return Err(exercise); } + num_done += 1; let percentage = num_done as f32 / total as f32 * 100.0; - bar.set_message(format!("({:.1} %)", percentage)); bar.inc(1); + bar.set_message(format!("({:.1} %)", percentage)); } Ok(()) } From 8e36256eac3eeb289906a4f51d2a742d8ba45037 Mon Sep 17 00:00:00 2001 From: TenzinRabgy Date: Wed, 4 Jan 2023 04:49:51 -0500 Subject: [PATCH 0824/1293] chore(watch): decrease watch delay closes #1215 --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 7e9156fb..59adb418 100644 --- a/src/main.rs +++ b/src/main.rs @@ -350,7 +350,7 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result { let (tx, rx) = channel(); let should_quit = Arc::new(AtomicBool::new(false)); - let mut watcher: RecommendedWatcher = Watcher::new(tx, Duration::from_secs(2))?; + let mut watcher: RecommendedWatcher = Watcher::new(tx, Duration::from_secs(1))?; watcher.watch(Path::new("./exercises"), RecursiveMode::Recursive)?; clear_screen(); From 87221720494d21958eb7e6e4abc4ee1c35f3f6e2 Mon Sep 17 00:00:00 2001 From: 0xMySt1c <0xMySt1c@tuta.io> Date: Wed, 4 Jan 2023 14:59:18 -0500 Subject: [PATCH 0825/1293] update rust language extension to rust-analyzer --- .gitpod.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitpod.yml b/.gitpod.yml index 73cb802d..06919335 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -4,4 +4,4 @@ tasks: vscode: extensions: - - rust-lang.rust@0.7.8 + - rust-lang.rust-analyzer@0.3.1348 From 33e0c73df76f5355a25660f19d6b977490621b39 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 14:21:44 +0000 Subject: [PATCH 0826/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 06b56818..486f9b5b 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -248,6 +248,7 @@ authors. seporterfield
seporterfield

πŸ–‹ David Barroso
David Barroso

πŸš‡ Tobias Klauser
Tobias Klauser

πŸ’» + 0xMySt1c
0xMySt1c

πŸ”§ From f67a2b25356beeed9e12f970fb90b03cd08b8ee7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 14:21:45 +0000 Subject: [PATCH 0827/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 66056aa7..a466f160 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1749,6 +1749,15 @@ "contributions": [ "code" ] + }, + { + "login": "0xMySt1c", + "name": "0xMySt1c", + "avatar_url": "https://avatars.githubusercontent.com/u/101825630?v=4", + "profile": "https://github.com/0xMySt1c", + "contributions": [ + "tool" + ] } ], "contributorsPerLine": 8, From 4179317f370718cc5ebfa8504d3423ef81572268 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 14:28:01 +0000 Subject: [PATCH 0828/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 486f9b5b..7d3d4f9d 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -250,6 +250,9 @@ authors. Tobias Klauser
Tobias Klauser

πŸ’» 0xMySt1c
0xMySt1c

πŸ”§ + + Ten
Ten

πŸ’» + From 6c170c2c21a25ccfbc4687e6cfec824177d456bf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 14:28:02 +0000 Subject: [PATCH 0829/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a466f160..659c289b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1758,6 +1758,15 @@ "contributions": [ "tool" ] + }, + { + "login": "AxolotlTears", + "name": "Ten", + "avatar_url": "https://avatars.githubusercontent.com/u/87157047?v=4", + "profile": "https://github.com/AxolotlTears", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 7c4a3a2af6dde8ab77fde8433496148f94e5ec90 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 5 Jan 2023 17:14:49 +0100 Subject: [PATCH 0830/1293] Fix typo in clippy1 hint --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 1135c914..66f78abb 100644 --- a/info.toml +++ b/info.toml @@ -1072,7 +1072,7 @@ name = "clippy1" path = "exercises/clippy/clippy1.rs" mode = "clippy" hint = """ -Rust stores the highest precision version of any long or inifinite precision +Rust stores the highest precision version of any long or infinite precision mathematical constants in the Rust standard library. https://doc.rust-lang.org/stable/std/f32/consts/index.html From 6b04848d413b09ee7925b280c38f57fdb35166a3 Mon Sep 17 00:00:00 2001 From: h4x5p4c3 Date: Wed, 11 Jan 2023 00:23:21 +0530 Subject: [PATCH 0831/1293] minor changes to hint --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 66f78abb..7418943b 100644 --- a/info.toml +++ b/info.toml @@ -815,7 +815,7 @@ hint = """ Step 1: We need to apply something to the collection `my_fav_fruits` before we start to go through it. What could that be? Take a look at the struct definition for a vector for inspiration: -https://doc.rust-lang.org/std/vec/struct.Vec.html. +https://doc.rust-lang.org/std/vec/struct.Vec.html Step 2 & step 3: Very similar to the lines above and below. You've got this! Step 4: From 3ed1e16c78fd7d3d04a6be8ddbfb7899e76569a4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 11 Jan 2023 11:23:07 +0000 Subject: [PATCH 0832/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 387 +++++++++++++++++++++++++++-------------------------- 1 file changed, 194 insertions(+), 193 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index 7d3d4f9d..43216f1f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -11,247 +11,248 @@ authors. - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - + +
Carol (Nichols || Goulding)
Carol (Nichols || Goulding)

πŸ’» πŸ–‹
QuietMisdreavus
QuietMisdreavus

πŸ’» πŸ–‹
Robert M Lugg
Robert M Lugg

πŸ–‹
Hynek Schlawack
Hynek Schlawack

πŸ’»
Katharina Fey
Katharina Fey

πŸ’»
lukabavdaz
lukabavdaz

πŸ’» πŸ–‹
Erik Vesteraas
Erik Vesteraas

πŸ’»
delet0r
delet0r

πŸ’»
Carol (Nichols || Goulding)
Carol (Nichols || Goulding)

πŸ’» πŸ–‹
QuietMisdreavus
QuietMisdreavus

πŸ’» πŸ–‹
Robert M Lugg
Robert M Lugg

πŸ–‹
Hynek Schlawack
Hynek Schlawack

πŸ’»
Katharina Fey
Katharina Fey

πŸ’»
lukabavdaz
lukabavdaz

πŸ’» πŸ–‹
Erik Vesteraas
Erik Vesteraas

πŸ’»
delet0r
delet0r

πŸ’»
Shaun Bennett
Shaun Bennett

πŸ’»
Andrew Bagshaw
Andrew Bagshaw

πŸ’»
Kyle Isom
Kyle Isom

πŸ’»
Colin Pitrat
Colin Pitrat

πŸ’»
Zac Anger
Zac Anger

πŸ’»
Matthias Geier
Matthias Geier

πŸ’»
Chris Pearce
Chris Pearce

πŸ’»
Yvan Sraka
Yvan Sraka

πŸ’»
Shaun Bennett
Shaun Bennett

πŸ’»
Andrew Bagshaw
Andrew Bagshaw

πŸ’»
Kyle Isom
Kyle Isom

πŸ’»
Colin Pitrat
Colin Pitrat

πŸ’»
Zac Anger
Zac Anger

πŸ’»
Matthias Geier
Matthias Geier

πŸ’»
Chris Pearce
Chris Pearce

πŸ’»
Yvan Sraka
Yvan Sraka

πŸ’»
Denys Smirnov
Denys Smirnov

πŸ’»
eddyp
eddyp

πŸ’»
Brian Kung
Brian Kung

πŸ’» πŸ–‹
Russell
Russell

πŸ’»
Dan Wilhelm
Dan Wilhelm

πŸ“–
Jesse
Jesse

πŸ’» πŸ–‹
Fredrik JambrΓ©n
Fredrik JambrΓ©n

πŸ’»
Pete McFarlane
Pete McFarlane

πŸ–‹
Denys Smirnov
Denys Smirnov

πŸ’»
eddyp
eddyp

πŸ’»
Brian Kung
Brian Kung

πŸ’» πŸ–‹
Russell
Russell

πŸ’»
Dan Wilhelm
Dan Wilhelm

πŸ“–
Jesse
Jesse

πŸ’» πŸ–‹
Fredrik JambrΓ©n
Fredrik JambrΓ©n

πŸ’»
Pete McFarlane
Pete McFarlane

πŸ–‹
nkanderson
nkanderson

πŸ’» πŸ–‹
Ajax M
Ajax M

πŸ“–
Dylan Nugent
Dylan Nugent

πŸ–‹
vyaslav
vyaslav

πŸ’» πŸ–‹
George
George

πŸ’»
Thomas Holloway
Thomas Holloway

πŸ’» πŸ–‹
Jubilee
Jubilee

πŸ’»
WofWca
WofWca

πŸ’»
nkanderson
nkanderson

πŸ’» πŸ–‹
Ajax M
Ajax M

πŸ“–
Dylan Nugent
Dylan Nugent

πŸ–‹
vyaslav
vyaslav

πŸ’» πŸ–‹
George
George

πŸ’»
Thomas Holloway
Thomas Holloway

πŸ’» πŸ–‹
Jubilee
Jubilee

πŸ’»
WofWca
WofWca

πŸ’»
Roberto Vidal
Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧
Jens
Jens

πŸ“–
Rahat Ahmed
Rahat Ahmed

πŸ“–
Abdou Seck
Abdou Seck

πŸ’» πŸ–‹ πŸ‘€
Katie
Katie

πŸ’»
Socrates
Socrates

πŸ“–
gnodarse
gnodarse

πŸ–‹
Harrison Metzger
Harrison Metzger

πŸ’»
Roberto Vidal
Roberto Vidal

πŸ’» πŸ“– πŸ€” 🚧
Jens
Jens

πŸ“–
Rahat Ahmed
Rahat Ahmed

πŸ“–
Abdou Seck
Abdou Seck

πŸ’» πŸ–‹ πŸ‘€
Katie
Katie

πŸ’»
Socrates
Socrates

πŸ“–
gnodarse
gnodarse

πŸ–‹
Harrison Metzger
Harrison Metzger

πŸ’»
Torben Jonas
Torben Jonas

πŸ’» πŸ–‹
Paul Bissex
Paul Bissex

πŸ“–
Steven Mann
Steven Mann

πŸ’» πŸ–‹
Mario Reder
Mario Reder

πŸ’» πŸ–‹
skim
skim

πŸ’»
Sanjay K
Sanjay K

πŸ’» πŸ–‹
Rohan Jain
Rohan Jain

πŸ’»
Said Aspen
Said Aspen

πŸ’» πŸ–‹
Torben Jonas
Torben Jonas

πŸ’» πŸ–‹
Paul Bissex
Paul Bissex

πŸ“–
Steven Mann
Steven Mann

πŸ’» πŸ–‹
Mario Reder
Mario Reder

πŸ’» πŸ–‹
skim
skim

πŸ’»
Sanjay K
Sanjay K

πŸ’» πŸ–‹
Rohan Jain
Rohan Jain

πŸ’»
Said Aspen
Said Aspen

πŸ’» πŸ–‹
Ufuk Celebi
Ufuk Celebi

πŸ’»
lebedevsergey
lebedevsergey

πŸ“–
Aleksei Trifonov
Aleksei Trifonov

πŸ–‹
Darren Meehan
Darren Meehan

πŸ–‹
Jihchi Lee
Jihchi Lee

πŸ–‹
Christofer Bertonha
Christofer Bertonha

πŸ–‹
Vivek Bharath Akupatni
Vivek Bharath Akupatni

πŸ’» ⚠️
DΓ­dac SementΓ© FernΓ‘ndez
DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹
Ufuk Celebi
Ufuk Celebi

πŸ’»
lebedevsergey
lebedevsergey

πŸ“–
Aleksei Trifonov
Aleksei Trifonov

πŸ–‹
Darren Meehan
Darren Meehan

πŸ–‹
Jihchi Lee
Jihchi Lee

πŸ–‹
Christofer Bertonha
Christofer Bertonha

πŸ–‹
Vivek Bharath Akupatni
Vivek Bharath Akupatni

πŸ’» ⚠️
DΓ­dac SementΓ© FernΓ‘ndez
DΓ­dac SementΓ© FernΓ‘ndez

πŸ’» πŸ–‹
Rob Story
Rob Story

πŸ’»
Siobhan Jacobson
Siobhan Jacobson

πŸ’»
Evan Carroll
Evan Carroll

πŸ–‹
Jawaad Mahmood
Jawaad Mahmood

πŸ–‹
Gaurang Tandon
Gaurang Tandon

πŸ–‹
Stefan Kupresak
Stefan Kupresak

πŸ–‹
Greg Leonard
Greg Leonard

πŸ–‹
Ryan McQuen
Ryan McQuen

πŸ’»
Rob Story
Rob Story

πŸ’»
Siobhan Jacobson
Siobhan Jacobson

πŸ’»
Evan Carroll
Evan Carroll

πŸ–‹
Jawaad Mahmood
Jawaad Mahmood

πŸ–‹
Gaurang Tandon
Gaurang Tandon

πŸ–‹
Stefan Kupresak
Stefan Kupresak

πŸ–‹
Greg Leonard
Greg Leonard

πŸ–‹
Ryan McQuen
Ryan McQuen

πŸ’»
Annika
Annika

πŸ‘€
Axel Viala
Axel Viala

πŸ’»
Mohammed Sazid Al Rashid
Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»
Caleb Webber
Caleb Webber

🚧
Peter N
Peter N

🚧
seancad
seancad

🚧
Will Hayworth
Will Hayworth

πŸ–‹
Christian Zeller
Christian Zeller

πŸ–‹
Annika
Annika

πŸ‘€
Axel Viala
Axel Viala

πŸ’»
Mohammed Sazid Al Rashid
Mohammed Sazid Al Rashid

πŸ–‹ πŸ’»
Caleb Webber
Caleb Webber

🚧
Peter N
Peter N

🚧
seancad
seancad

🚧
Will Hayworth
Will Hayworth

πŸ–‹
Christian Zeller
Christian Zeller

πŸ–‹
Jean-Francois Chevrette
Jean-Francois Chevrette

πŸ–‹ πŸ’»
John Baber-Lucero
John Baber-Lucero

πŸ–‹
Tal
Tal

πŸ–‹
apogeeoak
apogeeoak

πŸ–‹ πŸ’»
Larry Garfield
Larry Garfield

πŸ–‹
circumspect
circumspect

πŸ–‹
Cyrus Wyett
Cyrus Wyett

πŸ–‹
cadolphs
cadolphs

πŸ’»
Jean-Francois Chevrette
Jean-Francois Chevrette

πŸ–‹ πŸ’»
John Baber-Lucero
John Baber-Lucero

πŸ–‹
Tal
Tal

πŸ–‹
apogeeoak
apogeeoak

πŸ–‹ πŸ’»
Larry Garfield
Larry Garfield

πŸ–‹
circumspect
circumspect

πŸ–‹
Cyrus Wyett
Cyrus Wyett

πŸ–‹
cadolphs
cadolphs

πŸ’»
Pascal H.
Pascal H.

πŸ–‹
Rod Elias
Rod Elias

πŸ–‹
Matt Lebl
Matt Lebl

πŸ’»
Ignacio Le Fluk
Ignacio Le Fluk

πŸ–‹
Taylor Yu
Taylor Yu

πŸ’» πŸ–‹
Patrick Hintermayer
Patrick Hintermayer

πŸ’»
Pete Pavlovski
Pete Pavlovski

πŸ–‹
k12ish
k12ish

πŸ–‹
Pascal H.
Pascal H.

πŸ–‹
Rod Elias
Rod Elias

πŸ–‹
Matt Lebl
Matt Lebl

πŸ’»
Ignacio Le Fluk
Ignacio Le Fluk

πŸ–‹
Taylor Yu
Taylor Yu

πŸ’» πŸ–‹
Patrick Hintermayer
Patrick Hintermayer

πŸ’»
Pete Pavlovski
Pete Pavlovski

πŸ–‹
k12ish
k12ish

πŸ–‹
Shao Yang Hong
Shao Yang Hong

πŸ–‹
Brandon Macer
Brandon Macer

πŸ–‹
Stoian Dan
Stoian Dan

πŸ–‹
Pi Delport
Pi Delport

πŸ–‹
Sateesh
Sateesh

πŸ’» πŸ–‹
ZC
ZC

πŸ–‹
hyperparabolic
hyperparabolic

πŸ’»
arlecchino
arlecchino

πŸ“–
Shao Yang Hong
Shao Yang Hong

πŸ–‹
Brandon Macer
Brandon Macer

πŸ–‹
Stoian Dan
Stoian Dan

πŸ–‹
Pi Delport
Pi Delport

πŸ–‹
Sateesh
Sateesh

πŸ’» πŸ–‹
ZC
ZC

πŸ–‹
hyperparabolic
hyperparabolic

πŸ’»
arlecchino
arlecchino

πŸ“–
Richthofen
Richthofen

πŸ’»
Ivan Nerazumov
Ivan Nerazumov

πŸ“–
lauralindzey
lauralindzey

πŸ“–
Rakshit Sinha
Rakshit Sinha

πŸ–‹
Damian
Damian

πŸ–‹
Ben Armstead
Ben Armstead

πŸ’»
anuk909
anuk909

πŸ–‹ πŸ’»
granddaifuku
granddaifuku

πŸ–‹
Richthofen
Richthofen

πŸ’»
Ivan Nerazumov
Ivan Nerazumov

πŸ“–
lauralindzey
lauralindzey

πŸ“–
Rakshit Sinha
Rakshit Sinha

πŸ–‹
Damian
Damian

πŸ–‹
Ben Armstead
Ben Armstead

πŸ’»
anuk909
anuk909

πŸ–‹ πŸ’»
granddaifuku
granddaifuku

πŸ–‹
Weilet
Weilet

πŸ–‹
LIU JIE
LIU JIE

πŸ–‹
Antoine BΓΌsch
Antoine BΓΌsch

πŸ’»
frogtd
frogtd

πŸ–‹
Zhenghao Lu
Zhenghao Lu

πŸ–‹
Fredrik Enestad
Fredrik Enestad

πŸ–‹
xuesong
xuesong

πŸ–‹
Michael Walsh
Michael Walsh

πŸ’»
Weilet
Weilet

πŸ–‹
LIU JIE
LIU JIE

πŸ–‹
Antoine BΓΌsch
Antoine BΓΌsch

πŸ’»
frogtd
frogtd

πŸ–‹
Zhenghao Lu
Zhenghao Lu

πŸ–‹
Fredrik Enestad
Fredrik Enestad

πŸ–‹
xuesong
xuesong

πŸ–‹
Michael Walsh
Michael Walsh

πŸ’»
alirezaghey
alirezaghey

πŸ–‹
Franklin van Nes
Franklin van Nes

πŸ’»
nekonako
nekonako

πŸ’»
ZX
ZX

πŸ–‹
Yang Wen
Yang Wen

πŸ–‹
Brandon High
Brandon High

πŸ“–
x-hgg-x
x-hgg-x

πŸ’»
Kisaragi
Kisaragi

πŸ“–
alirezaghey
alirezaghey

πŸ–‹
Franklin van Nes
Franklin van Nes

πŸ’»
nekonako
nekonako

πŸ’»
ZX
ZX

πŸ–‹
Yang Wen
Yang Wen

πŸ–‹
Brandon High
Brandon High

πŸ“–
x-hgg-x
x-hgg-x

πŸ’»
Kisaragi
Kisaragi

πŸ“–
Lucas Aries
Lucas Aries

πŸ–‹
ragreenburg
ragreenburg

πŸ–‹
stevenfukase
stevenfukase

πŸ–‹
J-S-Kim
J-S-Kim

πŸ–‹
Fointard
Fointard

πŸ–‹
Ryan Lowe
Ryan Lowe

πŸ’»
cui fliter
cui fliter

πŸ–‹
Ron Lusk
Ron Lusk

πŸ–‹
Lucas Aries
Lucas Aries

πŸ–‹
ragreenburg
ragreenburg

πŸ–‹
stevenfukase
stevenfukase

πŸ–‹
J-S-Kim
J-S-Kim

πŸ–‹
Fointard
Fointard

πŸ–‹
Ryan Lowe
Ryan Lowe

πŸ’»
cui fliter
cui fliter

πŸ–‹
Ron Lusk
Ron Lusk

πŸ–‹
Bryan Lee
Bryan Lee

πŸ–‹
Nandaja Varma
Nandaja Varma

πŸ“–
pwygab
pwygab

πŸ’»
Lucas Grigolon Varela
Lucas Grigolon Varela

πŸ–‹
Bufo
Bufo

πŸ–‹
Jack Clayton
Jack Clayton

πŸ’»
Konstantin
Konstantin

πŸ–‹
0pling
0pling

πŸ–‹
Bryan Lee
Bryan Lee

πŸ–‹
Nandaja Varma
Nandaja Varma

πŸ“–
pwygab
pwygab

πŸ’»
Lucas Grigolon Varela
Lucas Grigolon Varela

πŸ–‹
Bufo
Bufo

πŸ–‹
Jack Clayton
Jack Clayton

πŸ’»
Konstantin
Konstantin

πŸ–‹
0pling
0pling

πŸ–‹
KatanaFluorescent
KatanaFluorescent

πŸ’»
Drew Morris
Drew Morris

πŸ’»
camperdue42
camperdue42

πŸ–‹
YsuOS
YsuOS

πŸ–‹
Steven Nguyen
Steven Nguyen

πŸ–‹
nacairns1
nacairns1

πŸ–‹
Paulo Gabriel Justino Bezerra
Paulo Gabriel Justino Bezerra

πŸ–‹
Jason
Jason

πŸ–‹
KatanaFluorescent
KatanaFluorescent

πŸ’»
Drew Morris
Drew Morris

πŸ’»
camperdue42
camperdue42

πŸ–‹
YsuOS
YsuOS

πŸ–‹
Steven Nguyen
Steven Nguyen

πŸ–‹
nacairns1
nacairns1

πŸ–‹
Paulo Gabriel Justino Bezerra
Paulo Gabriel Justino Bezerra

πŸ–‹
Jason
Jason

πŸ–‹
exdx
exdx

πŸ–‹
James Zow
James Zow

πŸ–‹
James Bromley
James Bromley

πŸ–‹
swhiteCQC
swhiteCQC

πŸ–‹
Neil Pate
Neil Pate

πŸ–‹
wojexe
wojexe

πŸ–‹
Mattia Schiavon
Mattia Schiavon

πŸ–‹
Eric Jolibois
Eric Jolibois

πŸ–‹
exdx
exdx

πŸ–‹
James Zow
James Zow

πŸ–‹
James Bromley
James Bromley

πŸ–‹
swhiteCQC
swhiteCQC

πŸ–‹
Neil Pate
Neil Pate

πŸ–‹
wojexe
wojexe

πŸ–‹
Mattia Schiavon
Mattia Schiavon

πŸ–‹
Eric Jolibois
Eric Jolibois

πŸ–‹
Edwin Chang
Edwin Chang

πŸ–‹
Saikat Das
Saikat Das

πŸ–‹
Jeremy Goh
Jeremy Goh

πŸ–‹
Lioness100
Lioness100

πŸ–‹
Tristan Nicholls
Tristan Nicholls

πŸ–‹
Claire
Claire

πŸ–‹
Maurice Van Wassenhove
Maurice Van Wassenhove

πŸ–‹
John Mendelewski
John Mendelewski

πŸ’»
Edwin Chang
Edwin Chang

πŸ–‹
Saikat Das
Saikat Das

πŸ–‹
Jeremy Goh
Jeremy Goh

πŸ–‹
Lioness100
Lioness100

πŸ–‹
Tristan Nicholls
Tristan Nicholls

πŸ–‹
Claire
Claire

πŸ–‹
Maurice Van Wassenhove
Maurice Van Wassenhove

πŸ–‹
John Mendelewski
John Mendelewski

πŸ’»
Brian Fakhoury
Brian Fakhoury

πŸ–‹
Markus Boehme
Markus Boehme

πŸ’»
Nico Vromans
Nico Vromans

πŸ–‹
vostok92
vostok92

πŸ–‹
Magnus RΓΈdseth
Magnus RΓΈdseth

πŸ–‹
rubiesonthesky
rubiesonthesky

πŸ–‹
Gabriel Bianconi
Gabriel Bianconi

πŸ–‹
Kody Low
Kody Low

πŸ–‹
Brian Fakhoury
Brian Fakhoury

πŸ–‹
Markus Boehme
Markus Boehme

πŸ’»
Nico Vromans
Nico Vromans

πŸ–‹
vostok92
vostok92

πŸ–‹
Magnus RΓΈdseth
Magnus RΓΈdseth

πŸ–‹
rubiesonthesky
rubiesonthesky

πŸ–‹
Gabriel Bianconi
Gabriel Bianconi

πŸ–‹
Kody Low
Kody Low

πŸ–‹
rzrymiak
rzrymiak

πŸ–‹
Miguel Raz GuzmΓ‘n Macedo
Miguel Raz GuzmΓ‘n Macedo

πŸ–‹
Magnus Markling
Magnus Markling

πŸ–‹
Tiago De Gaspari
Tiago De Gaspari

πŸ–‹
skaunov
skaunov

πŸ–‹
Cal Jacobson
Cal Jacobson

πŸ–‹
Duchoud Nicolas
Duchoud Nicolas

πŸ–‹
Gaëtan Faugère
Gaëtan Faugère

πŸ”§
rzrymiak
rzrymiak

πŸ–‹
Miguel Raz GuzmΓ‘n Macedo
Miguel Raz GuzmΓ‘n Macedo

πŸ–‹
Magnus Markling
Magnus Markling

πŸ–‹
Tiago De Gaspari
Tiago De Gaspari

πŸ–‹
skaunov
skaunov

πŸ–‹
Cal Jacobson
Cal Jacobson

πŸ–‹
Duchoud Nicolas
Duchoud Nicolas

πŸ–‹
Gaëtan Faugère
Gaëtan Faugère

πŸ”§
bhbuehler
bhbuehler

πŸ–‹
Yuri Astrakhan
Yuri Astrakhan

πŸ’»
azzamsa
azzamsa

πŸ’»
mvanschellebeeck
mvanschellebeeck

πŸ–‹
Arkid
Arkid

πŸ–‹
Tom Kunc
Tom Kunc

πŸ–‹
Marek FurΓ‘k
Marek FurΓ‘k

πŸ–‹
Winter
Winter

πŸ’»
bhbuehler
bhbuehler

πŸ–‹
Yuri Astrakhan
Yuri Astrakhan

πŸ’»
azzamsa
azzamsa

πŸ’»
mvanschellebeeck
mvanschellebeeck

πŸ–‹
Arkid
Arkid

πŸ–‹
Tom Kunc
Tom Kunc

πŸ–‹
Marek FurΓ‘k
Marek FurΓ‘k

πŸ–‹
Winter
Winter

πŸ’»
Moritz BΓΆhme
Moritz BΓΆhme

πŸ’»
craymel
craymel

πŸ–‹
TK Buristrakul
TK Buristrakul

πŸ–‹
Kent Worthington
Kent Worthington

πŸ–‹
seporterfield
seporterfield

πŸ–‹
David Barroso
David Barroso

πŸš‡
Tobias Klauser
Tobias Klauser

πŸ’»
0xMySt1c
0xMySt1c

πŸ”§
Moritz BΓΆhme
Moritz BΓΆhme

πŸ’»
craymel
craymel

πŸ–‹
TK Buristrakul
TK Buristrakul

πŸ–‹
Kent Worthington
Kent Worthington

πŸ–‹
seporterfield
seporterfield

πŸ–‹
David Barroso
David Barroso

πŸš‡
Tobias Klauser
Tobias Klauser

πŸ’»
0xMySt1c
0xMySt1c

πŸ”§
Ten
Ten

πŸ’»
Ten
Ten

πŸ’»
jones martin
jones martin

πŸ–‹
From ac839c267b901217af8eaf6f37791d53df35fe26 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 11 Jan 2023 11:23:08 +0000 Subject: [PATCH 0833/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 659c289b..cf99dc24 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1767,6 +1767,15 @@ "contributions": [ "code" ] + }, + { + "login": "h4x5p4c3", + "name": "jones martin", + "avatar_url": "https://avatars.githubusercontent.com/u/66133688?v=4", + "profile": "http://h4x5p4c3.xyz", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d05a817f3b90ef0275dbdc0ec19f6514434be163 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 11 Jan 2023 11:25:35 +0000 Subject: [PATCH 0834/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 43216f1f..fa51aa5b 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -253,6 +253,7 @@ authors. Ten
Ten

πŸ’» jones martin
jones martin

πŸ–‹ + cloppingemu
cloppingemu

πŸ’» From d58c97bd21d54195c33c9743a7f7532c4c7ef8e7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 11 Jan 2023 11:25:36 +0000 Subject: [PATCH 0835/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index cf99dc24..2613d268 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1776,6 +1776,15 @@ "contributions": [ "content" ] + }, + { + "login": "cloppingemu", + "name": "cloppingemu", + "avatar_url": "https://avatars.githubusercontent.com/u/12227963?v=4", + "profile": "https://github.com/cloppingemu", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 4771a7b9e70a05820bd418c155ecee5beacb2771 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Mon, 23 Jan 2023 12:16:51 +0800 Subject: [PATCH 0836/1293] chore: fix prompt error Missed a blank line, which causes the prompt incorrect like below: ```rust You can keep working on this exercise, or jump into the next one by removing the `I AM NOT DONE` comment: 6 | // Make this code compile by using the proper Rc primitives to express that the sun has multiple owners. 7 | 8 | // I AM NOT DONE 9 | use std::rc::Rc; ``` --- exercises/smart_pointers/rc1.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/smart_pointers/rc1.rs b/exercises/smart_pointers/rc1.rs index 9b907fde..d62f3619 100644 --- a/exercises/smart_pointers/rc1.rs +++ b/exercises/smart_pointers/rc1.rs @@ -6,6 +6,7 @@ // Make this code compile by using the proper Rc primitives to express that the sun has multiple owners. // I AM NOT DONE + use std::rc::Rc; #[derive(Debug)] From a1b29648696216c5d281f6b7d28c630629255913 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 26 Jan 2023 19:55:13 +0000 Subject: [PATCH 0837/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index fa51aa5b..94c93d25 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -254,6 +254,7 @@ authors. Ten
Ten

πŸ’» jones martin
jones martin

πŸ–‹ cloppingemu
cloppingemu

πŸ’» + Kevin Wan
Kevin Wan

πŸ–‹ From c9526043080b7e5d49841bd6ee6792ed1948a7ce Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 26 Jan 2023 19:55:14 +0000 Subject: [PATCH 0838/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2613d268..7864aab1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1785,6 +1785,15 @@ "contributions": [ "code" ] + }, + { + "login": "kevwan", + "name": "Kevin Wan", + "avatar_url": "https://avatars.githubusercontent.com/u/1918356?v=4", + "profile": "http://github.com/zeromicro/go-zero", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 1721ddc231b197b6a4ac44c05ab4f558b91f8098 Mon Sep 17 00:00:00 2001 From: wjwrh Date: Sun, 5 Feb 2023 14:10:23 +0800 Subject: [PATCH 0839/1293] Fix the problem of different edition between rustc and rust-analyzer --- src/exercise.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/exercise.rs b/src/exercise.rs index c0dae34e..2cde4e15 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -8,6 +8,7 @@ use std::path::PathBuf; use std::process::{self, Command}; const RUSTC_COLOR_ARGS: &[&str] = &["--color", "always"]; +const RUSTC_EDITION_ARGS: &[&str] = &["--edition", "2021"]; const I_AM_DONE_REGEX: &str = r"(?m)^\s*///?\s*I\s+AM\s+NOT\s+DONE"; const CONTEXT: usize = 2; const CLIPPY_CARGO_TOML_PATH: &str = "./exercises/clippy/Cargo.toml"; @@ -111,10 +112,12 @@ impl Exercise { Mode::Compile => Command::new("rustc") .args(&[self.path.to_str().unwrap(), "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) + .args(RUSTC_EDITION_ARGS) .output(), Mode::Test => Command::new("rustc") .args(&["--test", self.path.to_str().unwrap(), "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) + .args(RUSTC_EDITION_ARGS) .output(), Mode::Clippy => { let cargo_toml = format!( @@ -140,6 +143,7 @@ path = "{}.rs""#, Command::new("rustc") .args(&[self.path.to_str().unwrap(), "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) + .args(RUSTC_EDITION_ARGS) .output() .expect("Failed to compile!"); // Due to an issue with Clippy, a cargo clean is required to catch all lints. @@ -154,7 +158,7 @@ path = "{}.rs""#, Command::new("cargo") .args(&["clippy", "--manifest-path", CLIPPY_CARGO_TOML_PATH]) .args(RUSTC_COLOR_ARGS) - .args(&["--", "-D", "warnings","-D","clippy::float_cmp"]) + .args(&["--", "-D", "warnings", "-D", "clippy::float_cmp"]) .output() } } From ff44be9dcd8b248962bcd1479e134ac093af6f08 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 5 Feb 2023 10:51:49 +0000 Subject: [PATCH 0840/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 94c93d25..e978f1ac 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -255,6 +255,7 @@ authors. jones martin
jones martin

πŸ–‹ cloppingemu
cloppingemu

πŸ’» Kevin Wan
Kevin Wan

πŸ–‹ + Ruby
Ruby

πŸ’» From 72fff8d51a1c362a2ca7902b4aab3d6e9a1460a4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 5 Feb 2023 10:51:50 +0000 Subject: [PATCH 0841/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7864aab1..049d0f57 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1794,6 +1794,15 @@ "contributions": [ "content" ] + }, + { + "login": "wjwrh", + "name": "Ruby", + "avatar_url": "https://avatars.githubusercontent.com/u/43495006?v=4", + "profile": "http://kurowasaruby.cn", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 4bdd3c036bb6e532cb90b28a0502ccfda3ec4f2b Mon Sep 17 00:00:00 2001 From: Alexander Gill Date: Sat, 11 Feb 2023 23:18:34 +0000 Subject: [PATCH 0842/1293] fix(installation): loop to `max_len-1` avoid `i` going outside range of array indices --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index f3b3f33d..06f94645 100755 --- a/install.sh +++ b/install.sh @@ -99,7 +99,7 @@ function vercomp() { done fi - for i in `seq 0 $max_len` + for i in `seq 0 $((max_len-1))` do # Fill empty fields with zeros in v1 if [ -z "${v1[$i]}" ] From 0b119339eb15f92bd6b4fe111f0678f01e972e3b Mon Sep 17 00:00:00 2001 From: Alexander Gill Date: Sat, 11 Feb 2023 23:30:35 +0000 Subject: [PATCH 0843/1293] fix(installation): bump `MinRustVersion` to 1.58 this is the earliest minor version that compiled without errors --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 06f94645..19296910 100755 --- a/install.sh +++ b/install.sh @@ -124,7 +124,7 @@ function vercomp() { } RustVersion=$(rustc --version | cut -d " " -f 2) -MinRustVersion=1.56 +MinRustVersion=1.58 vercomp "$RustVersion" $MinRustVersion || ec=$? if [ ${ec:-0} -eq 2 ] then From acd2164c8523236c8b30f68f3120712e05f8d1a7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Feb 2023 14:43:07 +0000 Subject: [PATCH 0844/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index e978f1ac..b5a071d5 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -256,6 +256,7 @@ authors. cloppingemu
cloppingemu

πŸ’» Kevin Wan
Kevin Wan

πŸ–‹ Ruby
Ruby

πŸ’» + Alexander Gill
Alexander Gill

πŸ’» From 88a92b311c5dff95b7b78f73674f2d42c668ee4e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Feb 2023 14:43:08 +0000 Subject: [PATCH 0845/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 049d0f57..f06f81c6 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1803,6 +1803,15 @@ "contributions": [ "code" ] + }, + { + "login": "alexandergill", + "name": "Alexander Gill", + "avatar_url": "https://avatars.githubusercontent.com/u/7033716?v=4", + "profile": "https://github.com/alexandergill", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 957522a4926afafd2ea577791d1f21d8532b1bca Mon Sep 17 00:00:00 2001 From: liv Date: Sun, 12 Feb 2023 15:47:58 +0100 Subject: [PATCH 0846/1293] feat(intro1): add note on rust-analyzer usage --- exercises/intro/intro1.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/exercises/intro/intro1.rs b/exercises/intro/intro1.rs index 45c5acba..cfc55c30 100644 --- a/exercises/intro/intro1.rs +++ b/exercises/intro/intro1.rs @@ -26,5 +26,12 @@ fn main() { println!("solve the exercises. Good luck!"); println!(); println!("The source for this exercise is in `exercises/intro/intro1.rs`. Have a look!"); - println!("Going forward, the source of the exercises will always be in the success/failure output."); + println!( + "Going forward, the source of the exercises will always be in the success/failure output." + ); + println!(); + println!( + "If you want to use rust-analyzer, Rust's LSP implementation, make sure your editor is set" + ); + println!("up, and then run `rustlings lsp` before continuing.") } From e8683274ff4f452f4ad2a680285eb4ff1553d479 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Feb 2023 14:51:59 +0000 Subject: [PATCH 0847/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index b5a071d5..88a04bda 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -257,6 +257,7 @@ authors. Kevin Wan
Kevin Wan

πŸ–‹ Ruby
Ruby

πŸ’» Alexander Gill
Alexander Gill

πŸ’» + Jarrod Sanders
Jarrod Sanders

πŸ–‹ From 2aad5360d466e1b3412d171938a1ae016d9bb7b2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Feb 2023 14:52:00 +0000 Subject: [PATCH 0848/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index f06f81c6..b6c182f9 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1812,6 +1812,15 @@ "contributions": [ "code" ] + }, + { + "login": "kawaiiPlat", + "name": "Jarrod Sanders", + "avatar_url": "https://avatars.githubusercontent.com/u/50600614?v=4", + "profile": "https://www.linkedin.com/in/jarrod-sanders/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 18843cf62e012cf129e51dcaa5be034caa93e59f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Feb 2023 15:50:17 +0000 Subject: [PATCH 0849/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 88a04bda..4648d6df 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -258,6 +258,7 @@ authors. Ruby
Ruby

πŸ’» Alexander Gill
Alexander Gill

πŸ’» Jarrod Sanders
Jarrod Sanders

πŸ–‹ + Andrew Sen
Andrew Sen

πŸ–‹ From f3773660b04e7afb266474edbd99b537331d616d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Feb 2023 15:50:18 +0000 Subject: [PATCH 0850/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b6c182f9..b44d8d1a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1821,6 +1821,15 @@ "contributions": [ "content" ] + }, + { + "login": "platformer", + "name": "Andrew Sen", + "avatar_url": "https://avatars.githubusercontent.com/u/40146328?v=4", + "profile": "https://github.com/platformer", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d3ed9ce2f6df372bb1b3d368ad53a794e3cd1ce9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Feb 2023 15:54:56 +0000 Subject: [PATCH 0851/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4648d6df..85cd1774 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -260,6 +260,9 @@ authors. Jarrod Sanders
Jarrod Sanders

πŸ–‹ Andrew Sen
Andrew Sen

πŸ–‹ + + Grzegorz Ε»ur
Grzegorz Ε»ur

πŸ–‹ + From bf0fa8ee64971383737327dbe7cde56ce3757e4d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 12 Feb 2023 15:54:57 +0000 Subject: [PATCH 0852/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b44d8d1a..5db992ac 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1830,6 +1830,15 @@ "contributions": [ "content" ] + }, + { + "login": "grzegorz-zur", + "name": "Grzegorz Ε»ur", + "avatar_url": "https://avatars.githubusercontent.com/u/5297583?v=4", + "profile": "https://grzegorz-zur.com/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From fc9fb536ca8e2fd0121e0f52719bc838506f68fa Mon Sep 17 00:00:00 2001 From: liv Date: Sun, 12 Feb 2023 18:01:48 +0100 Subject: [PATCH 0853/1293] release: 5.4.0 --- CHANGELOG.md | 563 ++++++++++++++++++++++++++++----------------------- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 9 +- flake.nix | 2 +- src/main.rs | 2 +- 6 files changed, 314 insertions(+), 266 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c351fce8..63e448b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,35 @@ + + +## 5.4.0 (2023-02-12) + +#### Changed + +- Reordered exercises + - Unwrapped `standard_library_types` into `iterators` and `smart_pointers` + - Moved smart pointer exercises behind threads + - Ordered `rc1` before `arc1` +- **intro1**: Added a note on `rustlings lsp` +- **threads1**: Panic if threads are not joined +- **cli**: + - Made progress bar update proportional to amount of files verified + - Decreased `watch` delay from 2 to 1 second + +#### Fixed + +- Capitalized "Rust" in exercise hints +- **enums3**: Removed superfluous tuple brackets +- **quiz2, clippy1, iterators1**: Fixed a typo +- **rc1**: Fixed a prompt error +- **cli**: + - Fixed a typo in a method name + - Specified the edition in `rustc` commands + +#### Housekeeping + +- Bumped min Rust version to 1.58 in installation script + + ## 5.3.0 (2022-12-23) #### Added @@ -32,6 +63,7 @@ - Added a note on Windows PowerShell and other shell compatibility + ## 5.2.1 (2022-09-06) #### Fixed @@ -46,6 +78,7 @@ - Fixed a typo in README.md + ## 5.2.0 (2022-08-27) #### Added @@ -63,6 +96,7 @@ the tests + ## 5.1.1 (2022-08-17) #### Bug Fixes @@ -70,6 +104,7 @@ - Fixed an incorrect assertion in options1 + ## 5.1.0 (2022-08-16) #### Features @@ -105,6 +140,7 @@ - Added a link to our Zulip in the readme file + ## 5.0.0 (2022-07-16) #### Features @@ -162,7 +198,7 @@ - **from_str**: Added a hint comment about string error message conversion with `Box`. - **try_from_into**: Fixed the function name in comment. - + #### Removed - Removed the legacy LSP feature that was using `mod.rs` files. @@ -178,6 +214,7 @@ - Added a GitHub actions config so that tests run on every PR/commit. + ## 4.8.0 (2022-07-01) #### Features @@ -199,6 +236,7 @@ - Removed the deprecated Rust GitPod extension. + ## 4.7.1 (2022-04-20) #### Features @@ -220,422 +258,424 @@ Git log. -## 4.7.0 (2022-04-14) +## 4.7.0 (2022-04-14) #### Features -* Add move_semantics6.rs exercise (#908) ([3f0e1303](https://github.com/rust-lang/rustlings/commit/3f0e1303e0b3bf3fecc0baced3c8b8a37f83c184)) -* **intro:** Add intro section. ([21c9f441](https://github.com/rust-lang/rustlings/commit/21c9f44168394e08338fd470b5f49b1fd235986f)) -* Include exercises folder in the project structure behind a feature, enabling rust-analyzer to work (#917) ([179a75a6](https://github.com/rust-lang/rustlings/commit/179a75a68d03ac9518dec2297fb17f91a4fc506b)) +- Add move_semantics6.rs exercise (#908) ([3f0e1303](https://github.com/rust-lang/rustlings/commit/3f0e1303e0b3bf3fecc0baced3c8b8a37f83c184)) +- **intro:** Add intro section. ([21c9f441](https://github.com/rust-lang/rustlings/commit/21c9f44168394e08338fd470b5f49b1fd235986f)) +- Include exercises folder in the project structure behind a feature, enabling rust-analyzer to work (#917) ([179a75a6](https://github.com/rust-lang/rustlings/commit/179a75a68d03ac9518dec2297fb17f91a4fc506b)) #### Bug Fixes -* Fix a few spelling mistakes ([1c0fe3cb](https://github.com/rust-lang/rustlings/commit/1c0fe3cbcca85f90b3985985b8e265ee872a2ab2)) -* **cli:** - * Move long text strings into constants. ([f78c4802](https://github.com/rust-lang/rustlings/commit/f78c48020830d7900dd8d81f355606581670446d)) - * Replace `filter_map()` with `find_map()` ([9b27e8d](https://github.com/rust-lang/rustlings/commit/9b27e8d993ca20232fe38a412750c3f845a83b65)) -* **clippy1:** - * Set clippy::float_cmp lint to deny (#907) ([71a06044](https://github.com/rust-lang/rustlings/commit/71a06044e6a96ff756dc31d7b0ed665ae4badb57)) - * Updated code to test correctness clippy lint with approx_constant lint rule ([f2650de3](https://github.com/rust-lang/rustlings/commit/f2650de369810867d2763e935ac0963c32ec420e)) -* **errors1:** - * Add a comment to make the purpose more clear (#486) ([cbcde345](https://github.com/rust-lang/rustlings/commit/cbcde345409c3e550112e449242848eaa3391bb6)) - * Don't modify tests (#958) ([60bb7cc](https://github.com/rust-lang/rustlings/commit/60bb7cc3931d21d3986ad52b2b302e632a93831c)) -* **errors6:** Remove existing answer code ([43d0623](https://github.com/rust-lang/rustlings/commit/43d0623086edbc46fe896ba59c7afa22c3da9f7a)) -* **functions5:** Remove wrong new line and small English improvements (#885) ([8ef4869b](https://github.com/rust-lang/rustlings/commit/8ef4869b264094e5a9b50452b4534823a9df19c3)) -* **install:** protect path with whitespaces using quotes and stop at the first error ([d114847f](https://github.com/rust-lang/rustlings/commit/d114847f256c5f571c0b4c87e04b04bce3435509)) -* **intro1:** Add compiler error explanation. ([9b8de655](https://github.com/rust-lang/rustlings/commit/9b8de65525a5576b78cf0c8e4098cdd34296338f)) -* **iterators1:** reorder TODO steps ([0bd7a063](https://github.com/rust-lang/rustlings/commit/0bd7a0631a17a9d69af5746795a30efc9cf64e6e)) -* **move_semantics2:** Add comment ([89650f80](https://github.com/rust-lang/rustlings/commit/89650f808af23a32c9a2c6d46592b77547a6a464)) -* **move_semantics5:** correct typo (#857) ([46c28d5c](https://github.com/rust-lang/rustlings/commit/46c28d5cef3d8446b5a356b19d8dbc725f91a3a0)) -* **quiz1:** update to say quiz covers "If" ([1622e8c1](https://github.com/rust-lang/rustlings/commit/1622e8c198d89739765c915203efff0091bdeb78)) -* **structs3:** - * Add a hint for panic (#608) ([4f7ff5d9](https://github.com/rust-lang/rustlings/commit/4f7ff5d9c7b2d8b045194c1a9469d37e30257c4a)) - * remove redundant 'return' (#852) ([bf33829d](https://github.com/rust-lang/rustlings/commit/bf33829da240375d086f96267fc2e02fa6b07001)) - * Assigned value to `cents_per_gram` in test ([d1ee2da](https://github.com/rust-lang/rustlings/commit/d1ee2daf14f19105e6db3f9c610f44293d688532)) -* **structs3.rs:** assigned value to cents_per_gram in test ([d1ee2daf](https://github.com/rust-lang/rustlings/commit/d1ee2daf14f19105e6db3f9c610f44293d688532)) -* **traits1:** rename test functions to snake case (#854) ([1663a16e](https://github.com/rust-lang/rustlings/commit/1663a16eade6ca646b6ed061735f7982434d530d)) +- Fix a few spelling mistakes ([1c0fe3cb](https://github.com/rust-lang/rustlings/commit/1c0fe3cbcca85f90b3985985b8e265ee872a2ab2)) +- **cli:** + - Move long text strings into constants. ([f78c4802](https://github.com/rust-lang/rustlings/commit/f78c48020830d7900dd8d81f355606581670446d)) + - Replace `filter_map()` with `find_map()` ([9b27e8d](https://github.com/rust-lang/rustlings/commit/9b27e8d993ca20232fe38a412750c3f845a83b65)) +- **clippy1:** + - Set clippy::float_cmp lint to deny (#907) ([71a06044](https://github.com/rust-lang/rustlings/commit/71a06044e6a96ff756dc31d7b0ed665ae4badb57)) + - Updated code to test correctness clippy lint with approx_constant lint rule ([f2650de3](https://github.com/rust-lang/rustlings/commit/f2650de369810867d2763e935ac0963c32ec420e)) +- **errors1:** + - Add a comment to make the purpose more clear (#486) ([cbcde345](https://github.com/rust-lang/rustlings/commit/cbcde345409c3e550112e449242848eaa3391bb6)) + - Don't modify tests (#958) ([60bb7cc](https://github.com/rust-lang/rustlings/commit/60bb7cc3931d21d3986ad52b2b302e632a93831c)) +- **errors6:** Remove existing answer code ([43d0623](https://github.com/rust-lang/rustlings/commit/43d0623086edbc46fe896ba59c7afa22c3da9f7a)) +- **functions5:** Remove wrong new line and small English improvements (#885) ([8ef4869b](https://github.com/rust-lang/rustlings/commit/8ef4869b264094e5a9b50452b4534823a9df19c3)) +- **install:** protect path with whitespaces using quotes and stop at the first error ([d114847f](https://github.com/rust-lang/rustlings/commit/d114847f256c5f571c0b4c87e04b04bce3435509)) +- **intro1:** Add compiler error explanation. ([9b8de655](https://github.com/rust-lang/rustlings/commit/9b8de65525a5576b78cf0c8e4098cdd34296338f)) +- **iterators1:** reorder TODO steps ([0bd7a063](https://github.com/rust-lang/rustlings/commit/0bd7a0631a17a9d69af5746795a30efc9cf64e6e)) +- **move_semantics2:** Add comment ([89650f80](https://github.com/rust-lang/rustlings/commit/89650f808af23a32c9a2c6d46592b77547a6a464)) +- **move_semantics5:** correct typo (#857) ([46c28d5c](https://github.com/rust-lang/rustlings/commit/46c28d5cef3d8446b5a356b19d8dbc725f91a3a0)) +- **quiz1:** update to say quiz covers "If" ([1622e8c1](https://github.com/rust-lang/rustlings/commit/1622e8c198d89739765c915203efff0091bdeb78)) +- **structs3:** + - Add a hint for panic (#608) ([4f7ff5d9](https://github.com/rust-lang/rustlings/commit/4f7ff5d9c7b2d8b045194c1a9469d37e30257c4a)) + - remove redundant 'return' (#852) ([bf33829d](https://github.com/rust-lang/rustlings/commit/bf33829da240375d086f96267fc2e02fa6b07001)) + - Assigned value to `cents_per_gram` in test ([d1ee2da](https://github.com/rust-lang/rustlings/commit/d1ee2daf14f19105e6db3f9c610f44293d688532)) +- **structs3.rs:** assigned value to cents_per_gram in test ([d1ee2daf](https://github.com/rust-lang/rustlings/commit/d1ee2daf14f19105e6db3f9c610f44293d688532)) +- **traits1:** rename test functions to snake case (#854) ([1663a16e](https://github.com/rust-lang/rustlings/commit/1663a16eade6ca646b6ed061735f7982434d530d)) #### Documentation improvements -* Add hints on how to get GCC installed (#741) ([bc56861](https://github.com/rust-lang/rustlings/commit/bc5686174463ad6f4f6b824b0e9b97c3039d4886)) -* Fix some code blocks that were not highlighted ([17f9d74](https://github.com/rust-lang/rustlings/commit/17f9d7429ccd133a72e815fb5618e0ce79560929)) - +- Add hints on how to get GCC installed (#741) ([bc56861](https://github.com/rust-lang/rustlings/commit/bc5686174463ad6f4f6b824b0e9b97c3039d4886)) +- Fix some code blocks that were not highlighted ([17f9d74](https://github.com/rust-lang/rustlings/commit/17f9d7429ccd133a72e815fb5618e0ce79560929)) + ## 4.6.0 (2021-09-25) - #### Features -* add advanced_errs2 ([abd6b70c](https://github.com/rust-lang/rustlings/commit/abd6b70c72dc6426752ff41f09160b839e5c449e)) -* add advanced_errs1 ([882d535b](https://github.com/rust-lang/rustlings/commit/882d535ba8628d5e0b37e8664b3e2f26260b2671)) -* Add a farewell message when quitting `watch` ([1caef0b4](https://github.com/rust-lang/rustlings/commit/1caef0b43494c8b8cdd6c9260147e70d510f1aca)) -* add more watch commands ([a7dc080b](https://github.com/rust-lang/rustlings/commit/a7dc080b95e49146fbaafe6922a6de2f8cb1582a), closes [#842](https://github.com/rust-lang/rustlings/issues/842)) -* **modules:** update exercises, add modules3 (#822) ([dfd2fab4](https://github.com/rust-lang/rustlings/commit/dfd2fab4f33d1bf59e2e5ee03123c0c9a67a9481)) -* **quiz1:** add default function name in comment (#838) ([0a11bad7](https://github.com/rust-lang/rustlings/commit/0a11bad71402b5403143d642f439f57931278c07)) +- add advanced_errs2 ([abd6b70c](https://github.com/rust-lang/rustlings/commit/abd6b70c72dc6426752ff41f09160b839e5c449e)) +- add advanced_errs1 ([882d535b](https://github.com/rust-lang/rustlings/commit/882d535ba8628d5e0b37e8664b3e2f26260b2671)) +- Add a farewell message when quitting `watch` ([1caef0b4](https://github.com/rust-lang/rustlings/commit/1caef0b43494c8b8cdd6c9260147e70d510f1aca)) +- add more watch commands ([a7dc080b](https://github.com/rust-lang/rustlings/commit/a7dc080b95e49146fbaafe6922a6de2f8cb1582a), closes [#842](https://github.com/rust-lang/rustlings/issues/842)) +- **modules:** update exercises, add modules3 (#822) ([dfd2fab4](https://github.com/rust-lang/rustlings/commit/dfd2fab4f33d1bf59e2e5ee03123c0c9a67a9481)) +- **quiz1:** add default function name in comment (#838) ([0a11bad7](https://github.com/rust-lang/rustlings/commit/0a11bad71402b5403143d642f439f57931278c07)) #### Bug Fixes -* Correct small typo in exercises/conversions/from_str.rs ([86cc8529](https://github.com/rust-lang/rustlings/commit/86cc85295ae36948963ae52882e285d7e3e29323)) -* **cli:** typo in exercise.rs (#848) ([06d5c097](https://github.com/rust-lang/rustlings/commit/06d5c0973a3dffa3c6c6f70acb775d4c6630323c)) -* **from_str, try_from_into:** custom error types ([2dc93cad](https://github.com/rust-lang/rustlings/commit/2dc93caddad43821743e4903d89b355df58d7a49)) -* **modules2:** fix typo (#835) ([1c3beb0a](https://github.com/rust-lang/rustlings/commit/1c3beb0a59178c950dc05fe8ee2346b017429ae0)) -* **move_semantics5:** - * change &mut *y to &mut x (#814) ([d75759e8](https://github.com/rust-lang/rustlings/commit/d75759e829fdcd64ef071cf4b6eae2a011a7718b)) - * Clarify instructions ([df25684c](https://github.com/rust-lang/rustlings/commit/df25684cb79f8413915e00b5efef29369849cef1)) -* **quiz1:** Fix inconsistent wording (#826) ([03131a3d](https://github.com/rust-lang/rustlings/commit/03131a3d35d9842598150f9da817f7cc26e2669a)) - - +- Correct small typo in exercises/conversions/from_str.rs ([86cc8529](https://github.com/rust-lang/rustlings/commit/86cc85295ae36948963ae52882e285d7e3e29323)) +- **cli:** typo in exercise.rs (#848) ([06d5c097](https://github.com/rust-lang/rustlings/commit/06d5c0973a3dffa3c6c6f70acb775d4c6630323c)) +- **from_str, try_from_into:** custom error types ([2dc93cad](https://github.com/rust-lang/rustlings/commit/2dc93caddad43821743e4903d89b355df58d7a49)) +- **modules2:** fix typo (#835) ([1c3beb0a](https://github.com/rust-lang/rustlings/commit/1c3beb0a59178c950dc05fe8ee2346b017429ae0)) +- **move_semantics5:** + - change &mut \*y to &mut x (#814) ([d75759e8](https://github.com/rust-lang/rustlings/commit/d75759e829fdcd64ef071cf4b6eae2a011a7718b)) + - Clarify instructions ([df25684c](https://github.com/rust-lang/rustlings/commit/df25684cb79f8413915e00b5efef29369849cef1)) +- **quiz1:** Fix inconsistent wording (#826) ([03131a3d](https://github.com/rust-lang/rustlings/commit/03131a3d35d9842598150f9da817f7cc26e2669a)) + ## 4.5.0 (2021-07-07) - #### Features -* Add move_semantics5 exercise. (#746) ([399ab328](https://github.com/rust-lang/rustlings/commit/399ab328d8d407265c09563aa4ef4534b2503ff2)) -* **cli:** Add "next" to run the next unsolved exercise. (#785) ([d20e413a](https://github.com/rust-lang/rustlings/commit/d20e413a68772cd493561f2651cf244e822b7ca5)) +- Add move_semantics5 exercise. (#746) ([399ab328](https://github.com/rust-lang/rustlings/commit/399ab328d8d407265c09563aa4ef4534b2503ff2)) +- **cli:** Add "next" to run the next unsolved exercise. (#785) ([d20e413a](https://github.com/rust-lang/rustlings/commit/d20e413a68772cd493561f2651cf244e822b7ca5)) #### Bug Fixes -* rename result1 to errors4 ([50ab289d](https://github.com/rust-lang/rustlings/commit/50ab289da6b9eb19a7486c341b00048c516b88c0)) -* move_semantics5 hints ([1b858285](https://github.com/rust-lang/rustlings/commit/1b85828548f46f58b622b5e0c00f8c989f928807)) -* remove trailing whitespaces from iterators1 ([4d4fa774](https://github.com/rust-lang/rustlings/commit/4d4fa77459392acd3581c6068aa8be9a02de12fc)) -* add hints to generics1 and generics2 exercises ([31457940](https://github.com/rust-lang/rustlings/commit/31457940846b3844d78d4a4d2b074bc8d6aaf1eb)) -* remove trailing whitespace ([d9b69bd1](https://github.com/rust-lang/rustlings/commit/d9b69bd1a0a7a99f2c0d80933ad2eea44c8c71b2)) -* **installation:** first PowerShell command ([aa9a943d](https://github.com/rust-lang/rustlings/commit/aa9a943ddf3ae260782e73c26bcc9db60e5894b6)) -* **iterators5:** derive Clone, Copy ([91fc9e31](https://github.com/rust-lang/rustlings/commit/91fc9e3118f4af603c9911698cc2a234725cb032)) -* **quiz1:** Updated question description (#794) ([d8766496](https://github.com/rust-lang/rustlings/commit/d876649616cc8a8dd5f539f8bc1a5434b960b1e9)) -* **try_from_into, from_str:** hints for dyn Error ([11d2cf0d](https://github.com/rust-lang/rustlings/commit/11d2cf0d604dee3f5023c17802d69438e69fa50e)) -* **variables5:** confine the answer further ([48ffcbd2](https://github.com/rust-lang/rustlings/commit/48ffcbd2c4cc4d936c2c7480019190f179813cc5)) - - +- rename result1 to errors4 ([50ab289d](https://github.com/rust-lang/rustlings/commit/50ab289da6b9eb19a7486c341b00048c516b88c0)) +- move_semantics5 hints ([1b858285](https://github.com/rust-lang/rustlings/commit/1b85828548f46f58b622b5e0c00f8c989f928807)) +- remove trailing whitespaces from iterators1 ([4d4fa774](https://github.com/rust-lang/rustlings/commit/4d4fa77459392acd3581c6068aa8be9a02de12fc)) +- add hints to generics1 and generics2 exercises ([31457940](https://github.com/rust-lang/rustlings/commit/31457940846b3844d78d4a4d2b074bc8d6aaf1eb)) +- remove trailing whitespace ([d9b69bd1](https://github.com/rust-lang/rustlings/commit/d9b69bd1a0a7a99f2c0d80933ad2eea44c8c71b2)) +- **installation:** first PowerShell command ([aa9a943d](https://github.com/rust-lang/rustlings/commit/aa9a943ddf3ae260782e73c26bcc9db60e5894b6)) +- **iterators5:** derive Clone, Copy ([91fc9e31](https://github.com/rust-lang/rustlings/commit/91fc9e3118f4af603c9911698cc2a234725cb032)) +- **quiz1:** Updated question description (#794) ([d8766496](https://github.com/rust-lang/rustlings/commit/d876649616cc8a8dd5f539f8bc1a5434b960b1e9)) +- **try_from_into, from_str:** hints for dyn Error ([11d2cf0d](https://github.com/rust-lang/rustlings/commit/11d2cf0d604dee3f5023c17802d69438e69fa50e)) +- **variables5:** confine the answer further ([48ffcbd2](https://github.com/rust-lang/rustlings/commit/48ffcbd2c4cc4d936c2c7480019190f179813cc5)) -## 4.4.0 (2021-04-24) +## 4.4.0 (2021-04-24) #### Bug Fixes -* Fix spelling error in main.rs ([91ee27f2](https://github.com/rust-lang/rustlings/commit/91ee27f22bd3797a9db57e5fd430801c170c5db8)) -* typo in default out text ([644c49f1](https://github.com/rust-lang/rustlings/commit/644c49f1e04cbb24e95872b3a52b07d692ae3bc8)) -* **collections:** Naming exercises for vectors and hashmap ([bef39b12](https://github.com/rust-lang/rustlings/commit/bef39b125961310b34b34871e480a82e82af4678)) -* **from_str:** - * Correct typos ([5f7c89f8](https://github.com/rust-lang/rustlings/commit/5f7c89f85db1f33da01911eaa479c3a2d4721678)) - * test for error instead of unwrap/should_panic ([15e71535](https://github.com/rust-lang/rustlings/commit/15e71535f37cfaed36e22eb778728d186e2104ab)) - * use trait objects for from_str ([c3e7b831](https://github.com/rust-lang/rustlings/commit/c3e7b831786c9172ed8bd5d150f3c432f242fba9)) -* **functions3:** improve function argument type (#687) ([a6509cc4](https://github.com/rust-lang/rustlings/commit/a6509cc4d545d8825f01ddf7ee37823b372154dd)) -* **hashmap2:** Update incorrect assertion (#660) ([72aaa15e](https://github.com/rust-lang/rustlings/commit/72aaa15e6ab4b72b3422f1c6356396e20a2a2bb8)) -* **info:** Fix typo (#635) ([cddc1e86](https://github.com/rust-lang/rustlings/commit/cddc1e86e7ec744ee644cc774a4887b1a0ded3e8)) -* **iterators2:** Moved errors out of tests. ([baf4ba17](https://github.com/rust-lang/rustlings/commit/baf4ba175ba6eb92989e3dd54ecbec4bedc9a863), closes [#359](https://github.com/rust-lang/rustlings/issues/359)) -* **iterators3:** Enabled iterators3.rs to run without commented out tests. ([c6712dfc](https://github.com/rust-lang/rustlings/commit/c6712dfccd1a093e590ad22bbc4f49edc417dac0)) -* **main:** Let find_exercise work with borrows ([347f30bd](https://github.com/rust-lang/rustlings/commit/347f30bd867343c5ace1097e085a1f7e356553f7)) -* **move_semantics4:** - * Remove redundant "instead" (#640) ([cc266d7d](https://github.com/rust-lang/rustlings/commit/cc266d7d80b91e79df3f61984f231b7f1587218e)) - * Small readbility improvement (#617) ([10965920](https://github.com/rust-lang/rustlings/commit/10965920fbdf8a1efc85bed869e55a1787006404)) -* **option2:** Rename uninformative variables (#675) ([b4de6594](https://github.com/rust-lang/rustlings/commit/b4de6594380636817d13c2677ec6f472a964cf43)) -* **quiz3:** Force an answer to Q2 (#672) ([0d894e6f](https://github.com/rust-lang/rustlings/commit/0d894e6ff739943901e1ae8c904582e5c2f843bd)) -* **structs:** Add 5.3 to structs/README (#652) ([6bd791f2](https://github.com/rust-lang/rustlings/commit/6bd791f2f44aa7f0ad926df767f6b1fa8f12a9a9)) -* **structs2:** correct grammar in hint (#663) ([ebdb66c7](https://github.com/rust-lang/rustlings/commit/ebdb66c7bfb6d687a14cc511a559a222e6fc5de4)) -* **structs3:** - * reword heading comment (#664) ([9f3e8c2d](https://github.com/rust-lang/rustlings/commit/9f3e8c2dde645e5264c2d2200e68842b5f47bfa3)) - * add check to prevent naive implementation of is_international ([05a753fe](https://github.com/rust-lang/rustlings/commit/05a753fe6333d36dbee5f68c21dec04eacdc75df)) -* **threads1:** line number correction ([7857b0a6](https://github.com/rust-lang/rustlings/commit/7857b0a689b0847f48d8c14cbd1865e3b812d5ca)) -* **try_from_into:** use trait objects ([2e93a588](https://github.com/rust-lang/rustlings/commit/2e93a588e0abe8badb7eafafb9e7d073c2be5df8)) +- Fix spelling error in main.rs ([91ee27f2](https://github.com/rust-lang/rustlings/commit/91ee27f22bd3797a9db57e5fd430801c170c5db8)) +- typo in default out text ([644c49f1](https://github.com/rust-lang/rustlings/commit/644c49f1e04cbb24e95872b3a52b07d692ae3bc8)) +- **collections:** Naming exercises for vectors and hashmap ([bef39b12](https://github.com/rust-lang/rustlings/commit/bef39b125961310b34b34871e480a82e82af4678)) +- **from_str:** + - Correct typos ([5f7c89f8](https://github.com/rust-lang/rustlings/commit/5f7c89f85db1f33da01911eaa479c3a2d4721678)) + - test for error instead of unwrap/should_panic ([15e71535](https://github.com/rust-lang/rustlings/commit/15e71535f37cfaed36e22eb778728d186e2104ab)) + - use trait objects for from_str ([c3e7b831](https://github.com/rust-lang/rustlings/commit/c3e7b831786c9172ed8bd5d150f3c432f242fba9)) +- **functions3:** improve function argument type (#687) ([a6509cc4](https://github.com/rust-lang/rustlings/commit/a6509cc4d545d8825f01ddf7ee37823b372154dd)) +- **hashmap2:** Update incorrect assertion (#660) ([72aaa15e](https://github.com/rust-lang/rustlings/commit/72aaa15e6ab4b72b3422f1c6356396e20a2a2bb8)) +- **info:** Fix typo (#635) ([cddc1e86](https://github.com/rust-lang/rustlings/commit/cddc1e86e7ec744ee644cc774a4887b1a0ded3e8)) +- **iterators2:** Moved errors out of tests. ([baf4ba17](https://github.com/rust-lang/rustlings/commit/baf4ba175ba6eb92989e3dd54ecbec4bedc9a863), closes [#359](https://github.com/rust-lang/rustlings/issues/359)) +- **iterators3:** Enabled iterators3.rs to run without commented out tests. ([c6712dfc](https://github.com/rust-lang/rustlings/commit/c6712dfccd1a093e590ad22bbc4f49edc417dac0)) +- **main:** Let find_exercise work with borrows ([347f30bd](https://github.com/rust-lang/rustlings/commit/347f30bd867343c5ace1097e085a1f7e356553f7)) +- **move_semantics4:** + - Remove redundant "instead" (#640) ([cc266d7d](https://github.com/rust-lang/rustlings/commit/cc266d7d80b91e79df3f61984f231b7f1587218e)) + - Small readbility improvement (#617) ([10965920](https://github.com/rust-lang/rustlings/commit/10965920fbdf8a1efc85bed869e55a1787006404)) +- **option2:** Rename uninformative variables (#675) ([b4de6594](https://github.com/rust-lang/rustlings/commit/b4de6594380636817d13c2677ec6f472a964cf43)) +- **quiz3:** Force an answer to Q2 (#672) ([0d894e6f](https://github.com/rust-lang/rustlings/commit/0d894e6ff739943901e1ae8c904582e5c2f843bd)) +- **structs:** Add 5.3 to structs/README (#652) ([6bd791f2](https://github.com/rust-lang/rustlings/commit/6bd791f2f44aa7f0ad926df767f6b1fa8f12a9a9)) +- **structs2:** correct grammar in hint (#663) ([ebdb66c7](https://github.com/rust-lang/rustlings/commit/ebdb66c7bfb6d687a14cc511a559a222e6fc5de4)) +- **structs3:** + - reword heading comment (#664) ([9f3e8c2d](https://github.com/rust-lang/rustlings/commit/9f3e8c2dde645e5264c2d2200e68842b5f47bfa3)) + - add check to prevent naive implementation of is_international ([05a753fe](https://github.com/rust-lang/rustlings/commit/05a753fe6333d36dbee5f68c21dec04eacdc75df)) +- **threads1:** line number correction ([7857b0a6](https://github.com/rust-lang/rustlings/commit/7857b0a689b0847f48d8c14cbd1865e3b812d5ca)) +- **try_from_into:** use trait objects ([2e93a588](https://github.com/rust-lang/rustlings/commit/2e93a588e0abe8badb7eafafb9e7d073c2be5df8)) #### Features -* Replace clap with argh ([7928122f](https://github.com/rust-lang/rustlings/commit/7928122fcef9ca7834d988b1ec8ca0687478beeb)) -* Replace emojis when NO_EMOJI env variable present ([8d62a996](https://github.com/rust-lang/rustlings/commit/8d62a9963708dbecd9312e8bcc4b47049c72d155)) -* Added iterators5.rs exercise. ([b29ea17e](https://github.com/rust-lang/rustlings/commit/b29ea17ea94d1862114af2cf5ced0e09c197dc35)) -* **arc1:** Add more details to description and hint (#710) ([81be4044](https://github.com/rust-lang/rustlings/commit/81be40448777fa338ebced3b0bfc1b32d6370313)) -* **cli:** Improve the list command with options, and then some ([8bbe4ff1](https://github.com/rust-lang/rustlings/commit/8bbe4ff1385c5c169c90cd3ff9253f9a91daaf8e)) -* **list:** - * updated progress percentage ([1c6f7e4b](https://github.com/rust-lang/rustlings/commit/1c6f7e4b7b9b3bd36f4da2bb2b69c549cc8bd913)) - * added progress info ([c0e3daac](https://github.com/rust-lang/rustlings/commit/c0e3daacaf6850811df5bc57fa43e0f249d5cfa4)) - - +- Replace clap with argh ([7928122f](https://github.com/rust-lang/rustlings/commit/7928122fcef9ca7834d988b1ec8ca0687478beeb)) +- Replace emojis when NO_EMOJI env variable present ([8d62a996](https://github.com/rust-lang/rustlings/commit/8d62a9963708dbecd9312e8bcc4b47049c72d155)) +- Added iterators5.rs exercise. ([b29ea17e](https://github.com/rust-lang/rustlings/commit/b29ea17ea94d1862114af2cf5ced0e09c197dc35)) +- **arc1:** Add more details to description and hint (#710) ([81be4044](https://github.com/rust-lang/rustlings/commit/81be40448777fa338ebced3b0bfc1b32d6370313)) +- **cli:** Improve the list command with options, and then some ([8bbe4ff1](https://github.com/rust-lang/rustlings/commit/8bbe4ff1385c5c169c90cd3ff9253f9a91daaf8e)) +- **list:** + - updated progress percentage ([1c6f7e4b](https://github.com/rust-lang/rustlings/commit/1c6f7e4b7b9b3bd36f4da2bb2b69c549cc8bd913)) + - added progress info ([c0e3daac](https://github.com/rust-lang/rustlings/commit/c0e3daacaf6850811df5bc57fa43e0f249d5cfa4)) + ## 4.3.0 (2020-12-29) #### Features -* Rewrite default out text ([44d39112](https://github.com/rust-lang/rustlings/commit/44d39112ff122b29c9793fe52e605df1612c6490)) -* match exercise order to book chapters (#541) ([033bf119](https://github.com/rust-lang/rustlings/commit/033bf1198fc8bfce1b570e49da7cde010aa552e3)) -* Crab? (#586) ([fa9f522b](https://github.com/rust-lang/rustlings/commit/fa9f522b7f043d7ef73a39f003a9272dfe72c4f4)) -* add "rustlings list" command ([838f9f30](https://github.com/rust-lang/rustlings/commit/838f9f30083d0b23fd67503dcf0fbeca498e6647)) -* **try_from_into:** remove duplicate annotation ([04f1d079](https://github.com/rust-lang/rustlings/commit/04f1d079aa42a2f49af694bc92c67d731d31a53f)) +- Rewrite default out text ([44d39112](https://github.com/rust-lang/rustlings/commit/44d39112ff122b29c9793fe52e605df1612c6490)) +- match exercise order to book chapters (#541) ([033bf119](https://github.com/rust-lang/rustlings/commit/033bf1198fc8bfce1b570e49da7cde010aa552e3)) +- Crab? (#586) ([fa9f522b](https://github.com/rust-lang/rustlings/commit/fa9f522b7f043d7ef73a39f003a9272dfe72c4f4)) +- add "rustlings list" command ([838f9f30](https://github.com/rust-lang/rustlings/commit/838f9f30083d0b23fd67503dcf0fbeca498e6647)) +- **try_from_into:** remove duplicate annotation ([04f1d079](https://github.com/rust-lang/rustlings/commit/04f1d079aa42a2f49af694bc92c67d731d31a53f)) #### Bug Fixes -* update structs README ([bcf14cf6](https://github.com/rust-lang/rustlings/commit/bcf14cf677adb3a38a3ac3ca53f3c69f61153025)) -* added missing exercises to info.toml ([90cfb6ff](https://github.com/rust-lang/rustlings/commit/90cfb6ff28377531bfc34acb70547bdb13374f6b)) -* gives a bit more context to magic number ([30644c9a](https://github.com/rust-lang/rustlings/commit/30644c9a062b825c0ea89435dc59f0cad86b110e)) -* **functions2:** Change signature to trigger precise error message: (#605) ([0ef95947](https://github.com/rust-lang/rustlings/commit/0ef95947cc30482e63a7045be6cc2fb6f6dcb4cc)) -* **structs1:** Adjust wording (#573) ([9334783d](https://github.com/rust-lang/rustlings/commit/9334783da31d821cc59174fbe8320df95828926c)) -* **try_from_into:** - * type error ([4f4cfcf3](https://github.com/rust-lang/rustlings/commit/4f4cfcf3c36c8718c7c170c9c3a6935e6ef0618c)) - * Update description (#584) ([96347df9](https://github.com/rust-lang/rustlings/commit/96347df9df294f01153b29d9ad4ba361f665c755)) -* **vec1:** Have test compare every element in a and v ([9b6c6293](https://github.com/rust-lang/rustlings/commit/9b6c629397b24b944f484f5b2bbd8144266b5695)) +- update structs README ([bcf14cf6](https://github.com/rust-lang/rustlings/commit/bcf14cf677adb3a38a3ac3ca53f3c69f61153025)) +- added missing exercises to info.toml ([90cfb6ff](https://github.com/rust-lang/rustlings/commit/90cfb6ff28377531bfc34acb70547bdb13374f6b)) +- gives a bit more context to magic number ([30644c9a](https://github.com/rust-lang/rustlings/commit/30644c9a062b825c0ea89435dc59f0cad86b110e)) +- **functions2:** Change signature to trigger precise error message: (#605) ([0ef95947](https://github.com/rust-lang/rustlings/commit/0ef95947cc30482e63a7045be6cc2fb6f6dcb4cc)) +- **structs1:** Adjust wording (#573) ([9334783d](https://github.com/rust-lang/rustlings/commit/9334783da31d821cc59174fbe8320df95828926c)) +- **try_from_into:** + - type error ([4f4cfcf3](https://github.com/rust-lang/rustlings/commit/4f4cfcf3c36c8718c7c170c9c3a6935e6ef0618c)) + - Update description (#584) ([96347df9](https://github.com/rust-lang/rustlings/commit/96347df9df294f01153b29d9ad4ba361f665c755)) +- **vec1:** Have test compare every element in a and v ([9b6c6293](https://github.com/rust-lang/rustlings/commit/9b6c629397b24b944f484f5b2bbd8144266b5695)) + ## 4.2.0 (2020-11-07) #### Features -* Add HashMap exercises ([633c00cf](https://github.com/rust-lang/rustlings/commit/633c00cf8071e1e82959a3010452a32f34f29fc9)) -* Add Vec exercises ([0c12fa31](https://github.com/rust-lang/rustlings/commit/0c12fa31c57c03c6287458a0a8aca7afd057baf6)) -* **primitive_types6:** Add a test (#548) ([2b1fb2b7](https://github.com/rust-lang/rustlings/commit/2b1fb2b739bf9ad8d6b7b12af25fee173011bfc4)) -* **try_from_into:** Add tests (#571) ([95ccd926](https://github.com/rust-lang/rustlings/commit/95ccd92616ae79ba287cce221101e0bbe4f68cdc)) +- Add HashMap exercises ([633c00cf](https://github.com/rust-lang/rustlings/commit/633c00cf8071e1e82959a3010452a32f34f29fc9)) +- Add Vec exercises ([0c12fa31](https://github.com/rust-lang/rustlings/commit/0c12fa31c57c03c6287458a0a8aca7afd057baf6)) +- **primitive_types6:** Add a test (#548) ([2b1fb2b7](https://github.com/rust-lang/rustlings/commit/2b1fb2b739bf9ad8d6b7b12af25fee173011bfc4)) +- **try_from_into:** Add tests (#571) ([95ccd926](https://github.com/rust-lang/rustlings/commit/95ccd92616ae79ba287cce221101e0bbe4f68cdc)) #### Bug Fixes -* log error output when inotify limit is exceeded ([d61b4e5a](https://github.com/rust-lang/rustlings/commit/d61b4e5a13b44d72d004082f523fa1b6b24c1aca)) -* more unique temp_file ([5643ef05](https://github.com/rust-lang/rustlings/commit/5643ef05bc81e4a840e9456f4406a769abbe1392)) -* **installation:** Update the MinRustVersion ([21bfb2d4](https://github.com/rust-lang/rustlings/commit/21bfb2d4777429c87d8d3b5fbf0ce66006dcd034)) -* **iterators2:** Update description (#578) ([197d3a3d](https://github.com/rust-lang/rustlings/commit/197d3a3d8961b2465579218a6749b2b2cefa8ddd)) -* **primitive_types6:** - * remove 'unused doc comment' warning ([472d8592](https://github.com/rust-lang/rustlings/commit/472d8592d65c8275332a20dfc269e7ac0d41bc88)) - * missing comma in test ([4fb230da](https://github.com/rust-lang/rustlings/commit/4fb230daf1251444fcf29e085cee222a91f8a37e)) -* **quiz3:** Second test is for odd numbers, not even. (#553) ([18e0bfef](https://github.com/rust-lang/rustlings/commit/18e0bfef1de53071e353ba1ec5837002ff7290e6)) +- log error output when inotify limit is exceeded ([d61b4e5a](https://github.com/rust-lang/rustlings/commit/d61b4e5a13b44d72d004082f523fa1b6b24c1aca)) +- more unique temp_file ([5643ef05](https://github.com/rust-lang/rustlings/commit/5643ef05bc81e4a840e9456f4406a769abbe1392)) +- **installation:** Update the MinRustVersion ([21bfb2d4](https://github.com/rust-lang/rustlings/commit/21bfb2d4777429c87d8d3b5fbf0ce66006dcd034)) +- **iterators2:** Update description (#578) ([197d3a3d](https://github.com/rust-lang/rustlings/commit/197d3a3d8961b2465579218a6749b2b2cefa8ddd)) +- **primitive_types6:** + - remove 'unused doc comment' warning ([472d8592](https://github.com/rust-lang/rustlings/commit/472d8592d65c8275332a20dfc269e7ac0d41bc88)) + - missing comma in test ([4fb230da](https://github.com/rust-lang/rustlings/commit/4fb230daf1251444fcf29e085cee222a91f8a37e)) +- **quiz3:** Second test is for odd numbers, not even. (#553) ([18e0bfef](https://github.com/rust-lang/rustlings/commit/18e0bfef1de53071e353ba1ec5837002ff7290e6)) + ## 4.1.0 (2020-10-05) #### Bug Fixes -* Update rustlings version in Cargo.lock ([1cc40bc9](https://github.com/rust-lang/rustlings/commit/1cc40bc9ce95c23d56f6d91fa1c4deb646231fef)) -* **arc1:** index mod should equal thread count ([b4062ef6](https://github.com/rust-lang/rustlings/commit/b4062ef6993e80dac107c4093ea85166ad3ee0fa)) -* **enums3:** Update Message::ChangeColor to take a tuple. (#457) ([4b6540c7](https://github.com/rust-lang/rustlings/commit/4b6540c71adabad647de8a09e57295e7c7c7d794)) -* **exercises:** adding question mark to quiz2 ([101072ab](https://github.com/rust-lang/rustlings/commit/101072ab9f8c80b40b8b88cb06cbe38aca2481c5)) -* **generics3:** clarify grade change ([47f7672c](https://github.com/rust-lang/rustlings/commit/47f7672c0307732056e7426e81d351f0dd7e22e5)) -* **structs3:** Small adjustment of variable name ([114b54cb](https://github.com/rust-lang/rustlings/commit/114b54cbdb977234b39e5f180d937c14c78bb8b2)) -* **using_as:** Add test so that proper type is returned. (#512) ([3286c5ec](https://github.com/rust-lang/rustlings/commit/3286c5ec19ea5fb7ded81d047da5f8594108a490)) +- Update rustlings version in Cargo.lock ([1cc40bc9](https://github.com/rust-lang/rustlings/commit/1cc40bc9ce95c23d56f6d91fa1c4deb646231fef)) +- **arc1:** index mod should equal thread count ([b4062ef6](https://github.com/rust-lang/rustlings/commit/b4062ef6993e80dac107c4093ea85166ad3ee0fa)) +- **enums3:** Update Message::ChangeColor to take a tuple. (#457) ([4b6540c7](https://github.com/rust-lang/rustlings/commit/4b6540c71adabad647de8a09e57295e7c7c7d794)) +- **exercises:** adding question mark to quiz2 ([101072ab](https://github.com/rust-lang/rustlings/commit/101072ab9f8c80b40b8b88cb06cbe38aca2481c5)) +- **generics3:** clarify grade change ([47f7672c](https://github.com/rust-lang/rustlings/commit/47f7672c0307732056e7426e81d351f0dd7e22e5)) +- **structs3:** Small adjustment of variable name ([114b54cb](https://github.com/rust-lang/rustlings/commit/114b54cbdb977234b39e5f180d937c14c78bb8b2)) +- **using_as:** Add test so that proper type is returned. (#512) ([3286c5ec](https://github.com/rust-lang/rustlings/commit/3286c5ec19ea5fb7ded81d047da5f8594108a490)) #### Features -* Added iterators1.rs exercise ([9642f5a3](https://github.com/rust-lang/rustlings/commit/9642f5a3f686270a4f8f6ba969919ddbbc4f7fdd)) -* Add ability to run rustlings on repl.it (#471) ([8f7b5bd0](https://github.com/rust-lang/rustlings/commit/8f7b5bd00eb83542b959830ef55192d2d76db90a)) -* Add gitpod support (#473) ([4821a8be](https://github.com/rust-lang/rustlings/commit/4821a8be94af4f669042a06ab917934cfacd032f)) -* Remind the user of the hint option (#425) ([816b1f5e](https://github.com/rust-lang/rustlings/commit/816b1f5e85d6cc6e72673813a85d0ada2a8f84af)) -* Remind the user of the hint option (#425) ([9f61db5d](https://github.com/rust-lang/rustlings/commit/9f61db5dbe38538cf06571fcdd5f806e7901e83a)) -* **cli:** Added 'cls' command to 'watch' mode (#474) ([4f2468e1](https://github.com/rust-lang/rustlings/commit/4f2468e14f574a93a2e9b688367b5752ed96ae7b)) -* **try_from_into:** Add insufficient length test (#469) ([523d18b8](https://github.com/rust-lang/rustlings/commit/523d18b873a319f7c09262f44bd40e2fab1830e5)) +- Added iterators1.rs exercise ([9642f5a3](https://github.com/rust-lang/rustlings/commit/9642f5a3f686270a4f8f6ba969919ddbbc4f7fdd)) +- Add ability to run rustlings on repl.it (#471) ([8f7b5bd0](https://github.com/rust-lang/rustlings/commit/8f7b5bd00eb83542b959830ef55192d2d76db90a)) +- Add gitpod support (#473) ([4821a8be](https://github.com/rust-lang/rustlings/commit/4821a8be94af4f669042a06ab917934cfacd032f)) +- Remind the user of the hint option (#425) ([816b1f5e](https://github.com/rust-lang/rustlings/commit/816b1f5e85d6cc6e72673813a85d0ada2a8f84af)) +- Remind the user of the hint option (#425) ([9f61db5d](https://github.com/rust-lang/rustlings/commit/9f61db5dbe38538cf06571fcdd5f806e7901e83a)) +- **cli:** Added 'cls' command to 'watch' mode (#474) ([4f2468e1](https://github.com/rust-lang/rustlings/commit/4f2468e14f574a93a2e9b688367b5752ed96ae7b)) +- **try_from_into:** Add insufficient length test (#469) ([523d18b8](https://github.com/rust-lang/rustlings/commit/523d18b873a319f7c09262f44bd40e2fab1830e5)) + ## 4.0.0 (2020-07-08) #### Breaking Changes -* Add a --nocapture option to display test harnesses' outputs ([8ad5f9bf](https://github.com/rust-lang/rustlings/commit/8ad5f9bf531a4848b1104b7b389a20171624c82f)) -* Rename test to quiz, fixes #244 ([010a0456](https://github.com/rust-lang/rustlings/commit/010a04569282149cea7f7a76fc4d7f4c9f0f08dd)) +- Add a --nocapture option to display test harnesses' outputs ([8ad5f9bf](https://github.com/rust-lang/rustlings/commit/8ad5f9bf531a4848b1104b7b389a20171624c82f)) +- Rename test to quiz, fixes #244 ([010a0456](https://github.com/rust-lang/rustlings/commit/010a04569282149cea7f7a76fc4d7f4c9f0f08dd)) #### Features -* Add traits README ([173bb141](https://github.com/rust-lang/rustlings/commit/173bb14140c5530cbdb59e53ace3991a99d804af)) -* Add box1.rs exercise ([7479a473](https://github.com/rust-lang/rustlings/commit/7479a4737bdcac347322ad0883ca528c8675e720)) -* Rewrite try_from_into (#393) ([763aa6e3](https://github.com/rust-lang/rustlings/commit/763aa6e378a586caae2d8d63755a85eeba227933)) -* Add if2 exercise ([1da84b5f](https://github.com/rust-lang/rustlings/commit/1da84b5f7c489f65bd683c244f13c7d1ee812df0)) -* Added exercise structs3.rs ([b66e2e09](https://github.com/rust-lang/rustlings/commit/b66e2e09622243e086a0f1258dd27e1a2d61c891)) -* Add exercise variables6 covering const (#352) ([5999acd2](https://github.com/rust-lang/rustlings/commit/5999acd24a4f203292be36e0fd18d385887ec481)) +- Add traits README ([173bb141](https://github.com/rust-lang/rustlings/commit/173bb14140c5530cbdb59e53ace3991a99d804af)) +- Add box1.rs exercise ([7479a473](https://github.com/rust-lang/rustlings/commit/7479a4737bdcac347322ad0883ca528c8675e720)) +- Rewrite try_from_into (#393) ([763aa6e3](https://github.com/rust-lang/rustlings/commit/763aa6e378a586caae2d8d63755a85eeba227933)) +- Add if2 exercise ([1da84b5f](https://github.com/rust-lang/rustlings/commit/1da84b5f7c489f65bd683c244f13c7d1ee812df0)) +- Added exercise structs3.rs ([b66e2e09](https://github.com/rust-lang/rustlings/commit/b66e2e09622243e086a0f1258dd27e1a2d61c891)) +- Add exercise variables6 covering const (#352) ([5999acd2](https://github.com/rust-lang/rustlings/commit/5999acd24a4f203292be36e0fd18d385887ec481)) #### Bug Fixes -* Change then to than ([ddd98ad7](https://github.com/rust-lang/rustlings/commit/ddd98ad75d3668fbb10eff74374148aa5ed2344d)) -* rename quiz1 to tests1 in info (#420) ([0dd1c6ca](https://github.com/rust-lang/rustlings/commit/0dd1c6ca6b389789e0972aa955fe17aa15c95f29)) -* fix quiz naming inconsistency (#421) ([5563adbb](https://github.com/rust-lang/rustlings/commit/5563adbb890587fc48fbbc9c4028642687f1e85b)) -* confine the user further in variable exercises ([06ef4cc6](https://github.com/rust-lang/rustlings/commit/06ef4cc654e75d22a526812919ee49b8956280bf)) -* update iterator and macro text for typos and clarity ([95900828](https://github.com/rust-lang/rustlings/commit/959008284834bece0196a01e17ac69a7e3590116)) -* update generics2 closes #362 ([964c974a](https://github.com/rust-lang/rustlings/commit/964c974a0274199d755073b917c2bc5da0c9b4f1)) -* confusing comment in conversions/try_from_into.rs ([c9e4f2cf](https://github.com/rust-lang/rustlings/commit/c9e4f2cfb4c48d0b7451263cfb43b9426438122d)) -* **arc1:** Passively introduce attributes (#429) ([113cdae2](https://github.com/rust-lang/rustlings/commit/113cdae2d4e4c55905e8056ad326ede7fd7de356)) -* **box1:** fix comment typo (#426) ([bb2ca251](https://github.com/rust-lang/rustlings/commit/bb2ca251106b27a7272d9a30872904dd1376654c)) -* **errorsn:** Try harder to confine the user. (#388) ([2b20c8a0](https://github.com/rust-lang/rustlings/commit/2b20c8a0f5774d07c58d110d75879f33fc6273b5)) -* **from_into.rs:** typo ([a901499e](https://github.com/rust-lang/rustlings/commit/a901499ededd3ce1995164700514fe4e9a0373ea)) -* **generics2:** Guide students to the answer (#430) ([e6bd8021](https://github.com/rust-lang/rustlings/commit/e6bd8021d9a7dd06feebc30c9d5f953901d7b419)) -* **installation:** - * Provide a backup git reference when tag can't be curl ([9e4fb100](https://github.com/rust-lang/rustlings/commit/9e4fb1009f1c9e3433915c03e22c2af422e5c5fe)) - * Check if python is available while checking for git,rustc and cargo ([9cfb617d](https://github.com/rust-lang/rustlings/commit/9cfb617d5b0451b4b51644a1298965390cda9884)) -* **option1:** - * Don't add only zeros to the numbers array ([cce6a442](https://github.com/rust-lang/rustlings/commit/cce6a4427718724a9096800754cd3abeca6a1580)) - * Add cast to usize, as it is confusing in the context of an exercise about Option ([f6cffc7e](https://github.com/rust-lang/rustlings/commit/f6cffc7e487b42f15a6f958e49704c93a8d4465b)) -* **option2:** Add TODO to comments (#400) ([10967bce](https://github.com/rust-lang/rustlings/commit/10967bce57682812dc0891a9f9757da1a9d87404)) -* **options1:** Add hint about Array Initialization (#389) ([9f75554f](https://github.com/rust-lang/rustlings/commit/9f75554f2a30295996f03f0160b98c0458305502)) -* **test2:** name of type String and &str (#394) ([d6c0a688](https://github.com/rust-lang/rustlings/commit/d6c0a688e6a96f93ad60d540d4b326f342fc0d45)) -* **variables6:** minor typo (#419) ([524e17df](https://github.com/rust-lang/rustlings/commit/524e17df10db95f7b90a0f75cc8997182a8a4094)) +- Change then to than ([ddd98ad7](https://github.com/rust-lang/rustlings/commit/ddd98ad75d3668fbb10eff74374148aa5ed2344d)) +- rename quiz1 to tests1 in info (#420) ([0dd1c6ca](https://github.com/rust-lang/rustlings/commit/0dd1c6ca6b389789e0972aa955fe17aa15c95f29)) +- fix quiz naming inconsistency (#421) ([5563adbb](https://github.com/rust-lang/rustlings/commit/5563adbb890587fc48fbbc9c4028642687f1e85b)) +- confine the user further in variable exercises ([06ef4cc6](https://github.com/rust-lang/rustlings/commit/06ef4cc654e75d22a526812919ee49b8956280bf)) +- update iterator and macro text for typos and clarity ([95900828](https://github.com/rust-lang/rustlings/commit/959008284834bece0196a01e17ac69a7e3590116)) +- update generics2 closes #362 ([964c974a](https://github.com/rust-lang/rustlings/commit/964c974a0274199d755073b917c2bc5da0c9b4f1)) +- confusing comment in conversions/try_from_into.rs ([c9e4f2cf](https://github.com/rust-lang/rustlings/commit/c9e4f2cfb4c48d0b7451263cfb43b9426438122d)) +- **arc1:** Passively introduce attributes (#429) ([113cdae2](https://github.com/rust-lang/rustlings/commit/113cdae2d4e4c55905e8056ad326ede7fd7de356)) +- **box1:** fix comment typo (#426) ([bb2ca251](https://github.com/rust-lang/rustlings/commit/bb2ca251106b27a7272d9a30872904dd1376654c)) +- **errorsn:** Try harder to confine the user. (#388) ([2b20c8a0](https://github.com/rust-lang/rustlings/commit/2b20c8a0f5774d07c58d110d75879f33fc6273b5)) +- **from_into.rs:** typo ([a901499e](https://github.com/rust-lang/rustlings/commit/a901499ededd3ce1995164700514fe4e9a0373ea)) +- **generics2:** Guide students to the answer (#430) ([e6bd8021](https://github.com/rust-lang/rustlings/commit/e6bd8021d9a7dd06feebc30c9d5f953901d7b419)) +- **installation:** + - Provide a backup git reference when tag can't be curl ([9e4fb100](https://github.com/rust-lang/rustlings/commit/9e4fb1009f1c9e3433915c03e22c2af422e5c5fe)) + - Check if python is available while checking for git,rustc and cargo ([9cfb617d](https://github.com/rust-lang/rustlings/commit/9cfb617d5b0451b4b51644a1298965390cda9884)) +- **option1:** + - Don't add only zeros to the numbers array ([cce6a442](https://github.com/rust-lang/rustlings/commit/cce6a4427718724a9096800754cd3abeca6a1580)) + - Add cast to usize, as it is confusing in the context of an exercise about Option ([f6cffc7e](https://github.com/rust-lang/rustlings/commit/f6cffc7e487b42f15a6f958e49704c93a8d4465b)) +- **option2:** Add TODO to comments (#400) ([10967bce](https://github.com/rust-lang/rustlings/commit/10967bce57682812dc0891a9f9757da1a9d87404)) +- **options1:** Add hint about Array Initialization (#389) ([9f75554f](https://github.com/rust-lang/rustlings/commit/9f75554f2a30295996f03f0160b98c0458305502)) +- **test2:** name of type String and &str (#394) ([d6c0a688](https://github.com/rust-lang/rustlings/commit/d6c0a688e6a96f93ad60d540d4b326f342fc0d45)) +- **variables6:** minor typo (#419) ([524e17df](https://github.com/rust-lang/rustlings/commit/524e17df10db95f7b90a0f75cc8997182a8a4094)) + ## 3.0.0 (2020-04-11) #### Breaking Changes -* make "compile" exercises print output (#278) ([3b6d5c](https://github.com/fmoko/rustlings/commit/3b6d5c3aaa27a242a832799eb66e96897d26fde3)) +- make "compile" exercises print output (#278) ([3b6d5c](https://github.com/fmoko/rustlings/commit/3b6d5c3aaa27a242a832799eb66e96897d26fde3)) #### Bug Fixes -* **primitive_types:** revert primitive_types4 (#296) ([b3a3351e](https://github.com/rust-lang/rustlings/commit/b3a3351e8e6a0bdee07077d7b0382953821649ae)) -* **run:** compile clippy exercise files (#295) ([3ab084a4](https://github.com/rust-lang/rustlings/commit/3ab084a421c0f140ae83bf1fc3f47b39342e7373)) -* **conversions:** - * add additional test to meet exercise rules (#284) ([bc22ec3](https://github.com/fmoko/rustlings/commit/bc22ec382f843347333ef1301fc1bad773657f38)) - * remove duplicate not done comment (#292) ([dab90f](https://github.com/fmoko/rustlings/commit/dab90f7b91a6000fe874e3d664f244048e5fa342)) -* don't hardcode documentation version for traits (#288) ([30e6af](https://github.com/fmoko/rustlings/commit/30e6af60690c326fb5d3a9b7335f35c69c09137d)) +- **primitive_types:** revert primitive_types4 (#296) ([b3a3351e](https://github.com/rust-lang/rustlings/commit/b3a3351e8e6a0bdee07077d7b0382953821649ae)) +- **run:** compile clippy exercise files (#295) ([3ab084a4](https://github.com/rust-lang/rustlings/commit/3ab084a421c0f140ae83bf1fc3f47b39342e7373)) +- **conversions:** + - add additional test to meet exercise rules (#284) ([bc22ec3](https://github.com/fmoko/rustlings/commit/bc22ec382f843347333ef1301fc1bad773657f38)) + - remove duplicate not done comment (#292) ([dab90f](https://github.com/fmoko/rustlings/commit/dab90f7b91a6000fe874e3d664f244048e5fa342)) +- don't hardcode documentation version for traits (#288) ([30e6af](https://github.com/fmoko/rustlings/commit/30e6af60690c326fb5d3a9b7335f35c69c09137d)) #### Features -* add Option2 exercise (#290) ([86b5c08b](https://github.com/rust-lang/rustlings/commit/86b5c08b9bea1576127a7c5f599f5752072c087d)) -* add exercise for option (#282) ([135e5d47](https://github.com/rust-lang/rustlings/commit/135e5d47a7c395aece6f6022117fb20c82f2d3d4)) -* add new exercises for generics (#280) ([76be5e4e](https://github.com/rust-lang/rustlings/commit/76be5e4e991160f5fd9093f03ee2ba260e8f7229)) -* **ci:** add buildkite config ([b049fa2c](https://github.com/rust-lang/rustlings/commit/b049fa2c84dba0f0c8906ac44e28fd45fba51a71)) +- add Option2 exercise (#290) ([86b5c08b](https://github.com/rust-lang/rustlings/commit/86b5c08b9bea1576127a7c5f599f5752072c087d)) +- add exercise for option (#282) ([135e5d47](https://github.com/rust-lang/rustlings/commit/135e5d47a7c395aece6f6022117fb20c82f2d3d4)) +- add new exercises for generics (#280) ([76be5e4e](https://github.com/rust-lang/rustlings/commit/76be5e4e991160f5fd9093f03ee2ba260e8f7229)) +- **ci:** add buildkite config ([b049fa2c](https://github.com/rust-lang/rustlings/commit/b049fa2c84dba0f0c8906ac44e28fd45fba51a71)) + ### 2.2.1 (2020-02-27) #### Bug Fixes -* Re-add cloning the repo to install scripts ([3d9b03c5](https://github.com/rust-lang/rustlings/commit/3d9b03c52b8dc51b140757f6fd25ad87b5782ef5)) +- Re-add cloning the repo to install scripts ([3d9b03c5](https://github.com/rust-lang/rustlings/commit/3d9b03c52b8dc51b140757f6fd25ad87b5782ef5)) #### Features -* Add clippy lints (#269) ([1e2fd9c9](https://github.com/rust-lang/rustlings/commit/1e2fd9c92f8cd6e389525ca1a999fca4c90b5921)) +- Add clippy lints (#269) ([1e2fd9c9](https://github.com/rust-lang/rustlings/commit/1e2fd9c92f8cd6e389525ca1a999fca4c90b5921)) -## 2.2.0 (2020-02-25) +## 2.2.0 (2020-02-25) #### Bug Fixes -* Update deps to version compatable with aarch64-pc-windows (#263) ([19a93428](https://github.com/rust-lang/rustlings/commit/19a93428b3c73d994292671f829bdc8e5b7b3401)) -* **docs:** - * Added a necessary step to Windows installation process (#242) ([3906efcd](https://github.com/rust-lang/rustlings/commit/3906efcd52a004047b460ed548037093de3f523f)) - * Fixed mangled sentence from book; edited for clarity (#266) ([ade52ff](https://github.com/rust-lang/rustlings/commit/ade52ffb739987287ddd5705944c8777705faed9)) - * Updated iterators readme to account for iterators4 exercise (#273) ([bec8e3a](https://github.com/rust-lang/rustlings/commit/bec8e3a644cbd88db1c73ea5f1d8a364f4a34016)) -* **installation:** make fatal errors more obvious (#272) ([17d0951e](https://github.com/rust-lang/rustlings/commit/17d0951e66fda8e11b204d5c4c41a0d5e22e78f7)) -* **iterators2:** - * Remove reference to missing iterators2.rs (#245) ([419f7797](https://github.com/rust-lang/rustlings/commit/419f7797f294e4ce6a2b883199731b5bde77d262)) -* **as_ref_mut:** Enable a test and improve per clippy's suggestion (#256) ([dfdf809](https://github.com/rust-lang/rustlings/commit/dfdf8093ebbd4145864995627b812780de52f902)) -* **tests1:** - * Change test command ([fe10e06c](https://github.com/rust-lang/rustlings/commit/fe10e06c3733ddb4a21e90d09bf79bfe618e97ce) - * Correct test command in tests1.rs comment (#263) ([39fa7ae](https://github.com/rust-lang/rustlings/commit/39fa7ae8b70ad468da49b06f11b2383135a63bcf)) +- Update deps to version compatable with aarch64-pc-windows (#263) ([19a93428](https://github.com/rust-lang/rustlings/commit/19a93428b3c73d994292671f829bdc8e5b7b3401)) +- **docs:** + - Added a necessary step to Windows installation process (#242) ([3906efcd](https://github.com/rust-lang/rustlings/commit/3906efcd52a004047b460ed548037093de3f523f)) + - Fixed mangled sentence from book; edited for clarity (#266) ([ade52ff](https://github.com/rust-lang/rustlings/commit/ade52ffb739987287ddd5705944c8777705faed9)) + - Updated iterators readme to account for iterators4 exercise (#273) ([bec8e3a](https://github.com/rust-lang/rustlings/commit/bec8e3a644cbd88db1c73ea5f1d8a364f4a34016)) +- **installation:** make fatal errors more obvious (#272) ([17d0951e](https://github.com/rust-lang/rustlings/commit/17d0951e66fda8e11b204d5c4c41a0d5e22e78f7)) +- **iterators2:** + - Remove reference to missing iterators2.rs (#245) ([419f7797](https://github.com/rust-lang/rustlings/commit/419f7797f294e4ce6a2b883199731b5bde77d262)) +- **as_ref_mut:** Enable a test and improve per clippy's suggestion (#256) ([dfdf809](https://github.com/rust-lang/rustlings/commit/dfdf8093ebbd4145864995627b812780de52f902)) +- **tests1:** + - Change test command ([fe10e06c](https://github.com/rust-lang/rustlings/commit/fe10e06c3733ddb4a21e90d09bf79bfe618e97ce) + - Correct test command in tests1.rs comment (#263) ([39fa7ae](https://github.com/rust-lang/rustlings/commit/39fa7ae8b70ad468da49b06f11b2383135a63bcf)) #### Features -* Add variables5.rs exercise (#264) ([0c73609e](https://github.com/rust-lang/rustlings/commit/0c73609e6f2311295e95d6f96f8c747cfc4cba03)) -* Show a completion message when watching (#253) ([d25ee55a](https://github.com/rust-lang/rustlings/commit/d25ee55a3205882d35782e370af855051b39c58c)) -* Add type conversion and parsing exercises (#249) ([0c85dc11](https://github.com/rust-lang/rustlings/commit/0c85dc1193978b5165491b99cc4922caf8d14a65)) -* Created consistent money unit (#258) ([fd57f8f](https://github.com/rust-lang/rustlings/commit/fd57f8f2c1da2af8ddbebbccec214e6f40f4dbab)) -* Enable test for exercise test4 (#276) ([8b971ff](https://github.com/rust-lang/rustlings/commit/8b971ffab6079a706ac925f5917f987932b55c07)) -* Added traits exercises (#274 but specifically #216, which originally added - this :heart:) ([b559cdd](https://github.com/rust-lang/rustlings/commit/b559cdd73f32c0d0cfc1feda39f82b3e3583df17)) - +- Add variables5.rs exercise (#264) ([0c73609e](https://github.com/rust-lang/rustlings/commit/0c73609e6f2311295e95d6f96f8c747cfc4cba03)) +- Show a completion message when watching (#253) ([d25ee55a](https://github.com/rust-lang/rustlings/commit/d25ee55a3205882d35782e370af855051b39c58c)) +- Add type conversion and parsing exercises (#249) ([0c85dc11](https://github.com/rust-lang/rustlings/commit/0c85dc1193978b5165491b99cc4922caf8d14a65)) +- Created consistent money unit (#258) ([fd57f8f](https://github.com/rust-lang/rustlings/commit/fd57f8f2c1da2af8ddbebbccec214e6f40f4dbab)) +- Enable test for exercise test4 (#276) ([8b971ff](https://github.com/rust-lang/rustlings/commit/8b971ffab6079a706ac925f5917f987932b55c07)) +- Added traits exercises (#274 but specifically #216, which originally added + this :heart:) ([b559cdd](https://github.com/rust-lang/rustlings/commit/b559cdd73f32c0d0cfc1feda39f82b3e3583df17)) + ## 2.1.0 (2019-11-27) #### Bug Fixes -* add line numbers in several exercises and hints ([b565c4d3](https://github.com/rust-lang/rustlings/commit/b565c4d3e74e8e110bef201a082fa1302722a7c3)) -* **arc1:** Fix some words in the comment ([c42c3b21](https://github.com/rust-lang/rustlings/commit/c42c3b2101df9164c8cd7bb344def921e5ba3e61)) -* **enums:** Add link to chapter on pattern syntax (#242) ([615ce327](https://github.com/rust-lang/rustlings/commit/615ce3279800c56d89f19d218ccb7ef576624feb)) -* **primitive_types4:** - * update outdated hint ([4c5189df](https://github.com/rust-lang/rustlings/commit/4c5189df2bdd9a231f6b2611919ba5aa14da0d3f)) - * update outdated comment ([ded2c034](https://github.com/rust-lang/rustlings/commit/ded2c034ba93fa1e3c2c2ea16b83abc1a57265e8)) -* **strings2:** update line number in hint ([a09f684f](https://github.com/rust-lang/rustlings/commit/a09f684f05c58d239a6fc59ec5f81c2533e8b820)) -* **variables1:** Correct wrong word in comment ([fda5a470](https://github.com/rust-lang/rustlings/commit/fda5a47069e0954f16a04e8e50945e03becb71a5)) +- add line numbers in several exercises and hints ([b565c4d3](https://github.com/rust-lang/rustlings/commit/b565c4d3e74e8e110bef201a082fa1302722a7c3)) +- **arc1:** Fix some words in the comment ([c42c3b21](https://github.com/rust-lang/rustlings/commit/c42c3b2101df9164c8cd7bb344def921e5ba3e61)) +- **enums:** Add link to chapter on pattern syntax (#242) ([615ce327](https://github.com/rust-lang/rustlings/commit/615ce3279800c56d89f19d218ccb7ef576624feb)) +- **primitive_types4:** + - update outdated hint ([4c5189df](https://github.com/rust-lang/rustlings/commit/4c5189df2bdd9a231f6b2611919ba5aa14da0d3f)) + - update outdated comment ([ded2c034](https://github.com/rust-lang/rustlings/commit/ded2c034ba93fa1e3c2c2ea16b83abc1a57265e8)) +- **strings2:** update line number in hint ([a09f684f](https://github.com/rust-lang/rustlings/commit/a09f684f05c58d239a6fc59ec5f81c2533e8b820)) +- **variables1:** Correct wrong word in comment ([fda5a470](https://github.com/rust-lang/rustlings/commit/fda5a47069e0954f16a04e8e50945e03becb71a5)) #### Features -* **watch:** show hint while watching ([8143d57b](https://github.com/rust-lang/rustlings/commit/8143d57b4e88c51341dd4a18a14c536042cc009c)) +- **watch:** show hint while watching ([8143d57b](https://github.com/rust-lang/rustlings/commit/8143d57b4e88c51341dd4a18a14c536042cc009c)) + ## 2.0.0 (2019-11-12) #### Bug Fixes -* **default:** Clarify the installation procedure ([c371b853](https://github.com/rust-lang/rustlings/commit/c371b853afa08947ddeebec0edd074b171eeaae0)) -* **info:** Fix trailing newlines for hints ([795b6e34](https://github.com/rust-lang/rustlings/commit/795b6e348094a898e9227a14f6232f7bb94c8d31)) -* **run:** make `run` never prompt ([4b265465](https://github.com/rust-lang/rustlings/commit/4b26546589f7d2b50455429482cf1f386ceae8b3)) +- **default:** Clarify the installation procedure ([c371b853](https://github.com/rust-lang/rustlings/commit/c371b853afa08947ddeebec0edd074b171eeaae0)) +- **info:** Fix trailing newlines for hints ([795b6e34](https://github.com/rust-lang/rustlings/commit/795b6e348094a898e9227a14f6232f7bb94c8d31)) +- **run:** make `run` never prompt ([4b265465](https://github.com/rust-lang/rustlings/commit/4b26546589f7d2b50455429482cf1f386ceae8b3)) #### Breaking Changes -* Refactor hint system ([9bdb0a12](https://github.com/rust-lang/rustlings/commit/9bdb0a12e45a8e9f9f6a4bd4a9c172c5376c7f60)) -* improve `watch` execution mode ([2cdd6129](https://github.com/rust-lang/rustlings/commit/2cdd61294f0d9a53775ee24ad76435bec8a21e60)) -* Index exercises by name ([627cdc07](https://github.com/rust-lang/rustlings/commit/627cdc07d07dfe6a740e885e0ddf6900e7ec336b)) -* **run:** makes `run` never prompt ([4b265465](https://github.com/rust-lang/rustlings/commit/4b26546589f7d2b50455429482cf1f386ceae8b3)) +- Refactor hint system ([9bdb0a12](https://github.com/rust-lang/rustlings/commit/9bdb0a12e45a8e9f9f6a4bd4a9c172c5376c7f60)) +- improve `watch` execution mode ([2cdd6129](https://github.com/rust-lang/rustlings/commit/2cdd61294f0d9a53775ee24ad76435bec8a21e60)) +- Index exercises by name ([627cdc07](https://github.com/rust-lang/rustlings/commit/627cdc07d07dfe6a740e885e0ddf6900e7ec336b)) +- **run:** makes `run` never prompt ([4b265465](https://github.com/rust-lang/rustlings/commit/4b26546589f7d2b50455429482cf1f386ceae8b3)) #### Features -* **cli:** check for rustc before doing anything ([36a033b8](https://github.com/rust-lang/rustlings/commit/36a033b87a6549c1e5639c908bf7381c84f4f425)) -* **hint:** Add test for hint ([ce9fa6eb](https://github.com/rust-lang/rustlings/commit/ce9fa6ebbfdc3e7585d488d9409797285708316f)) +- **cli:** check for rustc before doing anything ([36a033b8](https://github.com/rust-lang/rustlings/commit/36a033b87a6549c1e5639c908bf7381c84f4f425)) +- **hint:** Add test for hint ([ce9fa6eb](https://github.com/rust-lang/rustlings/commit/ce9fa6ebbfdc3e7585d488d9409797285708316f)) + ### 1.5.1 (2019-11-11) #### Bug Fixes -* **errors3:** Update hint ([dcfb427b](https://github.com/rust-lang/rustlings/commit/dcfb427b09585f0193f0a294443fdf99f11c64cb), closes [#185](https://github.com/rust-lang/rustlings/issues/185)) -* **if1:** Remove `return` reference ([ad03d180](https://github.com/rust-lang/rustlings/commit/ad03d180c9311c0093e56a3531eec1a9a70cdb45)) -* **strings:** Move Strings before Structs ([6dcecb38](https://github.com/rust-lang/rustlings/commit/6dcecb38a4435593beb87c8e12d6314143631482), closes [#204](https://github.com/rust-lang/rustlings/issues/204)) -* **structs1:** Remove misleading comment ([f72e5a8f](https://github.com/rust-lang/rustlings/commit/f72e5a8f05568dde04eaeac10b9a69872f21cb37)) -* **threads:** Move Threads behind SLT ([fbe91a67](https://github.com/rust-lang/rustlings/commit/fbe91a67a482bfe64cbcdd58d06ba830a0f39da3), closes [#205](https://github.com/rust-lang/rustlings/issues/205)) -* **watch:** clear screen before each `verify()` ([3aff590](https://github.com/rust-lang/rustlings/commit/3aff59085586c24196a547c2693adbdcf4432648)) +- **errors3:** Update hint ([dcfb427b](https://github.com/rust-lang/rustlings/commit/dcfb427b09585f0193f0a294443fdf99f11c64cb), closes [#185](https://github.com/rust-lang/rustlings/issues/185)) +- **if1:** Remove `return` reference ([ad03d180](https://github.com/rust-lang/rustlings/commit/ad03d180c9311c0093e56a3531eec1a9a70cdb45)) +- **strings:** Move Strings before Structs ([6dcecb38](https://github.com/rust-lang/rustlings/commit/6dcecb38a4435593beb87c8e12d6314143631482), closes [#204](https://github.com/rust-lang/rustlings/issues/204)) +- **structs1:** Remove misleading comment ([f72e5a8f](https://github.com/rust-lang/rustlings/commit/f72e5a8f05568dde04eaeac10b9a69872f21cb37)) +- **threads:** Move Threads behind SLT ([fbe91a67](https://github.com/rust-lang/rustlings/commit/fbe91a67a482bfe64cbcdd58d06ba830a0f39da3), closes [#205](https://github.com/rust-lang/rustlings/issues/205)) +- **watch:** clear screen before each `verify()` ([3aff590](https://github.com/rust-lang/rustlings/commit/3aff59085586c24196a547c2693adbdcf4432648)) + ## 1.5.0 (2019-11-09) #### Bug Fixes -* **test1:** Rewrite logic ([79a56942](https://github.com/rust-lang/rustlings/commit/79a569422c8309cfc9e4aed25bf4ab3b3859996b)) -* **installation:** Fix rustlings installation check ([7a252c47](https://github.com/rust-lang/rustlings/commit/7a252c475551486efb52f949b8af55803b700bc6)) -* **iterators:** Rename iterator3.rs ([433d2115](https://github.com/rust-lang/rustlings/commit/433d2115bc1c04b6d34a335a18c9a8f3e2672bc6)) -* **iterators2:** Remove syntax resulting in misleading error message ([4cde8664](https://github.com/rust-lang/rustlings/commit/4cde86643e12db162a66e62f23b78962986046ac)) -* **option1:** - * Fix arguments passed to assert! macro (#222) ([4c2cf6da](https://github.com/rust-lang/rustlings/commit/4c2cf6da755efe02725e05ecc3a303304c10a6da)) - * Fix arguments passed to assert! macro ([ead4f7af](https://github.com/rust-lang/rustlings/commit/ead4f7af9e10e53418efdde5c359159347282afd)) - * Add test for prematurely passing exercise ([a750e4a1](https://github.com/rust-lang/rustlings/commit/a750e4a1a3006227292bb17d57d78ce84da6bfc6)) -* **primitive_types4:** Fail on a slice covering the wrong area ([5b1e673c](https://github.com/rust-lang/rustlings/commit/5b1e673cec1658afc4ebbbc800213847804facf5)) -* **readme:** http to https ([70946b85](https://github.com/rust-lang/rustlings/commit/70946b85e536e80e70ed9505cb650ca0a3a1fbb5)) -* **test1:** - * Swap assertion parameter order ([4086d463](https://github.com/rust-lang/rustlings/commit/4086d463a981e81d97781851d17db2ced290f446)) - * renamed function name to snake case closes #180 ([89d5186c](https://github.com/rust-lang/rustlings/commit/89d5186c0dae8135ecabf90ee8bb35949bc2d29b)) +- **test1:** Rewrite logic ([79a56942](https://github.com/rust-lang/rustlings/commit/79a569422c8309cfc9e4aed25bf4ab3b3859996b)) +- **installation:** Fix rustlings installation check ([7a252c47](https://github.com/rust-lang/rustlings/commit/7a252c475551486efb52f949b8af55803b700bc6)) +- **iterators:** Rename iterator3.rs ([433d2115](https://github.com/rust-lang/rustlings/commit/433d2115bc1c04b6d34a335a18c9a8f3e2672bc6)) +- **iterators2:** Remove syntax resulting in misleading error message ([4cde8664](https://github.com/rust-lang/rustlings/commit/4cde86643e12db162a66e62f23b78962986046ac)) +- **option1:** + - Fix arguments passed to assert! macro (#222) ([4c2cf6da](https://github.com/rust-lang/rustlings/commit/4c2cf6da755efe02725e05ecc3a303304c10a6da)) + - Fix arguments passed to assert! macro ([ead4f7af](https://github.com/rust-lang/rustlings/commit/ead4f7af9e10e53418efdde5c359159347282afd)) + - Add test for prematurely passing exercise ([a750e4a1](https://github.com/rust-lang/rustlings/commit/a750e4a1a3006227292bb17d57d78ce84da6bfc6)) +- **primitive_types4:** Fail on a slice covering the wrong area ([5b1e673c](https://github.com/rust-lang/rustlings/commit/5b1e673cec1658afc4ebbbc800213847804facf5)) +- **readme:** http to https ([70946b85](https://github.com/rust-lang/rustlings/commit/70946b85e536e80e70ed9505cb650ca0a3a1fbb5)) +- **test1:** + - Swap assertion parameter order ([4086d463](https://github.com/rust-lang/rustlings/commit/4086d463a981e81d97781851d17db2ced290f446)) + - renamed function name to snake case closes #180 ([89d5186c](https://github.com/rust-lang/rustlings/commit/89d5186c0dae8135ecabf90ee8bb35949bc2d29b)) #### Features -* Add enums exercises ([dc150321](https://github.com/rust-lang/rustlings/commit/dc15032112fc485226a573a18139e5ce928b1755)) -* Added exercise for struct update syntax ([1c4c8764](https://github.com/rust-lang/rustlings/commit/1c4c8764ed118740cd4cee73272ddc6cceb9d959)) -* **iterators2:** adds iterators2 exercise including config ([9288fccf](https://github.com/rust-lang/rustlings/commit/9288fccf07a2c5043b76d0fd6491e4cf72d76031)) +- Add enums exercises ([dc150321](https://github.com/rust-lang/rustlings/commit/dc15032112fc485226a573a18139e5ce928b1755)) +- Added exercise for struct update syntax ([1c4c8764](https://github.com/rust-lang/rustlings/commit/1c4c8764ed118740cd4cee73272ddc6cceb9d959)) +- **iterators2:** adds iterators2 exercise including config ([9288fccf](https://github.com/rust-lang/rustlings/commit/9288fccf07a2c5043b76d0fd6491e4cf72d76031)) -### 1.4.1 (2019-08-13) +### 1.4.1 (2019-08-13) #### Bug Fixes -* **iterators2:** Remove syntax resulting in misleading error message ([4cde8664](https://github.com/rust-lang/rustlings/commit/4cde86643e12db162a66e62f23b78962986046ac)) -* **option1:** Add test for prematurely passing exercise ([a750e4a1](https://github.com/rust-lang/rustlings/commit/a750e4a1a3006227292bb17d57d78ce84da6bfc6)) -* **test1:** Swap assertion parameter order ([4086d463](https://github.com/rust-lang/rustlings/commit/4086d463a981e81d97781851d17db2ced290f446)) - - +- **iterators2:** Remove syntax resulting in misleading error message ([4cde8664](https://github.com/rust-lang/rustlings/commit/4cde86643e12db162a66e62f23b78962986046ac)) +- **option1:** Add test for prematurely passing exercise ([a750e4a1](https://github.com/rust-lang/rustlings/commit/a750e4a1a3006227292bb17d57d78ce84da6bfc6)) +- **test1:** Swap assertion parameter order ([4086d463](https://github.com/rust-lang/rustlings/commit/4086d463a981e81d97781851d17db2ced290f446)) + ## 1.4.0 (2019-07-13) #### Bug Fixes -* **installation:** Fix rustlings installation check ([7a252c47](https://github.com/rust-lang/rustlings/commit/7a252c475551486efb52f949b8af55803b700bc6)) -* **iterators:** Rename iterator3.rs ([433d2115](https://github.com/rust-lang/rustlings/commit/433d2115bc1c04b6d34a335a18c9a8f3e2672bc6)) -* **readme:** http to https ([70946b85](https://github.com/rust-lang/rustlings/commit/70946b85e536e80e70ed9505cb650ca0a3a1fbb5)) -* **test1:** renamed function name to snake case ([89d5186c](https://github.com/rust-lang/rustlings/commit/89d5186c0dae8135ecabf90ee8bb35949bc2d29b)) -* **cli:** Check if changed exercise file exists before calling verify ([ba85ca3](https://github.com/rust-lang/rustlings/commit/ba85ca32c4cfc61de46851ab89f9c58a28f33c88)) -* **structs1:** Fix the irrefutable let pattern warning ([cc6a141](https://github.com/rust-lang/rustlings/commit/cc6a14104d7c034eadc98297eaaa972d09c50b1f)) +- **installation:** Fix rustlings installation check ([7a252c47](https://github.com/rust-lang/rustlings/commit/7a252c475551486efb52f949b8af55803b700bc6)) +- **iterators:** Rename iterator3.rs ([433d2115](https://github.com/rust-lang/rustlings/commit/433d2115bc1c04b6d34a335a18c9a8f3e2672bc6)) +- **readme:** http to https ([70946b85](https://github.com/rust-lang/rustlings/commit/70946b85e536e80e70ed9505cb650ca0a3a1fbb5)) +- **test1:** renamed function name to snake case ([89d5186c](https://github.com/rust-lang/rustlings/commit/89d5186c0dae8135ecabf90ee8bb35949bc2d29b)) +- **cli:** Check if changed exercise file exists before calling verify ([ba85ca3](https://github.com/rust-lang/rustlings/commit/ba85ca32c4cfc61de46851ab89f9c58a28f33c88)) +- **structs1:** Fix the irrefutable let pattern warning ([cc6a141](https://github.com/rust-lang/rustlings/commit/cc6a14104d7c034eadc98297eaaa972d09c50b1f)) #### Features -* **changelog:** Use clog for changelogs ([34e31232](https://github.com/rust-lang/rustlings/commit/34e31232dfddde284a341c9609b33cd27d9d5724)) -* **iterators2:** adds iterators2 exercise including config ([9288fccf](https://github.com/rust-lang/rustlings/commit/9288fccf07a2c5043b76d0fd6491e4cf72d76031)) +- **changelog:** Use clog for changelogs ([34e31232](https://github.com/rust-lang/rustlings/commit/34e31232dfddde284a341c9609b33cd27d9d5724)) +- **iterators2:** adds iterators2 exercise including config ([9288fccf](https://github.com/rust-lang/rustlings/commit/9288fccf07a2c5043b76d0fd6491e4cf72d76031)) + ### 1.3.0 (2019-06-05) #### Features @@ -652,6 +692,7 @@ - Remove highlighting and syntect (#167, @komaeda) + ### 1.2.2 (2019-05-07) #### Bug Fixes @@ -659,6 +700,7 @@ - Reverted `--nocapture` flag since it was causing tests to pass unconditionally + ### 1.2.1 (2019-04-22) #### Bug Fixes @@ -667,6 +709,7 @@ - Provide a nicer error message for when you're in the wrong directory + ### 1.2.0 (2019-04-22) #### Features @@ -675,6 +718,7 @@ - Use --nocapture when testing, enabling `println!` when running (@komaeda) + ### 1.1.1 (2019-04-14) #### Bug fixes @@ -688,6 +732,7 @@ - Canonicalize paths to fix path matching (@cjpearce, #143) + ### 1.1.0 (2019-03-20) - errors2.rs: update link to Rust book (#124) @@ -698,6 +743,7 @@ - Verify that rust version is recent enough to install Rustlings (#131) + ### 1.0.1 (2019-03-06) - Adds a way to install Rustlings in one command (`curl -L https://git.io/rustlings | bash`) @@ -705,6 +751,7 @@ - Reworks the exercise management to use an external TOML file instead of just listing them in the code + ### 1.0.0 (2019-03-06) Initial release. diff --git a/Cargo.lock b/Cargo.lock index 49f20b66..3d04953d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -459,7 +459,7 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustlings" -version = "5.3.0" +version = "5.4.0" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index c2c54fd2..4b450584 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "5.3.0" +version = "5.4.0" authors = [ "Liv ", "Carol (Nichols || Goulding) ", diff --git a/README.md b/README.md index 956bb6d0..4056ba89 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,12 @@ curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | This will install Rustlings and give you access to the `rustlings` command. Run it to get started! ### Nix + Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.3.0) -git clone -b 5.3.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.0) +git clone -b 5.4.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings # if nix version > 2.3 nix develop @@ -70,8 +71,8 @@ If you get a permission denied message, you might have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install --path .`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.3.0) -git clone -b 5.3.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.0) +git clone -b 5.4.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/flake.nix b/flake.nix index 2c29ffa5..5d485801 100644 --- a/flake.nix +++ b/flake.nix @@ -22,7 +22,7 @@ rustlings = pkgs.rustPlatform.buildRustPackage { name = "rustlings"; - version = "5.3.0"; + version = "5.4.0"; buildInputs = cargoBuildInputs; diff --git a/src/main.rs b/src/main.rs index 59adb418..c09088ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "5.3.0"; +const VERSION: &str = "5.4.0"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From 48ce9d2fd827a18314a6fdfdc5895091c6888755 Mon Sep 17 00:00:00 2001 From: magnusrodseth <59113973+magnusrodseth@users.noreply.github.com> Date: Sun, 12 Feb 2023 18:26:13 +0100 Subject: [PATCH 0854/1293] docs: add link to docs about `iter_mut` and `map` --- exercises/vecs/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/exercises/vecs/README.md b/exercises/vecs/README.md index ebe90bf3..8ff9b85f 100644 --- a/exercises/vecs/README.md +++ b/exercises/vecs/README.md @@ -13,3 +13,5 @@ the other useful data structure, hash maps, later. ## Further information - [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html) +- [`iter_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.iter_mut) +- [`map`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.map) From bbdc5c60395ce7e126bcd6f8babacdf6a76ea2d9 Mon Sep 17 00:00:00 2001 From: Daan Wynen Date: Tue, 14 Feb 2023 20:37:33 +0100 Subject: [PATCH 0855/1293] refactor(cow1): replace main with tests Following the discussion in #1195 this is the best I could come up with. The issue for me (and apparently a few other learners) was that the code needed to complete the exercise was not _missing_, but was rather there but wrong. In the end, what made the difference between this exercise and others (for me) was that in this exercise I was supposed to learn what to *expect* of an output. So I think it makes sense here to let the learner modify the tests and not the code itself. Fixes #1195 Signed-off-by: Daan Wynen # Conflicts: # info.toml --- exercises/smart_pointers/cow1.rs | 66 ++++++++++++++++++++++---------- info.toml | 6 +-- 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/exercises/smart_pointers/cow1.rs b/exercises/smart_pointers/cow1.rs index 5fba2519..885138a7 100644 --- a/exercises/smart_pointers/cow1.rs +++ b/exercises/smart_pointers/cow1.rs @@ -4,6 +4,9 @@ // Cow is a clone-on-write smart pointer. // It can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required. // The type is designed to work with general borrowed data via the Borrow trait. +// +// This exercise is meant to show you what to expect when passing data to Cow. +// Fix the unit tests by checking for Cow::Owned(_) and Cow::Borrowed(_) at the TODO markers. // I AM NOT DONE @@ -20,29 +23,52 @@ fn abs_all<'a, 'b>(input: &'a mut Cow<'b, [i32]>) -> &'a mut Cow<'b, [i32]> { input } -fn main() { - // No clone occurs because `input` doesn't need to be mutated. - let slice = [0, 1, 2]; - let mut input = Cow::from(&slice[..]); - match abs_all(&mut input) { - Cow::Borrowed(_) => println!("I borrowed the slice!"), - _ => panic!("expected borrowed value"), +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn reference_mutation() -> Result<(), &'static str> { + // Clone occurs because `input` needs to be mutated. + let slice = [-1, 0, 1]; + let mut input = Cow::from(&slice[..]); + match abs_all(&mut input) { + Cow::Owned(_) => Ok(()), + _ => Err("Expected owned value"), + } } - // Clone occurs because `input` needs to be mutated. - let slice = [-1, 0, 1]; - let mut input = Cow::from(&slice[..]); - match abs_all(&mut input) { - Cow::Owned(_) => println!("I modified the slice and now own it!"), - _ => panic!("expected owned value"), + #[test] + fn reference_no_mutation() -> Result<(), &'static str> { + // No clone occurs because `input` doesn't need to be mutated. + let slice = [0, 1, 2]; + let mut input = Cow::from(&slice[..]); + match abs_all(&mut input) { + // TODO + } } - // No clone occurs because `input` is already owned. - let slice = vec![-1, 0, 1]; - let mut input = Cow::from(slice); - match abs_all(&mut input) { - // TODO - Cow::Borrowed(_) => println!("I own this slice!"), - _ => panic!("expected borrowed value"), + #[test] + fn owned_no_mutation() -> Result<(), &'static str> { + // We can also pass `slice` without `&` so Cow owns it directly. + // In this case no mutation occurs and thus also no clone, + // but the result is still owned because it always was. + let slice = vec![0, 1, 2]; + let mut input = Cow::from(slice); + match abs_all(&mut input) { + // TODO + } + } + + #[test] + fn owned_mutation() -> Result<(), &'static str> { + // Of course this is also the case if a mutation does occur. + // In this case the call to `to_mut()` returns a reference to + // the same data as before. + let slice = vec![-1, 0, 1]; + let mut input = Cow::from(slice); + match abs_all(&mut input) { + // TODO + } } } diff --git a/info.toml b/info.toml index 299d932f..2f424033 100644 --- a/info.toml +++ b/info.toml @@ -1010,11 +1010,11 @@ https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html [[exercises]] name = "cow1" path = "exercises/smart_pointers/cow1.rs" -mode = "compile" +mode = "test" hint = """ -Since the vector is already owned, the `Cow` type doesn't need to clone it. +If Cow already owns the data it doesn't need to clone it when to_mut() is called. -Checkout https://doc.rust-lang.org/std/borrow/enum.Cow.html for documentation +Check out https://doc.rust-lang.org/std/borrow/enum.Cow.html for documentation on the `Cow` type. """ From e1e67d0d41b1795ea497d66c422c3797bf1c0bf2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 13:16:58 +0000 Subject: [PATCH 0856/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 85cd1774..bd3b2020 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -262,6 +262,7 @@ authors. Grzegorz Ε»ur
Grzegorz Ε»ur

πŸ–‹ + Daan Wynen
Daan Wynen

πŸ–‹ From 046a18cd16f66f4245ad738f54035e4eae405163 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 13:16:59 +0000 Subject: [PATCH 0857/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5db992ac..4eaab0d5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1839,6 +1839,15 @@ "contributions": [ "content" ] + }, + { + "login": "black-puppydog", + "name": "Daan Wynen", + "avatar_url": "https://avatars.githubusercontent.com/u/189241?v=4", + "profile": "https://github.com/black-puppydog", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From ef0b25c3921503588fc1c76e43cfa454e0f447b1 Mon Sep 17 00:00:00 2001 From: Anush Date: Fri, 17 Feb 2023 22:51:42 +0530 Subject: [PATCH 0858/1293] Removed verbose instructions from the uninstall section --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 4056ba89..14ae2317 100644 --- a/README.md +++ b/README.md @@ -155,8 +155,7 @@ for you: rm -rf rustlings # or your custom folder name, if you chose and or renamed it ``` -Second, since Rustlings got installed via `cargo install`, it's only reasonable to assume that you can also remove it using Cargo, and -exactly that is the case. Run `cargo uninstall` to remove the `rustlings` binary: +Second, run `cargo uninstall` to remove the `rustlings` binary: ```bash cargo uninstall rustlings From 338c95f120698f642165eb22c76d8b98483784fb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:03:58 +0000 Subject: [PATCH 0859/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index bd3b2020..80c10706 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -263,6 +263,7 @@ authors. Grzegorz Ε»ur
Grzegorz Ε»ur

πŸ–‹ Daan Wynen
Daan Wynen

πŸ–‹ + Anush
Anush

πŸ“– From 65f05f0541cfeba95dea6a390009d6deeb08e696 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:03:59 +0000 Subject: [PATCH 0860/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4eaab0d5..8bd8c20e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1848,6 +1848,15 @@ "contributions": [ "content" ] + }, + { + "login": "Anush008", + "name": "Anush", + "avatar_url": "https://avatars.githubusercontent.com/u/46051506?v=4", + "profile": "https://github.com/Anush008", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From 238a496af536b0390c7d7987aee6c63a9a25427d Mon Sep 17 00:00:00 2001 From: Gleb Shevchenko Date: Sat, 18 Feb 2023 14:02:11 +0100 Subject: [PATCH 0861/1293] fix: unify undisclosed type notation in errors5.rs --- exercises/error_handling/errors5.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/error_handling/errors5.rs b/exercises/error_handling/errors5.rs index 6da06ef3..eb5506cb 100644 --- a/exercises/error_handling/errors5.rs +++ b/exercises/error_handling/errors5.rs @@ -4,7 +4,7 @@ // This exercise uses some concepts that we won't get to until later in the course, like `Box` and the // `From` trait. It's not important to understand them in detail right now, but you can read ahead if you like. -// For now, think of the `Box` type as an "I want anything that does ???" type, which, given +// For now, think of the `Box` type as an "I want anything that does ???" type, which, given // Rust's usual standards for runtime safety, should strike you as somewhat lenient! // In short, this particular use case for boxes is for when you want to own a value and you care only that it is a From 1272d0b99003ac645c214b8170ffac875d84885d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 18 Feb 2023 13:26:37 +0000 Subject: [PATCH 0862/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 80c10706..b3f0452e 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -264,6 +264,7 @@ authors. Grzegorz Ε»ur
Grzegorz Ε»ur

πŸ–‹ Daan Wynen
Daan Wynen

πŸ–‹ Anush
Anush

πŸ“– + Gleb Shevchenko
Gleb Shevchenko

πŸ–‹ From d42ac49de410a19b0c6ce7694a59822dc7f11c17 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 18 Feb 2023 13:26:38 +0000 Subject: [PATCH 0863/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8bd8c20e..e2c72136 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1857,6 +1857,15 @@ "contributions": [ "doc" ] + }, + { + "login": "shgew", + "name": "Gleb Shevchenko", + "avatar_url": "https://avatars.githubusercontent.com/u/5584672?v=4", + "profile": "https://github.com/shgew", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From fef8314d3d45aa1ec3655cd6e9a52f877da51c23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20T=C3=B6rnquist?= Date: Sat, 18 Feb 2023 18:43:34 +0100 Subject: [PATCH 0864/1293] fix(move_semantics2): add expected output comment You can easily get this to compile with `vec0` being `[]` and `vec1` being `[22, 44, 66, 88]` --- exercises/move_semantics/move_semantics2.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs index 64870850..68dbf021 100644 --- a/exercises/move_semantics/move_semantics2.rs +++ b/exercises/move_semantics/move_semantics2.rs @@ -2,6 +2,10 @@ // Make me compile without changing line 13 or moving line 10! // Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand for a hint. +// Expected output: +// vec0 has length 3 content `[22, 44, 66]` +// vec1 has length 4 content `[22, 44, 66, 88]` + // I AM NOT DONE fn main() { From 89069f78b165e2e10d0b0a72c8d6b246bb9e9c94 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 18 Feb 2023 19:26:40 +0000 Subject: [PATCH 0865/1293] chore: update move_semantics4.rs' hint after #144, the signature doesn't need changing anymore --- info.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/info.toml b/info.toml index 2f424033..431b49ff 100644 --- a/info.toml +++ b/info.toml @@ -325,8 +325,7 @@ doing one step and then fixing the compiler errors that result! So the end goal is to: - get rid of the first line in main that creates the new vector - so then `vec0` doesn't exist, so we can't pass it to `fill_vec` - - we don't want to pass anything to `fill_vec`, so its signature should - reflect that it does not take any arguments + - `fill_vec` has had its signature changed, which our call should reflect - since we're not creating a new vec in `main` anymore, we need to create a new vec in `fill_vec`, similarly to the way we did in `main`""" From 045d86aa42cbdb81d2be123fc9a7379dd5e38b08 Mon Sep 17 00:00:00 2001 From: Cyril MARPAUD Date: Sat, 18 Feb 2023 21:38:43 +0100 Subject: [PATCH 0866/1293] refactor(arc1): improve readability by avoiding implicit dereference --- exercises/smart_pointers/arc1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/smart_pointers/arc1.rs b/exercises/smart_pointers/arc1.rs index 93a27036..ffb306af 100644 --- a/exercises/smart_pointers/arc1.rs +++ b/exercises/smart_pointers/arc1.rs @@ -32,7 +32,7 @@ fn main() { for offset in 0..8 { let child_numbers = // TODO joinhandles.push(thread::spawn(move || { - let sum: u32 = child_numbers.iter().filter(|n| *n % 8 == offset).sum(); + let sum: u32 = child_numbers.iter().filter(|&&n| n % 8 == offset).sum(); println!("Sum of offset {} is {}", offset, sum); })); } From 1ac66f372b670f5218334c1bb0dadcb67ca5cbd4 Mon Sep 17 00:00:00 2001 From: Aaron Suggs Date: Tue, 21 Feb 2023 09:45:59 -0500 Subject: [PATCH 0867/1293] docs: clarify instructions on iterators5.rs I changed the sentence that referenced the imperative implementation in iterators5.rs. That implementation was already removed and replaced with `todo!()` --- exercises/iterators/iterators5.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/exercises/iterators/iterators5.rs b/exercises/iterators/iterators5.rs index 0593d123..87097956 100644 --- a/exercises/iterators/iterators5.rs +++ b/exercises/iterators/iterators5.rs @@ -2,13 +2,11 @@ // Let's define a simple model to track Rustlings exercise progress. Progress // will be modelled using a hash map. The name of the exercise is the key and // the progress is the value. Two counting functions were created to count the -// number of exercises with a given progress. These counting functions use -// imperative style for loops. Recreate this counting functionality using -// iterators. Only the two iterator methods (count_iterator and -// count_collection_iterator) need to be modified. +// number of exercises with a given progress. Recreate this counting +// functionality using iterators. Try not to use imperative loops (for, while). +// Only the two iterator methods (count_iterator and count_collection_iterator) +// need to be modified. // Execute `rustlings hint iterators5` or use the `hint` watch subcommand for a hint. -// -// Make the code compile and the tests pass. // I AM NOT DONE From de24536187841eed4ab60aa375e2a02e1abe3f63 Mon Sep 17 00:00:00 2001 From: 0lhi <74732674+0lhi@users.noreply.github.com> Date: Fri, 24 Feb 2023 01:43:23 +0100 Subject: [PATCH 0868/1293] macros4.rs: Add rustfmt::skip to prevent auto-fix. The `macros4.rs` challenge can automatically be solved by rustfmt without the user noticing. Adding `#[rustfmt::skip]` above the `macro_rules!` line fixes this issue. --- exercises/macros/macros4.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/macros/macros4.rs b/exercises/macros/macros4.rs index c1fc5e8b..4ee98035 100644 --- a/exercises/macros/macros4.rs +++ b/exercises/macros/macros4.rs @@ -3,6 +3,7 @@ // I AM NOT DONE +#[rustfmt::skip] macro_rules! my_macro { () => { println!("Check out my macro!"); From 8c88f769b6f87d695a08b5d61a3d3d9fc447323a Mon Sep 17 00:00:00 2001 From: Chad Dougherty Date: Fri, 24 Feb 2023 08:51:03 -0500 Subject: [PATCH 0869/1293] rustfmt rustfmt converts "main ()" -> "main()" --- exercises/iterators/iterators1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/iterators/iterators1.rs b/exercises/iterators/iterators1.rs index 0379c6bb..f9cc3b39 100644 --- a/exercises/iterators/iterators1.rs +++ b/exercises/iterators/iterators1.rs @@ -10,7 +10,7 @@ // I AM NOT DONE -fn main () { +fn main() { let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"]; let mut my_iterable_fav_fruits = ???; // TODO: Step 1 From 1afc7ed8c53a2845f557e88b31e1f45f2f28abe4 Mon Sep 17 00:00:00 2001 From: Emmanuel Roullit Date: Sat, 25 Feb 2023 17:20:31 +0100 Subject: [PATCH 0870/1293] Update README.md Create Rustlings Codespace in one click --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 383a96eb..30541141 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ If you get a permission denied message, you might have to exclude the directory [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/rust-lang/rustlings) -Open up Rustlings in [Codespaces](https://docs.github.com/en/codespaces/developing-in-codespaces/creating-a-codespace-for-a-repository#creating-a-codespace-for-a-repository) +[![Open Rustlings On Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/?repo=rust-lang%2Frustlings&ref=master) ## Manually From 351e4e2460338785a474d66fd8c2ea1a324d2104 Mon Sep 17 00:00:00 2001 From: Emmanuel Roullit Date: Sat, 25 Feb 2023 17:56:00 +0100 Subject: [PATCH 0871/1293] Update devcontainer.json --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0fd90cc9..e1b2cec1 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ { - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/universal:2-linux", "waitFor": "onCreateCommand", "onCreateCommand": ".devcontainer/setup.sh", "updateContentCommand": "cargo build", From 86f8fa8e6e87274543a41697c2fdc810fbdbc079 Mon Sep 17 00:00:00 2001 From: Emmanuel Roullit Date: Sat, 25 Feb 2023 17:57:34 +0100 Subject: [PATCH 0872/1293] Update README.md Fix refs from master to main --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 30541141..e78d1a37 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ If you get a permission denied message, you might have to exclude the directory [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/rust-lang/rustlings) -[![Open Rustlings On Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/?repo=rust-lang%2Frustlings&ref=master) +[![Open Rustlings On Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/?repo=rust-lang%2Frustlings&ref=main) ## Manually From 3c841c4685608b9eb91103451626045daea24085 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 12:06:50 +0000 Subject: [PATCH 0873/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index b3f0452e..cc0eeda0 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -265,6 +265,7 @@ authors. Daan Wynen
Daan Wynen

πŸ–‹ Anush
Anush

πŸ“– Gleb Shevchenko
Gleb Shevchenko

πŸ–‹ + Emmanuel Roullit
Emmanuel Roullit

πŸš‡ From 0ad8eec3eb80bc9280611541d22ed8420f3e22cb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 12:06:51 +0000 Subject: [PATCH 0874/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e2c72136..e652e5f2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1866,6 +1866,15 @@ "contributions": [ "content" ] + }, + { + "login": "eroullit", + "name": "Emmanuel Roullit", + "avatar_url": "https://avatars.githubusercontent.com/u/301795?v=4", + "profile": "https://github.com/eroullit", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 8, From 7f06bb5fa7919562a2c0710f91779dc7c25c27bf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 12:06:57 +0000 Subject: [PATCH 0875/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index b3f0452e..c5ad1af4 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -265,6 +265,7 @@ authors. Daan Wynen
Daan Wynen

πŸ–‹ Anush
Anush

πŸ“– Gleb Shevchenko
Gleb Shevchenko

πŸ–‹ + Edmundo Paulino
Edmundo Paulino

πŸš‡ From ac9c1adb757bd5982ba3fcb9a3d50f99aa6959a6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 12:08:06 +0000 Subject: [PATCH 0876/1293] docs: update AUTHORS.md [skip ci] From eb7f21df040621327c8dd9fc28c11c9745afefea Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 12:08:07 +0000 Subject: [PATCH 0877/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e2c72136..004e63e7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1866,6 +1866,15 @@ "contributions": [ "content" ] + }, + { + "login": "mdmundo", + "name": "Edmundo Paulino", + "avatar_url": "https://avatars.githubusercontent.com/u/60408300?v=4", + "profile": "https://github.com/mdmundo", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 8, From 6c5ba7cc013762be48c1a72f1060979296c78e4b Mon Sep 17 00:00:00 2001 From: Mahdi Bahrami Date: Sun, 26 Feb 2023 19:30:57 +0330 Subject: [PATCH 0878/1293] Better error message when failing --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 19296910..4ee56bb1 100755 --- a/install.sh +++ b/install.sh @@ -141,7 +141,7 @@ git clone -q https://github.com/rust-lang/rustlings "$Path" cd "$Path" -Version=$(curl -s https://api.github.com/repos/rust-lang/rustlings/releases/latest | ${PY} -c "import json,sys;obj=json.load(sys.stdin);print(obj['tag_name']);") +Version=$(curl -s https://api.github.com/repos/rust-lang/rustlings/releases/latest | ${PY} -c "import json,sys;obj=json.load(sys.stdin);print(obj['tag_name']) if 'tag_name' in obj else sys.exit(f\"Error: {obj['message']}\");") CargoBin="${CARGO_HOME:-$HOME/.cargo}/bin" if [[ -z ${Version} ]] From 52ed5dbcf912602c24c24ba5c79fcf6ee749d999 Mon Sep 17 00:00:00 2001 From: Nidhal Messaoudi Date: Sun, 26 Feb 2023 17:28:24 +0100 Subject: [PATCH 0879/1293] First quiz and its related modules --- exercises/error_handling/errors5.rs | 2 +- exercises/functions/functions1.rs | 6 ++- exercises/functions/functions2.rs | 4 +- exercises/functions/functions3.rs | 4 +- exercises/functions/functions4.rs | 4 +- exercises/functions/functions5.rs | 4 +- exercises/if/if1.rs | 7 ++- exercises/if/if2.rs | 8 ++-- exercises/intro/intro1.rs | 2 - exercises/intro/intro2.rs | 4 +- exercises/iterators/iterators1.rs | 2 +- exercises/macros/macros4.rs | 1 - exercises/quiz1.rs | 16 +++++-- exercises/smart_pointers/arc1.rs | 2 +- exercises/smart_pointers/cow1.rs | 66 +++++++++-------------------- exercises/variables/variables1.rs | 4 +- exercises/variables/variables2.rs | 4 +- exercises/variables/variables3.rs | 4 +- exercises/variables/variables4.rs | 4 +- exercises/variables/variables5.rs | 4 +- exercises/variables/variables6.rs | 4 +- exercises/vecs/README.md | 2 - 22 files changed, 60 insertions(+), 98 deletions(-) diff --git a/exercises/error_handling/errors5.rs b/exercises/error_handling/errors5.rs index eb5506cb..6da06ef3 100644 --- a/exercises/error_handling/errors5.rs +++ b/exercises/error_handling/errors5.rs @@ -4,7 +4,7 @@ // This exercise uses some concepts that we won't get to until later in the course, like `Box` and the // `From` trait. It's not important to understand them in detail right now, but you can read ahead if you like. -// For now, think of the `Box` type as an "I want anything that does ???" type, which, given +// For now, think of the `Box` type as an "I want anything that does ???" type, which, given // Rust's usual standards for runtime safety, should strike you as somewhat lenient! // In short, this particular use case for boxes is for when you want to own a value and you care only that it is a diff --git a/exercises/functions/functions1.rs b/exercises/functions/functions1.rs index 03d8af70..38c35389 100644 --- a/exercises/functions/functions1.rs +++ b/exercises/functions/functions1.rs @@ -1,8 +1,10 @@ // functions1.rs // Execute `rustlings hint functions1` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { call_me(); } + +fn call_me() { + println!("I'm Nidhal Messaoudi, a software developer going Rusty!!!"); +} diff --git a/exercises/functions/functions2.rs b/exercises/functions/functions2.rs index 7d40a578..5a51bdfb 100644 --- a/exercises/functions/functions2.rs +++ b/exercises/functions/functions2.rs @@ -1,13 +1,11 @@ // functions2.rs // Execute `rustlings hint functions2` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { call_me(3); } -fn call_me(num:) { +fn call_me(num: i32) { for i in 0..num { println!("Ring! Call number {}", i + 1); } diff --git a/exercises/functions/functions3.rs b/exercises/functions/functions3.rs index 3b9e585b..5b2a9a1a 100644 --- a/exercises/functions/functions3.rs +++ b/exercises/functions/functions3.rs @@ -1,10 +1,8 @@ // functions3.rs // Execute `rustlings hint functions3` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { - call_me(); + call_me(12); } fn call_me(num: u32) { diff --git a/exercises/functions/functions4.rs b/exercises/functions/functions4.rs index 65d5be4f..40677fc9 100644 --- a/exercises/functions/functions4.rs +++ b/exercises/functions/functions4.rs @@ -7,14 +7,12 @@ // in the signatures for now. If anything, this is a good way to peek ahead // to future exercises!) -// I AM NOT DONE - fn main() { let original_price = 51; println!("Your sale price is {}", sale_price(original_price)); } -fn sale_price(price: i32) -> { +fn sale_price(price: i32) -> i32 { if is_even(price) { price - 10 } else { diff --git a/exercises/functions/functions5.rs b/exercises/functions/functions5.rs index 5d762961..52b8400f 100644 --- a/exercises/functions/functions5.rs +++ b/exercises/functions/functions5.rs @@ -1,13 +1,11 @@ // functions5.rs // Execute `rustlings hint functions5` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { let answer = square(3); println!("The square of 3 is {}", answer); } fn square(num: i32) -> i32 { - num * num; + return num * num; } diff --git a/exercises/if/if1.rs b/exercises/if/if1.rs index 587e03f8..660a093c 100644 --- a/exercises/if/if1.rs +++ b/exercises/if/if1.rs @@ -1,13 +1,16 @@ // if1.rs // Execute `rustlings hint if1` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - pub fn bigger(a: i32, b: i32) -> i32 { // Complete this function to return the bigger number! // Do not use: // - another function call // - additional variables + if a > b { + a + } else { + b + } } // Don't mind this for now :) diff --git a/exercises/if/if2.rs b/exercises/if/if2.rs index effddbb6..1fca9c3b 100644 --- a/exercises/if/if2.rs +++ b/exercises/if/if2.rs @@ -4,13 +4,13 @@ // Step 2: Get the bar_for_fuzz and default_to_baz tests passing! // Execute `rustlings hint if2` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - pub fn foo_if_fizz(fizzish: &str) -> &str { - if fizzish == "fizz" { + if fizzish == "fuzz" { + "bar" + } else if fizzish == "fizz" { "foo" } else { - 1 + "baz" } } diff --git a/exercises/intro/intro1.rs b/exercises/intro/intro1.rs index cfc55c30..54889778 100644 --- a/exercises/intro/intro1.rs +++ b/exercises/intro/intro1.rs @@ -9,8 +9,6 @@ // when you change one of the lines below! Try adding a `println!` line, or try changing // what it outputs in your terminal. Try removing a semicolon and see what happens! -// I AM NOT DONE - fn main() { println!("Hello and"); println!(r#" welcome to... "#); diff --git a/exercises/intro/intro2.rs b/exercises/intro/intro2.rs index efc1af20..b5b1d0a8 100644 --- a/exercises/intro/intro2.rs +++ b/exercises/intro/intro2.rs @@ -2,8 +2,6 @@ // Make the code print a greeting to the world. // Execute `rustlings hint intro2` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { - println!("Hello {}!"); + println!("Hello {}!", "World"); } diff --git a/exercises/iterators/iterators1.rs b/exercises/iterators/iterators1.rs index f9cc3b39..0379c6bb 100644 --- a/exercises/iterators/iterators1.rs +++ b/exercises/iterators/iterators1.rs @@ -10,7 +10,7 @@ // I AM NOT DONE -fn main() { +fn main () { let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"]; let mut my_iterable_fav_fruits = ???; // TODO: Step 1 diff --git a/exercises/macros/macros4.rs b/exercises/macros/macros4.rs index 4ee98035..c1fc5e8b 100644 --- a/exercises/macros/macros4.rs +++ b/exercises/macros/macros4.rs @@ -3,7 +3,6 @@ // I AM NOT DONE -#[rustfmt::skip] macro_rules! my_macro { () => { println!("Check out my macro!"); diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index dbb5cdc9..9988f9de 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -10,10 +10,20 @@ // Write a function that calculates the price of an order of apples given // the quantity bought. No hints this time! -// I AM NOT DONE - // Put your function here! -// fn calculate_price_of_apples { +fn calculate_price_of_apples(quantity: i32) -> i32 { + let mut quantity= quantity; + if quantity <= 40 { + quantity = quantity * 2; + } + return quantity; + + // if quantity > 40 { + // quantity + // } else { + // quantity * 2 + // } +} // Don't modify this function! #[test] diff --git a/exercises/smart_pointers/arc1.rs b/exercises/smart_pointers/arc1.rs index ffb306af..93a27036 100644 --- a/exercises/smart_pointers/arc1.rs +++ b/exercises/smart_pointers/arc1.rs @@ -32,7 +32,7 @@ fn main() { for offset in 0..8 { let child_numbers = // TODO joinhandles.push(thread::spawn(move || { - let sum: u32 = child_numbers.iter().filter(|&&n| n % 8 == offset).sum(); + let sum: u32 = child_numbers.iter().filter(|n| *n % 8 == offset).sum(); println!("Sum of offset {} is {}", offset, sum); })); } diff --git a/exercises/smart_pointers/cow1.rs b/exercises/smart_pointers/cow1.rs index 885138a7..5fba2519 100644 --- a/exercises/smart_pointers/cow1.rs +++ b/exercises/smart_pointers/cow1.rs @@ -4,9 +4,6 @@ // Cow is a clone-on-write smart pointer. // It can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required. // The type is designed to work with general borrowed data via the Borrow trait. -// -// This exercise is meant to show you what to expect when passing data to Cow. -// Fix the unit tests by checking for Cow::Owned(_) and Cow::Borrowed(_) at the TODO markers. // I AM NOT DONE @@ -23,52 +20,29 @@ fn abs_all<'a, 'b>(input: &'a mut Cow<'b, [i32]>) -> &'a mut Cow<'b, [i32]> { input } -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn reference_mutation() -> Result<(), &'static str> { - // Clone occurs because `input` needs to be mutated. - let slice = [-1, 0, 1]; - let mut input = Cow::from(&slice[..]); - match abs_all(&mut input) { - Cow::Owned(_) => Ok(()), - _ => Err("Expected owned value"), - } +fn main() { + // No clone occurs because `input` doesn't need to be mutated. + let slice = [0, 1, 2]; + let mut input = Cow::from(&slice[..]); + match abs_all(&mut input) { + Cow::Borrowed(_) => println!("I borrowed the slice!"), + _ => panic!("expected borrowed value"), } - #[test] - fn reference_no_mutation() -> Result<(), &'static str> { - // No clone occurs because `input` doesn't need to be mutated. - let slice = [0, 1, 2]; - let mut input = Cow::from(&slice[..]); - match abs_all(&mut input) { - // TODO - } + // Clone occurs because `input` needs to be mutated. + let slice = [-1, 0, 1]; + let mut input = Cow::from(&slice[..]); + match abs_all(&mut input) { + Cow::Owned(_) => println!("I modified the slice and now own it!"), + _ => panic!("expected owned value"), } - #[test] - fn owned_no_mutation() -> Result<(), &'static str> { - // We can also pass `slice` without `&` so Cow owns it directly. - // In this case no mutation occurs and thus also no clone, - // but the result is still owned because it always was. - let slice = vec![0, 1, 2]; - let mut input = Cow::from(slice); - match abs_all(&mut input) { - // TODO - } - } - - #[test] - fn owned_mutation() -> Result<(), &'static str> { - // Of course this is also the case if a mutation does occur. - // In this case the call to `to_mut()` returns a reference to - // the same data as before. - let slice = vec![-1, 0, 1]; - let mut input = Cow::from(slice); - match abs_all(&mut input) { - // TODO - } + // No clone occurs because `input` is already owned. + let slice = vec![-1, 0, 1]; + let mut input = Cow::from(slice); + match abs_all(&mut input) { + // TODO + Cow::Borrowed(_) => println!("I own this slice!"), + _ => panic!("expected borrowed value"), } } diff --git a/exercises/variables/variables1.rs b/exercises/variables/variables1.rs index f4d182ac..84de9fdc 100644 --- a/exercises/variables/variables1.rs +++ b/exercises/variables/variables1.rs @@ -2,9 +2,7 @@ // Make me compile! // Execute `rustlings hint variables1` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { - x = 5; + let x = 5; println!("x has the value {}", x); } diff --git a/exercises/variables/variables2.rs b/exercises/variables/variables2.rs index 641aeb8e..6715cf5c 100644 --- a/exercises/variables/variables2.rs +++ b/exercises/variables/variables2.rs @@ -1,10 +1,8 @@ // variables2.rs // Execute `rustlings hint variables2` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { - let x; + let x = 12; if x == 10 { println!("x is ten!"); } else { diff --git a/exercises/variables/variables3.rs b/exercises/variables/variables3.rs index 819b1bc7..30afbf14 100644 --- a/exercises/variables/variables3.rs +++ b/exercises/variables/variables3.rs @@ -1,9 +1,7 @@ // variables3.rs // Execute `rustlings hint variables3` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { - let x: i32; + let x: i32 = 12; println!("Number {}", x); } diff --git a/exercises/variables/variables4.rs b/exercises/variables/variables4.rs index 54491b0a..8c2ddd6d 100644 --- a/exercises/variables/variables4.rs +++ b/exercises/variables/variables4.rs @@ -1,10 +1,8 @@ // variables4.rs // Execute `rustlings hint variables4` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { - let x = 3; + let mut x = 3; println!("Number {}", x); x = 5; // don't change this line println!("Number {}", x); diff --git a/exercises/variables/variables5.rs b/exercises/variables/variables5.rs index 0e670d2a..1b9d9f48 100644 --- a/exercises/variables/variables5.rs +++ b/exercises/variables/variables5.rs @@ -1,11 +1,9 @@ // variables5.rs // Execute `rustlings hint variables5` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { let number = "T-H-R-E-E"; // don't change this line println!("Spell a Number : {}", number); - number = 3; // don't rename this variable + let number = 3; // don't rename this variable println!("Number plus two is : {}", number + 2); } diff --git a/exercises/variables/variables6.rs b/exercises/variables/variables6.rs index a8520122..e8314b28 100644 --- a/exercises/variables/variables6.rs +++ b/exercises/variables/variables6.rs @@ -1,9 +1,7 @@ // variables6.rs // Execute `rustlings hint variables6` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - -const NUMBER = 3; +const NUMBER: i32 = 3; fn main() { println!("Number {}", NUMBER); } diff --git a/exercises/vecs/README.md b/exercises/vecs/README.md index 8ff9b85f..ebe90bf3 100644 --- a/exercises/vecs/README.md +++ b/exercises/vecs/README.md @@ -13,5 +13,3 @@ the other useful data structure, hash maps, later. ## Further information - [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html) -- [`iter_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.iter_mut) -- [`map`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.map) From f7678b4a9ed03c81e2bedb998d5893f882acf915 Mon Sep 17 00:00:00 2001 From: Nidhal Messaoudi Date: Mon, 27 Feb 2023 12:57:40 +0100 Subject: [PATCH 0880/1293] Learning about primitive data types --- exercises/primitive_types/primitive_types1.rs | 4 +--- exercises/primitive_types/primitive_types2.rs | 10 ++++------ exercises/primitive_types/primitive_types3.rs | 6 +++--- exercises/primitive_types/primitive_types4.rs | 4 +--- exercises/primitive_types/primitive_types5.rs | 4 +--- exercises/primitive_types/primitive_types6.rs | 4 +--- 6 files changed, 11 insertions(+), 21 deletions(-) diff --git a/exercises/primitive_types/primitive_types1.rs b/exercises/primitive_types/primitive_types1.rs index 09121392..91734c69 100644 --- a/exercises/primitive_types/primitive_types1.rs +++ b/exercises/primitive_types/primitive_types1.rs @@ -2,8 +2,6 @@ // Fill in the rest of the line that has code missing! // No hints, there's no tricks, just get used to typing these :) -// I AM NOT DONE - fn main() { // Booleans (`bool`) @@ -12,7 +10,7 @@ fn main() { println!("Good morning!"); } - let // Finish the rest of this line like the example! Or make it be false! + let is_evening = false; // Finish the rest of this line like the example! Or make it be false! if is_evening { println!("Good evening!"); } diff --git a/exercises/primitive_types/primitive_types2.rs b/exercises/primitive_types/primitive_types2.rs index 8730baab..2f751232 100644 --- a/exercises/primitive_types/primitive_types2.rs +++ b/exercises/primitive_types/primitive_types2.rs @@ -2,14 +2,12 @@ // Fill in the rest of the line that has code missing! // No hints, there's no tricks, just get used to typing these :) -// I AM NOT DONE - fn main() { // Characters (`char`) // Note the _single_ quotes, these are different from the double quotes // you've been seeing around. - let my_first_initial = 'C'; + let my_first_initial = 'N'; if my_first_initial.is_alphabetic() { println!("Alphabetical!"); } else if my_first_initial.is_numeric() { @@ -18,12 +16,12 @@ fn main() { println!("Neither alphabetic nor numeric!"); } - let // Finish this line like the example! What's your favorite character? + let my_favorite_character = 'πŸ”₯'; // Finish this line like the example! What's your favorite character? // Try a letter, try a number, try a special character, try a character // from a different language than your own, try an emoji! - if your_character.is_alphabetic() { + if my_favorite_character.is_alphabetic() { println!("Alphabetical!"); - } else if your_character.is_numeric() { + } else if my_favorite_character.is_numeric() { println!("Numerical!"); } else { println!("Neither alphabetic nor numeric!"); diff --git a/exercises/primitive_types/primitive_types3.rs b/exercises/primitive_types/primitive_types3.rs index fa7d019a..62ae7149 100644 --- a/exercises/primitive_types/primitive_types3.rs +++ b/exercises/primitive_types/primitive_types3.rs @@ -2,10 +2,10 @@ // Create an array with at least 100 elements in it where the ??? is. // Execute `rustlings hint primitive_types3` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { - let a = ??? + let a = ["Nidhal Messaoudi, A Rust professional!"; 100]; + + println!("{}", a.len()); if a.len() >= 100 { println!("Wow, that's a big array!"); diff --git a/exercises/primitive_types/primitive_types4.rs b/exercises/primitive_types/primitive_types4.rs index 71fa243c..e3371784 100644 --- a/exercises/primitive_types/primitive_types4.rs +++ b/exercises/primitive_types/primitive_types4.rs @@ -2,13 +2,11 @@ // Get a slice out of Array a where the ??? is so that the test passes. // Execute `rustlings hint primitive_types4` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - #[test] fn slice_out_of_array() { let a = [1, 2, 3, 4, 5]; - let nice_slice = ??? + let nice_slice = &a[1..4]; assert_eq!([2, 3, 4], nice_slice) } diff --git a/exercises/primitive_types/primitive_types5.rs b/exercises/primitive_types/primitive_types5.rs index 4fd9141f..5cba3c15 100644 --- a/exercises/primitive_types/primitive_types5.rs +++ b/exercises/primitive_types/primitive_types5.rs @@ -2,11 +2,9 @@ // Destructure the `cat` tuple so that the println will work. // Execute `rustlings hint primitive_types5` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { let cat = ("Furry McFurson", 3.5); - let /* your pattern here */ = cat; + let (name, age) = cat; println!("{} is {} years old.", name, age); } diff --git a/exercises/primitive_types/primitive_types6.rs b/exercises/primitive_types/primitive_types6.rs index ddf8b423..695d2815 100644 --- a/exercises/primitive_types/primitive_types6.rs +++ b/exercises/primitive_types/primitive_types6.rs @@ -3,13 +3,11 @@ // You can put the expression for the second element where ??? is so that the test passes. // Execute `rustlings hint primitive_types6` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - #[test] fn indexing_tuple() { let numbers = (1, 2, 3); // Replace below ??? with the tuple indexing syntax. - let second = ???; + let second = numbers.1; assert_eq!(2, second, "This is not the 2nd number in the tuple!") From e3a20b8bc899eae9dfb440b885836812fa8614ee Mon Sep 17 00:00:00 2001 From: Nidhal Messaoudi Date: Mon, 27 Feb 2023 21:16:40 +0100 Subject: [PATCH 0881/1293] Learning about vectors --- exercises/move_semantics/move_semantics1.rs | 4 +--- exercises/move_semantics/move_semantics2.rs | 10 ++++------ exercises/move_semantics/move_semantics3.rs | 4 +--- exercises/vecs/vecs1.rs | 4 +--- exercises/vecs/vecs2.rs | 6 ++---- 5 files changed, 9 insertions(+), 19 deletions(-) diff --git a/exercises/move_semantics/move_semantics1.rs b/exercises/move_semantics/move_semantics1.rs index aac6dfc3..c60ee74f 100644 --- a/exercises/move_semantics/move_semantics1.rs +++ b/exercises/move_semantics/move_semantics1.rs @@ -1,12 +1,10 @@ // move_semantics1.rs // Execute `rustlings hint move_semantics1` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { let vec0 = Vec::new(); - let vec1 = fill_vec(vec0); + let mut vec1 = fill_vec(vec0); println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs index 64870850..229f13bd 100644 --- a/exercises/move_semantics/move_semantics2.rs +++ b/exercises/move_semantics/move_semantics2.rs @@ -2,12 +2,10 @@ // Make me compile without changing line 13 or moving line 10! // Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { - let vec0 = Vec::new(); + let mut vec0 = Vec::new(); - let mut vec1 = fill_vec(vec0); + let mut vec1 = fill_vec(&mut vec0); // Do not change the following line! println!("{} has length {} content `{:?}`", "vec0", vec0.len(), vec0); @@ -17,12 +15,12 @@ fn main() { println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); } -fn fill_vec(vec: Vec) -> Vec { +fn fill_vec(vec: &mut Vec) -> Vec { let mut vec = vec; vec.push(22); vec.push(44); vec.push(66); - vec + vec.to_vec() } diff --git a/exercises/move_semantics/move_semantics3.rs b/exercises/move_semantics/move_semantics3.rs index eaa30e33..bb830234 100644 --- a/exercises/move_semantics/move_semantics3.rs +++ b/exercises/move_semantics/move_semantics3.rs @@ -3,8 +3,6 @@ // (no lines with multiple semicolons necessary!) // Execute `rustlings hint move_semantics3` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn main() { let vec0 = Vec::new(); @@ -17,7 +15,7 @@ fn main() { println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); } -fn fill_vec(vec: Vec) -> Vec { +fn fill_vec(mut vec: Vec) -> Vec { vec.push(22); vec.push(44); vec.push(66); diff --git a/exercises/vecs/vecs1.rs b/exercises/vecs/vecs1.rs index 4e8c4cbb..0e8e2f73 100644 --- a/exercises/vecs/vecs1.rs +++ b/exercises/vecs/vecs1.rs @@ -4,11 +4,9 @@ // Make me compile and pass the test! // Execute `rustlings hint vecs1` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn array_and_vec() -> ([i32; 4], Vec) { let a = [10, 20, 30, 40]; // a plain array - let v = // TODO: declare your vector here with the macro for vectors + let v = vec![10, 20, 30, 40]; // TODO: declare your vector here with the macro for vectors (a, v) } diff --git a/exercises/vecs/vecs2.rs b/exercises/vecs/vecs2.rs index 5bea09a2..d016daaf 100644 --- a/exercises/vecs/vecs2.rs +++ b/exercises/vecs/vecs2.rs @@ -6,13 +6,11 @@ // // Execute `rustlings hint vecs2` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - fn vec_loop(mut v: Vec) -> Vec { for i in v.iter_mut() { // TODO: Fill this up so that each element in the Vec `v` is // multiplied by 2. - ??? + *i *= 2; } // At this point, `v` should be equal to [4, 8, 12, 16, 20]. @@ -23,7 +21,7 @@ fn vec_map(v: &Vec) -> Vec { v.iter().map(|num| { // TODO: Do the same thing as above - but instead of mutating the // Vec, you can just return the new number! - ??? + num * 2 }).collect() } From 1acbbb6d430d69720e0f9370d4649de92e510a31 Mon Sep 17 00:00:00 2001 From: Nidhal Messaoudi Date: Mon, 27 Feb 2023 21:17:45 +0100 Subject: [PATCH 0882/1293] Fixing the progress percentage --- src/verify.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/verify.rs b/src/verify.rs index cf319e47..68ba6cef 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -13,14 +13,15 @@ pub fn verify<'a>( progress: (usize, usize), verbose: bool, ) -> Result<(), &'a Exercise> { - let (mut num_done, total) = progress; + let (num_done, total) = progress; let bar = ProgressBar::new(total as u64); + let mut percentage = num_done as f32 / total as f32 * 100.0; bar.set_style(ProgressStyle::default_bar() .template("Progress: [{bar:60.green/red}] {pos}/{len} {msg}") .progress_chars("#>-") ); bar.set_position(num_done as u64); - bar.set_message(format!("({:.1} %)", 0.)); + bar.set_message(format!("({:.1} %)", percentage)); for exercise in exercises { let compile_result = match exercise.mode { @@ -31,8 +32,7 @@ pub fn verify<'a>( if !compile_result.unwrap_or(false) { return Err(exercise); } - num_done += 1; - let percentage = num_done as f32 / total as f32 * 100.0; + percentage += 100.0 / total as f32; bar.inc(1); bar.set_message(format!("({:.1} %)", percentage)); } From 278a1f103b7ba694ff448fe4abe663411b7f6c92 Mon Sep 17 00:00:00 2001 From: Nidhal Messaoudi Date: Mon, 27 Feb 2023 21:33:28 +0100 Subject: [PATCH 0883/1293] Original exercises --- exercises/functions/functions1.rs | 6 ++---- exercises/functions/functions2.rs | 4 +++- exercises/functions/functions3.rs | 4 +++- exercises/functions/functions4.rs | 4 +++- exercises/functions/functions5.rs | 4 +++- exercises/if/if1.rs | 7 ++----- exercises/if/if2.rs | 8 ++++---- exercises/intro/intro1.rs | 2 ++ exercises/intro/intro2.rs | 4 +++- exercises/move_semantics/move_semantics1.rs | 4 +++- exercises/move_semantics/move_semantics2.rs | 12 +++++++----- exercises/move_semantics/move_semantics3.rs | 4 +++- exercises/primitive_types/primitive_types1.rs | 4 +++- exercises/primitive_types/primitive_types2.rs | 10 ++++++---- exercises/primitive_types/primitive_types3.rs | 6 +++--- exercises/primitive_types/primitive_types4.rs | 4 +++- exercises/primitive_types/primitive_types5.rs | 4 +++- exercises/primitive_types/primitive_types6.rs | 4 +++- exercises/quiz1.rs | 16 +++------------- exercises/variables/variables1.rs | 4 +++- exercises/variables/variables2.rs | 4 +++- exercises/variables/variables3.rs | 4 +++- exercises/variables/variables4.rs | 4 +++- exercises/variables/variables5.rs | 4 +++- exercises/variables/variables6.rs | 4 +++- exercises/vecs/vecs1.rs | 4 +++- exercises/vecs/vecs2.rs | 6 ++++-- 27 files changed, 87 insertions(+), 58 deletions(-) diff --git a/exercises/functions/functions1.rs b/exercises/functions/functions1.rs index 38c35389..03d8af70 100644 --- a/exercises/functions/functions1.rs +++ b/exercises/functions/functions1.rs @@ -1,10 +1,8 @@ // functions1.rs // Execute `rustlings hint functions1` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { call_me(); } - -fn call_me() { - println!("I'm Nidhal Messaoudi, a software developer going Rusty!!!"); -} diff --git a/exercises/functions/functions2.rs b/exercises/functions/functions2.rs index 5a51bdfb..7d40a578 100644 --- a/exercises/functions/functions2.rs +++ b/exercises/functions/functions2.rs @@ -1,11 +1,13 @@ // functions2.rs // Execute `rustlings hint functions2` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { call_me(3); } -fn call_me(num: i32) { +fn call_me(num:) { for i in 0..num { println!("Ring! Call number {}", i + 1); } diff --git a/exercises/functions/functions3.rs b/exercises/functions/functions3.rs index 5b2a9a1a..3b9e585b 100644 --- a/exercises/functions/functions3.rs +++ b/exercises/functions/functions3.rs @@ -1,8 +1,10 @@ // functions3.rs // Execute `rustlings hint functions3` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { - call_me(12); + call_me(); } fn call_me(num: u32) { diff --git a/exercises/functions/functions4.rs b/exercises/functions/functions4.rs index 40677fc9..65d5be4f 100644 --- a/exercises/functions/functions4.rs +++ b/exercises/functions/functions4.rs @@ -7,12 +7,14 @@ // in the signatures for now. If anything, this is a good way to peek ahead // to future exercises!) +// I AM NOT DONE + fn main() { let original_price = 51; println!("Your sale price is {}", sale_price(original_price)); } -fn sale_price(price: i32) -> i32 { +fn sale_price(price: i32) -> { if is_even(price) { price - 10 } else { diff --git a/exercises/functions/functions5.rs b/exercises/functions/functions5.rs index 52b8400f..5d762961 100644 --- a/exercises/functions/functions5.rs +++ b/exercises/functions/functions5.rs @@ -1,11 +1,13 @@ // functions5.rs // Execute `rustlings hint functions5` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { let answer = square(3); println!("The square of 3 is {}", answer); } fn square(num: i32) -> i32 { - return num * num; + num * num; } diff --git a/exercises/if/if1.rs b/exercises/if/if1.rs index 660a093c..587e03f8 100644 --- a/exercises/if/if1.rs +++ b/exercises/if/if1.rs @@ -1,16 +1,13 @@ // if1.rs // Execute `rustlings hint if1` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + pub fn bigger(a: i32, b: i32) -> i32 { // Complete this function to return the bigger number! // Do not use: // - another function call // - additional variables - if a > b { - a - } else { - b - } } // Don't mind this for now :) diff --git a/exercises/if/if2.rs b/exercises/if/if2.rs index 1fca9c3b..effddbb6 100644 --- a/exercises/if/if2.rs +++ b/exercises/if/if2.rs @@ -4,13 +4,13 @@ // Step 2: Get the bar_for_fuzz and default_to_baz tests passing! // Execute `rustlings hint if2` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + pub fn foo_if_fizz(fizzish: &str) -> &str { - if fizzish == "fuzz" { - "bar" - } else if fizzish == "fizz" { + if fizzish == "fizz" { "foo" } else { - "baz" + 1 } } diff --git a/exercises/intro/intro1.rs b/exercises/intro/intro1.rs index 54889778..cfc55c30 100644 --- a/exercises/intro/intro1.rs +++ b/exercises/intro/intro1.rs @@ -9,6 +9,8 @@ // when you change one of the lines below! Try adding a `println!` line, or try changing // what it outputs in your terminal. Try removing a semicolon and see what happens! +// I AM NOT DONE + fn main() { println!("Hello and"); println!(r#" welcome to... "#); diff --git a/exercises/intro/intro2.rs b/exercises/intro/intro2.rs index b5b1d0a8..efc1af20 100644 --- a/exercises/intro/intro2.rs +++ b/exercises/intro/intro2.rs @@ -2,6 +2,8 @@ // Make the code print a greeting to the world. // Execute `rustlings hint intro2` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { - println!("Hello {}!", "World"); + println!("Hello {}!"); } diff --git a/exercises/move_semantics/move_semantics1.rs b/exercises/move_semantics/move_semantics1.rs index c60ee74f..aac6dfc3 100644 --- a/exercises/move_semantics/move_semantics1.rs +++ b/exercises/move_semantics/move_semantics1.rs @@ -1,10 +1,12 @@ // move_semantics1.rs // Execute `rustlings hint move_semantics1` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { let vec0 = Vec::new(); - let mut vec1 = fill_vec(vec0); + let vec1 = fill_vec(vec0); println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs index 229f13bd..64870850 100644 --- a/exercises/move_semantics/move_semantics2.rs +++ b/exercises/move_semantics/move_semantics2.rs @@ -2,10 +2,12 @@ // Make me compile without changing line 13 or moving line 10! // Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand for a hint. -fn main() { - let mut vec0 = Vec::new(); +// I AM NOT DONE - let mut vec1 = fill_vec(&mut vec0); +fn main() { + let vec0 = Vec::new(); + + let mut vec1 = fill_vec(vec0); // Do not change the following line! println!("{} has length {} content `{:?}`", "vec0", vec0.len(), vec0); @@ -15,12 +17,12 @@ fn main() { println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); } -fn fill_vec(vec: &mut Vec) -> Vec { +fn fill_vec(vec: Vec) -> Vec { let mut vec = vec; vec.push(22); vec.push(44); vec.push(66); - vec.to_vec() + vec } diff --git a/exercises/move_semantics/move_semantics3.rs b/exercises/move_semantics/move_semantics3.rs index bb830234..eaa30e33 100644 --- a/exercises/move_semantics/move_semantics3.rs +++ b/exercises/move_semantics/move_semantics3.rs @@ -3,6 +3,8 @@ // (no lines with multiple semicolons necessary!) // Execute `rustlings hint move_semantics3` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { let vec0 = Vec::new(); @@ -15,7 +17,7 @@ fn main() { println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); } -fn fill_vec(mut vec: Vec) -> Vec { +fn fill_vec(vec: Vec) -> Vec { vec.push(22); vec.push(44); vec.push(66); diff --git a/exercises/primitive_types/primitive_types1.rs b/exercises/primitive_types/primitive_types1.rs index 91734c69..09121392 100644 --- a/exercises/primitive_types/primitive_types1.rs +++ b/exercises/primitive_types/primitive_types1.rs @@ -2,6 +2,8 @@ // Fill in the rest of the line that has code missing! // No hints, there's no tricks, just get used to typing these :) +// I AM NOT DONE + fn main() { // Booleans (`bool`) @@ -10,7 +12,7 @@ fn main() { println!("Good morning!"); } - let is_evening = false; // Finish the rest of this line like the example! Or make it be false! + let // Finish the rest of this line like the example! Or make it be false! if is_evening { println!("Good evening!"); } diff --git a/exercises/primitive_types/primitive_types2.rs b/exercises/primitive_types/primitive_types2.rs index 2f751232..8730baab 100644 --- a/exercises/primitive_types/primitive_types2.rs +++ b/exercises/primitive_types/primitive_types2.rs @@ -2,12 +2,14 @@ // Fill in the rest of the line that has code missing! // No hints, there's no tricks, just get used to typing these :) +// I AM NOT DONE + fn main() { // Characters (`char`) // Note the _single_ quotes, these are different from the double quotes // you've been seeing around. - let my_first_initial = 'N'; + let my_first_initial = 'C'; if my_first_initial.is_alphabetic() { println!("Alphabetical!"); } else if my_first_initial.is_numeric() { @@ -16,12 +18,12 @@ fn main() { println!("Neither alphabetic nor numeric!"); } - let my_favorite_character = 'πŸ”₯'; // Finish this line like the example! What's your favorite character? + let // Finish this line like the example! What's your favorite character? // Try a letter, try a number, try a special character, try a character // from a different language than your own, try an emoji! - if my_favorite_character.is_alphabetic() { + if your_character.is_alphabetic() { println!("Alphabetical!"); - } else if my_favorite_character.is_numeric() { + } else if your_character.is_numeric() { println!("Numerical!"); } else { println!("Neither alphabetic nor numeric!"); diff --git a/exercises/primitive_types/primitive_types3.rs b/exercises/primitive_types/primitive_types3.rs index 62ae7149..fa7d019a 100644 --- a/exercises/primitive_types/primitive_types3.rs +++ b/exercises/primitive_types/primitive_types3.rs @@ -2,10 +2,10 @@ // Create an array with at least 100 elements in it where the ??? is. // Execute `rustlings hint primitive_types3` or use the `hint` watch subcommand for a hint. -fn main() { - let a = ["Nidhal Messaoudi, A Rust professional!"; 100]; +// I AM NOT DONE - println!("{}", a.len()); +fn main() { + let a = ??? if a.len() >= 100 { println!("Wow, that's a big array!"); diff --git a/exercises/primitive_types/primitive_types4.rs b/exercises/primitive_types/primitive_types4.rs index e3371784..71fa243c 100644 --- a/exercises/primitive_types/primitive_types4.rs +++ b/exercises/primitive_types/primitive_types4.rs @@ -2,11 +2,13 @@ // Get a slice out of Array a where the ??? is so that the test passes. // Execute `rustlings hint primitive_types4` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + #[test] fn slice_out_of_array() { let a = [1, 2, 3, 4, 5]; - let nice_slice = &a[1..4]; + let nice_slice = ??? assert_eq!([2, 3, 4], nice_slice) } diff --git a/exercises/primitive_types/primitive_types5.rs b/exercises/primitive_types/primitive_types5.rs index 5cba3c15..4fd9141f 100644 --- a/exercises/primitive_types/primitive_types5.rs +++ b/exercises/primitive_types/primitive_types5.rs @@ -2,9 +2,11 @@ // Destructure the `cat` tuple so that the println will work. // Execute `rustlings hint primitive_types5` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { let cat = ("Furry McFurson", 3.5); - let (name, age) = cat; + let /* your pattern here */ = cat; println!("{} is {} years old.", name, age); } diff --git a/exercises/primitive_types/primitive_types6.rs b/exercises/primitive_types/primitive_types6.rs index 695d2815..ddf8b423 100644 --- a/exercises/primitive_types/primitive_types6.rs +++ b/exercises/primitive_types/primitive_types6.rs @@ -3,11 +3,13 @@ // You can put the expression for the second element where ??? is so that the test passes. // Execute `rustlings hint primitive_types6` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + #[test] fn indexing_tuple() { let numbers = (1, 2, 3); // Replace below ??? with the tuple indexing syntax. - let second = numbers.1; + let second = ???; assert_eq!(2, second, "This is not the 2nd number in the tuple!") diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index 9988f9de..dbb5cdc9 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -10,20 +10,10 @@ // Write a function that calculates the price of an order of apples given // the quantity bought. No hints this time! -// Put your function here! -fn calculate_price_of_apples(quantity: i32) -> i32 { - let mut quantity= quantity; - if quantity <= 40 { - quantity = quantity * 2; - } - return quantity; +// I AM NOT DONE - // if quantity > 40 { - // quantity - // } else { - // quantity * 2 - // } -} +// Put your function here! +// fn calculate_price_of_apples { // Don't modify this function! #[test] diff --git a/exercises/variables/variables1.rs b/exercises/variables/variables1.rs index 84de9fdc..f4d182ac 100644 --- a/exercises/variables/variables1.rs +++ b/exercises/variables/variables1.rs @@ -2,7 +2,9 @@ // Make me compile! // Execute `rustlings hint variables1` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { - let x = 5; + x = 5; println!("x has the value {}", x); } diff --git a/exercises/variables/variables2.rs b/exercises/variables/variables2.rs index 6715cf5c..641aeb8e 100644 --- a/exercises/variables/variables2.rs +++ b/exercises/variables/variables2.rs @@ -1,8 +1,10 @@ // variables2.rs // Execute `rustlings hint variables2` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { - let x = 12; + let x; if x == 10 { println!("x is ten!"); } else { diff --git a/exercises/variables/variables3.rs b/exercises/variables/variables3.rs index 30afbf14..819b1bc7 100644 --- a/exercises/variables/variables3.rs +++ b/exercises/variables/variables3.rs @@ -1,7 +1,9 @@ // variables3.rs // Execute `rustlings hint variables3` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { - let x: i32 = 12; + let x: i32; println!("Number {}", x); } diff --git a/exercises/variables/variables4.rs b/exercises/variables/variables4.rs index 8c2ddd6d..54491b0a 100644 --- a/exercises/variables/variables4.rs +++ b/exercises/variables/variables4.rs @@ -1,8 +1,10 @@ // variables4.rs // Execute `rustlings hint variables4` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { - let mut x = 3; + let x = 3; println!("Number {}", x); x = 5; // don't change this line println!("Number {}", x); diff --git a/exercises/variables/variables5.rs b/exercises/variables/variables5.rs index 1b9d9f48..0e670d2a 100644 --- a/exercises/variables/variables5.rs +++ b/exercises/variables/variables5.rs @@ -1,9 +1,11 @@ // variables5.rs // Execute `rustlings hint variables5` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn main() { let number = "T-H-R-E-E"; // don't change this line println!("Spell a Number : {}", number); - let number = 3; // don't rename this variable + number = 3; // don't rename this variable println!("Number plus two is : {}", number + 2); } diff --git a/exercises/variables/variables6.rs b/exercises/variables/variables6.rs index e8314b28..a8520122 100644 --- a/exercises/variables/variables6.rs +++ b/exercises/variables/variables6.rs @@ -1,7 +1,9 @@ // variables6.rs // Execute `rustlings hint variables6` or use the `hint` watch subcommand for a hint. -const NUMBER: i32 = 3; +// I AM NOT DONE + +const NUMBER = 3; fn main() { println!("Number {}", NUMBER); } diff --git a/exercises/vecs/vecs1.rs b/exercises/vecs/vecs1.rs index 0e8e2f73..4e8c4cbb 100644 --- a/exercises/vecs/vecs1.rs +++ b/exercises/vecs/vecs1.rs @@ -4,9 +4,11 @@ // Make me compile and pass the test! // Execute `rustlings hint vecs1` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn array_and_vec() -> ([i32; 4], Vec) { let a = [10, 20, 30, 40]; // a plain array - let v = vec![10, 20, 30, 40]; // TODO: declare your vector here with the macro for vectors + let v = // TODO: declare your vector here with the macro for vectors (a, v) } diff --git a/exercises/vecs/vecs2.rs b/exercises/vecs/vecs2.rs index d016daaf..5bea09a2 100644 --- a/exercises/vecs/vecs2.rs +++ b/exercises/vecs/vecs2.rs @@ -6,11 +6,13 @@ // // Execute `rustlings hint vecs2` or use the `hint` watch subcommand for a hint. +// I AM NOT DONE + fn vec_loop(mut v: Vec) -> Vec { for i in v.iter_mut() { // TODO: Fill this up so that each element in the Vec `v` is // multiplied by 2. - *i *= 2; + ??? } // At this point, `v` should be equal to [4, 8, 12, 16, 20]. @@ -21,7 +23,7 @@ fn vec_map(v: &Vec) -> Vec { v.iter().map(|num| { // TODO: Do the same thing as above - but instead of mutating the // Vec, you can just return the new number! - num * 2 + ??? }).collect() } From 34aafa82f9b8266c6ea2a80f2cee03615a2c5297 Mon Sep 17 00:00:00 2001 From: Nidhal Messaoudi Date: Mon, 27 Feb 2023 21:36:51 +0100 Subject: [PATCH 0884/1293] Main exercises --- exercises/error_handling/errors5.rs | 2 +- exercises/iterators/iterators1.rs | 2 +- exercises/macros/macros4.rs | 1 + exercises/smart_pointers/arc1.rs | 2 +- exercises/smart_pointers/cow1.rs | 66 ++++++++++++++++++++--------- exercises/vecs/README.md | 2 + 6 files changed, 52 insertions(+), 23 deletions(-) diff --git a/exercises/error_handling/errors5.rs b/exercises/error_handling/errors5.rs index 6da06ef3..eb5506cb 100644 --- a/exercises/error_handling/errors5.rs +++ b/exercises/error_handling/errors5.rs @@ -4,7 +4,7 @@ // This exercise uses some concepts that we won't get to until later in the course, like `Box` and the // `From` trait. It's not important to understand them in detail right now, but you can read ahead if you like. -// For now, think of the `Box` type as an "I want anything that does ???" type, which, given +// For now, think of the `Box` type as an "I want anything that does ???" type, which, given // Rust's usual standards for runtime safety, should strike you as somewhat lenient! // In short, this particular use case for boxes is for when you want to own a value and you care only that it is a diff --git a/exercises/iterators/iterators1.rs b/exercises/iterators/iterators1.rs index 0379c6bb..f9cc3b39 100644 --- a/exercises/iterators/iterators1.rs +++ b/exercises/iterators/iterators1.rs @@ -10,7 +10,7 @@ // I AM NOT DONE -fn main () { +fn main() { let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"]; let mut my_iterable_fav_fruits = ???; // TODO: Step 1 diff --git a/exercises/macros/macros4.rs b/exercises/macros/macros4.rs index c1fc5e8b..4ee98035 100644 --- a/exercises/macros/macros4.rs +++ b/exercises/macros/macros4.rs @@ -3,6 +3,7 @@ // I AM NOT DONE +#[rustfmt::skip] macro_rules! my_macro { () => { println!("Check out my macro!"); diff --git a/exercises/smart_pointers/arc1.rs b/exercises/smart_pointers/arc1.rs index 93a27036..ffb306af 100644 --- a/exercises/smart_pointers/arc1.rs +++ b/exercises/smart_pointers/arc1.rs @@ -32,7 +32,7 @@ fn main() { for offset in 0..8 { let child_numbers = // TODO joinhandles.push(thread::spawn(move || { - let sum: u32 = child_numbers.iter().filter(|n| *n % 8 == offset).sum(); + let sum: u32 = child_numbers.iter().filter(|&&n| n % 8 == offset).sum(); println!("Sum of offset {} is {}", offset, sum); })); } diff --git a/exercises/smart_pointers/cow1.rs b/exercises/smart_pointers/cow1.rs index 5fba2519..885138a7 100644 --- a/exercises/smart_pointers/cow1.rs +++ b/exercises/smart_pointers/cow1.rs @@ -4,6 +4,9 @@ // Cow is a clone-on-write smart pointer. // It can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required. // The type is designed to work with general borrowed data via the Borrow trait. +// +// This exercise is meant to show you what to expect when passing data to Cow. +// Fix the unit tests by checking for Cow::Owned(_) and Cow::Borrowed(_) at the TODO markers. // I AM NOT DONE @@ -20,29 +23,52 @@ fn abs_all<'a, 'b>(input: &'a mut Cow<'b, [i32]>) -> &'a mut Cow<'b, [i32]> { input } -fn main() { - // No clone occurs because `input` doesn't need to be mutated. - let slice = [0, 1, 2]; - let mut input = Cow::from(&slice[..]); - match abs_all(&mut input) { - Cow::Borrowed(_) => println!("I borrowed the slice!"), - _ => panic!("expected borrowed value"), +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn reference_mutation() -> Result<(), &'static str> { + // Clone occurs because `input` needs to be mutated. + let slice = [-1, 0, 1]; + let mut input = Cow::from(&slice[..]); + match abs_all(&mut input) { + Cow::Owned(_) => Ok(()), + _ => Err("Expected owned value"), + } } - // Clone occurs because `input` needs to be mutated. - let slice = [-1, 0, 1]; - let mut input = Cow::from(&slice[..]); - match abs_all(&mut input) { - Cow::Owned(_) => println!("I modified the slice and now own it!"), - _ => panic!("expected owned value"), + #[test] + fn reference_no_mutation() -> Result<(), &'static str> { + // No clone occurs because `input` doesn't need to be mutated. + let slice = [0, 1, 2]; + let mut input = Cow::from(&slice[..]); + match abs_all(&mut input) { + // TODO + } } - // No clone occurs because `input` is already owned. - let slice = vec![-1, 0, 1]; - let mut input = Cow::from(slice); - match abs_all(&mut input) { - // TODO - Cow::Borrowed(_) => println!("I own this slice!"), - _ => panic!("expected borrowed value"), + #[test] + fn owned_no_mutation() -> Result<(), &'static str> { + // We can also pass `slice` without `&` so Cow owns it directly. + // In this case no mutation occurs and thus also no clone, + // but the result is still owned because it always was. + let slice = vec![0, 1, 2]; + let mut input = Cow::from(slice); + match abs_all(&mut input) { + // TODO + } + } + + #[test] + fn owned_mutation() -> Result<(), &'static str> { + // Of course this is also the case if a mutation does occur. + // In this case the call to `to_mut()` returns a reference to + // the same data as before. + let slice = vec![-1, 0, 1]; + let mut input = Cow::from(slice); + match abs_all(&mut input) { + // TODO + } } } diff --git a/exercises/vecs/README.md b/exercises/vecs/README.md index ebe90bf3..8ff9b85f 100644 --- a/exercises/vecs/README.md +++ b/exercises/vecs/README.md @@ -13,3 +13,5 @@ the other useful data structure, hash maps, later. ## Further information - [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html) +- [`iter_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.iter_mut) +- [`map`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.map) From ff50159a3d3fb98f40f004eb2cce106ae90cfe72 Mon Sep 17 00:00:00 2001 From: liv Date: Fri, 3 Mar 2023 21:27:57 +0100 Subject: [PATCH 0885/1293] fix: remove repl.it support for now It stopped working and needs too much manual fixing, until someone comes along to fix it, it's not great to have in the README section. Closes #1352. --- .replit | 2 -- README.md | 2 -- 2 files changed, 4 deletions(-) delete mode 100644 .replit diff --git a/.replit b/.replit deleted file mode 100644 index 8462a6fc..00000000 --- a/.replit +++ /dev/null @@ -1,2 +0,0 @@ -language = "rust" -run = "[ -x ~/.cargo/bin/rustlings ] && ~/.cargo/bin/rustlings watch || ./install.sh" diff --git a/README.md b/README.md index e78d1a37..571ba954 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,6 @@ If you get a permission denied message, you might have to exclude the directory ## Browser -[Run on Repl.it](https://repl.it/github/rust-lang/rustlings) - [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/rust-lang/rustlings) [![Open Rustlings On Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/?repo=rust-lang%2Frustlings&ref=main) From 3da5816db27f76e9fea4bd91e2949f036c6d830c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:51:23 +0000 Subject: [PATCH 0886/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 02404e80..2452a83a 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -267,6 +267,7 @@ authors. Gleb Shevchenko
Gleb Shevchenko

πŸ–‹ Edmundo Paulino
Edmundo Paulino

πŸš‡ Emmanuel Roullit
Emmanuel Roullit

πŸš‡ + Nidhal Messaoudi
Nidhal Messaoudi

πŸ’» From d334e0c66caf9c28f47b407579bb450f62cff9a0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:51:24 +0000 Subject: [PATCH 0887/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9dfc8def..81d80ae0 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1884,6 +1884,15 @@ "contributions": [ "infra" ] + }, + { + "login": "nidhalmessaoudi", + "name": "Nidhal Messaoudi", + "avatar_url": "https://avatars.githubusercontent.com/u/63377412?v=4", + "profile": "https://nidhalmessaoudi.herokuapp.com", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 7b2bfda37f50f0c2807d4b1c588fa5d69a34e10a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 16:28:12 +0000 Subject: [PATCH 0888/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 2452a83a..54157fcd 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -268,6 +268,7 @@ authors. Edmundo Paulino
Edmundo Paulino

πŸš‡ Emmanuel Roullit
Emmanuel Roullit

πŸš‡ Nidhal Messaoudi
Nidhal Messaoudi

πŸ’» + Mahdi Bahrami
Mahdi Bahrami

πŸ”§ From ec974f5dac75466490ca0884d4b862686ba58ea9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 16:28:13 +0000 Subject: [PATCH 0889/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 81d80ae0..2b0ffeaf 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1893,6 +1893,15 @@ "contributions": [ "code" ] + }, + { + "login": "MahdiBM", + "name": "Mahdi Bahrami", + "avatar_url": "https://avatars.githubusercontent.com/u/54685446?v=4", + "profile": "https://github.com/MahdiBM", + "contributions": [ + "tool" + ] } ], "contributorsPerLine": 8, From 7f1754ecc5690f31db4aff38eef2bf30e2aec525 Mon Sep 17 00:00:00 2001 From: liv Date: Fri, 10 Mar 2023 17:39:59 +0100 Subject: [PATCH 0890/1293] release: 5.4.1 --- CHANGELOG.md | 16 ++++++++++++++++ Cargo.toml | 2 +- README.md | 8 ++++---- flake.nix | 2 +- src/main.rs | 2 +- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63e448b9..2c14e7d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ + +## 5.4.1 (2023-03-10) + +#### Changed + +- `vecs`: Added links to `iter_mut` and `map` to README.md +- `cow1`: Changed main to tests +- `iterators1`: Formatted according to rustfmt + +#### Fixed + +- `errors5`: Unified undisclosed type notation +- `arc1`: Improved readability by avoiding implicit dereference +- `macros4`: Prevented auto-fix by adding `#[rustfmt::skip]` +- `cli`: Actually show correct progress percentages + ## 5.4.0 (2023-02-12) diff --git a/Cargo.toml b/Cargo.toml index 4b450584..d22816ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "5.4.0" +version = "5.4.1" authors = [ "Liv ", "Carol (Nichols || Goulding) ", diff --git a/README.md b/README.md index 571ba954..d16b7385 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,8 @@ This will install Rustlings and give you access to the `rustlings` command. Run Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.0) -git clone -b 5.4.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.1) +git clone -b 5.4.1 --depth 1 https://github.com/rust-lang/rustlings cd rustlings # if nix version > 2.3 nix develop @@ -71,8 +71,8 @@ If you get a permission denied message, you might have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install --path .`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.0) -git clone -b 5.4.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.1) +git clone -b 5.4.1 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/flake.nix b/flake.nix index 5d485801..5815a920 100644 --- a/flake.nix +++ b/flake.nix @@ -22,7 +22,7 @@ rustlings = pkgs.rustPlatform.buildRustPackage { name = "rustlings"; - version = "5.4.0"; + version = "5.4.1"; buildInputs = cargoBuildInputs; diff --git a/src/main.rs b/src/main.rs index c09088ba..312a0a12 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "5.4.0"; +const VERSION: &str = "5.4.1"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From ec86b60e704520289acac180cc55058431ca2bdb Mon Sep 17 00:00:00 2001 From: Sven Siegmund Date: Fri, 10 Mar 2023 17:58:03 +0100 Subject: [PATCH 0891/1293] improve hint for strings2, #1407 --- info.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 2f424033..731db504 100644 --- a/info.toml +++ b/info.toml @@ -439,7 +439,9 @@ mode = "compile" hint = """ Yes, it would be really easy to fix this by just changing the value bound to `word` to be a string slice instead of a `String`, wouldn't it?? There is a way to add one character to line -9, though, that will coerce the `String` into a string slice.""" +9, though, that will coerce the `String` into a string slice. + +Side note: If you're interested in learning about how this kind of reference conversion works, you can jump ahead in the book and read this part in the smart pointers chapter: https://doc.rust-lang.org/stable/book/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods""" [[exercises]] name = "strings3" From 31b208248bd47069ba592b575804c37c763be6bb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 17:03:20 +0000 Subject: [PATCH 0892/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 54157fcd..312dde05 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -270,6 +270,9 @@ authors. Nidhal Messaoudi
Nidhal Messaoudi

πŸ’» Mahdi Bahrami
Mahdi Bahrami

πŸ”§ + + Nagidal
Nagidal

πŸ–‹ + From 53a8318f32037c340d96488b46b6620d4ffbcd7f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 17:03:21 +0000 Subject: [PATCH 0893/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2b0ffeaf..0c74225f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1902,6 +1902,15 @@ "contributions": [ "tool" ] + }, + { + "login": "Nagidal", + "name": "Nagidal", + "avatar_url": "https://avatars.githubusercontent.com/u/7075397?v=4", + "profile": "https://github.com/Nagidal", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 7bab78c66d4c0fff4b9f7ca082964353215265e3 Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Fri, 10 Mar 2023 14:13:06 -0500 Subject: [PATCH 0894/1293] Rename iteration var names in vec2.rs for clarity Resolves #1417 --- exercises/vecs/vecs2.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/vecs/vecs2.rs b/exercises/vecs/vecs2.rs index 5bea09a2..1ea26071 100644 --- a/exercises/vecs/vecs2.rs +++ b/exercises/vecs/vecs2.rs @@ -9,7 +9,7 @@ // I AM NOT DONE fn vec_loop(mut v: Vec) -> Vec { - for i in v.iter_mut() { + for element in v.iter_mut() { // TODO: Fill this up so that each element in the Vec `v` is // multiplied by 2. ??? @@ -20,7 +20,7 @@ fn vec_loop(mut v: Vec) -> Vec { } fn vec_map(v: &Vec) -> Vec { - v.iter().map(|num| { + v.iter().map(|element| { // TODO: Do the same thing as above - but instead of mutating the // Vec, you can just return the new number! ??? From e8b44a39e023d83df0b1ba449f58f78361ef6847 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 14 Mar 2023 10:15:21 +0000 Subject: [PATCH 0895/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 312dde05..7bf26c79 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -272,6 +272,7 @@ authors. Nagidal
Nagidal

πŸ–‹ + Adam Brewer
Adam Brewer

πŸ–‹ From 06fac0e5707071b573aaf6a465448d2e9d81dc54 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 14 Mar 2023 10:15:22 +0000 Subject: [PATCH 0896/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0c74225f..4d98014a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1911,6 +1911,15 @@ "contributions": [ "content" ] + }, + { + "login": "adamhb123", + "name": "Adam Brewer", + "avatar_url": "https://avatars.githubusercontent.com/u/25161597?v=4", + "profile": "https://adabrew.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 5d91c86cf294e503f5580ea648f0d9140b895d7b Mon Sep 17 00:00:00 2001 From: hxztnxt Date: Thu, 16 Mar 2023 00:56:15 +0100 Subject: [PATCH 0897/1293] change order of references in README.md --- exercises/lifetimes/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/lifetimes/README.md b/exercises/lifetimes/README.md index 72befb3e..db1931a5 100644 --- a/exercises/lifetimes/README.md +++ b/exercises/lifetimes/README.md @@ -13,5 +13,5 @@ restrictive of their callers. ## Further information -- [Validating References with Lifetimes](https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html) - [Lifetimes (in Rust By Example)](https://doc.rust-lang.org/stable/rust-by-example/scope/lifetime.html) +- [Validating References with Lifetimes](https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html) From 568767601427cccf11ef8ea0dd20ad1ac0dbee1e Mon Sep 17 00:00:00 2001 From: Ryan Whitehouse Date: Mon, 20 Mar 2023 12:04:47 +0100 Subject: [PATCH 0898/1293] docs:clarify instructions on hashmaps2.rs --- exercises/hashmaps/hashmaps2.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/exercises/hashmaps/hashmaps2.rs b/exercises/hashmaps/hashmaps2.rs index 454b3e1d..6d216589 100644 --- a/exercises/hashmaps/hashmaps2.rs +++ b/exercises/hashmaps/hashmaps2.rs @@ -1,11 +1,11 @@ // hashmaps2.rs - // A basket of fruits in the form of a hash map is given. The key // represents the name of the fruit and the value represents how many -// of that particular fruit is in the basket. You have to put *MORE -// THAN 11* fruits in the basket. Three types of fruits - Apple (4), -// Mango (2) and Lychee (5) are already given in the basket. You are -// not allowed to insert any more of these fruits! +// of that particular fruit is in the basket. +// Three types of fruits - Apple (4), Mango (2) and Lychee (5) are already given in the basket. +// You must add fruit to the basket so that there is at least +// one of each kind and more than 11 in total. +// You are not allowed to insert any more of these fruits! // // Make me pass the tests! // @@ -34,8 +34,8 @@ fn fruit_basket(basket: &mut HashMap) { ]; for fruit in fruit_kinds { - // TODO: Put new fruits if not already present. Note that you - // are not allowed to put any type of fruit that's already + // TODO: Insert new fruits if they are not already present in the basket. + // Note that you are not allowed to put any type of fruit that's already // present! } } @@ -44,6 +44,7 @@ fn fruit_basket(basket: &mut HashMap) { mod tests { use super::*; + // Don't modify this function! fn get_fruit_basket() -> HashMap { let mut basket = HashMap::::new(); basket.insert(Fruit::Apple, 4); From 6e9ed48f42df78b83c1693e6f495d7a9f571a498 Mon Sep 17 00:00:00 2001 From: Eugene Date: Fri, 24 Mar 2023 16:48:11 +0100 Subject: [PATCH 0899/1293] cargo update for to resolve #1430 --- Cargo.lock | 280 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 170 insertions(+), 110 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3d04953d..192a4ac0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] [[package]] name = "argh" -version = "0.1.5" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7317a549bc17c5278d9e72bb6e62c6aa801ac2567048e39ebc1c194249323e" +checksum = "ab257697eb9496bf75526f0217b5ed64636a9cfafa78b8365c71bd283fcef93e" dependencies = [ "argh_derive", "argh_shared", @@ -23,22 +23,21 @@ dependencies = [ [[package]] name = "argh_derive" -version = "0.1.5" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60949c42375351e9442e354434b0cba2ac402c1237edf673cac3a4bf983b8d3c" +checksum = "b382dbd3288e053331f03399e1db106c9fb0d8562ad62cb04859ae926f324fa6" dependencies = [ "argh_shared", - "heck", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "argh_shared" -version = "0.1.5" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a61eb019cb8f415d162cb9f12130ee6bbe9168b7d953c17f4ad049e4051ca00" +checksum = "64cb94155d965e3d37ffbbe7cc5b82c3dd79dd33bd48e536f73d2cfb8d85506f" [[package]] name = "assert_cmd" @@ -54,9 +53,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bitflags" @@ -78,17 +77,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "console" -version = "0.15.0" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31" +checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" dependencies = [ "encode_unicode", + "lazy_static", "libc", - "once_cell", - "regex", - "terminal_size", "unicode-width", - "winapi 0.3.9", + "windows-sys 0.42.0", ] [[package]] @@ -117,14 +114,14 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412" dependencies = [ "cfg-if 1.0.0", "libc", "redox_syscall", - "winapi 0.3.9", + "windows-sys 0.45.0", ] [[package]] @@ -173,24 +170,15 @@ checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "glob" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "home" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654" +checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" dependencies = [ "winapi 0.3.9", ] @@ -238,9 +226,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.2" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "kernel32-sys" @@ -266,24 +254,24 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.100" +version = "0.2.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1fa8cddc8fbbee11227ef194b5317ed014b8acbf15139bd716a18ad3fe99ec5" +checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mio" @@ -330,9 +318,9 @@ dependencies = [ [[package]] name = "net2" -version = "0.2.37" +version = "0.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" dependencies = [ "cfg-if 0.1.10", "libc", @@ -365,9 +353,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] @@ -378,12 +366,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" -[[package]] -name = "once_cell" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" - [[package]] name = "predicates" version = "1.0.8" @@ -399,52 +381,52 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.2" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57e35a3326b75e49aa85f5dc6ec15b41108cf5aee58eabb1f274dd18b73c2451" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" [[package]] name = "predicates-tree" -version = "1.0.3" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7dd0fd014130206c9352efbdc92be592751b2b9274dff685348341082c6ea3d" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" dependencies = [ "predicates-core", - "treeline", + "termtree", ] [[package]] name = "proc-macro2" -version = "1.0.28" +version = "1.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" +checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.5.5" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "cce168fea28d3e05f158bda4576cf0c844d5045bc2cc3620fa0292ed5bb5814c" dependencies = [ "aho-corasick", "memchr", @@ -453,13 +435,13 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "rustlings" -version = "5.4.0" +version = "5.4.1" dependencies = [ "argh", "assert_cmd", @@ -477,9 +459,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "same-file" @@ -492,29 +474,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.129" +version = "1.0.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1f72836d2aa753853178eda473a3b9d8e4eefdaf20523b919677e6de489f8f1" +checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.129" +version = "1.0.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57ae87ad533d9a56427558b516d0adac283614e347abf85b0dc0cbbf0a249f3" +checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.8", ] [[package]] name = "serde_json" -version = "1.0.81" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" dependencies = [ "itoa", "ryu", @@ -523,72 +505,69 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.4" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] [[package]] name = "syn" -version = "1.0.75" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] -name = "terminal_size" -version = "0.1.17" +name = "syn" +version = "2.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" +checksum = "bcc02725fd69ab9f26eab07fad303e2497fad6fb9eba4f96c4d1687bdf704ad9" dependencies = [ - "libc", - "winapi 0.3.9", + "proc-macro2", + "quote", + "unicode-ident", ] +[[package]] +name = "termtree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" + [[package]] name = "toml" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] -name = "treeline" -version = "0.1.0" +name = "unicode-ident" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" - -[[package]] -name = "unicode-segmentation" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" [[package]] name = "unicode-width" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" - -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "walkdir" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" dependencies = [ "same-file", - "winapi 0.3.9", "winapi-util", ] @@ -635,6 +614,87 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "ws2_32-sys" version = "0.2.1" From 4160b06c6ca5bdb1a363fdb130a3a3055b9d2eac Mon Sep 17 00:00:00 2001 From: Ed Sweeney Date: Fri, 24 Mar 2023 21:52:58 -0700 Subject: [PATCH 0900/1293] correct comments in errors2.rs --- exercises/error_handling/errors2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/error_handling/errors2.rs b/exercises/error_handling/errors2.rs index aad3a93f..76b8d12c 100644 --- a/exercises/error_handling/errors2.rs +++ b/exercises/error_handling/errors2.rs @@ -2,7 +2,7 @@ // Say we're writing a game where you can buy items with tokens. All items cost // 5 tokens, and whenever you purchase items there is a processing fee of 1 // token. A player of the game will type in how many items they want to buy, -// and the `total_cost` function will calculate the total number of tokens. +// and the `total_cost` function will calculate the total cost of the tokens. // Since the player typed in the quantity, though, we get it as a string-- and // they might have typed anything, not just numbers! From d5449c992e8e7633ff929737fb6df4daa5413166 Mon Sep 17 00:00:00 2001 From: Tom Kunc Date: Sat, 25 Mar 2023 20:00:28 +1100 Subject: [PATCH 0901/1293] feat(lifetimekata): Add info about Lifetimekata project --- exercises/lifetimes/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/lifetimes/README.md b/exercises/lifetimes/README.md index 72befb3e..dc7ca797 100644 --- a/exercises/lifetimes/README.md +++ b/exercises/lifetimes/README.md @@ -11,6 +11,11 @@ be referenced outside. Lifetimes mean that calling code of e.g. functions can be checked to make sure their arguments are valid. Lifetimes are restrictive of their callers. +If you'd like to learn more about lifetime annotations, the +[lifetimekata](https://tfpk.github.io/lifetimekata/) project +has a similar style of exercises to Rustlings, but is all about +learning to write lifetime annotations. + ## Further information - [Validating References with Lifetimes](https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html) From efd4d83731e1d7bde5a041908fb3a81d7b02dfae Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 26 Mar 2023 12:48:09 +0000 Subject: [PATCH 0902/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 7bf26c79..9e5f1e86 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -273,6 +273,7 @@ authors. Nagidal
Nagidal

πŸ–‹ Adam Brewer
Adam Brewer

πŸ–‹ + Eugene
Eugene

πŸ”§ From 82f72c3ec6ea111a07f5dab9c0fa05528bb3068d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 26 Mar 2023 12:48:10 +0000 Subject: [PATCH 0903/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4d98014a..ecb7436e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1920,6 +1920,15 @@ "contributions": [ "content" ] + }, + { + "login": "eugkhp", + "name": "Eugene", + "avatar_url": "https://avatars.githubusercontent.com/u/25910599?v=4", + "profile": "https://github.com/eugkhp", + "contributions": [ + "tool" + ] } ], "contributorsPerLine": 8, From c28b78fae56e8a9aa30d627039ade17dd58547bd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 26 Mar 2023 12:50:13 +0000 Subject: [PATCH 0904/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 9e5f1e86..29fc14b9 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -274,6 +274,7 @@ authors. Nagidal
Nagidal

πŸ–‹ Adam Brewer
Adam Brewer

πŸ–‹ Eugene
Eugene

πŸ”§ + Ed Sweeney
Ed Sweeney

πŸ–‹ From 766b83b513afbfb0a5a5c6b481887ff7c81f8909 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 26 Mar 2023 12:50:14 +0000 Subject: [PATCH 0905/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ecb7436e..69aaf78a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1929,6 +1929,15 @@ "contributions": [ "tool" ] + }, + { + "login": "navicore", + "name": "Ed Sweeney", + "avatar_url": "https://avatars.githubusercontent.com/u/110999?v=4", + "profile": "https://social.linux.pizza/@navicore", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 864e741dd87eb8df192e6272ae4187bd95f61760 Mon Sep 17 00:00:00 2001 From: liv Date: Sun, 26 Mar 2023 15:21:21 +0200 Subject: [PATCH 0906/1293] reword hashmaps2 a bit more --- exercises/hashmaps/hashmaps2.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/exercises/hashmaps/hashmaps2.rs b/exercises/hashmaps/hashmaps2.rs index 6d216589..a4f069a8 100644 --- a/exercises/hashmaps/hashmaps2.rs +++ b/exercises/hashmaps/hashmaps2.rs @@ -1,10 +1,12 @@ // hashmaps2.rs -// A basket of fruits in the form of a hash map is given. The key -// represents the name of the fruit and the value represents how many -// of that particular fruit is in the basket. -// Three types of fruits - Apple (4), Mango (2) and Lychee (5) are already given in the basket. -// You must add fruit to the basket so that there is at least -// one of each kind and more than 11 in total. +// We're collecting different fruits to bake a delicious fruit cake. +// For this, we have a basket, which we'll represent in the form of a hash +// map. The key represents the name of each fruit we collect and the value +// represents how many of that particular fruit we have collected. +// Three types of fruits - Apple (4), Mango (2) and Lychee (5) are already +// in the basket hash map. +// You must add fruit to the basket so that there is at least +// one of each kind and more than 11 in total - we have a lot of mouths to feed. // You are not allowed to insert any more of these fruits! // // Make me pass the tests! @@ -34,7 +36,7 @@ fn fruit_basket(basket: &mut HashMap) { ]; for fruit in fruit_kinds { - // TODO: Insert new fruits if they are not already present in the basket. + // TODO: Insert new fruits if they are not already present in the basket. // Note that you are not allowed to put any type of fruit that's already // present! } From 18a9510048e20a40507f616a0b2fcbc849881ef8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 26 Mar 2023 13:23:18 +0000 Subject: [PATCH 0907/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 29fc14b9..b300f3e3 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -275,6 +275,7 @@ authors. Adam Brewer
Adam Brewer

πŸ–‹ Eugene
Eugene

πŸ”§ Ed Sweeney
Ed Sweeney

πŸ–‹ + javihernant
javihernant

πŸ–‹ From faf4d9a888dc9ada907ff293e56fa0f3786584fc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 26 Mar 2023 13:23:19 +0000 Subject: [PATCH 0908/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 69aaf78a..d86e9a2a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1938,6 +1938,15 @@ "contributions": [ "content" ] + }, + { + "login": "javihernant", + "name": "javihernant", + "avatar_url": "https://avatars.githubusercontent.com/u/73640929?v=4", + "profile": "https://github.com/javihernant", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 95e51f384ef4b600f86dc08fcb234f9715c9bc44 Mon Sep 17 00:00:00 2001 From: Vegard Matthey Date: Sun, 26 Mar 2023 23:25:59 +0200 Subject: [PATCH 0909/1293] fixed a spelling mistake in info.toml --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 731db504..fde77e23 100644 --- a/info.toml +++ b/info.toml @@ -844,7 +844,7 @@ Create an iterator from the slice. Transform the iterated values by applying the `capitalize_first` function. Remember to collect the iterator. Step 3. -This is surprising similar to the previous solution. Collect is very powerful +This is surprisingly similar to the previous solution. Collect is very powerful and very general. Rust just needs to know the desired type.""" [[exercises]] From db993899d3120d85e3b6e29ff6bc3eb67d1d4718 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:30:56 +0000 Subject: [PATCH 0910/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index b300f3e3..2561f744 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -276,6 +276,7 @@ authors. Eugene
Eugene

πŸ”§ Ed Sweeney
Ed Sweeney

πŸ–‹ javihernant
javihernant

πŸ–‹ + Vegard
Vegard

πŸ–‹ From 5e43c7aba503f71b6fc3afec2c37a7f0a2946376 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:30:57 +0000 Subject: [PATCH 0911/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d86e9a2a..1a218e5f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1947,6 +1947,15 @@ "contributions": [ "content" ] + }, + { + "login": "VegardMatthey", + "name": "Vegard", + "avatar_url": "https://avatars.githubusercontent.com/u/59250656?v=4", + "profile": "https://github.com/VegardMatthey", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 592694036f7329b90712ea066f5f79d2396c6f50 Mon Sep 17 00:00:00 2001 From: Ali Afsharzadeh Date: Tue, 28 Mar 2023 09:58:59 +0330 Subject: [PATCH 0912/1293] docs(variables): wrap mut keyword with backtick --- exercises/variables/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/variables/README.md b/exercises/variables/README.md index 11a7a78a..7964ff29 100644 --- a/exercises/variables/README.md +++ b/exercises/variables/README.md @@ -2,7 +2,7 @@ In Rust, variables are immutable by default. When a variable is immutable, once a value is bound to a name, you can’t change that value. -You can make them mutable by adding mut in front of the variable name. +You can make them mutable by adding `mut` in front of the variable name. ## Further information From 13356e16a3994ead1d399cd879797a8f05d258aa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 10:25:46 +0000 Subject: [PATCH 0913/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 2561f744..4a687d80 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -277,6 +277,7 @@ authors. Ed Sweeney
Ed Sweeney

πŸ–‹ javihernant
javihernant

πŸ–‹ Vegard
Vegard

πŸ–‹ + Ryan Whitehouse
Ryan Whitehouse

πŸ–‹ From 78f4d6636469506b03c6c6b87fc567271f863a7c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 10:25:47 +0000 Subject: [PATCH 0914/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 1a218e5f..23b1c061 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1956,6 +1956,15 @@ "contributions": [ "content" ] + }, + { + "login": "ryanwhitehouse", + "name": "Ryan Whitehouse", + "avatar_url": "https://avatars.githubusercontent.com/u/13400784?v=4", + "profile": "https://github.com/ryanwhitehouse", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 99bd7181f9f3ed59f382499796cadbca7c2509a1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 10:26:45 +0000 Subject: [PATCH 0915/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4a687d80..48fbc53b 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -278,6 +278,7 @@ authors. javihernant
javihernant

πŸ–‹ Vegard
Vegard

πŸ–‹ Ryan Whitehouse
Ryan Whitehouse

πŸ–‹ + Ali Afsharzadeh
Ali Afsharzadeh

πŸ–‹ From 347462d87ed021cd62485404731a454a0d890193 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 10:26:46 +0000 Subject: [PATCH 0916/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 23b1c061..9323238b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1965,6 +1965,15 @@ "contributions": [ "content" ] + }, + { + "login": "guoard", + "name": "Ali Afsharzadeh", + "avatar_url": "https://avatars.githubusercontent.com/u/65511355?v=4", + "profile": "https://github.com/guoard", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 1db646474e84fcf1c87118efb9ef0f6c3a96512c Mon Sep 17 00:00:00 2001 From: Ali Afsharzadeh Date: Wed, 29 Mar 2023 21:13:27 +0330 Subject: [PATCH 0917/1293] docs(error_handling): resolve markdown linter warnings --- exercises/error_handling/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/error_handling/README.md b/exercises/error_handling/README.md index 5255ace9..3b21f2b7 100644 --- a/exercises/error_handling/README.md +++ b/exercises/error_handling/README.md @@ -1,5 +1,6 @@ # Error handling -Most errors aren’t serious enough to require the program to stop entirely. + +Most errors aren’t serious enough to require the program to stop entirely. Sometimes, when a function fails, it’s for a reason that you can easily interpret and respond to. For example, if you try to open a file and that operation fails because the file doesn’t exist, you might want to create the file instead of terminating the process. From 382e16eb7ea66cddc4860f4b19453b031a2a8a8a Mon Sep 17 00:00:00 2001 From: Ali Afsharzadeh Date: Thu, 30 Mar 2023 19:53:22 +0330 Subject: [PATCH 0918/1293] feat(docs): add markdown linter for exercises README.md files --- .github/workflows/lint.yml | 18 ++++++++++++++++++ .markdownlint.yml | 2 ++ exercises/conversions/README.md | 4 +++- exercises/hashmaps/README.md | 3 ++- exercises/lifetimes/README.md | 12 ++++++------ exercises/macros/README.md | 2 +- exercises/options/README.md | 3 ++- exercises/smart_pointers/README.md | 1 + exercises/traits/README.md | 2 +- 9 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/lint.yml create mode 100644 .markdownlint.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..67339d1b --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,18 @@ +name: Lint + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: DavidAnson/markdownlint-cli2-action@v9 + with: + globs: "exercises/**/*.md" diff --git a/.markdownlint.yml b/.markdownlint.yml new file mode 100644 index 00000000..d5f7e391 --- /dev/null +++ b/.markdownlint.yml @@ -0,0 +1,2 @@ +# MD013/line-length Line length, Expected: 80 +MD013: false diff --git a/exercises/conversions/README.md b/exercises/conversions/README.md index 8d7da93e..619a78c5 100644 --- a/exercises/conversions/README.md +++ b/exercises/conversions/README.md @@ -6,6 +6,7 @@ The simplest form of type conversion is a type cast expression. It is denoted wi Rust also offers traits that facilitate type conversions upon implementation. These traits can be found under the [`convert`](https://doc.rust-lang.org/std/convert/index.html) module. The traits are the following: + - `From` and `Into` covered in [`from_into`](from_into.rs) - `TryFrom` and `TryInto` covered in [`try_from_into`](try_from_into.rs) - `AsRef` and `AsMut` covered in [`as_ref_mut`](as_ref_mut.rs) @@ -17,5 +18,6 @@ These should be the main ways ***within the standard library*** to convert data ## Further information These are not directly covered in the book, but the standard library has a great documentation for it. + - [conversions](https://doc.rust-lang.org/std/convert/index.html) -- [`FromStr` trait](https://doc.rust-lang.org/std/str/trait.FromStr.html) \ No newline at end of file +- [`FromStr` trait](https://doc.rust-lang.org/std/str/trait.FromStr.html) diff --git a/exercises/hashmaps/README.md b/exercises/hashmaps/README.md index 30471cf9..80ec1441 100644 --- a/exercises/hashmaps/README.md +++ b/exercises/hashmaps/README.md @@ -1,6 +1,7 @@ # Hashmaps + A *hash map* allows you to associate a value with a particular key. -You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map), +You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map), [*dictionary* in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) or an *associative array* in other languages. This is the other data structure that we've been talking about before, when diff --git a/exercises/lifetimes/README.md b/exercises/lifetimes/README.md index 74a4a786..91373f73 100644 --- a/exercises/lifetimes/README.md +++ b/exercises/lifetimes/README.md @@ -3,17 +3,17 @@ Lifetimes tell the compiler how to check whether references live long enough to be valid in any given situation. For example lifetimes say "make sure parameter 'a' lives as long as parameter 'b' so that the return -value is valid". +value is valid". -They are only necessary on borrows, i.e. references, +They are only necessary on borrows, i.e. references, since copied parameters or moves are owned in their scope and cannot be referenced outside. Lifetimes mean that calling code of e.g. functions -can be checked to make sure their arguments are valid. Lifetimes are +can be checked to make sure their arguments are valid. Lifetimes are restrictive of their callers. -If you'd like to learn more about lifetime annotations, the -[lifetimekata](https://tfpk.github.io/lifetimekata/) project -has a similar style of exercises to Rustlings, but is all about +If you'd like to learn more about lifetime annotations, the +[lifetimekata](https://tfpk.github.io/lifetimekata/) project +has a similar style of exercises to Rustlings, but is all about learning to write lifetime annotations. ## Further information diff --git a/exercises/macros/README.md b/exercises/macros/README.md index e34bc3a8..337816d6 100644 --- a/exercises/macros/README.md +++ b/exercises/macros/README.md @@ -4,7 +4,7 @@ Rust's macro system is very powerful, but also kind of difficult to wrap your head around. We're not going to teach you how to write your own fully-featured macros. Instead, we'll show you how to use and create them. -If you'd like to learn more about writing your own macros, the +If you'd like to learn more about writing your own macros, the [macrokata](https://github.com/tfpk/macrokata) project has a similar style of exercises to Rustlings, but is all about learning to write Macros. diff --git a/exercises/options/README.md b/exercises/options/README.md index 6140a167..bdd33749 100644 --- a/exercises/options/README.md +++ b/exercises/options/README.md @@ -1,7 +1,8 @@ # Options -Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not. +Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not. Option types are very common in Rust code, as they have a number of uses: + - Initial values - Return values for functions that are not defined over their entire input range (partial functions) - Return value for otherwise reporting simple errors, where None is returned on error diff --git a/exercises/smart_pointers/README.md b/exercises/smart_pointers/README.md index c517ae31..d56d2b62 100644 --- a/exercises/smart_pointers/README.md +++ b/exercises/smart_pointers/README.md @@ -1,4 +1,5 @@ # Smart Pointers + In Rust, smart pointers are variables that contain an address in memory and reference some other data, but they also have additional metadata and capabilities. Smart pointers in Rust often own the data they point to, while references only borrow data. diff --git a/exercises/traits/README.md b/exercises/traits/README.md index de67acd0..ac87c64e 100644 --- a/exercises/traits/README.md +++ b/exercises/traits/README.md @@ -7,13 +7,13 @@ Data types can implement traits. To do so, the methods making up the trait are d In this way, traits are somewhat similar to Java interfaces and C++ abstract classes. Some additional common Rust traits include: + - `Clone` (the `clone` method) - `Display` (which allows formatted display via `{}`) - `Debug` (which allows formatted display via `{:?}`) Because traits indicate shared behavior between data types, they are useful when writing generics. - ## Further information - [Traits](https://doc.rust-lang.org/book/ch10-02-traits.html) From 8c4a7bea5fc9a4af6cb59dcb745aafa2d85bd2b9 Mon Sep 17 00:00:00 2001 From: Keogami <41939011+keogami@users.noreply.github.com> Date: Fri, 31 Mar 2023 02:26:23 +0530 Subject: [PATCH 0919/1293] docs(README.md): split quick installation commands into two separate code blocks Having the two quick installation commands in two separate code blocks makes it easy to copy them through the github's `copy to clipboard` button --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d16b7385..be470fdb 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,10 @@ Just run: ```bash curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash -# Or if you want it to be installed to a different path: +``` +Or if you want it to be installed to a different path: + +```bash curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash -s mypath/ ``` From 22bb662d3eb9efd081a5603640628bdeebab97b9 Mon Sep 17 00:00:00 2001 From: Alexandre ESSE Date: Fri, 31 Mar 2023 11:20:11 +0200 Subject: [PATCH 0920/1293] fix(exercises): remove trailing spaces --- exercises/hashmaps/README.md | 2 +- exercises/lifetimes/README.md | 12 ++++++------ exercises/macros/README.md | 2 +- exercises/options/README.md | 2 +- exercises/threads/threads1.rs | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/exercises/hashmaps/README.md b/exercises/hashmaps/README.md index 30471cf9..6afa04b2 100644 --- a/exercises/hashmaps/README.md +++ b/exercises/hashmaps/README.md @@ -1,6 +1,6 @@ # Hashmaps A *hash map* allows you to associate a value with a particular key. -You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map), +You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map), [*dictionary* in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) or an *associative array* in other languages. This is the other data structure that we've been talking about before, when diff --git a/exercises/lifetimes/README.md b/exercises/lifetimes/README.md index 74a4a786..91373f73 100644 --- a/exercises/lifetimes/README.md +++ b/exercises/lifetimes/README.md @@ -3,17 +3,17 @@ Lifetimes tell the compiler how to check whether references live long enough to be valid in any given situation. For example lifetimes say "make sure parameter 'a' lives as long as parameter 'b' so that the return -value is valid". +value is valid". -They are only necessary on borrows, i.e. references, +They are only necessary on borrows, i.e. references, since copied parameters or moves are owned in their scope and cannot be referenced outside. Lifetimes mean that calling code of e.g. functions -can be checked to make sure their arguments are valid. Lifetimes are +can be checked to make sure their arguments are valid. Lifetimes are restrictive of their callers. -If you'd like to learn more about lifetime annotations, the -[lifetimekata](https://tfpk.github.io/lifetimekata/) project -has a similar style of exercises to Rustlings, but is all about +If you'd like to learn more about lifetime annotations, the +[lifetimekata](https://tfpk.github.io/lifetimekata/) project +has a similar style of exercises to Rustlings, but is all about learning to write lifetime annotations. ## Further information diff --git a/exercises/macros/README.md b/exercises/macros/README.md index e34bc3a8..337816d6 100644 --- a/exercises/macros/README.md +++ b/exercises/macros/README.md @@ -4,7 +4,7 @@ Rust's macro system is very powerful, but also kind of difficult to wrap your head around. We're not going to teach you how to write your own fully-featured macros. Instead, we'll show you how to use and create them. -If you'd like to learn more about writing your own macros, the +If you'd like to learn more about writing your own macros, the [macrokata](https://github.com/tfpk/macrokata) project has a similar style of exercises to Rustlings, but is all about learning to write Macros. diff --git a/exercises/options/README.md b/exercises/options/README.md index 6140a167..5433fed8 100644 --- a/exercises/options/README.md +++ b/exercises/options/README.md @@ -1,6 +1,6 @@ # Options -Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not. +Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not. Option types are very common in Rust code, as they have a number of uses: - Initial values - Return values for functions that are not defined over their entire input range (partial functions) diff --git a/exercises/threads/threads1.rs b/exercises/threads/threads1.rs index d6376db2..ae124eeb 100644 --- a/exercises/threads/threads1.rs +++ b/exercises/threads/threads1.rs @@ -30,7 +30,7 @@ fn main() { if results.len() != 10 { panic!("Oh no! All the spawned threads did not finish!"); } - + println!(); for (i, result) in results.into_iter().enumerate() { println!("thread {} took {}ms", i, result); From d7111cb4a35b34c8e4e910a27ff10facb7efd917 Mon Sep 17 00:00:00 2001 From: Alexandre ESSE Date: Fri, 31 Mar 2023 11:20:30 +0200 Subject: [PATCH 0921/1293] fix(main.rs): remove trailing spaces --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 312a0a12..704398e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -433,8 +433,8 @@ started, here's a couple of notes about how Rustlings operates: 4. If an exercise doesn't make sense to you, feel free to open an issue on GitHub! (https://github.com/rust-lang/rustlings/issues/new). We look at every issue, and sometimes, other learners do too so you can help each other out! -5. If you want to use `rust-analyzer` with exercises, which provides features like - autocompletion, run the command `rustlings lsp`. +5. If you want to use `rust-analyzer` with exercises, which provides features like + autocompletion, run the command `rustlings lsp`. Got all that? Great! To get started, run `rustlings watch` in order to get the first exercise. Make sure to have your editor open!"#; From e185e27273e6e64e9dcda6e7ab6c316716edceac Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 13:29:29 +0000 Subject: [PATCH 0922/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 48fbc53b..df85b149 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -280,6 +280,9 @@ authors. Ryan Whitehouse
Ryan Whitehouse

πŸ–‹ Ali Afsharzadeh
Ali Afsharzadeh

πŸ–‹ + + Keogami
Keogami

πŸ“– + From 84dcd51d37846120cb9ff471a17e4c7c025d3ab3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 13:29:30 +0000 Subject: [PATCH 0923/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9323238b..55161bbe 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1974,6 +1974,15 @@ "contributions": [ "content" ] + }, + { + "login": "keogami", + "name": "Keogami", + "avatar_url": "https://avatars.githubusercontent.com/u/41939011?v=4", + "profile": "http://keogami.ml", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From 391e5d121a7e68c2006c0cde8af0a4fcae3ed07a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 13:31:32 +0000 Subject: [PATCH 0924/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index df85b149..125fc10b 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -282,6 +282,7 @@ authors. Keogami
Keogami

πŸ“– + Alexandre Esse
Alexandre Esse

πŸ–‹ From 75f0ab65d1d93be46440bf00bdaa211188f91db6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 13:31:33 +0000 Subject: [PATCH 0925/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 55161bbe..0416dd8f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1983,6 +1983,15 @@ "contributions": [ "doc" ] + }, + { + "login": "ahresse", + "name": "Alexandre Esse", + "avatar_url": "https://avatars.githubusercontent.com/u/28402488?v=4", + "profile": "https://github.com/ahresse", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From b1fb38e73c506e9f4aec643dc9ef167517fa5437 Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Sun, 2 Apr 2023 12:25:24 +0530 Subject: [PATCH 0926/1293] fix: move lifetimes above tests in recommended order --- info.toml | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/info.toml b/info.toml index fde77e23..ef891435 100644 --- a/info.toml +++ b/info.toml @@ -748,6 +748,33 @@ hint = """ To find the best solution to this challenge you're going to need to think back to your knowledge of traits, specifically Trait Bound Syntax - you may also need this: `use std::fmt::Display;`.""" +# LIFETIMES + +[[exercises]] +name = "lifetimes1" +path = "exercises/lifetimes/lifetimes1.rs" +mode = "compile" +hint = """ +Let the compiler guide you. Also take a look at the book if you need help: +https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html""" + +[[exercises]] +name = "lifetimes2" +path = "exercises/lifetimes/lifetimes2.rs" +mode = "compile" +hint = """ +Remember that the generic lifetime 'a will get the concrete lifetime that is equal to the smaller of the lifetimes of x and y. +You can take at least two paths to achieve the desired result while keeping the inner block: +1. Move the string2 declaration to make it live as long as string1 (how is result declared?) +2. Move println! into the inner block""" + +[[exercises]] +name = "lifetimes3" +path = "exercises/lifetimes/lifetimes3.rs" +mode = "compile" +hint = """ +If you use a lifetime annotation in a struct's fields, where else does it need to be added?""" + # TESTS [[exercises]] @@ -780,33 +807,6 @@ You can call a function right where you're passing arguments to `assert!` -- so something like `assert!(having_fun())`. If you want to check that you indeed get false, you can negate the result of what you're doing using `!`, like `assert!(!having_fun())`.""" -# LIFETIMES - -[[exercises]] -name = "lifetimes1" -path = "exercises/lifetimes/lifetimes1.rs" -mode = "compile" -hint = """ -Let the compiler guide you. Also take a look at the book if you need help: -https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html""" - -[[exercises]] -name = "lifetimes2" -path = "exercises/lifetimes/lifetimes2.rs" -mode = "compile" -hint = """ -Remember that the generic lifetime 'a will get the concrete lifetime that is equal to the smaller of the lifetimes of x and y. -You can take at least two paths to achieve the desired result while keeping the inner block: -1. Move the string2 declaration to make it live as long as string1 (how is result declared?) -2. Move println! into the inner block""" - -[[exercises]] -name = "lifetimes3" -path = "exercises/lifetimes/lifetimes3.rs" -mode = "compile" -hint = """ -If you use a lifetime annotation in a struct's fields, where else does it need to be added?""" - # STANDARD LIBRARY TYPES [[exercises]] From 2f2fd43771c1b89b580d879e6f741364a5e76737 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 2 Apr 2023 10:45:42 +0000 Subject: [PATCH 0927/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 125fc10b..cffd25eb 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -283,6 +283,7 @@ authors. Keogami
Keogami

πŸ“– Alexandre Esse
Alexandre Esse

πŸ–‹ + Sagar Vora
Sagar Vora

πŸ–‹ From 54d21dc7c11064aae647cd3893e2f4d07adf0ae7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 2 Apr 2023 10:45:43 +0000 Subject: [PATCH 0928/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0416dd8f..97cd1b04 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1992,6 +1992,15 @@ "contributions": [ "content" ] + }, + { + "login": "sagarvora", + "name": "Sagar Vora", + "avatar_url": "https://avatars.githubusercontent.com/u/16315650?v=4", + "profile": "https://resilient.tech", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 27b75795666cddd3725c323cbc0b68b206fc150e Mon Sep 17 00:00:00 2001 From: poneciak Date: Wed, 5 Apr 2023 08:18:51 +0200 Subject: [PATCH 0929/1293] created task --- exercises/tests/tests4.rs | 40 +++++++++++++++++++++++++++++++++++++++ info.toml | 10 ++++++++++ 2 files changed, 50 insertions(+) create mode 100644 exercises/tests/tests4.rs diff --git a/exercises/tests/tests4.rs b/exercises/tests/tests4.rs new file mode 100644 index 00000000..2d8dd130 --- /dev/null +++ b/exercises/tests/tests4.rs @@ -0,0 +1,40 @@ +// tests4.rs +// Correct the tests to +// Do not change Rectangle::new body +// Execute `rustlings hint tests4` or use the `hint` watch subcommand for a hint. + +// I AM NOT DONE + +struct Rectangle { + width: i32, + height: i32 +} + +impl Rectangle { + pub fn new(width: i32, height: i32) -> Self { + if width < 0 || height < 0 { + panic!("Rectangle width and height cannot be negative!") + } + Rectangle {width, height} + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn correct_width_and_height() { + let _rect = Rectangle::new(10, 10); + } + + #[test] + fn negative_width() { + let _rect = Rectangle::new(-10, 10); + } + + #[test] + fn negative_height() { + let _rect = Rectangle::new(10, -10); + } +} diff --git a/info.toml b/info.toml index ef891435..ad06b888 100644 --- a/info.toml +++ b/info.toml @@ -807,6 +807,16 @@ You can call a function right where you're passing arguments to `assert!` -- so something like `assert!(having_fun())`. If you want to check that you indeed get false, you can negate the result of what you're doing using `!`, like `assert!(!having_fun())`.""" +[[exercises]] +name = "tests4" +path = "exercises/tests/tests4.rs" +mode = "test" +hint = """ +We expect method `Rectangle::new()` to panic for negative values. +To handle that you need to add special attribute to test function. +You can refer to the docs: https://doc.rust-lang.org/stable/book/ch11-01-writing-tests.html""" + + # STANDARD LIBRARY TYPES [[exercises]] From c4974ac7820784899592a26b4227683bca96bd2b Mon Sep 17 00:00:00 2001 From: poneciak Date: Wed, 5 Apr 2023 13:09:13 +0200 Subject: [PATCH 0930/1293] added required changes - fixed grammar in hint and added more specific link - added comments in test functions - changed introduction paragraph --- exercises/tests/tests4.rs | 11 ++++++++--- info.toml | 5 +++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/exercises/tests/tests4.rs b/exercises/tests/tests4.rs index 2d8dd130..727dbd7e 100644 --- a/exercises/tests/tests4.rs +++ b/exercises/tests/tests4.rs @@ -1,6 +1,5 @@ // tests4.rs -// Correct the tests to -// Do not change Rectangle::new body +// Make sure that we're testing for the correct conditions! // Execute `rustlings hint tests4` or use the `hint` watch subcommand for a hint. // I AM NOT DONE @@ -11,6 +10,7 @@ struct Rectangle { } impl Rectangle { + // Only change the test functions themselves pub fn new(width: i32, height: i32) -> Self { if width < 0 || height < 0 { panic!("Rectangle width and height cannot be negative!") @@ -25,16 +25,21 @@ mod tests { #[test] fn correct_width_and_height() { - let _rect = Rectangle::new(10, 10); + // This test should check if the rectangle is the size that we pass into its constructor + let rect = Rectangle::new(10, 20); + assert_eq!(???, 10); // check width + assert_eq!(???, 20); // check height } #[test] fn negative_width() { + // This test should check if thread panics when we try to create rectangle with negative width let _rect = Rectangle::new(-10, 10); } #[test] fn negative_height() { + // This test should check if thread panics when we try to create rectangle with negative height let _rect = Rectangle::new(10, -10); } } diff --git a/info.toml b/info.toml index ad06b888..fe79bdee 100644 --- a/info.toml +++ b/info.toml @@ -813,8 +813,9 @@ path = "exercises/tests/tests4.rs" mode = "test" hint = """ We expect method `Rectangle::new()` to panic for negative values. -To handle that you need to add special attribute to test function. -You can refer to the docs: https://doc.rust-lang.org/stable/book/ch11-01-writing-tests.html""" +To handle that you need to add a special attribute to the test function. +You can refer to the docs: +https://doc.rust-lang.org/stable/book/ch11-01-writing-tests.html#checking-for-panics-with-should_panic""" # STANDARD LIBRARY TYPES From 102d7f3d0ec8d9e6b0f4380c9ec199c47cf127f1 Mon Sep 17 00:00:00 2001 From: poneciak Date: Wed, 5 Apr 2023 13:24:14 +0200 Subject: [PATCH 0931/1293] changed comments in tests also fixed small logical issue in `Rectangle::new()` where u could create rectangle with width or height equals 0 --- exercises/tests/tests4.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/tests/tests4.rs b/exercises/tests/tests4.rs index 727dbd7e..1f34a2b2 100644 --- a/exercises/tests/tests4.rs +++ b/exercises/tests/tests4.rs @@ -12,7 +12,7 @@ struct Rectangle { impl Rectangle { // Only change the test functions themselves pub fn new(width: i32, height: i32) -> Self { - if width < 0 || height < 0 { + if width <= 0 || height <= 0 { panic!("Rectangle width and height cannot be negative!") } Rectangle {width, height} @@ -33,13 +33,13 @@ mod tests { #[test] fn negative_width() { - // This test should check if thread panics when we try to create rectangle with negative width + // This test should check if program panics when we try to create rectangle with negative width let _rect = Rectangle::new(-10, 10); } #[test] fn negative_height() { - // This test should check if thread panics when we try to create rectangle with negative height + // This test should check if program panics when we try to create rectangle with negative height let _rect = Rectangle::new(10, -10); } } From af365f444fb63d3f0cc7a86452d89ca6f73e9821 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:05:29 +0000 Subject: [PATCH 0932/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index cffd25eb..f39c7642 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -284,6 +284,7 @@ authors. Keogami
Keogami

πŸ“– Alexandre Esse
Alexandre Esse

πŸ–‹ Sagar Vora
Sagar Vora

πŸ–‹ + Kacper Poneta
Kacper Poneta

πŸ–‹ From 63a467af31a8bda072db78c2dc0037a5498baf47 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:05:30 +0000 Subject: [PATCH 0933/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 97cd1b04..bcf84753 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2001,6 +2001,15 @@ "contributions": [ "content" ] + }, + { + "login": "poneciak57", + "name": "Kacper Poneta", + "avatar_url": "https://avatars.githubusercontent.com/u/94321164?v=4", + "profile": "https://github.com/poneciak57", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 722c7910e411fb11cab5ada2222d6c52976a2411 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:06:58 +0000 Subject: [PATCH 0934/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index f39c7642..e32782e8 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -285,6 +285,7 @@ authors. Alexandre Esse
Alexandre Esse

πŸ–‹ Sagar Vora
Sagar Vora

πŸ–‹ Kacper Poneta
Kacper Poneta

πŸ–‹ + Aaron Suggs
Aaron Suggs

πŸ–‹ From 16ca8715441dabd402dbdf431e117f3c9ad7ff8e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:06:59 +0000 Subject: [PATCH 0935/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index bcf84753..01576d27 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2010,6 +2010,15 @@ "contributions": [ "content" ] + }, + { + "login": "ktheory", + "name": "Aaron Suggs", + "avatar_url": "https://avatars.githubusercontent.com/u/975?v=4", + "profile": "https://ktheory.com/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From c7adaa7d14b66012d10f7e5ad55ee9c3e8615b8b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:09:50 +0000 Subject: [PATCH 0936/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index e32782e8..ed50669b 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -286,6 +286,7 @@ authors. Sagar Vora
Sagar Vora

πŸ–‹ Kacper Poneta
Kacper Poneta

πŸ–‹ Aaron Suggs
Aaron Suggs

πŸ–‹ + Alex
Alex

πŸ–‹ From d544bfcd6ddc3167a5a484b8ea8776d4828642ee Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:09:51 +0000 Subject: [PATCH 0937/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 01576d27..e055aed7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2019,6 +2019,15 @@ "contributions": [ "content" ] + }, + { + "login": "alexwh", + "name": "Alex", + "avatar_url": "https://avatars.githubusercontent.com/u/1723612?v=4", + "profile": "https://github.com/alexwh", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 2f338260632ae65bfd6febf28bde68b26e187b9e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:11:14 +0000 Subject: [PATCH 0938/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index ed50669b..9e757bc2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -287,6 +287,7 @@ authors. Kacper Poneta
Kacper Poneta

πŸ–‹ Aaron Suggs
Aaron Suggs

πŸ–‹ Alex
Alex

πŸ–‹ + Sebastian TΓΆrnquist
Sebastian TΓΆrnquist

πŸ–‹ From 5de7124eeedbff53a493cbff0e6d4e5b97706c42 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:11:15 +0000 Subject: [PATCH 0939/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e055aed7..bdcf53c6 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2028,6 +2028,15 @@ "contributions": [ "content" ] + }, + { + "login": "stornquist", + "name": "Sebastian TΓΆrnquist", + "avatar_url": "https://avatars.githubusercontent.com/u/42915664?v=4", + "profile": "https://github.com/stornquist", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From c74e0bfd188169c15e51dd10501119515dbc220e Mon Sep 17 00:00:00 2001 From: Aaron Wang Date: Fri, 7 Apr 2023 01:56:20 -0400 Subject: [PATCH 0940/1293] docs: update line numbers in move_semantics2 --- exercises/move_semantics/move_semantics2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs index 68dbf021..ae76a7aa 100644 --- a/exercises/move_semantics/move_semantics2.rs +++ b/exercises/move_semantics/move_semantics2.rs @@ -1,5 +1,5 @@ // move_semantics2.rs -// Make me compile without changing line 13 or moving line 10! +// Make me compile without changing line 17 or moving line 14! // Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand for a hint. // Expected output: From 8cb5cba7750a95336a2394c137b2e07202e30da3 Mon Sep 17 00:00:00 2001 From: "J.c" Date: Sat, 8 Apr 2023 10:50:50 +0200 Subject: [PATCH 0941/1293] docs(vecs2): update hints --- info.toml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/info.toml b/info.toml index 28f9bb31..8f391bae 100644 --- a/info.toml +++ b/info.toml @@ -260,15 +260,14 @@ name = "vecs2" path = "exercises/vecs/vecs2.rs" mode = "test" hint = """ -Hint 1: `i` is each element from the Vec as they are being iterated. Can you try -multiplying this? +In the first function we are looping over the Vector and getting a reference to one `element` at a time. +To modify the value of that `element` we need to use the * dereference operator. You can learn more in this chapter of the Rust book: +https://doc.rust-lang.org/stable/book/ch08-01-vectors.html#iterating-over-the-values-in-a-vector -Hint 2: For the first function, there's a way to directly access the numbers stored -in the Vec, using the * dereference operator. You can both access and write to the -number that way. +In the second function this dereferencing is not necessary, because the map function expects the new value to be returned. -After you've completed both functions, decide for yourself which approach you like -better. What do you think is the more commonly used pattern under Rust developers? +After you've completed both functions, decide for yourself which approach you like better. +What do you think is the more commonly used pattern under Rust developers? """ # MOVE SEMANTICS From 8ed2cf7ef5209012f6948b55747a4142939f0930 Mon Sep 17 00:00:00 2001 From: Aaron Wang Date: Mon, 10 Apr 2023 22:36:21 -0400 Subject: [PATCH 0942/1293] Update move_semantics2.rs --- exercises/move_semantics/move_semantics2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs index ae76a7aa..93bb82ef 100644 --- a/exercises/move_semantics/move_semantics2.rs +++ b/exercises/move_semantics/move_semantics2.rs @@ -1,5 +1,4 @@ // move_semantics2.rs -// Make me compile without changing line 17 or moving line 14! // Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand for a hint. // Expected output: @@ -11,6 +10,7 @@ fn main() { let vec0 = Vec::new(); + // Do not move the following line! let mut vec1 = fill_vec(vec0); // Do not change the following line! From e6b1ef20496ef2287442c4abef130ae835395a23 Mon Sep 17 00:00:00 2001 From: bean5 <2052646+bean5@users.noreply.github.com> Date: Thu, 13 Apr 2023 19:37:19 -0600 Subject: [PATCH 0943/1293] docs: Apply fixes that linter noticed --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index be470fdb..f37e122c 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Alternatively, for a first-time Rust learner, there are several other resources: _Note: If you're on MacOS, make sure you've installed Xcode and its developer tools by typing `xcode-select --install`._ _Note: If you're on Linux, make sure you've installed gcc. Deb: `sudo apt install gcc`. Yum: `sudo yum -y install gcc`._ -You will need to have Rust installed. You can get it by visiting https://rustup.rs. This'll also install Cargo, Rust's package/project manager. +You will need to have Rust installed. You can get it by visiting . This'll also install Cargo, Rust's package/project manager. ## MacOS/Linux @@ -23,6 +23,7 @@ Just run: ```bash curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash ``` + Or if you want it to be installed to a different path: ```bash From 15ae83f8681ecba76554841743c1a715001ded75 Mon Sep 17 00:00:00 2001 From: bean5 <2052646+bean5@users.noreply.github.com> Date: Thu, 13 Apr 2023 19:39:57 -0600 Subject: [PATCH 0944/1293] docs: Replace apostrophe (for consistency with other README files) --- exercises/threads/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/threads/README.md b/exercises/threads/README.md index d0866947..dbe66643 100644 --- a/exercises/threads/README.md +++ b/exercises/threads/README.md @@ -1,6 +1,6 @@ # Threads -In most current operating systems, an executed program’s code is run in a process, and the operating system manages multiple processes at once. +In most current operating systems, an executed program's code is run in a process, and the operating system manages multiple processes at once. Within your program, you can also have independent parts that run simultaneously. The features that run these independent parts are called threads. ## Further information From 352267871cbc30d201c53179da3a31d9f5657d44 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 15 Apr 2023 17:19:16 +0100 Subject: [PATCH 0945/1293] fix: Added some extra tests to validate iterators5 solution closes: #1387 --- exercises/iterators/iterators5.rs | 53 ++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/exercises/iterators/iterators5.rs b/exercises/iterators/iterators5.rs index 87097956..45f0d485 100644 --- a/exercises/iterators/iterators5.rs +++ b/exercises/iterators/iterators5.rs @@ -65,12 +65,27 @@ mod tests { } #[test] - fn count_equals_for() { + fn count_some() { let map = get_map(); - assert_eq!( - count_for(&map, Progress::Complete), - count_iterator(&map, Progress::Complete) - ); + assert_eq!(1, count_iterator(&map, Progress::Some)); + } + + #[test] + fn count_none() { + let map = get_map(); + assert_eq!(2, count_iterator(&map, Progress::None)); + } + + #[test] + fn count_complete_equals_for() { + let map = get_map(); + let progressStates = vec![Progress::Complete, Progress::Some, Progress::None]; + for progressState in progressStates { + assert_eq!( + count_for(&map, progressState), + count_iterator(&map, progressState) + ); + } } #[test] @@ -83,14 +98,36 @@ mod tests { } #[test] - fn count_collection_equals_for() { + fn count_collection_some() { let collection = get_vec_map(); assert_eq!( - count_collection_for(&collection, Progress::Complete), - count_collection_iterator(&collection, Progress::Complete) + 1, + count_collection_iterator(&collection, Progress::Some) ); } + #[test] + fn count_collection_none() { + let collection = get_vec_map(); + assert_eq!( + 4, + count_collection_iterator(&collection, Progress::None) + ); + } + + #[test] + fn count_collection_equals_for() { + let progressStates = vec![Progress::Complete, Progress::Some, Progress::None]; + let collection = get_vec_map(); + + for progressState in progressStates { + assert_eq!( + count_collection_for(&collection, progressState), + count_collection_iterator(&collection, progressState) + ); + } + } + fn get_map() -> HashMap { use Progress::*; From a4a5691a7b3fac8201cf2965d94267da12bae47f Mon Sep 17 00:00:00 2001 From: Sebastian LaVine Date: Sun, 16 Apr 2023 21:44:08 -0400 Subject: [PATCH 0946/1293] feat: Add "!" command to `rustlings watch` --- src/main.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 704398e5..793b826d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -298,13 +298,21 @@ fn spawn_watch_shell( println!("Bye!"); } else if input.eq("help") { println!("Commands available to you in watch mode:"); - println!(" hint - prints the current exercise's hint"); - println!(" clear - clears the screen"); - println!(" quit - quits watch mode"); - println!(" help - displays this help message"); + println!(" hint - prints the current exercise's hint"); + println!(" clear - clears the screen"); + println!(" quit - quits watch mode"); + println!(" ! - executes a command, like `!rustc --explain E0381`"); + println!(" help - displays this help message"); println!(); println!("Watch mode automatically re-evaluates the current exercise"); println!("when you edit a file's contents.") + } else if let Some(cmd) = input.strip_prefix('!') { + let parts: Vec<&str> = cmd.split_whitespace().collect(); + if parts.is_empty() { + println!("no command provided"); + } else if let Err(e) = Command::new(parts[0]).args(&parts[1..]).status() { + println!("failed to execute command `{}`: {}", cmd, e); + } } else { println!("unknown command: {input}"); } From 4944488287ca28bb73b067c3b0321adb6fb010ae Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 18 Apr 2023 15:51:24 +0000 Subject: [PATCH 0947/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 9e757bc2..f5accd79 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -288,6 +288,7 @@ authors. Aaron Suggs
Aaron Suggs

πŸ–‹ Alex
Alex

πŸ–‹ Sebastian TΓΆrnquist
Sebastian TΓΆrnquist

πŸ–‹ + Sebastian LaVine
Sebastian LaVine

πŸ’» From 6209e7004e24492776edc5408260707949e6ffee Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 18 Apr 2023 15:51:25 +0000 Subject: [PATCH 0948/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index bdcf53c6..9c39e5ec 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2037,6 +2037,15 @@ "contributions": [ "content" ] + }, + { + "login": "smlavine", + "name": "Sebastian LaVine", + "avatar_url": "https://avatars.githubusercontent.com/u/33563640?v=4", + "profile": "http://smlavine.com", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 319a8253ba727d09a1c52c7d22b4e089137ecff9 Mon Sep 17 00:00:00 2001 From: Alan Gerber Date: Thu, 20 Apr 2023 12:15:31 -0400 Subject: [PATCH 0949/1293] fix(move_semantics2): fix line number comment Commit fef8314 added three lines of comments, which left the line numbers expected to stay unchanged mentioned on line 2 out of date. --- exercises/move_semantics/move_semantics2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs index 68dbf021..ae76a7aa 100644 --- a/exercises/move_semantics/move_semantics2.rs +++ b/exercises/move_semantics/move_semantics2.rs @@ -1,5 +1,5 @@ // move_semantics2.rs -// Make me compile without changing line 13 or moving line 10! +// Make me compile without changing line 17 or moving line 14! // Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand for a hint. // Expected output: From 836134202ef505e03e8177565e512059488aded2 Mon Sep 17 00:00:00 2001 From: lionel-rowe Date: Fri, 21 Apr 2023 06:05:25 +0100 Subject: [PATCH 0950/1293] feat(options2): better tests for layered_option The existing test can be solved with the following: ```rs while let Some(integer) = optional_integers.pop() { assert_eq!(integer.unwrap(), range); ``` Similarly with `expect(...)`, `unwrap_or(0)`, `unwrap_or_default()`, etc. However, none of these solutions use the learning point of stacking `Option`s. The updated test can _only_ be solved by stacking `Option`s: ```rs while let Some(Some(integer)) = optional_integers.pop() { assert_eq!(integer, cursor); ``` With the updated test, using `unwrap` or `expect` will panic when it hits the `None` value, and using `unwrap_or` or `unwrap_or_default` will cause the final `assert_eq!(cursor, 0)` to panic. --- exercises/options/options2.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/exercises/options/options2.rs b/exercises/options/options2.rs index 4e36443f..337c4261 100644 --- a/exercises/options/options2.rs +++ b/exercises/options/options2.rs @@ -18,17 +18,22 @@ mod tests { #[test] fn layered_option() { - let mut range = 10; - let mut optional_integers: Vec> = Vec::new(); - for i in 0..(range + 1) { + let range = 10; + let mut optional_integers: Vec> = vec![None]; + + for i in 1..(range + 1) { optional_integers.push(Some(i)); } + let mut cursor = range; + // TODO: make this a while let statement - remember that vector.pop also adds another layer of Option - // You can stack `Option`'s into while let and if let + // You can stack `Option`s into while let and if let integer = optional_integers.pop() { - assert_eq!(integer, range); - range -= 1; + assert_eq!(integer, cursor); + cursor -= 1; } + + assert_eq!(cursor, 0); } } From e2da663628f61f19066cd92b005bae3adc8521d8 Mon Sep 17 00:00:00 2001 From: deedy5 <65482418+deedy5@users.noreply.github.com> Date: Fri, 21 Apr 2023 15:51:52 +0000 Subject: [PATCH 0951/1293] Update info.toml modules2.rs: add more information to hint --- info.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 28f9bb31..ac04fc7d 100644 --- a/info.toml +++ b/info.toml @@ -478,7 +478,8 @@ hint = """ The delicious_snacks module is trying to present an external interface that is different than its internal structure (the `fruits` and `veggies` modules and associated constants). Complete the `use` statements to fit the uses in main and -find the one keyword missing for both constants.""" +find the one keyword missing for both constants. +Learn more at https://doc.rust-lang.org/book/ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#re-exporting-names-with-pub-use""" [[exercises]] name = "modules3" From 065cd0170e46fbdf0f74aee4708c4e3a200ab6ce Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 22 Apr 2023 13:48:41 +0000 Subject: [PATCH 0952/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index f5accd79..0f45c38f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -290,6 +290,9 @@ authors. Sebastian TΓΆrnquist
Sebastian TΓΆrnquist

πŸ–‹ Sebastian LaVine
Sebastian LaVine

πŸ’» + + Alan Gerber
Alan Gerber

πŸ–‹ + From 545a7262523cfe3074e91314ad621d84e48d81c1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 22 Apr 2023 13:48:42 +0000 Subject: [PATCH 0953/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9c39e5ec..8dd0d928 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2046,6 +2046,15 @@ "contributions": [ "code" ] + }, + { + "login": "akgerber", + "name": "Alan Gerber", + "avatar_url": "https://avatars.githubusercontent.com/u/201313?v=4", + "profile": "http://www.alangerber.us", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From c4627e7112f38a74e677f358bf5eafc7214c5a4f Mon Sep 17 00:00:00 2001 From: PiqqiDesigns Date: Thu, 27 Apr 2023 15:49:40 -0700 Subject: [PATCH 0954/1293] chore: clarified cow owned_no_mutation comments --- exercises/smart_pointers/cow1.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/smart_pointers/cow1.rs b/exercises/smart_pointers/cow1.rs index 885138a7..bc5b28e5 100644 --- a/exercises/smart_pointers/cow1.rs +++ b/exercises/smart_pointers/cow1.rs @@ -52,7 +52,8 @@ mod tests { fn owned_no_mutation() -> Result<(), &'static str> { // We can also pass `slice` without `&` so Cow owns it directly. // In this case no mutation occurs and thus also no clone, - // but the result is still owned because it always was. + // but the result is still owned because it was never borrowed + // or mutated. let slice = vec![0, 1, 2]; let mut input = Cow::from(slice); match abs_all(&mut input) { From 72d0c53b33e45cc55a5eb0c82119b7e393c0c59b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 28 Apr 2023 08:40:17 +0000 Subject: [PATCH 0955/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 0f45c38f..8e4d0fab 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -292,6 +292,7 @@ authors. Alan Gerber
Alan Gerber

πŸ–‹ + Eric
Eric

πŸ–‹ From eb4079c674640b4fc307d5dca7a23dcef33129f2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 28 Apr 2023 08:40:18 +0000 Subject: [PATCH 0956/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8dd0d928..a973b2d7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2055,6 +2055,15 @@ "contributions": [ "content" ] + }, + { + "login": "esotuvaka", + "name": "Eric", + "avatar_url": "https://avatars.githubusercontent.com/u/104941850?v=4", + "profile": "http://esotuvaka.github.io", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 5d3696a9e6bc6251f0c03d17d0d6a7a10ee09115 Mon Sep 17 00:00:00 2001 From: Romain Bayle <5014@holbertonstudents.com> Date: Mon, 1 May 2023 02:49:19 +0200 Subject: [PATCH 0957/1293] feat(cli): added success-hints option for the rustlings command closes #1373 --- src/main.rs | 14 +++++++++----- src/verify.rs | 32 +++++++++++++++++++------------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/main.rs b/src/main.rs index 793b826d..eaa365a4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -37,6 +37,9 @@ struct Args { /// show the executable version #[argh(switch, short = 'v')] version: bool, + /// show hints on success + #[argh(switch)] + success_hints: bool, #[argh(subcommand)] nested: Option, } @@ -148,6 +151,7 @@ fn main() { let toml_str = &fs::read_to_string("info.toml").unwrap(); let exercises = toml::from_str::(toml_str).unwrap().exercises; let verbose = args.nocapture; + let success_hints = args.success_hints; let command = args.nested.unwrap_or_else(|| { println!("{DEFAULT_OUT}\n"); @@ -229,7 +233,7 @@ fn main() { } Subcommands::Verify(_subargs) => { - verify(&exercises, (0, exercises.len()), verbose) + verify(&exercises, (0, exercises.len()), verbose, success_hints) .unwrap_or_else(|_| std::process::exit(1)); } @@ -252,7 +256,7 @@ fn main() { } } - Subcommands::Watch(_subargs) => match watch(&exercises, verbose) { + Subcommands::Watch(_subargs) => match watch(&exercises, verbose, success_hints) { Err(e) => { println!( "Error: Could not watch your progress. Error message was {:?}.", @@ -348,7 +352,7 @@ enum WatchStatus { Unfinished, } -fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result { +fn watch(exercises: &[Exercise], verbose: bool, success_hints: bool) -> notify::Result { /* Clears the terminal with an ANSI escape code. Works in UNIX and newer Windows terminals. */ fn clear_screen() { @@ -364,7 +368,7 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result { clear_screen(); let to_owned_hint = |t: &Exercise| t.hint.to_owned(); - let failed_exercise_hint = match verify(exercises.iter(), (0, exercises.len()), verbose) { + let failed_exercise_hint = match verify(exercises.iter(), (0, exercises.len()), verbose, success_hints) { Ok(_) => return Ok(WatchStatus::Finished), Err(exercise) => Arc::new(Mutex::new(Some(to_owned_hint(exercise)))), }; @@ -386,7 +390,7 @@ fn watch(exercises: &[Exercise], verbose: bool) -> notify::Result { ); let num_done = exercises.iter().filter(|e| e.looks_done()).count(); clear_screen(); - match verify(pending_exercises, (num_done, exercises.len()), verbose) { + match verify(pending_exercises, (num_done, exercises.len()), verbose, success_hints) { Ok(_) => return Ok(WatchStatus::Finished), Err(exercise) => { let mut failed_exercise_hint = failed_exercise_hint.lock().unwrap(); diff --git a/src/verify.rs b/src/verify.rs index 68ba6cef..f3f3b564 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -12,6 +12,7 @@ pub fn verify<'a>( exercises: impl IntoIterator, progress: (usize, usize), verbose: bool, + success_hints: bool, ) -> Result<(), &'a Exercise> { let (num_done, total) = progress; let bar = ProgressBar::new(total as u64); @@ -25,9 +26,9 @@ pub fn verify<'a>( for exercise in exercises { let compile_result = match exercise.mode { - Mode::Test => compile_and_test(exercise, RunMode::Interactive, verbose), - Mode::Compile => compile_and_run_interactively(exercise), - Mode::Clippy => compile_only(exercise), + Mode::Test => compile_and_test(exercise, RunMode::Interactive, verbose, success_hints), + Mode::Compile => compile_and_run_interactively(exercise, success_hints), + Mode::Clippy => compile_only(exercise, success_hints), }; if !compile_result.unwrap_or(false) { return Err(exercise); @@ -46,12 +47,12 @@ enum RunMode { // Compile and run the resulting test harness of the given Exercise pub fn test(exercise: &Exercise, verbose: bool) -> Result<(), ()> { - compile_and_test(exercise, RunMode::NonInteractive, verbose)?; + compile_and_test(exercise, RunMode::NonInteractive, verbose, false)?; Ok(()) } // Invoke the rust compiler without running the resulting binary -fn compile_only(exercise: &Exercise) -> Result { +fn compile_only(exercise: &Exercise, success_hints: bool) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {exercise}...")); progress_bar.enable_steady_tick(100); @@ -59,11 +60,11 @@ fn compile_only(exercise: &Exercise) -> Result { let _ = compile(exercise, &progress_bar)?; progress_bar.finish_and_clear(); - Ok(prompt_for_completion(exercise, None)) + Ok(prompt_for_completion(exercise, None, success_hints)) } // Compile the given Exercise and run the resulting binary in an interactive mode -fn compile_and_run_interactively(exercise: &Exercise) -> Result { +fn compile_and_run_interactively(exercise: &Exercise, success_hints: bool) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {exercise}...")); progress_bar.enable_steady_tick(100); @@ -84,12 +85,12 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result { } }; - Ok(prompt_for_completion(exercise, Some(output.stdout))) + Ok(prompt_for_completion(exercise, Some(output.stdout), success_hints)) } // Compile the given Exercise as a test harness and display // the output if verbose is set to true -fn compile_and_test(exercise: &Exercise, run_mode: RunMode, verbose: bool) -> Result { +fn compile_and_test(exercise: &Exercise, run_mode: RunMode, verbose: bool, success_hints: bool) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Testing {exercise}...")); progress_bar.enable_steady_tick(100); @@ -104,7 +105,7 @@ fn compile_and_test(exercise: &Exercise, run_mode: RunMode, verbose: bool) -> Re println!("{}", output.stdout); } if let RunMode::Interactive = run_mode { - Ok(prompt_for_completion(exercise, None)) + Ok(prompt_for_completion(exercise, None, success_hints)) } else { Ok(true) } @@ -142,12 +143,11 @@ fn compile<'a, 'b>( } } -fn prompt_for_completion(exercise: &Exercise, prompt_output: Option) -> bool { +fn prompt_for_completion(exercise: &Exercise, prompt_output: Option, success_hints: bool) -> bool { let context = match exercise.state() { State::Done => return true, State::Pending(context) => context, }; - match exercise.mode { Mode::Compile => success!("Successfully ran {}!", exercise), Mode::Test => success!("Successfully tested {}!", exercise), @@ -167,7 +167,6 @@ fn prompt_for_completion(exercise: &Exercise, prompt_output: Option) -> Mode::Test => "The code is compiling, and the tests pass!", Mode::Clippy => clippy_success_msg, }; - println!(); if no_emoji { println!("~*~ {success_msg} ~*~") @@ -183,6 +182,13 @@ fn prompt_for_completion(exercise: &Exercise, prompt_output: Option) -> println!("{}", separator()); println!(); } + if success_hints { + println!("Hints:"); + println!("{}", separator()); + println!("{}", exercise.hint); + println!("{}", separator()); + println!(); + } println!("You can keep working on this exercise,"); println!( From e631f3c78bf3f09955353778c8aa377085653d7a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 2 May 2023 11:15:48 +0000 Subject: [PATCH 0958/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 8e4d0fab..164370ab 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -293,6 +293,7 @@ authors. Alan Gerber
Alan Gerber

πŸ–‹ Eric
Eric

πŸ–‹ + Aaron Wang
Aaron Wang

πŸ–‹ From 583925c085308645504b30a323d66b8edf6f798a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 2 May 2023 11:15:49 +0000 Subject: [PATCH 0959/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a973b2d7..0e1b6373 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2064,6 +2064,15 @@ "contributions": [ "content" ] + }, + { + "login": "az0977776", + "name": "Aaron Wang", + "avatar_url": "https://avatars.githubusercontent.com/u/9172038?v=4", + "profile": "https://github.com/az0977776", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From c44e3025f9a5af4b4a7999edddd76b7f7863328a Mon Sep 17 00:00:00 2001 From: Romain Bayle <5014@holbertonstudents.com> Date: Tue, 2 May 2023 22:46:41 +0200 Subject: [PATCH 0960/1293] option success_hints added to the struct Watchargs instead of Args --- src/main.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index eaa365a4..74e8161b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -37,9 +37,6 @@ struct Args { /// show the executable version #[argh(switch, short = 'v')] version: bool, - /// show hints on success - #[argh(switch)] - success_hints: bool, #[argh(subcommand)] nested: Option, } @@ -64,7 +61,11 @@ struct VerifyArgs {} #[derive(FromArgs, PartialEq, Debug)] #[argh(subcommand, name = "watch")] /// Reruns `verify` when files were edited -struct WatchArgs {} +struct WatchArgs { + /// show hints on success + #[argh(switch)] + success_hints: bool, +} #[derive(FromArgs, PartialEq, Debug)] #[argh(subcommand, name = "run")] @@ -151,7 +152,6 @@ fn main() { let toml_str = &fs::read_to_string("info.toml").unwrap(); let exercises = toml::from_str::(toml_str).unwrap().exercises; let verbose = args.nocapture; - let success_hints = args.success_hints; let command = args.nested.unwrap_or_else(|| { println!("{DEFAULT_OUT}\n"); @@ -233,7 +233,7 @@ fn main() { } Subcommands::Verify(_subargs) => { - verify(&exercises, (0, exercises.len()), verbose, success_hints) + verify(&exercises, (0, exercises.len()), verbose, false) .unwrap_or_else(|_| std::process::exit(1)); } @@ -256,7 +256,7 @@ fn main() { } } - Subcommands::Watch(_subargs) => match watch(&exercises, verbose, success_hints) { + Subcommands::Watch(_subargs) => match watch(&exercises, verbose, _subargs.success_hints) { Err(e) => { println!( "Error: Could not watch your progress. Error message was {:?}.", From 3ecb47ff2cf7e5b6b6aa115fba02228896654b60 Mon Sep 17 00:00:00 2001 From: Noah May Date: Tue, 9 May 2023 15:13:18 -0500 Subject: [PATCH 0961/1293] fix(options3): panic when not matching to avoid false positives Closes #1503 --- exercises/options/options3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/options/options3.rs b/exercises/options/options3.rs index 3f995c52..3ed76eeb 100644 --- a/exercises/options/options3.rs +++ b/exercises/options/options3.rs @@ -13,7 +13,7 @@ fn main() { match y { Some(p) => println!("Co-ordinates are {},{} ", p.x, p.y), - _ => println!("no match"), + _ => panic!("no match!"), } y; // Fix without deleting this line. } From 70da26f649adcb7ea583db36a07bc8f285f3f5c3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 08:49:44 +0000 Subject: [PATCH 0962/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 164370ab..f1e43376 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -294,6 +294,7 @@ authors. Alan Gerber
Alan Gerber

πŸ–‹ Eric
Eric

πŸ–‹ Aaron Wang
Aaron Wang

πŸ–‹ + Noah
Noah

πŸ–‹ From 0d252636be6675e24475d821a953cdaf5f1e0f45 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 08:49:45 +0000 Subject: [PATCH 0963/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0e1b6373..47589247 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2073,6 +2073,15 @@ "contributions": [ "content" ] + }, + { + "login": "nmay231", + "name": "Noah", + "avatar_url": "https://avatars.githubusercontent.com/u/35386821?v=4", + "profile": "https://github.com/nmay231", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 70cf7698acbde43025a23d0199057485d8d75ade Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 13:54:39 +0000 Subject: [PATCH 0964/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index f1e43376..ed45690c 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -295,6 +295,7 @@ authors. Eric
Eric

πŸ–‹ Aaron Wang
Aaron Wang

πŸ–‹ Noah
Noah

πŸ–‹ + rb5014
rb5014

πŸ–‹ From c5fe42089d5fe6a15f1e1a18f1a4f8d612f2d3c0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 13:54:40 +0000 Subject: [PATCH 0965/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 47589247..654d2d93 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2082,6 +2082,15 @@ "contributions": [ "content" ] + }, + { + "login": "rb5014", + "name": "rb5014", + "avatar_url": "https://avatars.githubusercontent.com/u/105397317?v=4", + "profile": "https://github.com/rb5014", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 94c6131c59456c70302ee5c3d39114786533daf4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 13:55:28 +0000 Subject: [PATCH 0966/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index ed45690c..8a24e68f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -296,6 +296,7 @@ authors. Aaron Wang
Aaron Wang

πŸ–‹ Noah
Noah

πŸ–‹ rb5014
rb5014

πŸ–‹ + deedy5
deedy5

πŸ–‹ From 6abff3954921aba490b9f135c701ccb5f26595c5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 13:55:29 +0000 Subject: [PATCH 0967/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 654d2d93..35684e39 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2091,6 +2091,15 @@ "contributions": [ "content" ] + }, + { + "login": "deedy5", + "name": "deedy5", + "avatar_url": "https://avatars.githubusercontent.com/u/65482418?v=4", + "profile": "https://github.com/deedy5", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 58cbdd71b64ad8d32d192e56cedd563ebca6fd5b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 13:57:10 +0000 Subject: [PATCH 0968/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 8a24e68f..c1cc60c2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -297,6 +297,7 @@ authors. Noah
Noah

πŸ–‹ rb5014
rb5014

πŸ–‹ deedy5
deedy5

πŸ–‹ + lionel-rowe
lionel-rowe

πŸ–‹ From eeb439eaf9e164307dd2533d5ef082f740f53af3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 13:57:11 +0000 Subject: [PATCH 0969/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 35684e39..56c5e028 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2100,6 +2100,15 @@ "contributions": [ "content" ] + }, + { + "login": "lionel-rowe", + "name": "lionel-rowe", + "avatar_url": "https://avatars.githubusercontent.com/u/26078826?v=4", + "profile": "https://github.com/lionel-rowe", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From a6f99645c6cb1b5493e1fbf16576ab5c0f1dd88c Mon Sep 17 00:00:00 2001 From: liv Date: Wed, 17 May 2023 16:02:39 +0200 Subject: [PATCH 0970/1293] chore: rustfmt --- exercises/iterators/iterators5.rs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/exercises/iterators/iterators5.rs b/exercises/iterators/iterators5.rs index 45f0d485..dcf0742d 100644 --- a/exercises/iterators/iterators5.rs +++ b/exercises/iterators/iterators5.rs @@ -77,7 +77,7 @@ mod tests { } #[test] - fn count_complete_equals_for() { + fn count_complete_equals_for() { let map = get_map(); let progressStates = vec![Progress::Complete, Progress::Some, Progress::None]; for progressState in progressStates { @@ -100,19 +100,13 @@ mod tests { #[test] fn count_collection_some() { let collection = get_vec_map(); - assert_eq!( - 1, - count_collection_iterator(&collection, Progress::Some) - ); + assert_eq!(1, count_collection_iterator(&collection, Progress::Some)); } #[test] fn count_collection_none() { let collection = get_vec_map(); - assert_eq!( - 4, - count_collection_iterator(&collection, Progress::None) - ); + assert_eq!(4, count_collection_iterator(&collection, Progress::None)); } #[test] From 9508e9791495f6e6f4c64b330a6cbba37241fafc Mon Sep 17 00:00:00 2001 From: liv Date: Wed, 17 May 2023 16:14:10 +0200 Subject: [PATCH 0971/1293] feat: write absolute root module paths for lsp --- src/project.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/project.rs b/src/project.rs index 6e483504..7865d927 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,8 +1,9 @@ use glob::glob; use serde::{Deserialize, Serialize}; -use std::env; use std::error::Error; +use std::path::PathBuf; use std::process::Command; +use std::{env, fs}; /// Contains the structure of resulting rust-project.json file /// and functions to build the data required to create the file @@ -38,11 +39,12 @@ impl RustAnalyzerProject { } /// If path contains .rs extension, add a crate to `rust-project.json` - fn path_to_json(&mut self, path: String) { - if let Some((_, ext)) = path.split_once('.') { + fn path_to_json(&mut self, path: PathBuf) -> Result<(), Box> { + if let Some(ext) = path.extension() { if ext == "rs" { + let abspath = fs::canonicalize(path)?; self.crates.push(Crate { - root_module: path, + root_module: abspath.display().to_string(), edition: "2021".to_string(), deps: Vec::new(), // This allows rust_analyzer to work inside #[test] blocks @@ -50,15 +52,16 @@ impl RustAnalyzerProject { }) } } + + Ok(()) } /// Parse the exercises folder for .rs files, any matches will create /// a new `crate` in rust-project.json which allows rust-analyzer to /// treat it like a normal binary pub fn exercises_to_json(&mut self) -> Result<(), Box> { - for e in glob("./exercises/**/*")? { - let path = e?.to_string_lossy().to_string(); - self.path_to_json(path); + for path in glob("./exercises/**/*")? { + self.path_to_json(path?)?; } Ok(()) } From af52fce275ba26b653026fffc5c09a73c7ba5846 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 14:14:43 +0000 Subject: [PATCH 0972/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index c1cc60c2..a27c60e9 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -298,6 +298,7 @@ authors. rb5014
rb5014

πŸ–‹ deedy5
deedy5

πŸ–‹ lionel-rowe
lionel-rowe

πŸ–‹ + Ben
Ben

πŸ–‹ From ab61a0d5c7efb8cc4856587f5354fb2f9024a40a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 14:14:44 +0000 Subject: [PATCH 0973/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 56c5e028..1b9678e0 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2109,6 +2109,15 @@ "contributions": [ "content" ] + }, + { + "login": "Ben2917", + "name": "Ben", + "avatar_url": "https://avatars.githubusercontent.com/u/10279994?v=4", + "profile": "https://github.com/Ben2917", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From f452fd7bb0118d8e56848ec9e3f5e6e733be6316 Mon Sep 17 00:00:00 2001 From: liv Date: Wed, 17 May 2023 16:30:22 +0200 Subject: [PATCH 0974/1293] release: 5.5.0 --- CHANGELOG.md | 35 +++++++++++++++++++++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 8 ++++---- flake.nix | 2 +- src/main.rs | 22 ++++++++++++++++++---- 6 files changed, 60 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c14e7d7..d4d64406 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,38 @@ + +## 5.5.0 (2023-05-17) + +#### Added + +- `strings2`: Added a reference to the book chapter for reference conversion +- `lifetimes`: Added a link to the lifetimekata project +- Added a new `tests4` exercises, which teaches about testing for panics +- Added a `!` prefix command to watch mode that runs an external command +- Added a `--success-hints` option to watch mode that shows hints on exercise success + +#### Changed + +- `vecs2`: Renamed iterator variable bindings for clarify +- `lifetimes`: Changed order of book references +- `hashmaps2`: Clarified instructions in the todo block +- Moved lifetime exercises before test exercises (via the recommended book ordering) +- `options2`: Improved tests for layering options +- `modules2`: Added more information to the hint + +#### Fixed + +- `errors2`: Corrected a comment wording +- `iterators2`: Fixed a spelling mistake in the hint text +- `variables`: Wrapped the mut keyword with backticks for readability +- `move_semantics2`: Removed references to line numbers +- `cow1`: Clarified the `owned_no_mutation` comments +- `options3`: Changed exercise to panic when no match is found +- `rustlings lsp` now generates absolute paths, which should fix VSCode `rust-analyzer` usage on Windows + +#### Housekeeping + +- Added a markdown linter to run on GitHub actions +- Split quick installation section into two code blocks + ## 5.4.1 (2023-03-10) diff --git a/Cargo.lock b/Cargo.lock index 192a4ac0..16f771c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -441,7 +441,7 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "rustlings" -version = "5.4.1" +version = "5.5.0" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index d22816ca..e603bbf0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustlings" -version = "5.4.1" +version = "5.5.0" authors = [ "Liv ", "Carol (Nichols || Goulding) ", diff --git a/README.md b/README.md index be470fdb..92daa332 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,8 @@ This will install Rustlings and give you access to the `rustlings` command. Run Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.1) -git clone -b 5.4.1 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.0) +git clone -b 5.5.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings # if nix version > 2.3 nix develop @@ -74,8 +74,8 @@ If you get a permission denied message, you might have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install --path .`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.1) -git clone -b 5.4.1 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.0) +git clone -b 5.5.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/flake.nix b/flake.nix index 5815a920..c8749197 100644 --- a/flake.nix +++ b/flake.nix @@ -22,7 +22,7 @@ rustlings = pkgs.rustPlatform.buildRustPackage { name = "rustlings"; - version = "5.4.1"; + version = "5.5.0"; buildInputs = cargoBuildInputs; diff --git a/src/main.rs b/src/main.rs index 74e8161b..feb673da 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "5.4.1"; +const VERSION: &str = "5.5.0"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code @@ -352,7 +352,11 @@ enum WatchStatus { Unfinished, } -fn watch(exercises: &[Exercise], verbose: bool, success_hints: bool) -> notify::Result { +fn watch( + exercises: &[Exercise], + verbose: bool, + success_hints: bool, +) -> notify::Result { /* Clears the terminal with an ANSI escape code. Works in UNIX and newer Windows terminals. */ fn clear_screen() { @@ -368,7 +372,12 @@ fn watch(exercises: &[Exercise], verbose: bool, success_hints: bool) -> notify:: clear_screen(); let to_owned_hint = |t: &Exercise| t.hint.to_owned(); - let failed_exercise_hint = match verify(exercises.iter(), (0, exercises.len()), verbose, success_hints) { + let failed_exercise_hint = match verify( + exercises.iter(), + (0, exercises.len()), + verbose, + success_hints, + ) { Ok(_) => return Ok(WatchStatus::Finished), Err(exercise) => Arc::new(Mutex::new(Some(to_owned_hint(exercise)))), }; @@ -390,7 +399,12 @@ fn watch(exercises: &[Exercise], verbose: bool, success_hints: bool) -> notify:: ); let num_done = exercises.iter().filter(|e| e.looks_done()).count(); clear_screen(); - match verify(pending_exercises, (num_done, exercises.len()), verbose, success_hints) { + match verify( + pending_exercises, + (num_done, exercises.len()), + verbose, + success_hints, + ) { Ok(_) => return Ok(WatchStatus::Finished), Err(exercise) => { let mut failed_exercise_hint = failed_exercise_hint.lock().unwrap(); From 19cee732094c59669f29ce941ad87f5a90af6bf8 Mon Sep 17 00:00:00 2001 From: liv Date: Wed, 17 May 2023 16:56:01 +0200 Subject: [PATCH 0975/1293] chore: set up oranda Sets up oranda so we can get nice website things for free. Some caveats we have right now: - Absolutely manual, I have to do `oranda build` and the deploy manually right now - I had to pop the Readme into a new Markdown file because the first header in there was looking very strange --- .gitignore | 4 ++ Cargo.toml | 1 + oranda.json | 11 ++++ website.md | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 192 insertions(+) create mode 100644 oranda.json create mode 100644 website.md diff --git a/.gitignore b/.gitignore index c14f9227..88bf2b6c 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,7 @@ rust-project.json !.vscode/extensions.json *.iml *.o +public/ + +# Local Netlify folder +.netlify diff --git a/Cargo.toml b/Cargo.toml index e603bbf0..498bbf9b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [package] name = "rustlings" +description = "Small exercises to get you used to reading and writing Rust code!" version = "5.5.0" authors = [ "Liv ", diff --git a/oranda.json b/oranda.json new file mode 100644 index 00000000..503653a4 --- /dev/null +++ b/oranda.json @@ -0,0 +1,11 @@ +{ + "homepage": "https://rustlings.cool", + "readme_path": "website.md", + "repository": "https://github.com/rust-lang/rustlings", + "analytics": { + "plausible": { + "domain": "rustlings.cool" + } + }, + "changelog": true +} diff --git a/website.md b/website.md new file mode 100644 index 00000000..92bedc8c --- /dev/null +++ b/website.md @@ -0,0 +1,176 @@ +Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages! + +Alternatively, for a first-time Rust learner, there are several other resources: + +- [The Book](https://doc.rust-lang.org/book/index.html) - The most comprehensive resource for learning Rust, but a bit theoretical sometimes. You will be using this along with Rustlings! +- [Rust By Example](https://doc.rust-lang.org/rust-by-example/index.html) - Learn Rust by solving little exercises! It's almost like `rustlings`, but online + +## Getting Started + +_Note: If you're on MacOS, make sure you've installed Xcode and its developer tools by typing `xcode-select --install`._ +_Note: If you're on Linux, make sure you've installed gcc. Deb: `sudo apt install gcc`. Yum: `sudo yum -y install gcc`._ + +You will need to have Rust installed. You can get it by visiting https://rustup.rs. This'll also install Cargo, Rust's package/project manager. + +## MacOS/Linux + +Just run: + +```bash +curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash +``` + +Or if you want it to be installed to a different path: + +```bash +curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash -s mypath/ +``` + +This will install Rustlings and give you access to the `rustlings` command. Run it to get started! + +### Nix + +Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`. + +```bash +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.0) +git clone -b 5.5.0 --depth 1 https://github.com/rust-lang/rustlings +cd rustlings +# if nix version > 2.3 +nix develop +# if nix version <= 2.3 +nix-shell +``` + +## Windows + +In PowerShell (Run as Administrator), set `ExecutionPolicy` to `RemoteSigned`: + +```ps1 +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser +``` + +Then, you can run: + +```ps1 +Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 +``` + +To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. Keep in mind that this works best in PowerShell, and any other terminals may give you errors. + +If you get a permission denied message, you might have to exclude the directory where you cloned Rustlings in your antivirus. + +## Browser + +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/rust-lang/rustlings) + +[![Open Rustlings On Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/?repo=rust-lang%2Frustlings&ref=main) + +## Manually + +Basically: Clone the repository at the latest tag, run `cargo install --path .`. + +```bash +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.0) +git clone -b 5.5.0 --depth 1 https://github.com/rust-lang/rustlings +cd rustlings +cargo install --force --path . +``` + +If there are installation errors, ensure that your toolchain is up to date. For the latest, run: + +```bash +rustup update +``` + +Then, same as above, run `rustlings` to get started. + +## Doing exercises + +The exercises are sorted by topic and can be found in the subdirectory `rustlings/exercises/`. For every topic there is an additional README file with some resources to get you started on the topic. We really recommend that you have a look at them before you start. + +The task is simple. Most exercises contain an error that keeps them from compiling, and it's up to you to fix it! Some exercises are also run as tests, but rustlings handles them all the same. To run the exercises in the recommended order, execute: + +```bash +rustlings watch +``` + +This will try to verify the completion of every exercise in a predetermined order (what we think is best for newcomers). It will also rerun automatically every time you change a file in the `exercises/` directory. If you want to only run it once, you can use: + +```bash +rustlings verify +``` + +This will do the same as watch, but it'll quit after running. + +In case you want to go by your own order, or want to only verify a single exercise, you can run: + +```bash +rustlings run myExercise1 +``` + +Or simply use the following command to run the next unsolved exercise in the course: + +```bash +rustlings run next +``` + +In case you get stuck, you can run the following command to get a hint for your +exercise: + +```bash +rustlings hint myExercise1 +``` + +You can also get the hint for the next unsolved exercise with the following command: + +```bash +rustlings hint next +``` + +To check your progress, you can run the following command: + +```bash +rustlings list +``` + +## Testing yourself + +After every couple of sections, there will be a quiz that'll test your knowledge on a bunch of sections at once. These quizzes are found in `exercises/quizN.rs`. + +## Enabling `rust-analyzer` + +Run the command `rustlings lsp` which will generate a `rust-project.json` at the root of the project, this allows [rust-analyzer](https://rust-analyzer.github.io/) to parse each exercise. + +## Continuing On + +Once you've completed Rustlings, put your new knowledge to good use! Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to. + +## Uninstalling Rustlings + +If you want to remove Rustlings from your system, there are two steps. First, you'll need to remove the exercises folder that the install script created +for you: + +```bash +rm -rf rustlings # or your custom folder name, if you chose and or renamed it +``` + +Second, run `cargo uninstall` to remove the `rustlings` binary: + +```bash +cargo uninstall rustlings +``` + +Now you should be done! + +## Contributing + +See [CONTRIBUTING.md](./CONTRIBUTING.md). + +Development-focused discussion about Rustlings happens in the [**rustlings** stream](https://rust-lang.zulipchat.com/#narrow/stream/334454-rustlings) +on the [Rust Project Zulip](https://rust-lang.zulipchat.com). Feel free to start a new thread there +if you have ideas or suggestions! + +## Contributors ✨ + +Thanks goes to the wonderful people listed in [AUTHORS.md](./AUTHORS.md) πŸŽ‰ From 0667ee7c4d2af44c98aff8db96887ddf40055c49 Mon Sep 17 00:00:00 2001 From: liv Date: Wed, 17 May 2023 17:11:49 +0200 Subject: [PATCH 0976/1293] fix: add oranda-hide class to readme --- README.md | 4 ++ oranda.json | 1 - website.md | 176 ---------------------------------------------------- 3 files changed, 4 insertions(+), 177 deletions(-) delete mode 100644 website.md diff --git a/README.md b/README.md index 92daa332..a6060a73 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ +
+ # rustlings πŸ¦€β€οΈ +
+ Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages! _...looking for the old, web-based version of Rustlings? Try [here](https://github.com/rust-lang/rustlings/tree/rustlings-1)_ diff --git a/oranda.json b/oranda.json index 503653a4..08cc234d 100644 --- a/oranda.json +++ b/oranda.json @@ -1,6 +1,5 @@ { "homepage": "https://rustlings.cool", - "readme_path": "website.md", "repository": "https://github.com/rust-lang/rustlings", "analytics": { "plausible": { diff --git a/website.md b/website.md deleted file mode 100644 index 92bedc8c..00000000 --- a/website.md +++ /dev/null @@ -1,176 +0,0 @@ -Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages! - -Alternatively, for a first-time Rust learner, there are several other resources: - -- [The Book](https://doc.rust-lang.org/book/index.html) - The most comprehensive resource for learning Rust, but a bit theoretical sometimes. You will be using this along with Rustlings! -- [Rust By Example](https://doc.rust-lang.org/rust-by-example/index.html) - Learn Rust by solving little exercises! It's almost like `rustlings`, but online - -## Getting Started - -_Note: If you're on MacOS, make sure you've installed Xcode and its developer tools by typing `xcode-select --install`._ -_Note: If you're on Linux, make sure you've installed gcc. Deb: `sudo apt install gcc`. Yum: `sudo yum -y install gcc`._ - -You will need to have Rust installed. You can get it by visiting https://rustup.rs. This'll also install Cargo, Rust's package/project manager. - -## MacOS/Linux - -Just run: - -```bash -curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash -``` - -Or if you want it to be installed to a different path: - -```bash -curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash -s mypath/ -``` - -This will install Rustlings and give you access to the `rustlings` command. Run it to get started! - -### Nix - -Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`. - -```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.0) -git clone -b 5.5.0 --depth 1 https://github.com/rust-lang/rustlings -cd rustlings -# if nix version > 2.3 -nix develop -# if nix version <= 2.3 -nix-shell -``` - -## Windows - -In PowerShell (Run as Administrator), set `ExecutionPolicy` to `RemoteSigned`: - -```ps1 -Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -``` - -Then, you can run: - -```ps1 -Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 -``` - -To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. Keep in mind that this works best in PowerShell, and any other terminals may give you errors. - -If you get a permission denied message, you might have to exclude the directory where you cloned Rustlings in your antivirus. - -## Browser - -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/rust-lang/rustlings) - -[![Open Rustlings On Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/?repo=rust-lang%2Frustlings&ref=main) - -## Manually - -Basically: Clone the repository at the latest tag, run `cargo install --path .`. - -```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.0) -git clone -b 5.5.0 --depth 1 https://github.com/rust-lang/rustlings -cd rustlings -cargo install --force --path . -``` - -If there are installation errors, ensure that your toolchain is up to date. For the latest, run: - -```bash -rustup update -``` - -Then, same as above, run `rustlings` to get started. - -## Doing exercises - -The exercises are sorted by topic and can be found in the subdirectory `rustlings/exercises/`. For every topic there is an additional README file with some resources to get you started on the topic. We really recommend that you have a look at them before you start. - -The task is simple. Most exercises contain an error that keeps them from compiling, and it's up to you to fix it! Some exercises are also run as tests, but rustlings handles them all the same. To run the exercises in the recommended order, execute: - -```bash -rustlings watch -``` - -This will try to verify the completion of every exercise in a predetermined order (what we think is best for newcomers). It will also rerun automatically every time you change a file in the `exercises/` directory. If you want to only run it once, you can use: - -```bash -rustlings verify -``` - -This will do the same as watch, but it'll quit after running. - -In case you want to go by your own order, or want to only verify a single exercise, you can run: - -```bash -rustlings run myExercise1 -``` - -Or simply use the following command to run the next unsolved exercise in the course: - -```bash -rustlings run next -``` - -In case you get stuck, you can run the following command to get a hint for your -exercise: - -```bash -rustlings hint myExercise1 -``` - -You can also get the hint for the next unsolved exercise with the following command: - -```bash -rustlings hint next -``` - -To check your progress, you can run the following command: - -```bash -rustlings list -``` - -## Testing yourself - -After every couple of sections, there will be a quiz that'll test your knowledge on a bunch of sections at once. These quizzes are found in `exercises/quizN.rs`. - -## Enabling `rust-analyzer` - -Run the command `rustlings lsp` which will generate a `rust-project.json` at the root of the project, this allows [rust-analyzer](https://rust-analyzer.github.io/) to parse each exercise. - -## Continuing On - -Once you've completed Rustlings, put your new knowledge to good use! Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to. - -## Uninstalling Rustlings - -If you want to remove Rustlings from your system, there are two steps. First, you'll need to remove the exercises folder that the install script created -for you: - -```bash -rm -rf rustlings # or your custom folder name, if you chose and or renamed it -``` - -Second, run `cargo uninstall` to remove the `rustlings` binary: - -```bash -cargo uninstall rustlings -``` - -Now you should be done! - -## Contributing - -See [CONTRIBUTING.md](./CONTRIBUTING.md). - -Development-focused discussion about Rustlings happens in the [**rustlings** stream](https://rust-lang.zulipchat.com/#narrow/stream/334454-rustlings) -on the [Rust Project Zulip](https://rust-lang.zulipchat.com). Feel free to start a new thread there -if you have ideas or suggestions! - -## Contributors ✨ - -Thanks goes to the wonderful people listed in [AUTHORS.md](./AUTHORS.md) πŸŽ‰ From 2d544f18b53102a11bc80be4e986c7f52f5262de Mon Sep 17 00:00:00 2001 From: liv Date: Wed, 17 May 2023 21:04:32 +0200 Subject: [PATCH 0977/1293] fix: revert back to using relative paths --- src/project.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/project.rs b/src/project.rs index 7865d927..ebebe27d 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,9 +1,9 @@ use glob::glob; use serde::{Deserialize, Serialize}; +use std::env; use std::error::Error; use std::path::PathBuf; use std::process::Command; -use std::{env, fs}; /// Contains the structure of resulting rust-project.json file /// and functions to build the data required to create the file @@ -42,9 +42,8 @@ impl RustAnalyzerProject { fn path_to_json(&mut self, path: PathBuf) -> Result<(), Box> { if let Some(ext) = path.extension() { if ext == "rs" { - let abspath = fs::canonicalize(path)?; self.crates.push(Crate { - root_module: abspath.display().to_string(), + root_module: path.display().to_string(), edition: "2021".to_string(), deps: Vec::new(), // This allows rust_analyzer to work inside #[test] blocks From f2de12aa3443af2e989a045d9035294184d36eee Mon Sep 17 00:00:00 2001 From: liv Date: Wed, 17 May 2023 21:05:51 +0200 Subject: [PATCH 0978/1293] release: 5.5.1 --- CHANGELOG.md | 7 +++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 8 ++++---- flake.nix | 2 +- src/main.rs | 2 +- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4d64406..a802faaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ + +## 5.5.1 (2023-05-17) + +#### Fixed + +- Reverted `rust-project.json` path generation due to an upstream `rust-analyzer` fix. + ## 5.5.0 (2023-05-17) diff --git a/Cargo.lock b/Cargo.lock index 16f771c7..a09d98f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -441,7 +441,7 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "rustlings" -version = "5.5.0" +version = "5.5.1" dependencies = [ "argh", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index 498bbf9b..eca091f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustlings" description = "Small exercises to get you used to reading and writing Rust code!" -version = "5.5.0" +version = "5.5.1" authors = [ "Liv ", "Carol (Nichols || Goulding) ", diff --git a/README.md b/README.md index a6060a73..12bd3925 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,8 @@ This will install Rustlings and give you access to the `rustlings` command. Run Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.0) -git clone -b 5.5.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.1) +git clone -b 5.5.1 --depth 1 https://github.com/rust-lang/rustlings cd rustlings # if nix version > 2.3 nix develop @@ -78,8 +78,8 @@ If you get a permission denied message, you might have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install --path .`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.0) -git clone -b 5.5.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.1) +git clone -b 5.5.1 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/flake.nix b/flake.nix index c8749197..5dbca5c2 100644 --- a/flake.nix +++ b/flake.nix @@ -22,7 +22,7 @@ rustlings = pkgs.rustPlatform.buildRustPackage { name = "rustlings"; - version = "5.5.0"; + version = "5.5.1"; buildInputs = cargoBuildInputs; diff --git a/src/main.rs b/src/main.rs index feb673da..0a9af2ec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ mod run; mod verify; // In sync with crate version -const VERSION: &str = "5.5.0"; +const VERSION: &str = "5.5.1"; #[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code From a7257a1d1ef59642f692e2638085ec00a6f2f391 Mon Sep 17 00:00:00 2001 From: b1ue64 <77976308+b1ue64@users.noreply.github.com> Date: Sat, 20 May 2023 16:38:33 -0400 Subject: [PATCH 0979/1293] feat(iterators5): remove outdated part of hint --- info.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/info.toml b/info.toml index ac04fc7d..2add5f0c 100644 --- a/info.toml +++ b/info.toml @@ -897,9 +897,6 @@ hint = """ The documentation for the std::iter::Iterator trait contains numerous methods that would be helpful here. -Return 0 from count_collection_iterator to make the code compile in order to -test count_iterator. - The collection variable in count_collection_iterator is a slice of HashMaps. It needs to be converted into an iterator in order to use the iterator methods. From 8e62346f8625965f1dac9603f3297e726670b3d3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 21 May 2023 09:39:25 +0000 Subject: [PATCH 0980/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index a27c60e9..e0631ce8 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -300,6 +300,9 @@ authors. lionel-rowe
lionel-rowe

πŸ–‹ Ben
Ben

πŸ–‹ + + b1ue64
b1ue64

πŸ–‹ + From 15ad02c984ef355a451189b2708b93112afc1840 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 21 May 2023 09:39:26 +0000 Subject: [PATCH 0981/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 1b9678e0..7978d245 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2118,6 +2118,15 @@ "contributions": [ "content" ] + }, + { + "login": "b1ue64", + "name": "b1ue64", + "avatar_url": "https://avatars.githubusercontent.com/u/77976308?v=4", + "profile": "https://github.com/b1ue64", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From e35a84fcb3f448aa3c455fab8c3a6a13fd47e606 Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 22 May 2023 11:09:57 +0200 Subject: [PATCH 0982/1293] chore(oranda): don't generate changelog pages --- oranda.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oranda.json b/oranda.json index 08cc234d..18ef8c68 100644 --- a/oranda.json +++ b/oranda.json @@ -6,5 +6,5 @@ "domain": "rustlings.cool" } }, - "changelog": true + "changelog": false } From 9604ab66218a83710e0da1152ec75b5574f051a8 Mon Sep 17 00:00:00 2001 From: lazywalker Date: Tue, 23 May 2023 15:00:55 +0800 Subject: [PATCH 0983/1293] fix(exercises): use snake_case variables --- exercises/iterators/iterators5.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/exercises/iterators/iterators5.rs b/exercises/iterators/iterators5.rs index dcf0742d..d0fcc8ca 100644 --- a/exercises/iterators/iterators5.rs +++ b/exercises/iterators/iterators5.rs @@ -79,11 +79,11 @@ mod tests { #[test] fn count_complete_equals_for() { let map = get_map(); - let progressStates = vec![Progress::Complete, Progress::Some, Progress::None]; - for progressState in progressStates { + let progress_states = vec![Progress::Complete, Progress::Some, Progress::None]; + for progress_state in progress_states { assert_eq!( - count_for(&map, progressState), - count_iterator(&map, progressState) + count_for(&map, progress_state), + count_iterator(&map, progress_state) ); } } @@ -111,13 +111,13 @@ mod tests { #[test] fn count_collection_equals_for() { - let progressStates = vec![Progress::Complete, Progress::Some, Progress::None]; + let progress_states = vec![Progress::Complete, Progress::Some, Progress::None]; let collection = get_vec_map(); - for progressState in progressStates { + for progress_state in progress_states { assert_eq!( - count_collection_for(&collection, progressState), - count_collection_iterator(&collection, progressState) + count_collection_for(&collection, progress_state), + count_collection_iterator(&collection, progress_state) ); } } From b9cb9311672babb938127385a102a645d86e4cac Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 23 May 2023 09:05:58 +0000 Subject: [PATCH 0984/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index e0631ce8..50a477c0 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -302,6 +302,7 @@ authors. b1ue64
b1ue64

πŸ–‹ + lazywalker
lazywalker

πŸ–‹ From 33224370eb98da79a2a0b1d6a470cfa6edab83f2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 23 May 2023 09:05:59 +0000 Subject: [PATCH 0985/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7978d245..14ec3a98 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2127,6 +2127,15 @@ "contributions": [ "content" ] + }, + { + "login": "lazywalker", + "name": "lazywalker", + "avatar_url": "https://avatars.githubusercontent.com/u/53956?v=4", + "profile": "https://github.com/lazywalker", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 7eef5d15eef780f93e22b1b4e0185f7708219ea0 Mon Sep 17 00:00:00 2001 From: Robert Fry Date: Mon, 29 May 2023 18:39:08 +0100 Subject: [PATCH 0986/1293] docs: cleanup the explanation paragraphs at the start of each exercise. --- exercises/clippy/clippy1.rs | 13 +++--- exercises/clippy/clippy2.rs | 4 +- exercises/clippy/clippy3.rs | 3 ++ exercises/conversions/as_ref_mut.rs | 12 ++++-- exercises/conversions/from_into.rs | 40 +++++++++++-------- exercises/conversions/from_str.rs | 30 ++++++++------ exercises/conversions/try_from_into.rs | 27 +++++++------ exercises/conversions/using_as.rs | 16 +++++--- exercises/enums/enums1.rs | 1 + exercises/enums/enums2.rs | 4 +- exercises/enums/enums3.rs | 11 +++-- exercises/error_handling/errors1.rs | 14 ++++--- exercises/error_handling/errors2.rs | 30 +++++++------- exercises/error_handling/errors3.rs | 5 ++- exercises/error_handling/errors4.rs | 4 +- exercises/error_handling/errors5.rs | 36 ++++++++++------- exercises/error_handling/errors6.rs | 13 +++--- exercises/functions/functions1.rs | 4 +- exercises/functions/functions2.rs | 4 +- exercises/functions/functions3.rs | 4 +- exercises/functions/functions4.rs | 15 +++---- exercises/functions/functions5.rs | 4 +- exercises/generics/generics1.rs | 11 +++-- exercises/generics/generics2.rs | 7 +++- exercises/hashmaps/hashmaps1.rs | 15 +++---- exercises/hashmaps/hashmaps2.rs | 27 +++++++------ exercises/hashmaps/hashmaps3.rs | 24 +++++------ exercises/if/if1.rs | 1 + exercises/if/if2.rs | 3 +- exercises/intro/intro1.rs | 12 ++++-- exercises/intro/intro2.rs | 5 ++- exercises/iterators/iterators1.rs | 11 ++--- exercises/iterators/iterators2.rs | 5 ++- exercises/iterators/iterators3.rs | 15 ++++--- exercises/iterators/iterators4.rs | 4 +- exercises/iterators/iterators5.rs | 5 ++- exercises/lifetimes/lifetimes1.rs | 9 +++-- exercises/lifetimes/lifetimes2.rs | 8 ++-- exercises/lifetimes/lifetimes3.rs | 3 +- exercises/macros/macros1.rs | 4 +- exercises/macros/macros2.rs | 4 +- exercises/macros/macros3.rs | 5 ++- exercises/macros/macros4.rs | 4 +- exercises/modules/modules1.rs | 4 +- exercises/modules/modules2.rs | 10 +++-- exercises/modules/modules3.rs | 13 +++--- exercises/move_semantics/move_semantics1.rs | 4 +- exercises/move_semantics/move_semantics2.rs | 6 ++- exercises/move_semantics/move_semantics3.rs | 9 +++-- exercises/move_semantics/move_semantics4.rs | 11 +++-- exercises/move_semantics/move_semantics5.rs | 9 +++-- exercises/move_semantics/move_semantics6.rs | 5 ++- exercises/options/options1.rs | 12 ++++-- exercises/options/options2.rs | 9 +++-- exercises/options/options3.rs | 4 +- exercises/primitive_types/primitive_types1.rs | 8 +++- exercises/primitive_types/primitive_types2.rs | 8 +++- exercises/primitive_types/primitive_types3.rs | 5 ++- exercises/primitive_types/primitive_types4.rs | 5 ++- exercises/primitive_types/primitive_types5.rs | 5 ++- exercises/primitive_types/primitive_types6.rs | 9 +++-- exercises/quiz1.rs | 9 +++-- exercises/quiz2.rs | 10 +++-- exercises/quiz3.rs | 20 +++++----- exercises/smart_pointers/arc1.rs | 19 +++++---- exercises/smart_pointers/box1.rs | 16 ++++---- exercises/smart_pointers/cow1.rs | 29 ++++++++------ exercises/smart_pointers/rc1.rs | 15 ++++--- exercises/strings/strings1.rs | 5 ++- exercises/strings/strings2.rs | 5 ++- exercises/strings/strings3.rs | 4 +- exercises/strings/strings4.rs | 3 +- exercises/structs/structs1.rs | 5 ++- exercises/structs/structs2.rs | 5 ++- exercises/structs/structs3.rs | 5 ++- exercises/tests/tests1.rs | 17 ++++---- exercises/tests/tests2.rs | 9 +++-- exercises/tests/tests3.rs | 9 +++-- exercises/tests/tests4.rs | 5 ++- exercises/threads/threads1.rs | 14 ++++--- exercises/threads/threads2.rs | 15 ++++--- exercises/threads/threads3.rs | 4 +- exercises/traits/traits1.rs | 12 +++--- exercises/traits/traits2.rs | 11 ++--- exercises/traits/traits3.rs | 9 +++-- exercises/traits/traits4.rs | 5 ++- exercises/traits/traits5.rs | 5 ++- exercises/variables/variables1.rs | 5 ++- exercises/variables/variables2.rs | 4 +- exercises/variables/variables3.rs | 4 +- exercises/variables/variables4.rs | 4 +- exercises/variables/variables5.rs | 4 +- exercises/variables/variables6.rs | 4 +- exercises/vecs/vecs1.rs | 7 +++- exercises/vecs/vecs2.rs | 5 ++- 95 files changed, 577 insertions(+), 337 deletions(-) diff --git a/exercises/clippy/clippy1.rs b/exercises/clippy/clippy1.rs index bad46891..95c0141f 100644 --- a/exercises/clippy/clippy1.rs +++ b/exercises/clippy/clippy1.rs @@ -1,10 +1,13 @@ // clippy1.rs -// The Clippy tool is a collection of lints to analyze your code -// so you can catch common mistakes and improve your Rust code. // -// For these exercises the code will fail to compile when there are clippy warnings -// check clippy's suggestions from the output to solve the exercise. -// Execute `rustlings hint clippy1` or use the `hint` watch subcommand for a hint. +// The Clippy tool is a collection of lints to analyze your code so you can +// catch common mistakes and improve your Rust code. +// +// For these exercises the code will fail to compile when there are clippy +// warnings check clippy's suggestions from the output to solve the exercise. +// +// Execute `rustlings hint clippy1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/clippy/clippy2.rs b/exercises/clippy/clippy2.rs index dac40dbe..9b87a0b7 100644 --- a/exercises/clippy/clippy2.rs +++ b/exercises/clippy/clippy2.rs @@ -1,5 +1,7 @@ // clippy2.rs -// Execute `rustlings hint clippy2` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint clippy2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/clippy/clippy3.rs b/exercises/clippy/clippy3.rs index b0159ebe..35021f84 100644 --- a/exercises/clippy/clippy3.rs +++ b/exercises/clippy/clippy3.rs @@ -1,5 +1,8 @@ // clippy3.rs +// // Here's a couple more easy Clippy fixes, so you can see its utility. +// +// Execute `rustlings hint clippy3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index e6a9d114..626a36c4 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -1,7 +1,11 @@ -// AsRef and AsMut allow for cheap reference-to-reference conversions. -// Read more about them at https://doc.rust-lang.org/std/convert/trait.AsRef.html -// and https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively. -// Execute `rustlings hint as_ref_mut` or use the `hint` watch subcommand for a hint. +// as_ref_mut.rs +// +// AsRef and AsMut allow for cheap reference-to-reference conversions. Read more +// about them at https://doc.rust-lang.org/std/convert/trait.AsRef.html and +// https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively. +// +// Execute `rustlings hint as_ref_mut` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs index 6c272c3b..aba471d9 100644 --- a/exercises/conversions/from_into.rs +++ b/exercises/conversions/from_into.rs @@ -1,7 +1,11 @@ -// The From trait is used for value-to-value conversions. -// If From is implemented correctly for a type, the Into trait should work conversely. -// You can read more about it at https://doc.rust-lang.org/std/convert/trait.From.html -// Execute `rustlings hint from_into` or use the `hint` watch subcommand for a hint. +// from_into.rs +// +// The From trait is used for value-to-value conversions. If From is implemented +// correctly for a type, the Into trait should work conversely. You can read +// more about it at https://doc.rust-lang.org/std/convert/trait.From.html +// +// Execute `rustlings hint from_into` or use the `hint` watch subcommand for a +// hint. #[derive(Debug)] struct Person { @@ -20,20 +24,21 @@ impl Default for Person { } } -// Your task is to complete this implementation -// in order for the line `let p = Person::from("Mark,20")` to compile -// Please note that you'll need to parse the age component into a `usize` -// with something like `"4".parse::()`. The outcome of this needs to -// be handled appropriately. +// Your task is to complete this implementation in order for the line `let p = +// Person::from("Mark,20")` to compile Please note that you'll need to parse the +// age component into a `usize` with something like `"4".parse::()`. The +// outcome of this needs to be handled appropriately. // // Steps: -// 1. If the length of the provided string is 0, then return the default of Person -// 2. Split the given string on the commas present in it -// 3. Extract the first element from the split operation and use it as the name -// 4. If the name is empty, then return the default of Person -// 5. Extract the other element from the split operation and parse it into a `usize` as the age -// If while parsing the age, something goes wrong, then return the default of Person -// Otherwise, then return an instantiated Person object with the results +// 1. If the length of the provided string is 0, then return the default of +// Person. +// 2. Split the given string on the commas present in it. +// 3. Extract the first element from the split operation and use it as the name. +// 4. If the name is empty, then return the default of Person. +// 5. Extract the other element from the split operation and parse it into a +// `usize` as the age. +// If while parsing the age, something goes wrong, then return the default of +// Person Otherwise, then return an instantiated Person object with the results // I AM NOT DONE @@ -77,7 +82,8 @@ mod tests { } #[test] fn test_bad_age() { - // Test that "Mark,twenty" will return the default person due to an error in parsing age + // Test that "Mark,twenty" will return the default person due to an + // error in parsing age let p = Person::from("Mark,twenty"); assert_eq!(p.name, "John"); assert_eq!(p.age, 30); diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index fe168159..34472c32 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -1,10 +1,13 @@ // from_str.rs -// This is similar to from_into.rs, but this time we'll implement `FromStr` -// and return errors instead of falling back to a default value. -// Additionally, upon implementing FromStr, you can use the `parse` method -// on strings to generate an object of the implementor type. -// You can read more about it at https://doc.rust-lang.org/std/str/trait.FromStr.html -// Execute `rustlings hint from_str` or use the `hint` watch subcommand for a hint. +// +// This is similar to from_into.rs, but this time we'll implement `FromStr` and +// return errors instead of falling back to a default value. Additionally, upon +// implementing FromStr, you can use the `parse` method on strings to generate +// an object of the implementor type. You can read more about it at +// https://doc.rust-lang.org/std/str/trait.FromStr.html +// +// Execute `rustlings hint from_str` or use the `hint` watch subcommand for a +// hint. use std::num::ParseIntError; use std::str::FromStr; @@ -33,15 +36,18 @@ enum ParsePersonError { // Steps: // 1. If the length of the provided string is 0, an error should be returned // 2. Split the given string on the commas present in it -// 3. Only 2 elements should be returned from the split, otherwise return an error +// 3. Only 2 elements should be returned from the split, otherwise return an +// error // 4. Extract the first element from the split operation and use it as the name -// 5. Extract the other element from the split operation and parse it into a `usize` as the age -// with something like `"4".parse::()` -// 6. If while extracting the name and the age something goes wrong, an error should be returned +// 5. Extract the other element from the split operation and parse it into a +// `usize` as the age with something like `"4".parse::()` +// 6. If while extracting the name and the age something goes wrong, an error +// should be returned // If everything goes well, then return a Result of a Person object // -// As an aside: `Box` implements `From<&'_ str>`. This means that if you want to return a -// string error message, you can do so via just using return `Err("my error message".into())`. +// As an aside: `Box` implements `From<&'_ str>`. This means that if +// you want to return a string error message, you can do so via just using +// return `Err("my error message".into())`. impl FromStr for Person { type Err = ParsePersonError; diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index fa98bc90..32d6ef39 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -1,9 +1,13 @@ // try_from_into.rs -// TryFrom is a simple and safe type conversion that may fail in a controlled way under some circumstances. -// Basically, this is the same as From. The main difference is that this should return a Result type -// instead of the target type itself. -// You can read more about it at https://doc.rust-lang.org/std/convert/trait.TryFrom.html -// Execute `rustlings hint try_from_into` or use the `hint` watch subcommand for a hint. +// +// TryFrom is a simple and safe type conversion that may fail in a controlled +// way under some circumstances. Basically, this is the same as From. The main +// difference is that this should return a Result type instead of the target +// type itself. You can read more about it at +// https://doc.rust-lang.org/std/convert/trait.TryFrom.html +// +// Execute `rustlings hint try_from_into` or use the `hint` watch subcommand for +// a hint. use std::convert::{TryFrom, TryInto}; @@ -25,14 +29,13 @@ enum IntoColorError { // I AM NOT DONE -// Your task is to complete this implementation -// and return an Ok result of inner type Color. -// You need to create an implementation for a tuple of three integers, -// an array of three integers, and a slice of integers. +// Your task is to complete this implementation and return an Ok result of inner +// type Color. You need to create an implementation for a tuple of three +// integers, an array of three integers, and a slice of integers. // -// Note that the implementation for tuple and array will be checked at compile time, -// but the slice implementation needs to check the slice length! -// Also note that correct RGB color values must be integers in the 0..=255 range. +// Note that the implementation for tuple and array will be checked at compile +// time, but the slice implementation needs to check the slice length! Also note +// that correct RGB color values must be integers in the 0..=255 range. // Tuple implementation impl TryFrom<(i16, i16, i16)> for Color { diff --git a/exercises/conversions/using_as.rs b/exercises/conversions/using_as.rs index 8c9b7113..414cef3a 100644 --- a/exercises/conversions/using_as.rs +++ b/exercises/conversions/using_as.rs @@ -1,10 +1,14 @@ -// Type casting in Rust is done via the usage of the `as` operator. -// Please note that the `as` operator is not only used when type casting. -// It also helps with renaming imports. +// using_as.rs // -// The goal is to make sure that the division does not fail to compile -// and returns the proper type. -// Execute `rustlings hint using_as` or use the `hint` watch subcommand for a hint. +// Type casting in Rust is done via the usage of the `as` operator. Please note +// that the `as` operator is not only used when type casting. It also helps with +// renaming imports. +// +// The goal is to make sure that the division does not fail to compile and +// returns the proper type. +// +// Execute `rustlings hint using_as` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/enums/enums1.rs b/exercises/enums/enums1.rs index 511ba740..25525b25 100644 --- a/exercises/enums/enums1.rs +++ b/exercises/enums/enums1.rs @@ -1,4 +1,5 @@ // enums1.rs +// // No hints this time! ;) // I AM NOT DONE diff --git a/exercises/enums/enums2.rs b/exercises/enums/enums2.rs index 167a6b2e..df93fe0f 100644 --- a/exercises/enums/enums2.rs +++ b/exercises/enums/enums2.rs @@ -1,5 +1,7 @@ // enums2.rs -// Execute `rustlings hint enums2` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint enums2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs index a2a9d586..69ba0728 100644 --- a/exercises/enums/enums3.rs +++ b/exercises/enums/enums3.rs @@ -1,6 +1,9 @@ // enums3.rs +// // Address all the TODOs to make the tests pass! -// Execute `rustlings hint enums3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint enums3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE @@ -37,8 +40,10 @@ impl State { } fn process(&mut self, message: Message) { - // TODO: create a match expression to process the different message variants - // Remember: When passing a tuple as a function argument, you'll need extra parentheses: fn function((t, u, p, l, e)) + // TODO: create a match expression to process the different message + // variants + // Remember: When passing a tuple as a function argument, you'll need + // extra parentheses: fn function((t, u, p, l, e)) } } diff --git a/exercises/error_handling/errors1.rs b/exercises/error_handling/errors1.rs index bcee9723..0ba59a57 100644 --- a/exercises/error_handling/errors1.rs +++ b/exercises/error_handling/errors1.rs @@ -1,9 +1,13 @@ // errors1.rs -// This function refuses to generate text to be printed on a nametag if -// you pass it an empty string. It'd be nicer if it explained what the problem -// was, instead of just sometimes returning `None`. Thankfully, Rust has a similar -// construct to `Option` that can be used to express error conditions. Let's use it! -// Execute `rustlings hint errors1` or use the `hint` watch subcommand for a hint. +// +// This function refuses to generate text to be printed on a nametag if you pass +// it an empty string. It'd be nicer if it explained what the problem was, +// instead of just sometimes returning `None`. Thankfully, Rust has a similar +// construct to `Option` that can be used to express error conditions. Let's use +// it! +// +// Execute `rustlings hint errors1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/error_handling/errors2.rs b/exercises/error_handling/errors2.rs index 6971fcfb..d86f326d 100644 --- a/exercises/error_handling/errors2.rs +++ b/exercises/error_handling/errors2.rs @@ -1,21 +1,23 @@ // errors2.rs +// // Say we're writing a game where you can buy items with tokens. All items cost // 5 tokens, and whenever you purchase items there is a processing fee of 1 -// token. A player of the game will type in how many items they want to buy, -// and the `total_cost` function will calculate the total cost of the tokens. -// Since the player typed in the quantity, though, we get it as a string-- and -// they might have typed anything, not just numbers! - +// token. A player of the game will type in how many items they want to buy, and +// the `total_cost` function will calculate the total cost of the tokens. Since +// the player typed in the quantity, though, we get it as a string-- and they +// might have typed anything, not just numbers! +// // Right now, this function isn't handling the error case at all (and isn't -// handling the success case properly either). What we want to do is: -// if we call the `parse` function on a string that is not a number, that -// function will return a `ParseIntError`, and in that case, we want to -// immediately return that error from our function and not try to multiply -// and add. - -// There are at least two ways to implement this that are both correct-- but -// one is a lot shorter! -// Execute `rustlings hint errors2` or use the `hint` watch subcommand for a hint. +// handling the success case properly either). What we want to do is: if we call +// the `parse` function on a string that is not a number, that function will +// return a `ParseIntError`, and in that case, we want to immediately return +// that error from our function and not try to multiply and add. +// +// There are at least two ways to implement this that are both correct-- but one +// is a lot shorter! +// +// Execute `rustlings hint errors2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/error_handling/errors3.rs b/exercises/error_handling/errors3.rs index a2d2d190..d42d3b17 100644 --- a/exercises/error_handling/errors3.rs +++ b/exercises/error_handling/errors3.rs @@ -1,8 +1,11 @@ // errors3.rs +// // This is a program that is trying to use a completed version of the // `total_cost` function from the previous exercise. It's not working though! // Why not? What should we do to fix it? -// Execute `rustlings hint errors3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint errors3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/error_handling/errors4.rs b/exercises/error_handling/errors4.rs index 0efe8ccd..e04bff77 100644 --- a/exercises/error_handling/errors4.rs +++ b/exercises/error_handling/errors4.rs @@ -1,5 +1,7 @@ // errors4.rs -// Execute `rustlings hint errors4` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint errors4` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/error_handling/errors5.rs b/exercises/error_handling/errors5.rs index eb5506cb..92461a7e 100644 --- a/exercises/error_handling/errors5.rs +++ b/exercises/error_handling/errors5.rs @@ -1,20 +1,26 @@ // errors5.rs - +// // This program uses an altered version of the code from errors4. - -// This exercise uses some concepts that we won't get to until later in the course, like `Box` and the -// `From` trait. It's not important to understand them in detail right now, but you can read ahead if you like. -// For now, think of the `Box` type as an "I want anything that does ???" type, which, given -// Rust's usual standards for runtime safety, should strike you as somewhat lenient! - -// In short, this particular use case for boxes is for when you want to own a value and you care only that it is a -// type which implements a particular trait. To do so, The Box is declared as of type Box where Trait is the trait -// the compiler looks for on any value used in that context. For this exercise, that context is the potential errors -// which can be returned in a Result. - -// What can we use to describe both errors? In other words, is there a trait which both errors implement? - -// Execute `rustlings hint errors5` or use the `hint` watch subcommand for a hint. +// +// This exercise uses some concepts that we won't get to until later in the +// course, like `Box` and the `From` trait. It's not important to understand +// them in detail right now, but you can read ahead if you like. For now, think +// of the `Box` type as an "I want anything that does ???" type, which, +// given Rust's usual standards for runtime safety, should strike you as +// somewhat lenient! +// +// In short, this particular use case for boxes is for when you want to own a +// value and you care only that it is a type which implements a particular +// trait. To do so, The Box is declared as of type Box where Trait is +// the trait the compiler looks for on any value used in that context. For this +// exercise, that context is the potential errors which can be returned in a +// Result. +// +// What can we use to describe both errors? In other words, is there a trait +// which both errors implement? +// +// Execute `rustlings hint errors5` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/error_handling/errors6.rs b/exercises/error_handling/errors6.rs index 8097b490..aaf0948e 100644 --- a/exercises/error_handling/errors6.rs +++ b/exercises/error_handling/errors6.rs @@ -1,12 +1,13 @@ // errors6.rs - +// // Using catch-all error types like `Box` isn't recommended // for library code, where callers might want to make decisions based on the -// error content, instead of printing it out or propagating it further. Here, -// we define a custom error type to make it possible for callers to decide -// what to do next when our function returns an error. - -// Execute `rustlings hint errors6` or use the `hint` watch subcommand for a hint. +// error content, instead of printing it out or propagating it further. Here, we +// define a custom error type to make it possible for callers to decide what to +// do next when our function returns an error. +// +// Execute `rustlings hint errors6` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/functions/functions1.rs b/exercises/functions/functions1.rs index 03d8af70..40ed9a07 100644 --- a/exercises/functions/functions1.rs +++ b/exercises/functions/functions1.rs @@ -1,5 +1,7 @@ // functions1.rs -// Execute `rustlings hint functions1` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint functions1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/functions/functions2.rs b/exercises/functions/functions2.rs index 7d40a578..5154f34d 100644 --- a/exercises/functions/functions2.rs +++ b/exercises/functions/functions2.rs @@ -1,5 +1,7 @@ // functions2.rs -// Execute `rustlings hint functions2` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint functions2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/functions/functions3.rs b/exercises/functions/functions3.rs index 3b9e585b..74f44d6d 100644 --- a/exercises/functions/functions3.rs +++ b/exercises/functions/functions3.rs @@ -1,5 +1,7 @@ // functions3.rs -// Execute `rustlings hint functions3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint functions3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/functions/functions4.rs b/exercises/functions/functions4.rs index 65d5be4f..77c4b2aa 100644 --- a/exercises/functions/functions4.rs +++ b/exercises/functions/functions4.rs @@ -1,11 +1,12 @@ // functions4.rs -// Execute `rustlings hint functions4` or use the `hint` watch subcommand for a hint. - -// This store is having a sale where if the price is an even number, you get -// 10 Rustbucks off, but if it's an odd number, it's 3 Rustbucks off. -// (Don't worry about the function bodies themselves, we're only interested -// in the signatures for now. If anything, this is a good way to peek ahead -// to future exercises!) +// +// This store is having a sale where if the price is an even number, you get 10 +// Rustbucks off, but if it's an odd number, it's 3 Rustbucks off. (Don't worry +// about the function bodies themselves, we're only interested in the signatures +// for now. If anything, this is a good way to peek ahead to future exercises!) +// +// Execute `rustlings hint functions4` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/functions/functions5.rs b/exercises/functions/functions5.rs index 5d762961..f1b63f48 100644 --- a/exercises/functions/functions5.rs +++ b/exercises/functions/functions5.rs @@ -1,5 +1,7 @@ // functions5.rs -// Execute `rustlings hint functions5` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint functions5` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/generics/generics1.rs b/exercises/generics/generics1.rs index 4c34ae47..35c1d2fe 100644 --- a/exercises/generics/generics1.rs +++ b/exercises/generics/generics1.rs @@ -1,7 +1,10 @@ -// This shopping list program isn't compiling! -// Use your knowledge of generics to fix it. - -// Execute `rustlings hint generics1` or use the `hint` watch subcommand for a hint. +// generics1.rs +// +// This shopping list program isn't compiling! Use your knowledge of generics to +// fix it. +// +// Execute `rustlings hint generics1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/generics/generics2.rs b/exercises/generics/generics2.rs index aedbd55c..074cd938 100644 --- a/exercises/generics/generics2.rs +++ b/exercises/generics/generics2.rs @@ -1,7 +1,10 @@ +// generics2.rs +// // This powerful wrapper provides the ability to store a positive integer value. // Rewrite it using generics so that it supports wrapping ANY type. - -// Execute `rustlings hint generics2` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint generics2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/hashmaps/hashmaps1.rs b/exercises/hashmaps/hashmaps1.rs index fd8dd2f8..80829eaa 100644 --- a/exercises/hashmaps/hashmaps1.rs +++ b/exercises/hashmaps/hashmaps1.rs @@ -1,14 +1,15 @@ // hashmaps1.rs -// A basket of fruits in the form of a hash map needs to be defined. -// The key represents the name of the fruit and the value represents -// how many of that particular fruit is in the basket. You have to put -// at least three different types of fruits (e.g apple, banana, mango) -// in the basket and the total count of all the fruits should be at -// least five. +// +// A basket of fruits in the form of a hash map needs to be defined. The key +// represents the name of the fruit and the value represents how many of that +// particular fruit is in the basket. You have to put at least three different +// types of fruits (e.g apple, banana, mango) in the basket and the total count +// of all the fruits should be at least five. // // Make me compile and pass the tests! // -// Execute `rustlings hint hashmaps1` or use the `hint` watch subcommand for a hint. +// Execute `rustlings hint hashmaps1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/hashmaps/hashmaps2.rs b/exercises/hashmaps/hashmaps2.rs index a4f069a8..f9138486 100644 --- a/exercises/hashmaps/hashmaps2.rs +++ b/exercises/hashmaps/hashmaps2.rs @@ -1,17 +1,18 @@ // hashmaps2.rs -// We're collecting different fruits to bake a delicious fruit cake. -// For this, we have a basket, which we'll represent in the form of a hash -// map. The key represents the name of each fruit we collect and the value -// represents how many of that particular fruit we have collected. -// Three types of fruits - Apple (4), Mango (2) and Lychee (5) are already -// in the basket hash map. -// You must add fruit to the basket so that there is at least -// one of each kind and more than 11 in total - we have a lot of mouths to feed. -// You are not allowed to insert any more of these fruits! +// +// We're collecting different fruits to bake a delicious fruit cake. For this, +// we have a basket, which we'll represent in the form of a hash map. The key +// represents the name of each fruit we collect and the value represents how +// many of that particular fruit we have collected. Three types of fruits - +// Apple (4), Mango (2) and Lychee (5) are already in the basket hash map. You +// must add fruit to the basket so that there is at least one of each kind and +// more than 11 in total - we have a lot of mouths to feed. You are not allowed +// to insert any more of these fruits! // // Make me pass the tests! // -// Execute `rustlings hint hashmaps2` or use the `hint` watch subcommand for a hint. +// Execute `rustlings hint hashmaps2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE @@ -36,9 +37,9 @@ fn fruit_basket(basket: &mut HashMap) { ]; for fruit in fruit_kinds { - // TODO: Insert new fruits if they are not already present in the basket. - // Note that you are not allowed to put any type of fruit that's already - // present! + // TODO: Insert new fruits if they are not already present in the + // basket. Note that you are not allowed to put any type of fruit that's + // already present! } } diff --git a/exercises/hashmaps/hashmaps3.rs b/exercises/hashmaps/hashmaps3.rs index ad3baa68..4b48e093 100644 --- a/exercises/hashmaps/hashmaps3.rs +++ b/exercises/hashmaps/hashmaps3.rs @@ -1,18 +1,18 @@ // hashmaps3.rs - -// A list of scores (one per line) of a soccer match is given. Each line -// is of the form : -// ,,, +// +// A list of scores (one per line) of a soccer match is given. Each line is of +// the form : ",,," // Example: England,France,4,2 (England scored 4 goals, France 2). - -// You have to build a scores table containing the name of the team, goals -// the team scored, and goals the team conceded. One approach to build -// the scores table is to use a Hashmap. The solution is partially -// written to use a Hashmap, complete it to pass the test. - +// +// You have to build a scores table containing the name of the team, goals the +// team scored, and goals the team conceded. One approach to build the scores +// table is to use a Hashmap. The solution is partially written to use a +// Hashmap, complete it to pass the test. +// // Make me pass the tests! - -// Execute `rustlings hint hashmaps3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint hashmaps3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/if/if1.rs b/exercises/if/if1.rs index 587e03f8..d8108a0f 100644 --- a/exercises/if/if1.rs +++ b/exercises/if/if1.rs @@ -1,4 +1,5 @@ // if1.rs +// // Execute `rustlings hint if1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/if/if2.rs b/exercises/if/if2.rs index effddbb6..f512f13f 100644 --- a/exercises/if/if2.rs +++ b/exercises/if/if2.rs @@ -1,7 +1,8 @@ // if2.rs - +// // Step 1: Make me compile! // Step 2: Get the bar_for_fuzz and default_to_baz tests passing! +// // Execute `rustlings hint if2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/intro/intro1.rs b/exercises/intro/intro1.rs index cfc55c30..37fa0112 100644 --- a/exercises/intro/intro1.rs +++ b/exercises/intro/intro1.rs @@ -1,13 +1,17 @@ // intro1.rs +// // About this `I AM NOT DONE` thing: // We sometimes encourage you to keep trying things on a given exercise, even // after you already figured it out. If you got everything working and feel // ready for the next exercise, remove the `I AM NOT DONE` comment below. -// Execute `rustlings hint intro1` or use the `hint` watch subcommand for a hint. // -// If you're running this using `rustlings watch`: The exercise file will be reloaded -// when you change one of the lines below! Try adding a `println!` line, or try changing -// what it outputs in your terminal. Try removing a semicolon and see what happens! +// If you're running this using `rustlings watch`: The exercise file will be +// reloaded when you change one of the lines below! Try adding a `println!` +// line, or try changing what it outputs in your terminal. Try removing a +// semicolon and see what happens! +// +// Execute `rustlings hint intro1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/intro/intro2.rs b/exercises/intro/intro2.rs index efc1af20..990b20f0 100644 --- a/exercises/intro/intro2.rs +++ b/exercises/intro/intro2.rs @@ -1,6 +1,9 @@ // intro2.rs +// // Make the code print a greeting to the world. -// Execute `rustlings hint intro2` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint intro2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/iterators/iterators1.rs b/exercises/iterators/iterators1.rs index f9cc3b39..b3f698be 100644 --- a/exercises/iterators/iterators1.rs +++ b/exercises/iterators/iterators1.rs @@ -1,12 +1,13 @@ // iterators1.rs // -// Make me compile by filling in the `???`s +// When performing operations on elements within a collection, iterators are +// essential. This module helps you get familiar with the structure of using an +// iterator and how to go through elements within an iterable collection. // -// When performing operations on elements within a collection, iterators are essential. -// This module helps you get familiar with the structure of using an iterator and -// how to go through elements within an iterable collection. +// Make me compile by filling in the `???`s // -// Execute `rustlings hint iterators1` or use the `hint` watch subcommand for a hint. +// Execute `rustlings hint iterators1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/iterators/iterators2.rs b/exercises/iterators/iterators2.rs index 29c53afb..dda82a08 100644 --- a/exercises/iterators/iterators2.rs +++ b/exercises/iterators/iterators2.rs @@ -1,7 +1,10 @@ // iterators2.rs +// // In this exercise, you'll learn some of the unique advantages that iterators // can offer. Follow the steps to complete the exercise. -// Execute `rustlings hint iterators2` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint iterators2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/iterators/iterators3.rs b/exercises/iterators/iterators3.rs index c97a6258..29fa23a3 100644 --- a/exercises/iterators/iterators3.rs +++ b/exercises/iterators/iterators3.rs @@ -1,10 +1,13 @@ // iterators3.rs -// This is a bigger exercise than most of the others! You can do it! -// Here is your mission, should you choose to accept it: +// +// This is a bigger exercise than most of the others! You can do it! Here is +// your mission, should you choose to accept it: // 1. Complete the divide function to get the first four tests to pass. // 2. Get the remaining tests to pass by completing the result_with_list and // list_of_results functions. -// Execute `rustlings hint iterators3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint iterators3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE @@ -26,14 +29,16 @@ pub fn divide(a: i32, b: i32) -> Result { todo!(); } -// Complete the function and return a value of the correct type so the test passes. +// Complete the function and return a value of the correct type so the test +// passes. // Desired output: Ok([1, 11, 1426, 3]) fn result_with_list() -> () { let numbers = vec![27, 297, 38502, 81]; let division_results = numbers.into_iter().map(|n| divide(n, 27)); } -// Complete the function and return a value of the correct type so the test passes. +// Complete the function and return a value of the correct type so the test +// passes. // Desired output: [Ok(1), Ok(11), Ok(1426), Ok(3)] fn list_of_results() -> () { let numbers = vec![27, 297, 38502, 81]; diff --git a/exercises/iterators/iterators4.rs b/exercises/iterators/iterators4.rs index a02470ec..79e1692b 100644 --- a/exercises/iterators/iterators4.rs +++ b/exercises/iterators/iterators4.rs @@ -1,5 +1,7 @@ // iterators4.rs -// Execute `rustlings hint iterators4` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint iterators4` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/iterators/iterators5.rs b/exercises/iterators/iterators5.rs index d0fcc8ca..a062ee4c 100644 --- a/exercises/iterators/iterators5.rs +++ b/exercises/iterators/iterators5.rs @@ -1,4 +1,5 @@ // iterators5.rs +// // Let's define a simple model to track Rustlings exercise progress. Progress // will be modelled using a hash map. The name of the exercise is the key and // the progress is the value. Two counting functions were created to count the @@ -6,7 +7,9 @@ // functionality using iterators. Try not to use imperative loops (for, while). // Only the two iterator methods (count_iterator and count_collection_iterator) // need to be modified. -// Execute `rustlings hint iterators5` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint iterators5` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/lifetimes/lifetimes1.rs b/exercises/lifetimes/lifetimes1.rs index 0236470d..87bde490 100644 --- a/exercises/lifetimes/lifetimes1.rs +++ b/exercises/lifetimes/lifetimes1.rs @@ -1,11 +1,12 @@ // lifetimes1.rs // // The Rust compiler needs to know how to check whether supplied references are -// valid, so that it can let the programmer know if a reference is at risk -// of going out of scope before it is used. Remember, references are borrows -// and do not own their own data. What if their owner goes out of scope? +// valid, so that it can let the programmer know if a reference is at risk of +// going out of scope before it is used. Remember, references are borrows and do +// not own their own data. What if their owner goes out of scope? // -// Execute `rustlings hint lifetimes1` or use the `hint` watch subcommand for a hint. +// Execute `rustlings hint lifetimes1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/lifetimes/lifetimes2.rs b/exercises/lifetimes/lifetimes2.rs index b48feabc..4f3d8c18 100644 --- a/exercises/lifetimes/lifetimes2.rs +++ b/exercises/lifetimes/lifetimes2.rs @@ -1,10 +1,10 @@ // lifetimes2.rs // -// So if the compiler is just validating the references passed -// to the annotated parameters and the return type, what do -// we need to change? +// So if the compiler is just validating the references passed to the annotated +// parameters and the return type, what do we need to change? // -// Execute `rustlings hint lifetimes2` or use the `hint` watch subcommand for a hint. +// Execute `rustlings hint lifetimes2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/lifetimes/lifetimes3.rs b/exercises/lifetimes/lifetimes3.rs index ea483708..9c59f9c0 100644 --- a/exercises/lifetimes/lifetimes3.rs +++ b/exercises/lifetimes/lifetimes3.rs @@ -2,7 +2,8 @@ // // Lifetimes are also needed when structs hold references. // -// Execute `rustlings hint lifetimes3` or use the `hint` watch subcommand for a hint. +// Execute `rustlings hint lifetimes3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/macros/macros1.rs b/exercises/macros/macros1.rs index 634d0a70..678de6ee 100644 --- a/exercises/macros/macros1.rs +++ b/exercises/macros/macros1.rs @@ -1,5 +1,7 @@ // macros1.rs -// Execute `rustlings hint macros1` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint macros1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/macros/macros2.rs b/exercises/macros/macros2.rs index f6092cab..788fc16a 100644 --- a/exercises/macros/macros2.rs +++ b/exercises/macros/macros2.rs @@ -1,5 +1,7 @@ // macros2.rs -// Execute `rustlings hint macros2` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint macros2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/macros/macros3.rs b/exercises/macros/macros3.rs index 106f1c6d..b795c149 100644 --- a/exercises/macros/macros3.rs +++ b/exercises/macros/macros3.rs @@ -1,6 +1,9 @@ // macros3.rs +// // Make me compile, without taking the macro out of the module! -// Execute `rustlings hint macros3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint macros3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/macros/macros4.rs b/exercises/macros/macros4.rs index 4ee98035..71b45a09 100644 --- a/exercises/macros/macros4.rs +++ b/exercises/macros/macros4.rs @@ -1,5 +1,7 @@ // macros4.rs -// Execute `rustlings hint macros4` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint macros4` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/modules/modules1.rs b/exercises/modules/modules1.rs index 8dd0e402..9eb5a48b 100644 --- a/exercises/modules/modules1.rs +++ b/exercises/modules/modules1.rs @@ -1,5 +1,7 @@ // modules1.rs -// Execute `rustlings hint modules1` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint modules1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/modules/modules2.rs b/exercises/modules/modules2.rs index c30a3897..04154543 100644 --- a/exercises/modules/modules2.rs +++ b/exercises/modules/modules2.rs @@ -1,7 +1,11 @@ // modules2.rs -// You can bring module paths into scopes and provide new names for them with the -// 'use' and 'as' keywords. Fix these 'use' statements to make the code compile. -// Execute `rustlings hint modules2` or use the `hint` watch subcommand for a hint. +// +// You can bring module paths into scopes and provide new names for them with +// the 'use' and 'as' keywords. Fix these 'use' statements to make the code +// compile. +// +// Execute `rustlings hint modules2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/modules/modules3.rs b/exercises/modules/modules3.rs index 35e07990..f2bb0503 100644 --- a/exercises/modules/modules3.rs +++ b/exercises/modules/modules3.rs @@ -1,9 +1,12 @@ // modules3.rs -// You can use the 'use' keyword to bring module paths from modules from anywhere -// and especially from the Rust standard library into your scope. -// Bring SystemTime and UNIX_EPOCH -// from the std::time module. Bonus style points if you can do it with one line! -// Execute `rustlings hint modules3` or use the `hint` watch subcommand for a hint. +// +// You can use the 'use' keyword to bring module paths from modules from +// anywhere and especially from the Rust standard library into your scope. Bring +// SystemTime and UNIX_EPOCH from the std::time module. Bonus style points if +// you can do it with one line! +// +// Execute `rustlings hint modules3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/move_semantics/move_semantics1.rs b/exercises/move_semantics/move_semantics1.rs index aac6dfc3..710d20d8 100644 --- a/exercises/move_semantics/move_semantics1.rs +++ b/exercises/move_semantics/move_semantics1.rs @@ -1,5 +1,7 @@ // move_semantics1.rs -// Execute `rustlings hint move_semantics1` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint move_semantics1` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs index 93bb82ef..5821b52b 100644 --- a/exercises/move_semantics/move_semantics2.rs +++ b/exercises/move_semantics/move_semantics2.rs @@ -1,9 +1,11 @@ // move_semantics2.rs -// Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand for a hint. - +// // Expected output: // vec0 has length 3 content `[22, 44, 66]` // vec1 has length 4 content `[22, 44, 66, 88]` +// +// Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/move_semantics/move_semantics3.rs b/exercises/move_semantics/move_semantics3.rs index eaa30e33..ea214934 100644 --- a/exercises/move_semantics/move_semantics3.rs +++ b/exercises/move_semantics/move_semantics3.rs @@ -1,7 +1,10 @@ // move_semantics3.rs -// Make me compile without adding new lines-- just changing existing lines! -// (no lines with multiple semicolons necessary!) -// Execute `rustlings hint move_semantics3` or use the `hint` watch subcommand for a hint. +// +// Make me compile without adding new lines-- just changing existing lines! (no +// lines with multiple semicolons necessary!) +// +// Execute `rustlings hint move_semantics3` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/move_semantics/move_semantics4.rs b/exercises/move_semantics/move_semantics4.rs index 99834ec3..75a3b6bd 100644 --- a/exercises/move_semantics/move_semantics4.rs +++ b/exercises/move_semantics/move_semantics4.rs @@ -1,8 +1,11 @@ // move_semantics4.rs -// Refactor this code so that instead of passing `vec0` into the `fill_vec` function, -// the Vector gets created in the function itself and passed back to the main -// function. -// Execute `rustlings hint move_semantics4` or use the `hint` watch subcommand for a hint. +// +// Refactor this code so that instead of passing `vec0` into the `fill_vec` +// function, the Vector gets created in the function itself and passed back to +// the main function. +// +// Execute `rustlings hint move_semantics4` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/move_semantics/move_semantics5.rs b/exercises/move_semantics/move_semantics5.rs index 36eae127..68db09eb 100644 --- a/exercises/move_semantics/move_semantics5.rs +++ b/exercises/move_semantics/move_semantics5.rs @@ -1,7 +1,10 @@ // move_semantics5.rs -// Make me compile only by reordering the lines in `main()`, but without -// adding, changing or removing any of them. -// Execute `rustlings hint move_semantics5` or use the `hint` watch subcommand for a hint. +// +// Make me compile only by reordering the lines in `main()`, but without adding, +// changing or removing any of them. +// +// Execute `rustlings hint move_semantics5` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/move_semantics/move_semantics6.rs b/exercises/move_semantics/move_semantics6.rs index eb52a848..cace4ca6 100644 --- a/exercises/move_semantics/move_semantics6.rs +++ b/exercises/move_semantics/move_semantics6.rs @@ -1,6 +1,9 @@ // move_semantics6.rs -// Execute `rustlings hint move_semantics6` or use the `hint` watch subcommand for a hint. +// // You can't change anything except adding or removing references. +// +// Execute `rustlings hint move_semantics6` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/options/options1.rs b/exercises/options/options1.rs index 1f891b0e..e131b48b 100644 --- a/exercises/options/options1.rs +++ b/exercises/options/options1.rs @@ -1,5 +1,7 @@ // options1.rs -// Execute `rustlings hint options1` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint options1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE @@ -7,8 +9,9 @@ // If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them // all, so there'll be no more left :( fn maybe_icecream(time_of_day: u16) -> Option { - // We use the 24-hour system here, so 10PM is a value of 22 and 12AM is a value of 0 - // The Option output should gracefully handle cases where time_of_day > 23. + // We use the 24-hour system here, so 10PM is a value of 22 and 12AM is a + // value of 0 The Option output should gracefully handle cases where + // time_of_day > 23. // TODO: Complete the function body - remember to return an Option! ??? } @@ -28,7 +31,8 @@ mod tests { #[test] fn raw_value() { - // TODO: Fix this test. How do you get at the value contained in the Option? + // TODO: Fix this test. How do you get at the value contained in the + // Option? let icecreams = maybe_icecream(12); assert_eq!(icecreams, 5); } diff --git a/exercises/options/options2.rs b/exercises/options/options2.rs index 337c4261..4d998e7d 100644 --- a/exercises/options/options2.rs +++ b/exercises/options/options2.rs @@ -1,5 +1,7 @@ // options2.rs -// Execute `rustlings hint options2` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint options2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE @@ -27,8 +29,9 @@ mod tests { let mut cursor = range; - // TODO: make this a while let statement - remember that vector.pop also adds another layer of Option - // You can stack `Option`s into while let and if let + // TODO: make this a while let statement - remember that vector.pop also + // adds another layer of Option. You can stack `Option`s into + // while let and if let. integer = optional_integers.pop() { assert_eq!(integer, cursor); cursor -= 1; diff --git a/exercises/options/options3.rs b/exercises/options/options3.rs index 3ed76eeb..23c15eab 100644 --- a/exercises/options/options3.rs +++ b/exercises/options/options3.rs @@ -1,5 +1,7 @@ // options3.rs -// Execute `rustlings hint options3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint options3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/primitive_types/primitive_types1.rs b/exercises/primitive_types/primitive_types1.rs index 09121392..e1cf52a2 100644 --- a/exercises/primitive_types/primitive_types1.rs +++ b/exercises/primitive_types/primitive_types1.rs @@ -1,6 +1,10 @@ // primitive_types1.rs -// Fill in the rest of the line that has code missing! -// No hints, there's no tricks, just get used to typing these :) +// +// Fill in the rest of the line that has code missing! No hints, there's no +// tricks, just get used to typing these :) +// +// Execute `rustlings hint primitive_types1` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/primitive_types/primitive_types2.rs b/exercises/primitive_types/primitive_types2.rs index 8730baab..fcc9705a 100644 --- a/exercises/primitive_types/primitive_types2.rs +++ b/exercises/primitive_types/primitive_types2.rs @@ -1,6 +1,10 @@ // primitive_types2.rs -// Fill in the rest of the line that has code missing! -// No hints, there's no tricks, just get used to typing these :) +// +// Fill in the rest of the line that has code missing! No hints, there's no +// tricks, just get used to typing these :) +// +// Execute `rustlings hint primitive_types2` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/primitive_types/primitive_types3.rs b/exercises/primitive_types/primitive_types3.rs index fa7d019a..06a7a621 100644 --- a/exercises/primitive_types/primitive_types3.rs +++ b/exercises/primitive_types/primitive_types3.rs @@ -1,6 +1,9 @@ // primitive_types3.rs +// // Create an array with at least 100 elements in it where the ??? is. -// Execute `rustlings hint primitive_types3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint primitive_types3` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/primitive_types/primitive_types4.rs b/exercises/primitive_types/primitive_types4.rs index 71fa243c..d44d8776 100644 --- a/exercises/primitive_types/primitive_types4.rs +++ b/exercises/primitive_types/primitive_types4.rs @@ -1,6 +1,9 @@ // primitive_types4.rs +// // Get a slice out of Array a where the ??? is so that the test passes. -// Execute `rustlings hint primitive_types4` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint primitive_types4` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/primitive_types/primitive_types5.rs b/exercises/primitive_types/primitive_types5.rs index 4fd9141f..f646986e 100644 --- a/exercises/primitive_types/primitive_types5.rs +++ b/exercises/primitive_types/primitive_types5.rs @@ -1,6 +1,9 @@ // primitive_types5.rs +// // Destructure the `cat` tuple so that the println will work. -// Execute `rustlings hint primitive_types5` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint primitive_types5` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/primitive_types/primitive_types6.rs b/exercises/primitive_types/primitive_types6.rs index ddf8b423..07cc46c6 100644 --- a/exercises/primitive_types/primitive_types6.rs +++ b/exercises/primitive_types/primitive_types6.rs @@ -1,7 +1,10 @@ // primitive_types6.rs -// Use a tuple index to access the second element of `numbers`. -// You can put the expression for the second element where ??? is so that the test passes. -// Execute `rustlings hint primitive_types6` or use the `hint` watch subcommand for a hint. +// +// Use a tuple index to access the second element of `numbers`. You can put the +// expression for the second element where ??? is so that the test passes. +// +// Execute `rustlings hint primitive_types6` or use the `hint` watch subcommand +// for a hint. // I AM NOT DONE diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index dbb5cdc9..a9904b8b 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -1,14 +1,17 @@ // quiz1.rs +// // This is a quiz for the following sections: // - Variables // - Functions // - If - +// // Mary is buying apples. The price of an apple is calculated as follows: // - An apple costs 2 rustbucks. // - If Mary buys more than 40 apples, each apple only costs 1 rustbuck! -// Write a function that calculates the price of an order of apples given -// the quantity bought. No hints this time! +// Write a function that calculates the price of an order of apples given the +// quantity bought. No hints this time! +// +// No hints this time ;) // I AM NOT DONE diff --git a/exercises/quiz2.rs b/exercises/quiz2.rs index 5c42dae0..29925caf 100644 --- a/exercises/quiz2.rs +++ b/exercises/quiz2.rs @@ -1,14 +1,15 @@ // quiz2.rs +// // This is a quiz for the following sections: // - Strings // - Vecs // - Move semantics // - Modules // - Enums - -// Let's build a little machine in the form of a function. -// As input, we're going to give a list of strings and commands. These commands -// determine what action is going to be applied to the string. It can either be: +// +// Let's build a little machine in the form of a function. As input, we're going +// to give a list of strings and commands. These commands determine what action +// is going to be applied to the string. It can either be: // - Uppercase the string // - Trim the string // - Append "bar" to the string a specified amount of times @@ -16,6 +17,7 @@ // - The input is going to be a Vector of a 2-length tuple, // the first element is the string, the second one is the command. // - The output element is going to be a Vector of strings. +// // No hints this time! // I AM NOT DONE diff --git a/exercises/quiz3.rs b/exercises/quiz3.rs index 15dc4699..3b01d313 100644 --- a/exercises/quiz3.rs +++ b/exercises/quiz3.rs @@ -1,17 +1,19 @@ // quiz3.rs +// // This quiz tests: // - Generics // - Traits -// An imaginary magical school has a new report card generation system written in Rust! -// Currently the system only supports creating report cards where the student's grade -// is represented numerically (e.g. 1.0 -> 5.5). -// However, the school also issues alphabetical grades (A+ -> F-) and needs -// to be able to print both types of report card! - +// +// An imaginary magical school has a new report card generation system written +// in Rust! Currently the system only supports creating report cards where the +// student's grade is represented numerically (e.g. 1.0 -> 5.5). However, the +// school also issues alphabetical grades (A+ -> F-) and needs to be able to +// print both types of report card! +// // Make the necessary code changes in the struct ReportCard and the impl block -// to support alphabetical report cards. Change the Grade in the second test to "A+" -// to show that your changes allow alphabetical grades. - +// to support alphabetical report cards. Change the Grade in the second test to +// "A+" to show that your changes allow alphabetical grades. +// // Execute `rustlings hint quiz3` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/smart_pointers/arc1.rs b/exercises/smart_pointers/arc1.rs index ffb306af..3526ddcb 100644 --- a/exercises/smart_pointers/arc1.rs +++ b/exercises/smart_pointers/arc1.rs @@ -1,21 +1,24 @@ // arc1.rs -// In this exercise, we are given a Vec of u32 called "numbers" with values ranging -// from 0 to 99 -- [ 0, 1, 2, ..., 98, 99 ] -// We would like to use this set of numbers within 8 different threads simultaneously. -// Each thread is going to get the sum of every eighth value, with an offset. +// +// In this exercise, we are given a Vec of u32 called "numbers" with values +// ranging from 0 to 99 -- [ 0, 1, 2, ..., 98, 99 ] We would like to use this +// set of numbers within 8 different threads simultaneously. Each thread is +// going to get the sum of every eighth value, with an offset. +// // The first thread (offset 0), will sum 0, 8, 16, ... // The second thread (offset 1), will sum 1, 9, 17, ... // The third thread (offset 2), will sum 2, 10, 18, ... // ... // The eighth thread (offset 7), will sum 7, 15, 23, ... - +// // Because we are using threads, our values need to be thread-safe. Therefore, // we are using Arc. We need to make a change in each of the two TODOs. - - +// // Make this code compile by filling in a value for `shared_numbers` where the // first TODO comment is, and create an initial binding for `child_numbers` -// where the second TODO comment is. Try not to create any copies of the `numbers` Vec! +// where the second TODO comment is. Try not to create any copies of the +// `numbers` Vec! +// // Execute `rustlings hint arc1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/smart_pointers/box1.rs b/exercises/smart_pointers/box1.rs index 66cf00f3..513e7daa 100644 --- a/exercises/smart_pointers/box1.rs +++ b/exercises/smart_pointers/box1.rs @@ -1,13 +1,15 @@ // box1.rs // -// At compile time, Rust needs to know how much space a type takes up. This becomes problematic -// for recursive types, where a value can have as part of itself another value of the same type. -// To get around the issue, we can use a `Box` - a smart pointer used to store data on the heap, -// which also allows us to wrap a recursive type. +// At compile time, Rust needs to know how much space a type takes up. This +// becomes problematic for recursive types, where a value can have as part of +// itself another value of the same type. To get around the issue, we can use a +// `Box` - a smart pointer used to store data on the heap, which also allows us +// to wrap a recursive type. // -// The recursive type we're implementing in this exercise is the `cons list` - a data structure -// frequently found in functional programming languages. Each item in a cons list contains two -// elements: the value of the current item and the next item. The last item is a value called `Nil`. +// The recursive type we're implementing in this exercise is the `cons list` - a +// data structure frequently found in functional programming languages. Each +// item in a cons list contains two elements: the value of the current item and +// the next item. The last item is a value called `Nil`. // // Step 1: use a `Box` in the enum definition to make the code compile // Step 2: create both empty and non-empty cons lists by replacing `todo!()` diff --git a/exercises/smart_pointers/cow1.rs b/exercises/smart_pointers/cow1.rs index bc5b28e5..7ca91686 100644 --- a/exercises/smart_pointers/cow1.rs +++ b/exercises/smart_pointers/cow1.rs @@ -1,12 +1,16 @@ // cow1.rs - -// This exercise explores the Cow, or Clone-On-Write type. -// Cow is a clone-on-write smart pointer. -// It can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required. -// The type is designed to work with general borrowed data via the Borrow trait. +// +// This exercise explores the Cow, or Clone-On-Write type. Cow is a +// clone-on-write smart pointer. It can enclose and provide immutable access to +// borrowed data, and clone the data lazily when mutation or ownership is +// required. The type is designed to work with general borrowed data via the +// Borrow trait. // // This exercise is meant to show you what to expect when passing data to Cow. -// Fix the unit tests by checking for Cow::Owned(_) and Cow::Borrowed(_) at the TODO markers. +// Fix the unit tests by checking for Cow::Owned(_) and Cow::Borrowed(_) at the +// TODO markers. +// +// Execute `rustlings hint cow1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE @@ -50,10 +54,9 @@ mod tests { #[test] fn owned_no_mutation() -> Result<(), &'static str> { - // We can also pass `slice` without `&` so Cow owns it directly. - // In this case no mutation occurs and thus also no clone, - // but the result is still owned because it was never borrowed - // or mutated. + // We can also pass `slice` without `&` so Cow owns it directly. In this + // case no mutation occurs and thus also no clone, but the result is + // still owned because it was never borrowed or mutated. let slice = vec![0, 1, 2]; let mut input = Cow::from(slice); match abs_all(&mut input) { @@ -63,9 +66,9 @@ mod tests { #[test] fn owned_mutation() -> Result<(), &'static str> { - // Of course this is also the case if a mutation does occur. - // In this case the call to `to_mut()` returns a reference to - // the same data as before. + // Of course this is also the case if a mutation does occur. In this + // case the call to `to_mut()` returns a reference to the same data as + // before. let slice = vec![-1, 0, 1]; let mut input = Cow::from(slice); match abs_all(&mut input) { diff --git a/exercises/smart_pointers/rc1.rs b/exercises/smart_pointers/rc1.rs index d62f3619..ad3f1ce2 100644 --- a/exercises/smart_pointers/rc1.rs +++ b/exercises/smart_pointers/rc1.rs @@ -1,9 +1,14 @@ // rc1.rs -// In this exercise, we want to express the concept of multiple owners via the Rc type. -// This is a model of our solar system - there is a Sun type and multiple Planets. -// The Planets take ownership of the sun, indicating that they revolve around the sun. - -// Make this code compile by using the proper Rc primitives to express that the sun has multiple owners. +// +// In this exercise, we want to express the concept of multiple owners via the +// Rc type. This is a model of our solar system - there is a Sun type and +// multiple Planets. The Planets take ownership of the sun, indicating that they +// revolve around the sun. +// +// Make this code compile by using the proper Rc primitives to express that the +// sun has multiple owners. +// +// Execute `rustlings hint rc1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/strings/strings1.rs b/exercises/strings/strings1.rs index 0de86a1d..f50e1fa9 100644 --- a/exercises/strings/strings1.rs +++ b/exercises/strings/strings1.rs @@ -1,6 +1,9 @@ // strings1.rs +// // Make me compile without changing the function signature! -// Execute `rustlings hint strings1` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint strings1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/strings/strings2.rs b/exercises/strings/strings2.rs index 0c48ec95..4d95d16a 100644 --- a/exercises/strings/strings2.rs +++ b/exercises/strings/strings2.rs @@ -1,6 +1,9 @@ // strings2.rs +// // Make me compile without changing the function signature! -// Execute `rustlings hint strings2` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint strings2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/strings/strings3.rs b/exercises/strings/strings3.rs index e2353aec..b29f9325 100644 --- a/exercises/strings/strings3.rs +++ b/exercises/strings/strings3.rs @@ -1,5 +1,7 @@ // strings3.rs -// Execute `rustlings hint strings3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint strings3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/strings/strings4.rs b/exercises/strings/strings4.rs index c410b562..e8c54acc 100644 --- a/exercises/strings/strings4.rs +++ b/exercises/strings/strings4.rs @@ -1,9 +1,10 @@ // strings4.rs - +// // Ok, here are a bunch of values-- some are `String`s, some are `&str`s. Your // task is to call one of these two functions on each value depending on what // you think each value is. That is, add either `string_slice` or `string` // before the parentheses on each line. If you're right, it will compile! +// // No hints this time! // I AM NOT DONE diff --git a/exercises/structs/structs1.rs b/exercises/structs/structs1.rs index 0d91c469..5fa5821c 100644 --- a/exercises/structs/structs1.rs +++ b/exercises/structs/structs1.rs @@ -1,6 +1,9 @@ // structs1.rs +// // Address all the TODOs to make the tests pass! -// Execute `rustlings hint structs1` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint structs1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/structs/structs2.rs b/exercises/structs/structs2.rs index 32e311fa..328567f0 100644 --- a/exercises/structs/structs2.rs +++ b/exercises/structs/structs2.rs @@ -1,6 +1,9 @@ // structs2.rs +// // Address all the TODOs to make the tests pass! -// Execute `rustlings hint structs2` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint structs2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index 3536a457..4851317c 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -1,8 +1,11 @@ // structs3.rs +// // Structs contain data, but can also have logic. In this exercise we have // defined the Package struct and we want to test some logic attached to it. // Make the code compile and the tests pass! -// Execute `rustlings hint structs3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint structs3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/tests/tests1.rs b/exercises/tests/tests1.rs index 8b6ea374..810277ac 100644 --- a/exercises/tests/tests1.rs +++ b/exercises/tests/tests1.rs @@ -1,11 +1,14 @@ // tests1.rs -// Tests are important to ensure that your code does what you think it should do. -// Tests can be run on this file with the following command: -// rustlings run tests1 - -// This test has a problem with it -- make the test compile! Make the test -// pass! Make the test fail! -// Execute `rustlings hint tests1` or use the `hint` watch subcommand for a hint. +// +// Tests are important to ensure that your code does what you think it should +// do. Tests can be run on this file with the following command: rustlings run +// tests1 +// +// This test has a problem with it -- make the test compile! Make the test pass! +// Make the test fail! +// +// Execute `rustlings hint tests1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/tests/tests2.rs b/exercises/tests/tests2.rs index a5ac15b1..f8024e9f 100644 --- a/exercises/tests/tests2.rs +++ b/exercises/tests/tests2.rs @@ -1,7 +1,10 @@ // tests2.rs -// This test has a problem with it -- make the test compile! Make the test -// pass! Make the test fail! -// Execute `rustlings hint tests2` or use the `hint` watch subcommand for a hint. +// +// This test has a problem with it -- make the test compile! Make the test pass! +// Make the test fail! +// +// Execute `rustlings hint tests2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/tests/tests3.rs b/exercises/tests/tests3.rs index 196a81a0..4013e384 100644 --- a/exercises/tests/tests3.rs +++ b/exercises/tests/tests3.rs @@ -1,8 +1,11 @@ // tests3.rs +// // This test isn't testing our function -- make it do that in such a way that -// the test passes. Then write a second test that tests whether we get the result -// we expect to get when we call `is_even(5)`. -// Execute `rustlings hint tests3` or use the `hint` watch subcommand for a hint. +// the test passes. Then write a second test that tests whether we get the +// result we expect to get when we call `is_even(5)`. +// +// Execute `rustlings hint tests3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/tests/tests4.rs b/exercises/tests/tests4.rs index 1f34a2b2..935d0db1 100644 --- a/exercises/tests/tests4.rs +++ b/exercises/tests/tests4.rs @@ -1,6 +1,9 @@ // tests4.rs +// // Make sure that we're testing for the correct conditions! -// Execute `rustlings hint tests4` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint tests4` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/threads/threads1.rs b/exercises/threads/threads1.rs index ae124eeb..80b6def3 100644 --- a/exercises/threads/threads1.rs +++ b/exercises/threads/threads1.rs @@ -1,10 +1,12 @@ // threads1.rs -// Execute `rustlings hint threads1` or use the `hint` watch subcommand for a hint. - -// This program spawns multiple threads that each run for at least 250ms, -// and each thread returns how much time they took to complete. -// The program should wait until all the spawned threads have finished and -// should collect their return values into a vector. +// +// This program spawns multiple threads that each run for at least 250ms, and +// each thread returns how much time they took to complete. The program should +// wait until all the spawned threads have finished and should collect their +// return values into a vector. +// +// Execute `rustlings hint threads1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/threads/threads2.rs b/exercises/threads/threads2.rs index ada3d14a..62dad80d 100644 --- a/exercises/threads/threads2.rs +++ b/exercises/threads/threads2.rs @@ -1,7 +1,11 @@ // threads2.rs -// Execute `rustlings hint threads2` or use the `hint` watch subcommand for a hint. -// Building on the last exercise, we want all of the threads to complete their work but this time -// the spawned threads need to be in charge of updating a shared value: JobStatus.jobs_completed +// +// Building on the last exercise, we want all of the threads to complete their +// work but this time the spawned threads need to be in charge of updating a +// shared value: JobStatus.jobs_completed +// +// Execute `rustlings hint threads2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE @@ -27,8 +31,9 @@ fn main() { } for handle in handles { handle.join().unwrap(); - // TODO: Print the value of the JobStatus.jobs_completed. Did you notice anything - // interesting in the output? Do you have to 'join' on all the handles? + // TODO: Print the value of the JobStatus.jobs_completed. Did you notice + // anything interesting in the output? Do you have to 'join' on all the + // handles? println!("jobs completed {}", ???); } } diff --git a/exercises/threads/threads3.rs b/exercises/threads/threads3.rs index 9e9f285a..db7d41ba 100644 --- a/exercises/threads/threads3.rs +++ b/exercises/threads/threads3.rs @@ -1,5 +1,7 @@ // threads3.rs -// Execute `rustlings hint threads3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint threads3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/traits/traits1.rs b/exercises/traits/traits1.rs index f5320a5a..37dfcbfe 100644 --- a/exercises/traits/traits1.rs +++ b/exercises/traits/traits1.rs @@ -1,13 +1,11 @@ // traits1.rs -// Time to implement some traits! // -// Your task is to implement the trait -// `AppendBar` for the type `String`. +// Time to implement some traits! Your task is to implement the trait +// `AppendBar` for the type `String`. The trait AppendBar has only one function, +// which appends "Bar" to any object implementing this trait. // -// The trait AppendBar has only one function, -// which appends "Bar" to any object -// implementing this trait. -// Execute `rustlings hint traits1` or use the `hint` watch subcommand for a hint. +// Execute `rustlings hint traits1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/traits/traits2.rs b/exercises/traits/traits2.rs index 288b4983..3e35f8e1 100644 --- a/exercises/traits/traits2.rs +++ b/exercises/traits/traits2.rs @@ -1,14 +1,11 @@ // traits2.rs // -// Your task is to implement the trait -// `AppendBar` for a vector of strings. -// -// To implement this trait, consider for -// a moment what it means to 'append "Bar"' +// Your task is to implement the trait `AppendBar` for a vector of strings. To +// implement this trait, consider for a moment what it means to 'append "Bar"' // to a vector of strings. // -// No boiler plate code this time, -// you can do this! +// No boiler plate code this time, you can do this! +// // Execute `rustlings hint traits2` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/traits/traits3.rs b/exercises/traits/traits3.rs index 6d2fd6c3..4e2b06b0 100644 --- a/exercises/traits/traits3.rs +++ b/exercises/traits/traits3.rs @@ -1,11 +1,12 @@ // traits3.rs // -// Your task is to implement the Licensed trait for -// both structures and have them return the same -// information without writing the same function twice. +// Your task is to implement the Licensed trait for both structures and have +// them return the same information without writing the same function twice. // // Consider what you can add to the Licensed trait. -// Execute `rustlings hint traits3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint traits3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/traits/traits4.rs b/exercises/traits/traits4.rs index 6b541665..4bda3e57 100644 --- a/exercises/traits/traits4.rs +++ b/exercises/traits/traits4.rs @@ -1,8 +1,11 @@ // traits4.rs // // Your task is to replace the '??' sections so the code compiles. +// // Don't change any line other than the marked one. -// Execute `rustlings hint traits4` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint traits4` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/traits/traits5.rs b/exercises/traits/traits5.rs index 0fbca28a..df183805 100644 --- a/exercises/traits/traits5.rs +++ b/exercises/traits/traits5.rs @@ -1,8 +1,11 @@ // traits5.rs // // Your task is to replace the '??' sections so the code compiles. +// // Don't change any line other than the marked one. -// Execute `rustlings hint traits5` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint traits5` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/variables/variables1.rs b/exercises/variables/variables1.rs index f4d182ac..b3e089a5 100644 --- a/exercises/variables/variables1.rs +++ b/exercises/variables/variables1.rs @@ -1,6 +1,9 @@ // variables1.rs +// // Make me compile! -// Execute `rustlings hint variables1` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint variables1` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/variables/variables2.rs b/exercises/variables/variables2.rs index 641aeb8e..e1c23edf 100644 --- a/exercises/variables/variables2.rs +++ b/exercises/variables/variables2.rs @@ -1,5 +1,7 @@ // variables2.rs -// Execute `rustlings hint variables2` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint variables2` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/variables/variables3.rs b/exercises/variables/variables3.rs index 819b1bc7..86bed419 100644 --- a/exercises/variables/variables3.rs +++ b/exercises/variables/variables3.rs @@ -1,5 +1,7 @@ // variables3.rs -// Execute `rustlings hint variables3` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint variables3` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/variables/variables4.rs b/exercises/variables/variables4.rs index 54491b0a..5394f394 100644 --- a/exercises/variables/variables4.rs +++ b/exercises/variables/variables4.rs @@ -1,5 +1,7 @@ // variables4.rs -// Execute `rustlings hint variables4` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint variables4` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/variables/variables5.rs b/exercises/variables/variables5.rs index 0e670d2a..a29b38be 100644 --- a/exercises/variables/variables5.rs +++ b/exercises/variables/variables5.rs @@ -1,5 +1,7 @@ // variables5.rs -// Execute `rustlings hint variables5` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint variables5` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/variables/variables6.rs b/exercises/variables/variables6.rs index a8520122..853183ba 100644 --- a/exercises/variables/variables6.rs +++ b/exercises/variables/variables6.rs @@ -1,5 +1,7 @@ // variables6.rs -// Execute `rustlings hint variables6` or use the `hint` watch subcommand for a hint. +// +// Execute `rustlings hint variables6` or use the `hint` watch subcommand for a +// hint. // I AM NOT DONE diff --git a/exercises/vecs/vecs1.rs b/exercises/vecs/vecs1.rs index 4e8c4cbb..65b7a7f8 100644 --- a/exercises/vecs/vecs1.rs +++ b/exercises/vecs/vecs1.rs @@ -1,7 +1,10 @@ // vecs1.rs -// Your task is to create a `Vec` which holds the exact same elements -// as in the array `a`. +// +// Your task is to create a `Vec` which holds the exact same elements as in the +// array `a`. +// // Make me compile and pass the test! +// // Execute `rustlings hint vecs1` or use the `hint` watch subcommand for a hint. // I AM NOT DONE diff --git a/exercises/vecs/vecs2.rs b/exercises/vecs/vecs2.rs index 1ea26071..e92c970a 100644 --- a/exercises/vecs/vecs2.rs +++ b/exercises/vecs/vecs2.rs @@ -1,6 +1,7 @@ // vecs2.rs -// A Vec of even numbers is given. Your task is to complete the loop -// so that each number in the Vec is multiplied by 2. +// +// A Vec of even numbers is given. Your task is to complete the loop so that +// each number in the Vec is multiplied by 2. // // Make me pass the test! // From 1e02f194fdd1cb1ca99cf1d93d11455db8b1bce6 Mon Sep 17 00:00:00 2001 From: tajo48 Date: Wed, 31 May 2023 16:37:41 +0200 Subject: [PATCH 0987/1293] update hint for vecs2 to match with exercise as it was updated to fix clarity --- info.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/info.toml b/info.toml index 2add5f0c..a7155d48 100644 --- a/info.toml +++ b/info.toml @@ -260,8 +260,8 @@ name = "vecs2" path = "exercises/vecs/vecs2.rs" mode = "test" hint = """ -Hint 1: `i` is each element from the Vec as they are being iterated. Can you try -multiplying this? +Hint 1: In the code, the variable `element` represents an item from the Vec as it is being iterated. +Can you try multiplying this? Hint 2: For the first function, there's a way to directly access the numbers stored in the Vec, using the * dereference operator. You can both access and write to the From a96bbcd9675933b19454d627ab6291d4739f0e53 Mon Sep 17 00:00:00 2001 From: luhem7 Date: Sat, 3 Jun 2023 10:20:29 -0400 Subject: [PATCH 0988/1293] fix(threads, smart pointers): Swap order of threads and smart pointers exercises closes #1541 --- info.toml | 122 +++++++++++++++++++++++++++--------------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/info.toml b/info.toml index 2add5f0c..3abb2f8c 100644 --- a/info.toml +++ b/info.toml @@ -905,67 +905,6 @@ The fold method can be useful in the count_collection_iterator function. For a further challenge, consult the documentation for Iterator to find a different method that could make your code more compact than using fold.""" -# THREADS - -[[exercises]] -name = "threads1" -path = "exercises/threads/threads1.rs" -mode = "compile" -hint = """ -`JoinHandle` is a struct that is returned from a spawned thread: -https://doc.rust-lang.org/std/thread/fn.spawn.html - -A challenge with multi-threaded applications is that the main thread can -finish before the spawned threads are completed. -https://doc.rust-lang.org/book/ch16-01-threads.html#waiting-for-all-threads-to-finish-using-join-handles - -Use the JoinHandles to wait for each thread to finish and collect their results. -https://doc.rust-lang.org/std/thread/struct.JoinHandle.html -""" - -[[exercises]] -name = "threads2" -path = "exercises/threads/threads2.rs" -mode = "compile" -hint = """ -`Arc` is an Atomic Reference Counted pointer that allows safe, shared access -to **immutable** data. But we want to *change* the number of `jobs_completed` -so we'll need to also use another type that will only allow one thread to -mutate the data at a time. Take a look at this section of the book: -https://doc.rust-lang.org/book/ch16-03-shared-state.html#atomic-reference-counting-with-arct -and keep reading if you'd like more hints :) - - -Do you now have an `Arc` `Mutex` `JobStatus` at the beginning of main? Like: -`let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 }));` -Similar to the code in the example in the book that happens after the text -that says "We can use Arc to fix this.". If not, give that a try! If you -do and would like more hints, keep reading!! - - -Make sure neither of your threads are holding onto the lock of the mutex -while they are sleeping, since this will prevent the other thread from -being allowed to get the lock. Locks are automatically released when -they go out of scope. - -If you've learned from the sample solutions, I encourage you to come -back to this exercise and try it again in a few days to reinforce -what you've learned :)""" - -[[exercises]] -name = "threads3" -path = "exercises/threads/threads3.rs" -mode = "compile" -hint = """ -An alternate way to handle concurrency between threads is to use -a mpsc (multiple producer, single consumer) channel to communicate. -With both a sending end and a receiving end, it's possible to -send values in one thread and receive them in another. -Multiple producers are possible by using clone() to create a duplicate -of the original sending end. -See https://doc.rust-lang.org/book/ch16-02-message-passing.html for more info. -""" - # SMART POINTERS [[exercises]] @@ -1028,6 +967,67 @@ Check out https://doc.rust-lang.org/std/borrow/enum.Cow.html for documentation on the `Cow` type. """ +# THREADS + +[[exercises]] +name = "threads1" +path = "exercises/threads/threads1.rs" +mode = "compile" +hint = """ +`JoinHandle` is a struct that is returned from a spawned thread: +https://doc.rust-lang.org/std/thread/fn.spawn.html + +A challenge with multi-threaded applications is that the main thread can +finish before the spawned threads are completed. +https://doc.rust-lang.org/book/ch16-01-threads.html#waiting-for-all-threads-to-finish-using-join-handles + +Use the JoinHandles to wait for each thread to finish and collect their results. +https://doc.rust-lang.org/std/thread/struct.JoinHandle.html +""" + +[[exercises]] +name = "threads2" +path = "exercises/threads/threads2.rs" +mode = "compile" +hint = """ +`Arc` is an Atomic Reference Counted pointer that allows safe, shared access +to **immutable** data. But we want to *change* the number of `jobs_completed` +so we'll need to also use another type that will only allow one thread to +mutate the data at a time. Take a look at this section of the book: +https://doc.rust-lang.org/book/ch16-03-shared-state.html#atomic-reference-counting-with-arct +and keep reading if you'd like more hints :) + + +Do you now have an `Arc` `Mutex` `JobStatus` at the beginning of main? Like: +`let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 }));` +Similar to the code in the example in the book that happens after the text +that says "We can use Arc to fix this.". If not, give that a try! If you +do and would like more hints, keep reading!! + + +Make sure neither of your threads are holding onto the lock of the mutex +while they are sleeping, since this will prevent the other thread from +being allowed to get the lock. Locks are automatically released when +they go out of scope. + +If you've learned from the sample solutions, I encourage you to come +back to this exercise and try it again in a few days to reinforce +what you've learned :)""" + +[[exercises]] +name = "threads3" +path = "exercises/threads/threads3.rs" +mode = "compile" +hint = """ +An alternate way to handle concurrency between threads is to use +a mpsc (multiple producer, single consumer) channel to communicate. +With both a sending end and a receiving end, it's possible to +send values in one thread and receive them in another. +Multiple producers are possible by using clone() to create a duplicate +of the original sending end. +See https://doc.rust-lang.org/book/ch16-02-message-passing.html for more info. +""" + # MACROS [[exercises]] From 479574e88eef4a4299b005388bec74f07a9c57d5 Mon Sep 17 00:00:00 2001 From: "Florine W. Dekker" Date: Wed, 7 Jun 2023 16:58:02 +0200 Subject: [PATCH 0989/1293] fix(vecs): rename outdated variable name in hint --- info.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/info.toml b/info.toml index 2add5f0c..8706ee51 100644 --- a/info.toml +++ b/info.toml @@ -260,8 +260,8 @@ name = "vecs2" path = "exercises/vecs/vecs2.rs" mode = "test" hint = """ -Hint 1: `i` is each element from the Vec as they are being iterated. Can you try -multiplying this? +Hint 1: `element` is each element from the Vec as they are being iterated. Can you +try multiplying this? Hint 2: For the first function, there's a way to directly access the numbers stored in the Vec, using the * dereference operator. You can both access and write to the From bbfb4c7e63dc59a4e8afbb8d2a10b35414782256 Mon Sep 17 00:00:00 2001 From: Bert Apperlo <91734527+b-apperlo@users.noreply.github.com> Date: Thu, 8 Jun 2023 15:49:07 +0200 Subject: [PATCH 0990/1293] feat: added test function to hashmaps2.rs The existing test functions only check if a kind of fruit exists in the hashmap, but not if the amount of fruits is higher than zero. This new test function solves this. --- exercises/hashmaps/hashmaps2.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/exercises/hashmaps/hashmaps2.rs b/exercises/hashmaps/hashmaps2.rs index a4f069a8..852c0760 100644 --- a/exercises/hashmaps/hashmaps2.rs +++ b/exercises/hashmaps/hashmaps2.rs @@ -80,4 +80,13 @@ mod tests { let count = basket.values().sum::(); assert!(count > 11); } + + #[test] + fn all_fruit_types_in_basket() { + let mut basket = get_fruit_basket(); + fruit_basket(&mut basket); + for amount in basket.values() { + assert_ne!(amount, &0); + } + } } From 8974e33f697abf55d322b7de051e8b41c219523d Mon Sep 17 00:00:00 2001 From: Bert Apperlo <91734527+b-apperlo@users.noreply.github.com> Date: Thu, 8 Jun 2023 16:44:39 +0200 Subject: [PATCH 0991/1293] fix: update hashmaps3.rs --- exercises/hashmaps/hashmaps3.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/exercises/hashmaps/hashmaps3.rs b/exercises/hashmaps/hashmaps3.rs index ad3baa68..982976c6 100644 --- a/exercises/hashmaps/hashmaps3.rs +++ b/exercises/hashmaps/hashmaps3.rs @@ -20,7 +20,6 @@ use std::collections::HashMap; // A structure to store team name and its goal details. struct Team { - name: String, goals_scored: u8, goals_conceded: u8, } From a4fe3602b238f38e9fd245874c863852791129fb Mon Sep 17 00:00:00 2001 From: Bert Apperlo <91734527+b-apperlo@users.noreply.github.com> Date: Thu, 8 Jun 2023 16:46:45 +0200 Subject: [PATCH 0992/1293] fix: updated comment for struct --- exercises/hashmaps/hashmaps3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/hashmaps/hashmaps3.rs b/exercises/hashmaps/hashmaps3.rs index 982976c6..0d0a43ad 100644 --- a/exercises/hashmaps/hashmaps3.rs +++ b/exercises/hashmaps/hashmaps3.rs @@ -18,7 +18,7 @@ use std::collections::HashMap; -// A structure to store team name and its goal details. +// A structure to store the goal details of a team. struct Team { goals_scored: u8, goals_conceded: u8, From d0a17830831121fcdbc27a1833ccbbc17bc0c02d Mon Sep 17 00:00:00 2001 From: IVIURARY Date: Thu, 8 Jun 2023 22:14:25 +0100 Subject: [PATCH 0993/1293] fix(enums3): add test for message closes #1548 --- exercises/enums/enums3.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs index a2a9d586..e75d4433 100644 --- a/exercises/enums/enums3.rs +++ b/exercises/enums/enums3.rs @@ -17,6 +17,7 @@ struct State { color: (u8, u8, u8), position: Point, quit: bool, + message: String } impl State { @@ -28,9 +29,7 @@ impl State { self.quit = true; } - fn echo(&self, s: String) { - println!("{}", s); - } + fn echo(&mut self, s: String) { self.message = s } fn move_position(&mut self, p: Point) { self.position = p; @@ -52,6 +51,7 @@ mod tests { quit: false, position: Point { x: 0, y: 0 }, color: (0, 0, 0), + message: "hello world".to_string(), }; state.process(Message::ChangeColor(255, 0, 255)); state.process(Message::Echo(String::from("hello world"))); @@ -62,5 +62,6 @@ mod tests { assert_eq!(state.position.x, 10); assert_eq!(state.position.y, 15); assert_eq!(state.quit, true); + assert_eq!(state.message, "hello world"); } } From f30f0bf148eab8b1a11fa7ee36f230e94aea417a Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 11 Jun 2023 16:30:01 -0500 Subject: [PATCH 0994/1293] chore(ci): add action step to check if lockfile is synced --- .github/workflows/rust.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index bf2a041a..1b244b1a 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -14,6 +14,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + - name: Fetch & maybe update Cargo.lock + run: cargo fetch --locked - name: Build run: cargo build --verbose - name: Run tests From 3cced07c1324a1d4e0b2f2e1e585cc1964d2bde3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 09:50:02 +0000 Subject: [PATCH 0995/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 50a477c0..8f8934e1 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -303,6 +303,7 @@ authors. b1ue64
b1ue64

πŸ–‹ lazywalker
lazywalker

πŸ–‹ + proofconstruction
proofconstruction

πŸš‡ From e0ea03dc567cd29c08012aa2da818c6f5599ab3b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 09:50:03 +0000 Subject: [PATCH 0996/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 14ec3a98..15f9c56e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2136,6 +2136,15 @@ "contributions": [ "content" ] + }, + { + "login": "proofconstruction", + "name": "proofconstruction", + "avatar_url": "https://avatars.githubusercontent.com/u/74747193?v=4", + "profile": "https://github.com/proofconstruction", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 8, @@ -2144,5 +2153,6 @@ "repoType": "github", "repoHost": "https://github.com", "skipCi": true, - "commitConvention": "angular" + "commitConvention": "angular", + "commitType": "docs" } From 369ae2e63d06de6fee36aeebfd1ff3e8bcdfa25a Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 12 Jun 2023 12:07:18 +0200 Subject: [PATCH 0997/1293] feat(move_semantics2): rewrite hint --- exercises/move_semantics/move_semantics2.rs | 10 +++---- info.toml | 29 +++++++++++---------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs index 93bb82ef..66ddb4cd 100644 --- a/exercises/move_semantics/move_semantics2.rs +++ b/exercises/move_semantics/move_semantics2.rs @@ -2,23 +2,21 @@ // Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand for a hint. // Expected output: -// vec0 has length 3 content `[22, 44, 66]` -// vec1 has length 4 content `[22, 44, 66, 88]` +// vec0 has length 3, with contents `[22, 44, 66]` +// vec1 has length 4, with contents `[22, 44, 66, 88]` // I AM NOT DONE fn main() { let vec0 = Vec::new(); - // Do not move the following line! let mut vec1 = fill_vec(vec0); - // Do not change the following line! - println!("{} has length {} content `{:?}`", "vec0", vec0.len(), vec0); + println!("{} has length {}, with contents: `{:?}`", "vec0", vec0.len(), vec0); vec1.push(88); - println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); + println!("{} has length {}, with contents `{:?}`", "vec1", vec1.len(), vec1); } fn fill_vec(vec: Vec) -> Vec { diff --git a/info.toml b/info.toml index 2add5f0c..8febf41d 100644 --- a/info.toml +++ b/info.toml @@ -287,23 +287,24 @@ Also: Try accessing `vec0` after having called `fill_vec()`. See what happens!"" [[exercises]] name = "move_semantics2" path = "exercises/move_semantics/move_semantics2.rs" -mode = "compile" +mode = "test" hint = """ -So, `vec0` is passed into the `fill_vec` function as an argument. In Rust, -when an argument is passed to a function and it's not explicitly returned, -you can't use the original variable anymore. We call this "moving" a variable. -Variables that are moved into a function (or block scope) and aren't explicitly -returned get "dropped" at the end of that function. This is also what happens here. -There's a few ways to fix this, try them all if you want: -1. Make another, separate version of the data that's in `vec0` and pass that +When running this exercise for the first time, you'll notice an error about +"borrow of moved value". In Rust, when an argument is passed to a function and +it's not explicitly returned, you can't use the original variable anymore. +We call this "moving" a variable. When we pass `vec0` into `fill_vec`, it's being +"moved" into `vec1`, meaning we can't access `vec0` anymore after the fact. +Rust provides a couple of different ways to mitigate this issue, feel free to try them all: +1. You could make another, separate version of the data that's in `vec0` and pass that to `fill_vec` instead. 2. Make `fill_vec` borrow its argument instead of taking ownership of it, - and then copy the data within the function in order to return an owned - `Vec` -3. Make `fill_vec` *mutably* borrow a reference to its argument (which will need to be - mutable), modify it directly, then not return anything. Then you can get rid - of `vec1` entirely -- note that this will change what gets printed by the - first `println!`""" + and then copy the data within the function (`vec.clone()`) in order to return an owned + `Vec`. +3. Or, you could make `fill_vec` *mutably* borrow a reference to its argument (which will need to be + mutable), modify it directly, then not return anything. This means that `vec0` will change over the + course of the function, and makes `vec1` redundant (make sure to change the parameters of the `println!` + statements if you go this route) +""" [[exercises]] name = "move_semantics3" From a1188ca0eea0e1a61217812bde3b085a7de998b5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:17:21 +0000 Subject: [PATCH 0998/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 8f8934e1..77f98ada 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -304,6 +304,7 @@ authors. b1ue64
b1ue64

πŸ–‹ lazywalker
lazywalker

πŸ–‹ proofconstruction
proofconstruction

πŸš‡ + IVIURRAY
IVIURRAY

πŸ–‹ From 47fcab1e603e7147e68bdf03b110f8799f2d5460 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:17:22 +0000 Subject: [PATCH 0999/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 15f9c56e..6c0cb1fc 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2145,6 +2145,15 @@ "contributions": [ "infra" ] + }, + { + "login": "IVIURRAY", + "name": "IVIURRAY", + "avatar_url": "https://avatars.githubusercontent.com/u/16007179?v=4", + "profile": "https://www.youtube.com/channel/UCQCjA6qUutAtWqkCA4Z36CQ", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 4fd52390eec5e16b24cf26c1efaa961d4f0a365e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:18:54 +0000 Subject: [PATCH 1000/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 77f98ada..4d151363 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -305,6 +305,7 @@ authors. lazywalker
lazywalker

πŸ–‹ proofconstruction
proofconstruction

πŸš‡ IVIURRAY
IVIURRAY

πŸ–‹ + Bert Apperlo
Bert Apperlo

πŸ–‹ From d35a352fe6f252217c65560e3c1addcd23e9a7f0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:18:55 +0000 Subject: [PATCH 1001/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6c0cb1fc..760aa3a6 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2154,6 +2154,15 @@ "contributions": [ "content" ] + }, + { + "login": "b-apperlo", + "name": "Bert Apperlo", + "avatar_url": "https://avatars.githubusercontent.com/u/91734527?v=4", + "profile": "https://github.com/b-apperlo", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From bd05bab4bfb14a7ef65424cdcd7af8f20d4a3dd1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:32:25 +0000 Subject: [PATCH 1002/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4d151363..a2219b2d 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -306,6 +306,7 @@ authors. proofconstruction
proofconstruction

πŸš‡ IVIURRAY
IVIURRAY

πŸ–‹ Bert Apperlo
Bert Apperlo

πŸ–‹ + Florine W. Dekker
Florine W. Dekker

πŸ–‹ From 5921948de8cd15e20e5812c0d1712ec4fc3e8127 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:32:26 +0000 Subject: [PATCH 1003/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 760aa3a6..81e5f4f2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2163,6 +2163,15 @@ "contributions": [ "content" ] + }, + { + "login": "FWDekker", + "name": "Florine W. Dekker", + "avatar_url": "https://avatars.githubusercontent.com/u/13442533?v=4", + "profile": "https://fwdekker.com/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From a14f0c3f55ce326a6dfe5b7ed63cb0052985d1c4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:33:44 +0000 Subject: [PATCH 1004/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index a2219b2d..23dfa65f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -307,6 +307,7 @@ authors. IVIURRAY
IVIURRAY

πŸ–‹ Bert Apperlo
Bert Apperlo

πŸ–‹ Florine W. Dekker
Florine W. Dekker

πŸ–‹ + Mehul Gangavelli
Mehul Gangavelli

πŸ–‹ From 521962159592adc2031fc5ff513ce6385bb72a45 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:33:45 +0000 Subject: [PATCH 1005/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 81e5f4f2..5e038774 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2172,6 +2172,15 @@ "contributions": [ "content" ] + }, + { + "login": "luhem7", + "name": "Mehul Gangavelli", + "avatar_url": "https://avatars.githubusercontent.com/u/4008215?v=4", + "profile": "https://github.com/luhem7", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From eb3c9658b166eb6aae1d05ea89d0863a554663b4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:36:22 +0000 Subject: [PATCH 1006/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 23dfa65f..723cc4a8 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -308,6 +308,7 @@ authors. Bert Apperlo
Bert Apperlo

πŸ–‹ Florine W. Dekker
Florine W. Dekker

πŸ–‹ Mehul Gangavelli
Mehul Gangavelli

πŸ–‹ + Mikael Frosthage
Mikael Frosthage

πŸ–‹ From a2f99ad00db939e63b8bdbbfbb9948a737fe0f5c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:36:23 +0000 Subject: [PATCH 1007/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5e038774..ab5d1424 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2181,6 +2181,15 @@ "contributions": [ "content" ] + }, + { + "login": "Frosthage", + "name": "Mikael Frosthage", + "avatar_url": "https://avatars.githubusercontent.com/u/14823314?v=4", + "profile": "https://github.com/Frosthage", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 33cf4f7eca5b309996cee25bced7dc76936f09b8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:39:26 +0000 Subject: [PATCH 1008/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 723cc4a8..79306523 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -310,6 +310,9 @@ authors. Mehul Gangavelli
Mehul Gangavelli

πŸ–‹ Mikael Frosthage
Mikael Frosthage

πŸ–‹ + + Robert Fry
Robert Fry

πŸ–‹ + From 846e68e1aa601826e18f9e5e7b0fbf3fd0afd3e1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:39:27 +0000 Subject: [PATCH 1009/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ab5d1424..393e59e2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2190,6 +2190,15 @@ "contributions": [ "content" ] + }, + { + "login": "robertefry", + "name": "Robert Fry", + "avatar_url": "https://avatars.githubusercontent.com/u/43712054?v=4", + "profile": "https://robertfry.xyz", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From c236a80a37c46cc59d5fc6ba619a23229c9f816c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 15 Jun 2023 08:42:01 +0000 Subject: [PATCH 1010/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 79306523..ba208034 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -312,6 +312,7 @@ authors. Robert Fry
Robert Fry

πŸ–‹ + tajo48
tajo48

πŸ–‹ From 0cb63cdd01d133a1244ff18db448591fb3a40cd6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 15 Jun 2023 08:42:02 +0000 Subject: [PATCH 1011/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 393e59e2..a8b82aeb 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2199,6 +2199,15 @@ "contributions": [ "content" ] + }, + { + "login": "tajo48", + "name": "tajo48", + "avatar_url": "https://avatars.githubusercontent.com/u/55502906?v=4", + "profile": "https://github.com/tajo48", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From c2264cabae976cf534be08942ff33f3a58f8795e Mon Sep 17 00:00:00 2001 From: liv Date: Thu, 15 Jun 2023 10:56:53 +0200 Subject: [PATCH 1012/1293] fix: install into $home on windows for now Stopgap measure so that people stop installing into System32 (since that's the default Powershell elevated prompt directory for some reason). --- install.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install.ps1 b/install.ps1 index 97980c5b..7bab21f6 100644 --- a/install.ps1 +++ b/install.ps1 @@ -1,7 +1,7 @@ #!/usr/bin/env pwsh #Requires -Version 5 -param($path = "$pwd/rustlings") +param($path = "$home/rustlings") Write-Host "Let's get you set up with Rustlings!" @@ -91,4 +91,4 @@ if (!$clippy) { rustup component add clippy } -Write-Host "All done! Run 'rustlings' to get started." +Write-Host "All done! Navigate to $path and run 'rustlings' to get started!" From c5231f0ce34092a8e92ee0e2eac157f9e0655e33 Mon Sep 17 00:00:00 2001 From: Mohammed Sadiq Date: Fri, 16 Jun 2023 13:50:54 +0530 Subject: [PATCH 1013/1293] fix(enums3): modify message string in test Otherwise it won't actually test the change of state.message and it would fail to check if the user missed changing state.message This happened to me as I had a catch-all line in `match` --- exercises/enums/enums3.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs index 5d284417..98da1691 100644 --- a/exercises/enums/enums3.rs +++ b/exercises/enums/enums3.rs @@ -59,7 +59,7 @@ mod tests { message: "hello world".to_string(), }; state.process(Message::ChangeColor(255, 0, 255)); - state.process(Message::Echo(String::from("hello world"))); + state.process(Message::Echo(String::from("Hello world!"))); state.process(Message::Move(Point { x: 10, y: 15 })); state.process(Message::Quit); @@ -67,6 +67,6 @@ mod tests { assert_eq!(state.position.x, 10); assert_eq!(state.position.y, 15); assert_eq!(state.quit, true); - assert_eq!(state.message, "hello world"); + assert_eq!(state.message, "Hello world!"); } } From adc7ca56901ed1f53659fb8fa139a65423affd13 Mon Sep 17 00:00:00 2001 From: liv Date: Thu, 22 Jun 2023 10:10:44 +0200 Subject: [PATCH 1014/1293] fix(move_semantics2): change type back to compile --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index ba3e585a..b4fd8ffa 100644 --- a/info.toml +++ b/info.toml @@ -287,7 +287,7 @@ Also: Try accessing `vec0` after having called `fill_vec()`. See what happens!"" [[exercises]] name = "move_semantics2" path = "exercises/move_semantics/move_semantics2.rs" -mode = "test" +mode = "compile" hint = """ When running this exercise for the first time, you'll notice an error about "borrow of moved value". In Rust, when an argument is passed to a function and From eacf7db6f34f7c884b2a736a35fa997299b34485 Mon Sep 17 00:00:00 2001 From: Anish <98446102+novanish@users.noreply.github.com> Date: Fri, 23 Jun 2023 17:18:17 +0545 Subject: [PATCH 1015/1293] refactor: Update comment to use correct construct name 'Result' instead of 'Option' Refactor the comment in the code to provide a more accurate description of the construct being used. Replace the mention of Option with Result. --- exercises/error_handling/errors1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/error_handling/errors1.rs b/exercises/error_handling/errors1.rs index 0ba59a57..13d2724c 100644 --- a/exercises/error_handling/errors1.rs +++ b/exercises/error_handling/errors1.rs @@ -3,7 +3,7 @@ // This function refuses to generate text to be printed on a nametag if you pass // it an empty string. It'd be nicer if it explained what the problem was, // instead of just sometimes returning `None`. Thankfully, Rust has a similar -// construct to `Option` that can be used to express error conditions. Let's use +// construct to `Result` that can be used to express error conditions. Let's use // it! // // Execute `rustlings hint errors1` or use the `hint` watch subcommand for a From f03a915c750a47cfbabb13413e200d82f0e45405 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 07:58:23 +0000 Subject: [PATCH 1016/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index ba208034..c7ef5209 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -313,6 +313,7 @@ authors. Robert Fry
Robert Fry

πŸ–‹ tajo48
tajo48

πŸ–‹ + Anish
Anish

πŸ–‹ From 2e4022dd730869c9065f8b9f1aa031cbb0b2f0fa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 07:58:24 +0000 Subject: [PATCH 1017/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a8b82aeb..0c985add 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2208,6 +2208,15 @@ "contributions": [ "content" ] + }, + { + "login": "novanish", + "name": "Anish", + "avatar_url": "https://avatars.githubusercontent.com/u/98446102?v=4", + "profile": "https://anishchhetri.com.np", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 405b32e77a6643f08e5bc895d6d2d1e684d47324 Mon Sep 17 00:00:00 2001 From: vnprc <9425366+vnprc@users.noreply.github.com> Date: Mon, 26 Jun 2023 09:17:39 -0400 Subject: [PATCH 1018/1293] chore: use correct line number in strings2.rs hint --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index b4fd8ffa..e4863cbf 100644 --- a/info.toml +++ b/info.toml @@ -439,7 +439,7 @@ mode = "compile" hint = """ Yes, it would be really easy to fix this by just changing the value bound to `word` to be a string slice instead of a `String`, wouldn't it?? There is a way to add one character to line -9, though, that will coerce the `String` into a string slice. +12, though, that will coerce the `String` into a string slice. Side note: If you're interested in learning about how this kind of reference conversion works, you can jump ahead in the book and read this part in the smart pointers chapter: https://doc.rust-lang.org/stable/book/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods""" From 47b3a531325932a0051b0dba91c3a8fd86aa2fe1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 13:19:52 +0000 Subject: [PATCH 1019/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index c7ef5209..4e777174 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -314,6 +314,7 @@ authors. Robert Fry
Robert Fry

πŸ–‹ tajo48
tajo48

πŸ–‹ Anish
Anish

πŸ–‹ + vnprc
vnprc

πŸ–‹ From a46d42f45e7052fbadb457cd303ff62f5a641555 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 13:19:53 +0000 Subject: [PATCH 1020/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0c985add..d02fe784 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2217,6 +2217,15 @@ "contributions": [ "content" ] + }, + { + "login": "vnprc", + "name": "vnprc", + "avatar_url": "https://avatars.githubusercontent.com/u/9425366?v=4", + "profile": "https://github.com/vnprc", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From b99c7b8c37b7f95d450ad3fa5461a9398c0f7819 Mon Sep 17 00:00:00 2001 From: Will Hack <18036720+willhack@users.noreply.github.com> Date: Sun, 2 Jul 2023 13:46:59 -0400 Subject: [PATCH 1021/1293] chore: update line reference in strings2 hint --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index ba3e585a..05012cf9 100644 --- a/info.toml +++ b/info.toml @@ -439,7 +439,7 @@ mode = "compile" hint = """ Yes, it would be really easy to fix this by just changing the value bound to `word` to be a string slice instead of a `String`, wouldn't it?? There is a way to add one character to line -9, though, that will coerce the `String` into a string slice. +12, though, that will coerce the `String` into a string slice. Side note: If you're interested in learning about how this kind of reference conversion works, you can jump ahead in the book and read this part in the smart pointers chapter: https://doc.rust-lang.org/stable/book/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods""" From c5b0627180ae98c41f67e345b2a16ca14a6cffd1 Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 3 Jul 2023 18:50:50 +0200 Subject: [PATCH 1022/1293] chore: update oranda config for 0.1.0 --- oranda.json | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/oranda.json b/oranda.json index 18ef8c68..603e474e 100644 --- a/oranda.json +++ b/oranda.json @@ -1,10 +1,25 @@ { - "homepage": "https://rustlings.cool", - "repository": "https://github.com/rust-lang/rustlings", - "analytics": { - "plausible": { - "domain": "rustlings.cool" + "project": { + "homepage": "https://rustlings.cool", + "repository": "https://github.com/rust-lang/rustlings" + }, + "marketing": { + "analytics": { + "plausible": { + "domain": "rustlings.cool" + } } }, - "changelog": false + "components": { + "artifacts": { + "cargo_dist": false, + "package_managers": { + "preferred": { + "macos/linux/unix": "curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash", + "windows": "Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1" + } + } + }, + "changelog": true + } } From 0ab781c7a7e5240f86033a5c9d242ef5aca391aa Mon Sep 17 00:00:00 2001 From: Will Hack <18036720+willhack@users.noreply.github.com> Date: Mon, 3 Jul 2023 14:20:38 -0400 Subject: [PATCH 1023/1293] chore: remove line reference from strings2 hint --- info.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/info.toml b/info.toml index 05012cf9..9885cdce 100644 --- a/info.toml +++ b/info.toml @@ -438,8 +438,8 @@ path = "exercises/strings/strings2.rs" mode = "compile" hint = """ Yes, it would be really easy to fix this by just changing the value bound to `word` to be a -string slice instead of a `String`, wouldn't it?? There is a way to add one character to line -12, though, that will coerce the `String` into a string slice. +string slice instead of a `String`, wouldn't it?? There is a way to add one character to the +if statement, though, that will coerce the `String` into a string slice. Side note: If you're interested in learning about how this kind of reference conversion works, you can jump ahead in the book and read this part in the smart pointers chapter: https://doc.rust-lang.org/stable/book/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods""" From 287172698aea106723682542e011b64f3d6d218a Mon Sep 17 00:00:00 2001 From: Joshua Carlson Date: Mon, 3 Jul 2023 14:52:13 -0400 Subject: [PATCH 1024/1293] added if3 based on: `Using if in a let Statement` --- exercises/if/if3.rs | 55 +++++++++++++++++++++++++++++++++++++++++++++ info.toml | 7 ++++++ 2 files changed, 62 insertions(+) create mode 100644 exercises/if/if3.rs diff --git a/exercises/if/if3.rs b/exercises/if/if3.rs new file mode 100644 index 00000000..73a7025b --- /dev/null +++ b/exercises/if/if3.rs @@ -0,0 +1,55 @@ +// if3.rs +// +// Execute `rustlings hint if3` or use the `hint` watch subcommand for a hint. + +// I AM NOT DONE + +pub fn animal_habitat(animal: &str) -> &'static str { + let identifier = if animal == "crab" { + 1 + } else if animal == "gopher" { + 2.0 + } else if animal == "snake" { + 3 + } else { + "Unknown" + }; + + // DO NOT CHANGE THIS STATEMENT BELOW + let habitat = if identifier == 1 { + "Beach" + } else if identifier == 2 { + "Burrow" + } else if identifier == 3 { + "Desert" + } else { + "Unknown" + }; + + habitat +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn gopher_lives_in_burrow() { + assert_eq!(animal_habitat("gopher"), "Burrow") + } + + #[test] + fn snake_lives_in_desert() { + assert_eq!(animal_habitat("snake"), "Desert") + } + + #[test] + fn crab_lives_on_beach() { + assert_eq!(animal_habitat("crab"), "Beach") + } + + #[test] + fn unknown_animal() { + assert_eq!(animal_habitat("dinosaur"), "Unknown") + } +} diff --git a/info.toml b/info.toml index e4863cbf..e8a28cbc 100644 --- a/info.toml +++ b/info.toml @@ -167,6 +167,13 @@ For that first compiler error, it's important in Rust that each conditional block returns the same type! To get the tests passing, you will need a couple conditions checking different input values.""" +[[exercises]] +name = "if3" +path = "exercises/if/if3.rs" +mode = "test" +hint = """ +In Rust, every arm of an `if` expression has to return the same type of value. Make sure the type is consistent across all arms.""" + # QUIZ 1 [[exercises]] From 0e0c5dfe99b99b7723ea9ec77733214c69b2a8ae Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 4 Jul 2023 09:57:30 +0000 Subject: [PATCH 1025/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4e777174..6c1ee1e3 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -315,6 +315,7 @@ authors. tajo48
tajo48

πŸ–‹ Anish
Anish

πŸ–‹ vnprc
vnprc

πŸ–‹ + Joshua Carlson
Joshua Carlson

πŸ–‹ From 176fb7c447e9310c5c5ccc511ee8f61ad14adc9b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 4 Jul 2023 09:57:31 +0000 Subject: [PATCH 1026/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d02fe784..37b86693 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2226,6 +2226,15 @@ "contributions": [ "content" ] + }, + { + "login": "jrcarl624", + "name": "Joshua Carlson", + "avatar_url": "https://avatars.githubusercontent.com/u/61999256?v=4", + "profile": "http://androecia.net", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 2934d062a30be177056fcded950bd5339b636b8f Mon Sep 17 00:00:00 2001 From: "Nicholas R. Smith" Date: Fri, 14 Jul 2023 10:47:42 -0700 Subject: [PATCH 1027/1293] fix: run cargo update to build proc-macro2 on nightly --- Cargo.lock | 192 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 126 insertions(+), 66 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a09d98f7..a8268d90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] @@ -77,15 +77,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "console" -version = "0.15.5" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" +checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", - "windows-sys 0.42.0", + "windows-sys 0.45.0", ] [[package]] @@ -114,14 +114,14 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412" +checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" dependencies = [ "cfg-if 1.0.0", "libc", "redox_syscall", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -176,11 +176,11 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "home" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ - "winapi 0.3.9", + "windows-sys 0.48.0", ] [[package]] @@ -226,9 +226,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" [[package]] name = "kernel32-sys" @@ -254,18 +254,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.140" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if 1.0.0", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -318,9 +315,9 @@ dependencies = [ [[package]] name = "net2" -version = "0.2.38" +version = "0.2.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" +checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" dependencies = [ "cfg-if 0.1.10", "libc", @@ -397,18 +394,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.53" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73" +checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" dependencies = [ "proc-macro2", ] @@ -424,9 +421,21 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce168fea28d3e05f158bda4576cf0c844d5045bc2cc3620fa0292ed5bb5814c" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", @@ -435,9 +444,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "rustlings" @@ -459,9 +468,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" [[package]] name = "same-file" @@ -474,29 +483,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.158" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9" +checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.158" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad" +checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" dependencies = [ "proc-macro2", "quote", - "syn 2.0.8", + "syn 2.0.25", ] [[package]] name = "serde_json" -version = "1.0.94" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" +checksum = "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed" dependencies = [ "itoa", "ryu", @@ -525,9 +534,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.8" +version = "2.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc02725fd69ab9f26eab07fad303e2497fad6fb9eba4f96c4d1687bdf704ad9" +checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2" dependencies = [ "proc-macro2", "quote", @@ -551,9 +560,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" [[package]] name = "unicode-width" @@ -614,28 +623,22 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - [[package]] name = "windows-sys" version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.1", ] [[package]] @@ -644,13 +647,28 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", ] [[package]] @@ -659,42 +677,84 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + [[package]] name = "windows_i686_gnu" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + [[package]] name = "windows_i686_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + [[package]] name = "ws2_32-sys" version = "0.2.1" From f4d86f384c396ed0741e93f71c314c5ed503f12c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 10:31:15 +0000 Subject: [PATCH 1028/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 6c1ee1e3..04ef1fc6 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -316,6 +316,7 @@ authors. Anish
Anish

πŸ–‹ vnprc
vnprc

πŸ–‹ Joshua Carlson
Joshua Carlson

πŸ–‹ + Nicholas R. Smith
Nicholas R. Smith

πŸ’» From 2c7dec73275a12f8e47e0f60c2f1686e579bdc7a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 10:31:16 +0000 Subject: [PATCH 1029/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 37b86693..ac074d39 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2235,6 +2235,15 @@ "contributions": [ "content" ] + }, + { + "login": "johnDeSilencio", + "name": "Nicholas R. Smith", + "avatar_url": "https://avatars.githubusercontent.com/u/20136554?v=4", + "profile": "https://johndesilencio.me", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 662e5bddd7faf7ba383d964ef3c6a2d33168e66c Mon Sep 17 00:00:00 2001 From: Yamila Moreno Date: Mon, 17 Jul 2023 15:58:29 +0200 Subject: [PATCH 1030/1293] fix(primitives-4.rs): update hint so it's less confusing --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index e8a28cbc..f484ecd2 100644 --- a/info.toml +++ b/info.toml @@ -216,7 +216,7 @@ mode = "test" hint = """ Take a look at the Understanding Ownership -> Slices -> Other Slices section of the book: https://doc.rust-lang.org/book/ch04-03-slices.html -and use the starting and ending indices of the items in the Array +and use the starting and ending (plus one) indices of the items in the Array that you want to end up in the slice. If you're curious why the first argument of `assert_eq!` does not From 7f9f897945fbe764b240d51389cf933488b74910 Mon Sep 17 00:00:00 2001 From: Gabor Szabo Date: Thu, 20 Jul 2023 08:28:18 +0300 Subject: [PATCH 1031/1293] add test-case to if/if1 to check equal values --- exercises/if/if1.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/if/if1.rs b/exercises/if/if1.rs index d8108a0f..4734d78f 100644 --- a/exercises/if/if1.rs +++ b/exercises/if/if1.rs @@ -25,4 +25,9 @@ mod tests { fn fortytwo_is_bigger_than_thirtytwo() { assert_eq!(42, bigger(32, 42)); } + + #[test] + fn equal_numbers() { + assert_eq!(42, bigger(42, 42)); + } } From ef8f1f108ba2ed109eea93684ea29861085cea31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Gonz=C3=A1lez?= Date: Fri, 21 Jul 2023 14:42:19 +0200 Subject: [PATCH 1032/1293] docs: dedup repeated sentence --- exercises/quiz1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/quiz1.rs b/exercises/quiz1.rs index a9904b8b..4ee5ada7 100644 --- a/exercises/quiz1.rs +++ b/exercises/quiz1.rs @@ -9,7 +9,7 @@ // - An apple costs 2 rustbucks. // - If Mary buys more than 40 apples, each apple only costs 1 rustbuck! // Write a function that calculates the price of an order of apples given the -// quantity bought. No hints this time! +// quantity bought. // // No hints this time ;) From 8283ae8c4c90acde71a98037107b018ec8fc454b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 08:29:17 +0000 Subject: [PATCH 1033/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 04ef1fc6..3dde8407 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -317,6 +317,7 @@ authors. vnprc
vnprc

πŸ–‹ Joshua Carlson
Joshua Carlson

πŸ–‹ Nicholas R. Smith
Nicholas R. Smith

πŸ’» + Alexander GonzΓ‘lez
Alexander GonzΓ‘lez

πŸ–‹ From bb5fa3f1e8b867f03d5db4d6ab53a1fdfdfad062 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 08:29:18 +0000 Subject: [PATCH 1034/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ac074d39..8a3034da 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2244,6 +2244,15 @@ "contributions": [ "code" ] + }, + { + "login": "alexfertel", + "name": "Alexander GonzΓ‘lez", + "avatar_url": "https://avatars.githubusercontent.com/u/22298999?v=4", + "profile": "https://alexfertel.me", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From be8d1df8b90ad6f15c529e8460a6de72bba52de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20H=C3=B6jvall?= Date: Fri, 28 Jul 2023 23:05:01 +0200 Subject: [PATCH 1035/1293] chore(errors4): improved comment --- exercises/error_handling/errors4.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/error_handling/errors4.rs b/exercises/error_handling/errors4.rs index e04bff77..d6d6fcb6 100644 --- a/exercises/error_handling/errors4.rs +++ b/exercises/error_handling/errors4.rs @@ -16,7 +16,7 @@ enum CreationError { impl PositiveNonzeroInteger { fn new(value: i64) -> Result { - // Hmm...? Why is this only returning an Ok value? + // Hmm... Why is this always returning an Ok value? Ok(PositiveNonzeroInteger(value as u64)) } } From f39df76215fb06013e3d2fbbaf1b709de4729867 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 1 Aug 2023 08:50:13 +0000 Subject: [PATCH 1036/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 3dde8407..250e0929 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -318,6 +318,7 @@ authors. Joshua Carlson
Joshua Carlson

πŸ–‹ Nicholas R. Smith
Nicholas R. Smith

πŸ’» Alexander GonzΓ‘lez
Alexander GonzΓ‘lez

πŸ–‹ + Marcus HΓΆjvall
Marcus HΓΆjvall

πŸ–‹ From 62adbdf7f2d32981e3c44792008c23e5ac700739 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 1 Aug 2023 08:50:14 +0000 Subject: [PATCH 1037/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8a3034da..b5f81cee 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2253,6 +2253,15 @@ "contributions": [ "content" ] + }, + { + "login": "softarn", + "name": "Marcus HΓΆjvall", + "avatar_url": "https://avatars.githubusercontent.com/u/517619?v=4", + "profile": "https://github.com/softarn", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 828e7246598d2d55ea4b379194120367163e397e Mon Sep 17 00:00:00 2001 From: Joshua Carlson <61999256+jrcarl624@users.noreply.github.com> Date: Tue, 1 Aug 2023 13:33:32 -0400 Subject: [PATCH 1038/1293] Added note related to tests. --- exercises/if/if3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/if/if3.rs b/exercises/if/if3.rs index 73a7025b..00400236 100644 --- a/exercises/if/if3.rs +++ b/exercises/if/if3.rs @@ -28,7 +28,7 @@ pub fn animal_habitat(animal: &str) -> &'static str { habitat } - +// No test changes needed. #[cfg(test)] mod tests { use super::*; From 2691a35102b0eab111706da0c27fc39541b64e0c Mon Sep 17 00:00:00 2001 From: Alon Hearter Date: Mon, 7 Aug 2023 18:22:49 +0300 Subject: [PATCH 1039/1293] Fix from_into.rs tests --- exercises/conversions/from_into.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs index aba471d9..60911f3e 100644 --- a/exercises/conversions/from_into.rs +++ b/exercises/conversions/from_into.rs @@ -127,14 +127,14 @@ mod tests { #[test] fn test_trailing_comma() { let p: Person = Person::from("Mike,32,"); - assert_eq!(p.name, "John"); - assert_eq!(p.age, 30); + assert_eq!(p.name, "Mike"); + assert_eq!(p.age, 32); } #[test] fn test_trailing_comma_and_some_string() { let p: Person = Person::from("Mike,32,man"); - assert_eq!(p.name, "John"); - assert_eq!(p.age, 30); + assert_eq!(p.name, "Mike"); + assert_eq!(p.age, 32); } } From 24c838bc0b8bbcc8d61d1af4fc611a7d1c7fbe80 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 15:38:51 +0000 Subject: [PATCH 1040/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 250e0929..6d73d479 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -320,6 +320,9 @@ authors. Alexander GonzΓ‘lez
Alexander GonzΓ‘lez

πŸ–‹ Marcus HΓΆjvall
Marcus HΓΆjvall

πŸ–‹ + + Alon Hearter
Alon Hearter

πŸ–‹ + From 1ace9795f728562fecc548858172320d65c2029e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 15:38:52 +0000 Subject: [PATCH 1041/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b5f81cee..632a6335 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2262,6 +2262,15 @@ "contributions": [ "content" ] + }, + { + "login": "barlevalon", + "name": "Alon Hearter", + "avatar_url": "https://avatars.githubusercontent.com/u/3397911?v=4", + "profile": "https://github.com/barlevalon", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 720f33eee642eafab3c03bc7caed5f8690b481e8 Mon Sep 17 00:00:00 2001 From: Mate Kovacs Date: Thu, 10 Aug 2023 19:56:47 +0900 Subject: [PATCH 1042/1293] add .to_mut() in test owned_mutation() --- exercises/smart_pointers/cow1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/smart_pointers/cow1.rs b/exercises/smart_pointers/cow1.rs index 7ca91686..5ab51152 100644 --- a/exercises/smart_pointers/cow1.rs +++ b/exercises/smart_pointers/cow1.rs @@ -70,7 +70,7 @@ mod tests { // case the call to `to_mut()` returns a reference to the same data as // before. let slice = vec![-1, 0, 1]; - let mut input = Cow::from(slice); + let mut input = Cow::from(slice).to_mut(); match abs_all(&mut input) { // TODO } From ad1c29c512cbd39c05ebd07b9013f08fe8721017 Mon Sep 17 00:00:00 2001 From: Kevin C Date: Mon, 14 Aug 2023 12:49:28 -0700 Subject: [PATCH 1043/1293] Fix comment in errors2 --- exercises/error_handling/errors2.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/error_handling/errors2.rs b/exercises/error_handling/errors2.rs index d86f326d..d4a5477b 100644 --- a/exercises/error_handling/errors2.rs +++ b/exercises/error_handling/errors2.rs @@ -9,9 +9,9 @@ // // Right now, this function isn't handling the error case at all (and isn't // handling the success case properly either). What we want to do is: if we call -// the `parse` function on a string that is not a number, that function will -// return a `ParseIntError`, and in that case, we want to immediately return -// that error from our function and not try to multiply and add. +// the `total_cost` function on a string that is not a number, that function +// will return a `ParseIntError`, and in that case, we want to immediately +// return that error from our function and not try to multiply and add. // // There are at least two ways to implement this that are both correct-- but one // is a lot shorter! From 33a45d0f898317dbbb7bc9e9e057f54c36b62471 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 15 Aug 2023 09:20:01 +0000 Subject: [PATCH 1044/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 6d73d479..28fa51a9 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -322,6 +322,7 @@ authors. Alon Hearter
Alon Hearter

πŸ–‹ + shirts
shirts

πŸ–‹ From d67084730841399466089b867bc41f780e8c0281 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 15 Aug 2023 09:20:02 +0000 Subject: [PATCH 1045/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 632a6335..5d1c22b6 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2271,6 +2271,15 @@ "contributions": [ "content" ] + }, + { + "login": "shirts", + "name": "shirts", + "avatar_url": "https://avatars.githubusercontent.com/u/4952151?v=4", + "profile": "https://github.com/shirts", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From af76794627ac9252650c8d3ec41d9afe251ca5e5 Mon Sep 17 00:00:00 2001 From: Roi Gabay Date: Sun, 20 Aug 2023 21:09:10 +0300 Subject: [PATCH 1046/1293] info.toml: update threads2 text. the previous text does not appear in the provided link (https://doc.rust-lang.org/book/ch16-03-shared-state.html#atomic-reference-counting-with-arct). --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index e8a28cbc..05bb0d5f 100644 --- a/info.toml +++ b/info.toml @@ -1009,7 +1009,7 @@ and keep reading if you'd like more hints :) Do you now have an `Arc` `Mutex` `JobStatus` at the beginning of main? Like: `let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 }));` Similar to the code in the example in the book that happens after the text -that says "We can use Arc to fix this.". If not, give that a try! If you +that says "Sharing a Mutex Between Multiple Threads". If not, give that a try! If you do and would like more hints, keep reading!! From fa0463b3b219f3d10e8ae2e04bc9fbb67e360e9b Mon Sep 17 00:00:00 2001 From: Ivan Vasiunyk Date: Fri, 25 Aug 2023 21:49:22 +0200 Subject: [PATCH 1047/1293] fix(errors1): change Result to Option in exersise description --- exercises/error_handling/errors1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/error_handling/errors1.rs b/exercises/error_handling/errors1.rs index 13d2724c..0ba59a57 100644 --- a/exercises/error_handling/errors1.rs +++ b/exercises/error_handling/errors1.rs @@ -3,7 +3,7 @@ // This function refuses to generate text to be printed on a nametag if you pass // it an empty string. It'd be nicer if it explained what the problem was, // instead of just sometimes returning `None`. Thankfully, Rust has a similar -// construct to `Result` that can be used to express error conditions. Let's use +// construct to `Option` that can be used to express error conditions. Let's use // it! // // Execute `rustlings hint errors1` or use the `hint` watch subcommand for a From e7ad540618048d4f4c1fee9666a7d49df0ccaed3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 26 Aug 2023 20:27:32 +0000 Subject: [PATCH 1048/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 28fa51a9..e01c19c3 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -323,6 +323,7 @@ authors. Alon Hearter
Alon Hearter

πŸ–‹ shirts
shirts

πŸ–‹ + Ivan Vasiunyk
Ivan Vasiunyk

πŸ–‹ From 77f0e177e67bddd3e5ed5a3460800cb1749e6b94 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 26 Aug 2023 20:27:33 +0000 Subject: [PATCH 1049/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5d1c22b6..22d68418 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2280,6 +2280,15 @@ "contributions": [ "content" ] + }, + { + "login": "eLVas", + "name": "Ivan Vasiunyk", + "avatar_url": "https://avatars.githubusercontent.com/u/6797156?v=4", + "profile": "https://github.com/eLVas", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 571bab20c1136adf1443b0fc1778341e923e06e5 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sat, 26 Aug 2023 23:07:20 +0200 Subject: [PATCH 1050/1293] Run clippy --fix --- src/exercise.rs | 18 +++++++++--------- src/main.rs | 12 ++++++------ src/project.rs | 2 +- src/verify.rs | 4 ++-- tests/integration_tests.rs | 34 +++++++++++++++++----------------- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 2cde4e15..07251dba 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -110,12 +110,12 @@ impl Exercise { pub fn compile(&self) -> Result { let cmd = match self.mode { Mode::Compile => Command::new("rustc") - .args(&[self.path.to_str().unwrap(), "-o", &temp_file()]) + .args([self.path.to_str().unwrap(), "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) .args(RUSTC_EDITION_ARGS) .output(), Mode::Test => Command::new("rustc") - .args(&["--test", self.path.to_str().unwrap(), "-o", &temp_file()]) + .args(["--test", self.path.to_str().unwrap(), "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) .args(RUSTC_EDITION_ARGS) .output(), @@ -141,7 +141,7 @@ path = "{}.rs""#, // compilation failure, this would silently fail. But we expect // clippy to reflect the same failure while compiling later. Command::new("rustc") - .args(&[self.path.to_str().unwrap(), "-o", &temp_file()]) + .args([self.path.to_str().unwrap(), "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) .args(RUSTC_EDITION_ARGS) .output() @@ -151,14 +151,14 @@ path = "{}.rs""#, // This is already fixed on Clippy's master branch. See this issue to track merging into Cargo: // https://github.com/rust-lang/rust-clippy/issues/3837 Command::new("cargo") - .args(&["clean", "--manifest-path", CLIPPY_CARGO_TOML_PATH]) + .args(["clean", "--manifest-path", CLIPPY_CARGO_TOML_PATH]) .args(RUSTC_COLOR_ARGS) .output() .expect("Failed to run 'cargo clean'"); Command::new("cargo") - .args(&["clippy", "--manifest-path", CLIPPY_CARGO_TOML_PATH]) + .args(["clippy", "--manifest-path", CLIPPY_CARGO_TOML_PATH]) .args(RUSTC_COLOR_ARGS) - .args(&["--", "-D", "warnings", "-D", "clippy::float_cmp"]) + .args(["--", "-D", "warnings", "-D", "clippy::float_cmp"]) .output() } } @@ -183,7 +183,7 @@ path = "{}.rs""#, Mode::Test => "--show-output", _ => "", }; - let cmd = Command::new(&temp_file()) + let cmd = Command::new(temp_file()) .arg(arg) .output() .expect("Failed to run 'run' command"); @@ -260,7 +260,7 @@ impl Display for Exercise { #[inline] fn clean() { - let _ignored = remove_file(&temp_file()); + let _ignored = remove_file(temp_file()); } #[cfg(test)] @@ -270,7 +270,7 @@ mod test { #[test] fn test_clean() { - File::create(&temp_file()).unwrap(); + File::create(temp_file()).unwrap(); let exercise = Exercise { name: String::from("example"), path: PathBuf::from("tests/fixture/state/pending_exercise.rs"), diff --git a/src/main.rs b/src/main.rs index 0a9af2ec..1a150867 100644 --- a/src/main.rs +++ b/src/main.rs @@ -169,7 +169,7 @@ fn main() { let filter_cond = filters .split(',') .filter(|f| !f.trim().is_empty()) - .any(|f| e.name.contains(&f) || fname.contains(&f)); + .any(|f| e.name.contains(f) || fname.contains(f)); let status = if e.looks_done() { exercises_done += 1; "Done" @@ -429,7 +429,7 @@ fn watch( fn rustc_exists() -> bool { Command::new("rustc") - .args(&["--version"]) + .args(["--version"]) .stdout(Stdio::null()) .spawn() .and_then(|mut child| child.wait()) @@ -465,7 +465,7 @@ started, here's a couple of notes about how Rustlings operates: Got all that? Great! To get started, run `rustlings watch` in order to get the first exercise. Make sure to have your editor open!"#; -const FENISH_LINE: &str = r#"+----------------------------------------------------+ +const FENISH_LINE: &str = r"+----------------------------------------------------+ | You made it to the Fe-nish line! | +-------------------------- ------------------------+ \\/ @@ -490,12 +490,12 @@ If you noticed any issues, please don't hesitate to report them to our repo. You can also contribute your own exercises to help the greater community! Before reporting an issue or contributing, please read our guidelines: -https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md"#; +https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md"; -const WELCOME: &str = r#" welcome to... +const WELCOME: &str = r" welcome to... _ _ _ _ __ _ _ ___| |_| (_)_ __ __ _ ___ | '__| | | / __| __| | | '_ \ / _` / __| | | | |_| \__ \ |_| | | | | | (_| \__ \ |_| \__,_|___/\__|_|_|_| |_|\__, |___/ - |___/"#; + |___/"; diff --git a/src/project.rs b/src/project.rs index ebebe27d..bcbd7ada 100644 --- a/src/project.rs +++ b/src/project.rs @@ -86,7 +86,7 @@ impl RustAnalyzerProject { println!("Determined toolchain: {}\n", &toolchain); - self.sysroot_src = (std::path::Path::new(&*toolchain) + self.sysroot_src = (std::path::Path::new(toolchain) .join("lib") .join("rustlib") .join("src") diff --git a/src/verify.rs b/src/verify.rs index f3f3b564..4e0df867 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -123,9 +123,9 @@ fn compile_and_test(exercise: &Exercise, run_mode: RunMode, verbose: bool, succe // Compile the given Exercise and return an object with information // about the state of the compilation -fn compile<'a, 'b>( +fn compile<'a>( exercise: &'a Exercise, - progress_bar: &'b ProgressBar, + progress_bar: &ProgressBar, ) -> Result, ()> { let compilation_result = exercise.compile(); diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 1a729232..4c236fd0 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -44,7 +44,7 @@ fn verify_fails_if_some_fails() { fn run_single_compile_success() { Command::cargo_bin("rustlings") .unwrap() - .args(&["run", "compSuccess"]) + .args(["run", "compSuccess"]) .current_dir("tests/fixture/success/") .assert() .success(); @@ -54,7 +54,7 @@ fn run_single_compile_success() { fn run_single_compile_failure() { Command::cargo_bin("rustlings") .unwrap() - .args(&["run", "compFailure"]) + .args(["run", "compFailure"]) .current_dir("tests/fixture/failure/") .assert() .code(1); @@ -64,7 +64,7 @@ fn run_single_compile_failure() { fn run_single_test_success() { Command::cargo_bin("rustlings") .unwrap() - .args(&["run", "testSuccess"]) + .args(["run", "testSuccess"]) .current_dir("tests/fixture/success/") .assert() .success(); @@ -74,7 +74,7 @@ fn run_single_test_success() { fn run_single_test_failure() { Command::cargo_bin("rustlings") .unwrap() - .args(&["run", "testFailure"]) + .args(["run", "testFailure"]) .current_dir("tests/fixture/failure/") .assert() .code(1); @@ -84,7 +84,7 @@ fn run_single_test_failure() { fn run_single_test_not_passed() { Command::cargo_bin("rustlings") .unwrap() - .args(&["run", "testNotPassed.rs"]) + .args(["run", "testNotPassed.rs"]) .current_dir("tests/fixture/failure/") .assert() .code(1); @@ -104,7 +104,7 @@ fn run_single_test_no_filename() { fn run_single_test_no_exercise() { Command::cargo_bin("rustlings") .unwrap() - .args(&["run", "compNoExercise.rs"]) + .args(["run", "compNoExercise.rs"]) .current_dir("tests/fixture/failure") .assert() .code(1); @@ -114,7 +114,7 @@ fn run_single_test_no_exercise() { fn reset_single_exercise() { Command::cargo_bin("rustlings") .unwrap() - .args(&["reset", "intro1"]) + .args(["reset", "intro1"]) .assert() .code(0); } @@ -135,7 +135,7 @@ fn reset_no_exercise() { fn get_hint_for_single_test() { Command::cargo_bin("rustlings") .unwrap() - .args(&["hint", "testFailure"]) + .args(["hint", "testFailure"]) .current_dir("tests/fixture/failure") .assert() .code(0) @@ -171,7 +171,7 @@ fn all_exercises_require_confirmation() { fn run_compile_exercise_does_not_prompt() { Command::cargo_bin("rustlings") .unwrap() - .args(&["run", "pending_exercise"]) + .args(["run", "pending_exercise"]) .current_dir("tests/fixture/state") .assert() .code(0) @@ -182,7 +182,7 @@ fn run_compile_exercise_does_not_prompt() { fn run_test_exercise_does_not_prompt() { Command::cargo_bin("rustlings") .unwrap() - .args(&["run", "pending_test_exercise"]) + .args(["run", "pending_test_exercise"]) .current_dir("tests/fixture/state") .assert() .code(0) @@ -193,7 +193,7 @@ fn run_test_exercise_does_not_prompt() { fn run_single_test_success_with_output() { Command::cargo_bin("rustlings") .unwrap() - .args(&["--nocapture", "run", "testSuccess"]) + .args(["--nocapture", "run", "testSuccess"]) .current_dir("tests/fixture/success/") .assert() .code(0) @@ -204,7 +204,7 @@ fn run_single_test_success_with_output() { fn run_single_test_success_without_output() { Command::cargo_bin("rustlings") .unwrap() - .args(&["run", "testSuccess"]) + .args(["run", "testSuccess"]) .current_dir("tests/fixture/success/") .assert() .code(0) @@ -215,7 +215,7 @@ fn run_single_test_success_without_output() { fn run_rustlings_list() { Command::cargo_bin("rustlings") .unwrap() - .args(&["list"]) + .args(["list"]) .current_dir("tests/fixture/success") .assert() .success(); @@ -225,7 +225,7 @@ fn run_rustlings_list() { fn run_rustlings_list_no_pending() { Command::cargo_bin("rustlings") .unwrap() - .args(&["list"]) + .args(["list"]) .current_dir("tests/fixture/success") .assert() .success() @@ -236,7 +236,7 @@ fn run_rustlings_list_no_pending() { fn run_rustlings_list_both_done_and_pending() { Command::cargo_bin("rustlings") .unwrap() - .args(&["list"]) + .args(["list"]) .current_dir("tests/fixture/state") .assert() .success() @@ -247,7 +247,7 @@ fn run_rustlings_list_both_done_and_pending() { fn run_rustlings_list_without_pending() { Command::cargo_bin("rustlings") .unwrap() - .args(&["list", "--solved"]) + .args(["list", "--solved"]) .current_dir("tests/fixture/state") .assert() .success() @@ -258,7 +258,7 @@ fn run_rustlings_list_without_pending() { fn run_rustlings_list_without_done() { Command::cargo_bin("rustlings") .unwrap() - .args(&["list", "--unsolved"]) + .args(["list", "--unsolved"]) .current_dir("tests/fixture/state") .assert() .success() From 3cc9be0d115c8fd614dff9ab982c84c3d645173c Mon Sep 17 00:00:00 2001 From: mo8it Date: Sat, 26 Aug 2023 23:25:12 +0200 Subject: [PATCH 1051/1293] Avoid line numbers in hints --- info.toml | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/info.toml b/info.toml index e8a28cbc..1afe3382 100644 --- a/info.toml +++ b/info.toml @@ -22,8 +22,8 @@ name = "variables1" path = "exercises/variables/variables1.rs" mode = "compile" hint = """ -The declaration on line 8 is missing a keyword that is needed in Rust -to create a new variable binding.""" +The declaration in the first line in the main function is missing a keyword +that is needed in Rust to create a new variable binding.""" [[exercises]] name = "variables2" @@ -32,7 +32,7 @@ mode = "compile" hint = """ The compiler message is saying that Rust cannot infer the type that the variable binding `x` has with what is given here. -What happens if you annotate line 7 with a type annotation? +What happens if you annotate the first line in the main function with a type annotation? What if you give x a value? What if you do both? What type should x be, anyway? @@ -44,8 +44,9 @@ path = "exercises/variables/variables3.rs" mode = "compile" hint = """ Oops! In this exercise, we have a variable binding that we've created on -line 7, and we're trying to use it on line 8, but we haven't given it a -value. We can't print out something that isn't there; try giving x a value! +in the first line in the main function, and we're trying to use it in the next line, +but we haven't given it a value. +We can't print out something that isn't there; try giving x a value! This is an error that can cause bugs that's very easy to make in any programming language -- thankfully the Rust compiler has caught this for us!""" @@ -123,8 +124,8 @@ name = "functions4" path = "exercises/functions/functions4.rs" mode = "compile" hint = """ -The error message points to line 17 and says it expects a type after the -`->`. This is where the function's return type should be -- take a look at +The error message points to the function `sale_price` and says it expects a type +after the `->`. This is where the function's return type should be -- take a look at the `is_even` function for an example! Also: Did you figure out that, technically, u32 would be the more fitting type @@ -285,9 +286,10 @@ name = "move_semantics1" path = "exercises/move_semantics/move_semantics1.rs" mode = "compile" hint = """ -So you've got the "cannot borrow immutable local variable `vec1` as mutable" error on line 13, -right? The fix for this is going to be adding one keyword, and the addition is NOT on line 13 -where the error is. +So you've got the "cannot borrow immutable local variable `vec1` as mutable" error on the line +where we push an element to the vector, right? +The fix for this is going to be adding one keyword, and the addition is NOT on the line where +we push to the vector (where the error is). Also: Try accessing `vec0` after having called `fill_vec()`. See what happens!""" @@ -445,8 +447,9 @@ path = "exercises/strings/strings2.rs" mode = "compile" hint = """ Yes, it would be really easy to fix this by just changing the value bound to `word` to be a -string slice instead of a `String`, wouldn't it?? There is a way to add one character to line -12, though, that will coerce the `String` into a string slice. +string slice instead of a `String`, wouldn't it?? There is a way to add one character to the +line with the function call `is_a_color_word`, though, that will coerce the `String` into a +string slice. Side note: If you're interested in learning about how this kind of reference conversion works, you can jump ahead in the book and read this part in the smart pointers chapter: https://doc.rust-lang.org/stable/book/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods""" @@ -825,7 +828,6 @@ To handle that you need to add a special attribute to the test function. You can refer to the docs: https://doc.rust-lang.org/stable/book/ch11-01-writing-tests.html#checking-for-panics-with-should_panic""" - # STANDARD LIBRARY TYPES [[exercises]] From c655612d2d151cbde90a8d054f3b72df2d5d7b59 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sat, 26 Aug 2023 23:34:40 +0200 Subject: [PATCH 1052/1293] Update deps --- Cargo.lock | 335 +++++++++++++++++++++++++++++++++++------------------ Cargo.toml | 18 +-- 2 files changed, 233 insertions(+), 120 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a8268d90..5a40b6f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,24 @@ version = 3 [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] [[package]] -name = "argh" -version = "0.1.10" +name = "anstyle" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab257697eb9496bf75526f0217b5ed64636a9cfafa78b8365c71bd283fcef93e" +checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" + +[[package]] +name = "argh" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7af5ba06967ff7214ce4c7419c7d185be7ecd6cc4965a8f6e1d8ce0398aad219" dependencies = [ "argh_derive", "argh_shared", @@ -23,32 +29,38 @@ dependencies = [ [[package]] name = "argh_derive" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b382dbd3288e053331f03399e1db106c9fb0d8562ad62cb04859ae926f324fa6" +checksum = "56df0aeedf6b7a2fc67d06db35b09684c3e8da0c95f8f27685cb17e08413d87a" dependencies = [ "argh_shared", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "argh_shared" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cb94155d965e3d37ffbbe7cc5b82c3dd79dd33bd48e536f73d2cfb8d85506f" +checksum = "5693f39141bda5760ecc4111ab08da40565d1771038c4a0250f03457ec707531" +dependencies = [ + "serde", +] [[package]] name = "assert_cmd" -version = "0.11.1" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc477793bd82ec39799b6f6b3df64938532fdf2ab0d49ef817eac65856a5a1e" +checksum = "88903cb14723e4d4003335bb7f8a14f27691649105346a0f0957466c096adfe6" dependencies = [ - "escargot", + "anstyle", + "bstr", + "doc-comment", "predicates", "predicates-core", "predicates-tree", + "wait-timeout", ] [[package]] @@ -63,6 +75,17 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bstr" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "cfg-if" version = "0.1.10" @@ -89,10 +112,22 @@ dependencies = [ ] [[package]] -name = "difference" -version = "2.0.0" +name = "difflib" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encode_unicode" @@ -101,22 +136,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] -name = "escargot" -version = "0.4.0" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceb9adbf9874d5d028b5e4c5739d22b71988252b25c9c98fe7cf9738bee84597" -dependencies = [ - "lazy_static", - "log", - "serde", - "serde_json", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "filetime" -version = "0.2.21" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" dependencies = [ "cfg-if 1.0.0", "libc", @@ -126,9 +155,9 @@ dependencies = [ [[package]] name = "float-cmp" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" dependencies = [ "num-traits", ] @@ -174,6 +203,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + [[package]] name = "home" version = "0.5.5" @@ -184,15 +219,26 @@ dependencies = [ ] [[package]] -name = "indicatif" -version = "0.16.2" +name = "indexmap" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "indicatif" +version = "0.17.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b297dc40733f23a0e52728a58fa9489a5b7638a324932de16b41adc3ef80730" dependencies = [ "console", - "lazy_static", + "instant", "number_prefix", - "regex", + "portable-atomic", + "unicode-width", ] [[package]] @@ -215,6 +261,15 @@ dependencies = [ "libc", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "iovec" version = "0.1.4" @@ -225,10 +280,19 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "1.0.8" +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "kernel32-sys" @@ -260,9 +324,9 @@ checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "memchr" @@ -350,9 +414,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] @@ -364,13 +428,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] -name = "predicates" -version = "1.0.8" +name = "portable-atomic" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49cfaf7fdaa3bfacc6fa3e7054e65148878354a5cfddcf661df4c851f8021df" +checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b" + +[[package]] +name = "predicates" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9" dependencies = [ - "difference", + "anstyle", + "difflib", "float-cmp", + "itertools", "normalize-line-endings", "predicates-core", "regex", @@ -394,36 +466,36 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.64" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.29" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.9.1" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" dependencies = [ "aho-corasick", "memchr", @@ -433,9 +505,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" dependencies = [ "aho-corasick", "memchr", @@ -444,9 +516,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "rustlings" @@ -468,9 +540,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "same-file" @@ -483,29 +555,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.171" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.171" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn", ] [[package]] name = "serde_json" -version = "1.0.102" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa", "ryu", @@ -513,30 +585,28 @@ dependencies = [ ] [[package]] -name = "slab" -version = "0.4.8" +name = "serde_spanned" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "syn" -version = "1.0.109" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ "proc-macro2", "quote", @@ -551,18 +621,43 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "toml" -version = "0.5.11" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" dependencies = [ "serde", ] [[package]] -name = "unicode-ident" -version = "1.0.10" +name = "toml_edit" +version = "0.19.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-width" @@ -570,6 +665,15 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.3.3" @@ -638,7 +742,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] [[package]] @@ -658,17 +762,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -679,9 +783,9 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" @@ -691,9 +795,9 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" @@ -703,9 +807,9 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" @@ -715,9 +819,9 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" @@ -727,9 +831,9 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" @@ -739,9 +843,9 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" @@ -751,9 +855,18 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winnow" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +dependencies = [ + "memchr", +] [[package]] name = "ws2_32-sys" diff --git a/Cargo.toml b/Cargo.toml index eca091f4..f627dd79 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,21 +10,21 @@ edition = "2021" [dependencies] argh = "0.1" -indicatif = "0.16" +indicatif = "0.17" console = "0.15" notify = "4.0" -toml = "0.5" -regex = "1.5" +toml = "0.7" +regex = "1.9" serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.81" -home = "0.5.3" -glob = "0.3.0" +serde_json = "1.0.105" +home = "0.5.5" +glob = "0.3.1" [[bin]] name = "rustlings" path = "src/main.rs" [dev-dependencies] -assert_cmd = "0.11.0" -predicates = "1.0.1" -glob = "0.3.0" +assert_cmd = "2.0.12" +predicates = "3.0.3" +glob = "0.3.1" From c0b8af2c42c5e116cb9f91b42da4dd5d92baeaed Mon Sep 17 00:00:00 2001 From: mo8it Date: Sat, 26 Aug 2023 23:35:07 +0200 Subject: [PATCH 1053/1293] Fix indicatif --- src/run.rs | 3 ++- src/verify.rs | 35 +++++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/run.rs b/src/run.rs index 1e2e56cf..e0ada4c5 100644 --- a/src/run.rs +++ b/src/run.rs @@ -1,4 +1,5 @@ use std::process::Command; +use std::time::Duration; use crate::exercise::{Exercise, Mode}; use crate::verify::test; @@ -36,7 +37,7 @@ pub fn reset(exercise: &Exercise) -> Result<(), ()> { fn compile_and_run(exercise: &Exercise) -> Result<(), ()> { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {exercise}...")); - progress_bar.enable_steady_tick(100); + progress_bar.enable_steady_tick(Duration::from_millis(100)); let compilation_result = exercise.compile(); let compilation = match compilation_result { diff --git a/src/verify.rs b/src/verify.rs index f3f3b564..01dd87fa 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -1,7 +1,7 @@ use crate::exercise::{CompiledExercise, Exercise, Mode, State}; use console::style; use indicatif::{ProgressBar, ProgressStyle}; -use std::env; +use std::{env, time::Duration}; // Verify that the provided container of Exercise objects // can be compiled and run without any failures. @@ -17,9 +17,11 @@ pub fn verify<'a>( let (num_done, total) = progress; let bar = ProgressBar::new(total as u64); let mut percentage = num_done as f32 / total as f32 * 100.0; - bar.set_style(ProgressStyle::default_bar() - .template("Progress: [{bar:60.green/red}] {pos}/{len} {msg}") - .progress_chars("#>-") + bar.set_style( + ProgressStyle::default_bar() + .template("Progress: [{bar:60.green/red}] {pos}/{len} {msg}") + .expect("Progressbar template should be valid!") + .progress_chars("#>-"), ); bar.set_position(num_done as u64); bar.set_message(format!("({:.1} %)", percentage)); @@ -55,7 +57,7 @@ pub fn test(exercise: &Exercise, verbose: bool) -> Result<(), ()> { fn compile_only(exercise: &Exercise, success_hints: bool) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {exercise}...")); - progress_bar.enable_steady_tick(100); + progress_bar.enable_steady_tick(Duration::from_millis(100)); let _ = compile(exercise, &progress_bar)?; progress_bar.finish_and_clear(); @@ -67,7 +69,7 @@ fn compile_only(exercise: &Exercise, success_hints: bool) -> Result { fn compile_and_run_interactively(exercise: &Exercise, success_hints: bool) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {exercise}...")); - progress_bar.enable_steady_tick(100); + progress_bar.enable_steady_tick(Duration::from_millis(100)); let compilation = compile(exercise, &progress_bar)?; @@ -85,15 +87,24 @@ fn compile_and_run_interactively(exercise: &Exercise, success_hints: bool) -> Re } }; - Ok(prompt_for_completion(exercise, Some(output.stdout), success_hints)) + Ok(prompt_for_completion( + exercise, + Some(output.stdout), + success_hints, + )) } // Compile the given Exercise as a test harness and display // the output if verbose is set to true -fn compile_and_test(exercise: &Exercise, run_mode: RunMode, verbose: bool, success_hints: bool) -> Result { +fn compile_and_test( + exercise: &Exercise, + run_mode: RunMode, + verbose: bool, + success_hints: bool, +) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Testing {exercise}...")); - progress_bar.enable_steady_tick(100); + progress_bar.enable_steady_tick(Duration::from_millis(100)); let compilation = compile(exercise, &progress_bar)?; let result = compilation.run(); @@ -143,7 +154,11 @@ fn compile<'a, 'b>( } } -fn prompt_for_completion(exercise: &Exercise, prompt_output: Option, success_hints: bool) -> bool { +fn prompt_for_completion( + exercise: &Exercise, + prompt_output: Option, + success_hints: bool, +) -> bool { let context = match exercise.state() { State::Done => return true, State::Pending(context) => context, From 64224d3918820ebcdd2ee23fe2e7678f94573345 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sun, 27 Aug 2023 00:46:48 +0200 Subject: [PATCH 1054/1293] Make move_semantics5 a test --- exercises/move_semantics/move_semantics5.rs | 1 + info.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/move_semantics/move_semantics5.rs b/exercises/move_semantics/move_semantics5.rs index 68db09eb..267bdccc 100644 --- a/exercises/move_semantics/move_semantics5.rs +++ b/exercises/move_semantics/move_semantics5.rs @@ -8,6 +8,7 @@ // I AM NOT DONE +#[test] fn main() { let mut x = 100; let y = &mut x; diff --git a/info.toml b/info.toml index e8a28cbc..9267d467 100644 --- a/info.toml +++ b/info.toml @@ -340,7 +340,7 @@ So the end goal is to: [[exercises]] name = "move_semantics5" path = "exercises/move_semantics/move_semantics5.rs" -mode = "compile" +mode = "test" hint = """ Carefully reason about the range in which each mutable reference is in scope. Does it help to update the value of referent (x) immediately after From 16936d95d13df800f06c7af22069b5daf0c672e4 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sun, 27 Aug 2023 00:47:03 +0200 Subject: [PATCH 1055/1293] Fix typo --- exercises/move_semantics/move_semantics3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/move_semantics/move_semantics3.rs b/exercises/move_semantics/move_semantics3.rs index ea214934..16118f7b 100644 --- a/exercises/move_semantics/move_semantics3.rs +++ b/exercises/move_semantics/move_semantics3.rs @@ -1,6 +1,6 @@ // move_semantics3.rs // -// Make me compile without adding new lines-- just changing existing lines! (no +// Make me compile without adding new lines -- just changing existing lines! (no // lines with multiple semicolons necessary!) // // Execute `rustlings hint move_semantics3` or use the `hint` watch subcommand From 193b600382ead22a24d2c26ca3a9117e7ad18be8 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sun, 27 Aug 2023 01:06:01 +0200 Subject: [PATCH 1056/1293] Convert other exercises that have assertions to test mode --- exercises/iterators/iterators1.rs | 1 + exercises/smart_pointers/rc1.rs | 1 + exercises/threads/threads3.rs | 1 + info.toml | 6 +++--- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/exercises/iterators/iterators1.rs b/exercises/iterators/iterators1.rs index b3f698be..31076bb9 100644 --- a/exercises/iterators/iterators1.rs +++ b/exercises/iterators/iterators1.rs @@ -11,6 +11,7 @@ // I AM NOT DONE +#[test] fn main() { let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"]; diff --git a/exercises/smart_pointers/rc1.rs b/exercises/smart_pointers/rc1.rs index ad3f1ce2..1b903469 100644 --- a/exercises/smart_pointers/rc1.rs +++ b/exercises/smart_pointers/rc1.rs @@ -35,6 +35,7 @@ impl Planet { } } +#[test] fn main() { let sun = Rc::new(Sun {}); println!("reference count = {}", Rc::strong_count(&sun)); // 1 reference diff --git a/exercises/threads/threads3.rs b/exercises/threads/threads3.rs index db7d41ba..91006bbc 100644 --- a/exercises/threads/threads3.rs +++ b/exercises/threads/threads3.rs @@ -48,6 +48,7 @@ fn send_tx(q: Queue, tx: mpsc::Sender) -> () { }); } +#[test] fn main() { let (tx, rx) = mpsc::channel(); let queue = Queue::new(); diff --git a/info.toml b/info.toml index 9267d467..452e4787 100644 --- a/info.toml +++ b/info.toml @@ -831,7 +831,7 @@ https://doc.rust-lang.org/stable/book/ch11-01-writing-tests.html#checking-for-pa [[exercises]] name = "iterators1" path = "exercises/iterators/iterators1.rs" -mode = "compile" +mode = "test" hint = """ Step 1: We need to apply something to the collection `my_fav_fruits` before we start to go through @@ -936,7 +936,7 @@ and try other types! [[exercises]] name = "rc1" path = "exercises/smart_pointers/rc1.rs" -mode = "compile" +mode = "test" hint = """ This is a straightforward exercise to use the Rc type. Each Planet has ownership of the Sun, and uses Rc::clone() to increment the reference count of the Sun. @@ -1025,7 +1025,7 @@ what you've learned :)""" [[exercises]] name = "threads3" path = "exercises/threads/threads3.rs" -mode = "compile" +mode = "test" hint = """ An alternate way to handle concurrency between threads is to use a mpsc (multiple producer, single consumer) channel to communicate. From 7bb69f864188906b3731725df08157131bfe9e57 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 28 Aug 2023 11:37:33 +0000 Subject: [PATCH 1057/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index e01c19c3..ed165b75 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -324,6 +324,7 @@ authors. Alon Hearter
Alon Hearter

πŸ–‹ shirts
shirts

πŸ–‹ Ivan Vasiunyk
Ivan Vasiunyk

πŸ–‹ + Mo
Mo

πŸ’» From d258c30406ff17cb06b18128eac8eff44a594e99 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 28 Aug 2023 11:37:34 +0000 Subject: [PATCH 1058/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 22d68418..c3df1ad0 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2289,6 +2289,15 @@ "contributions": [ "content" ] + }, + { + "login": "mo8it", + "name": "Mo", + "avatar_url": "https://avatars.githubusercontent.com/u/76752051?v=4", + "profile": "https://mo8it.com", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 9c0581bc0faea12b790e0fa0cafe8d08a5ed028e Mon Sep 17 00:00:00 2001 From: mo8it Date: Tue, 29 Aug 2023 00:52:11 +0200 Subject: [PATCH 1059/1293] Use u32 instead of i32 --- exercises/structs/structs3.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs index 4851317c..7cda5af1 100644 --- a/exercises/structs/structs3.rs +++ b/exercises/structs/structs3.rs @@ -13,13 +13,15 @@ struct Package { sender_country: String, recipient_country: String, - weight_in_grams: i32, + weight_in_grams: u32, } impl Package { - fn new(sender_country: String, recipient_country: String, weight_in_grams: i32) -> Package { - if weight_in_grams <= 0 { - panic!("Can not ship a weightless package.") + fn new(sender_country: String, recipient_country: String, weight_in_grams: u32) -> Package { + if weight_in_grams < 10 { + // This is not how you should handle errors in Rust, + // but we will learn about error handling later. + panic!("Can not ship a package with weight below 10 grams.") } else { Package { sender_country, @@ -33,7 +35,7 @@ impl Package { // Something goes here... } - fn get_fees(&self, cents_per_gram: i32) -> ??? { + fn get_fees(&self, cents_per_gram: u32) -> ??? { // Something goes here... } } @@ -48,7 +50,7 @@ mod tests { let sender_country = String::from("Spain"); let recipient_country = String::from("Austria"); - Package::new(sender_country, recipient_country, -2210); + Package::new(sender_country, recipient_country, 5); } #[test] From 013f22c89cba7dbd935b58392a1a7d8cdcdc7eb7 Mon Sep 17 00:00:00 2001 From: x10an14 Date: Wed, 30 Aug 2023 18:03:45 +0200 Subject: [PATCH 1060/1293] improvement(development): Add nix-direnv integration So as to automatically open a nix devShell for those who use direnv/want to use direnv to make their lives more automated. --- .envrc | 4 ++++ .gitignore | 1 + 2 files changed, 5 insertions(+) create mode 100644 .envrc diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..48541064 --- /dev/null +++ b/.envrc @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +# Automatically Load nix devShell w/dotenv +use flake diff --git a/.gitignore b/.gitignore index 88bf2b6c..f319d39d 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ rust-project.json *.iml *.o public/ +.direnv/ # Local Netlify folder .netlify From 60b848760033ee3f7a6522929f7b4aa21064c5e2 Mon Sep 17 00:00:00 2001 From: x10an14 Date: Wed, 30 Aug 2023 18:09:41 +0200 Subject: [PATCH 1061/1293] feat(flake): Add defaults to commands in flake So that: - `nix build .#`, and - `nix run .#` both work. --- flake.nix | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/flake.nix b/flake.nix index 5dbca5c2..791c36ff 100644 --- a/flake.nix +++ b/flake.nix @@ -60,5 +60,18 @@ clippy ] ++ cargoBuildInputs; }; + apps = let + rustlings-app = { + type = "app"; + program = "${rustlings}/bin/rustlings"; + }; + in { + default = rustlings-app; + rustlings = rustlings-app; + }; + packages = { + inherit rustlings; + default = rustlings; + }; }); } From e7bdc83a8f910b239a0d910410a9c95ff5fd99d3 Mon Sep 17 00:00:00 2001 From: x10an14 Date: Wed, 30 Aug 2023 19:41:29 +0200 Subject: [PATCH 1062/1293] fix(nix/tests): Add `git` to Nix's rust build/test sandbox The integration test `reset_single_exercise` depends on Git... --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index 5dbca5c2..c6360eec 100644 --- a/flake.nix +++ b/flake.nix @@ -25,6 +25,7 @@ version = "5.5.1"; buildInputs = cargoBuildInputs; + nativeBuildInputs = [pkgs.git]; src = with pkgs.lib; cleanSourceWith { src = self; From 5a93f2a4f14d83d34aac69254262da7aaa5b752c Mon Sep 17 00:00:00 2001 From: mo8it Date: Fri, 25 Aug 2023 23:18:01 +0200 Subject: [PATCH 1063/1293] Port to Clap --- Cargo.lock | 133 +++++++++++++++++++++++++++++++---- Cargo.toml | 15 ++-- src/main.rs | 195 +++++++++++++++++++++------------------------------- 3 files changed, 208 insertions(+), 135 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a40b6f1..e5b85530 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,19 +4,61 @@ version = 3 [[package]] name = "aho-corasick" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" dependencies = [ "memchr", ] +[[package]] +name = "anstream" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + [[package]] name = "anstyle" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" +[[package]] +name = "anstyle-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" +dependencies = [ + "anstyle", + "windows-sys 0.48.0", +] + [[package]] name = "argh" version = "0.1.12" @@ -77,9 +119,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bstr" -version = "1.6.0" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +checksum = "4c2f7349907b712260e64b0afe2f84692af14a454be26187d9df565c7f69266a" dependencies = [ "memchr", "regex-automata", @@ -98,6 +140,52 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "clap" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "console" version = "0.15.7" @@ -209,6 +297,12 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "home" version = "0.5.5" @@ -330,9 +424,9 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" [[package]] name = "mio" @@ -493,9 +587,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick", "memchr", @@ -505,9 +599,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" dependencies = [ "aho-corasick", "memchr", @@ -526,6 +620,7 @@ version = "5.5.1" dependencies = [ "argh", "assert_cmd", + "clap", "console", "glob", "home", @@ -603,10 +698,16 @@ dependencies = [ ] [[package]] -name = "syn" -version = "2.0.29" +name = "strsim" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "2.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" dependencies = [ "proc-macro2", "quote", @@ -665,6 +766,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "wait-timeout" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index f627dd79..2c2a92b2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,15 +10,16 @@ edition = "2021" [dependencies] argh = "0.1" -indicatif = "0.17" +indicatif = "0.17.6" console = "0.15" notify = "4.0" -toml = "0.7" -regex = "1.9" +toml = "0.7.6" +regex = "1.5" serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.105" -home = "0.5.5" -glob = "0.3.1" +serde_json = "1.0.81" +home = "0.5.3" +glob = "0.3.0" +clap = { version = "4.4.0", features = ["derive"] } [[bin]] name = "rustlings" @@ -27,4 +28,4 @@ path = "src/main.rs" [dev-dependencies] assert_cmd = "2.0.12" predicates = "3.0.3" -glob = "0.3.1" +glob = "0.3.0" diff --git a/src/main.rs b/src/main.rs index 1a150867..a4b764d7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ use crate::exercise::{Exercise, ExerciseList}; use crate::project::RustAnalyzerProject; use crate::run::{reset, run}; use crate::verify::verify; -use argh::FromArgs; +use clap::{Parser, Subcommand}; use console::Emoji; use notify::DebouncedEvent; use notify::{RecommendedWatcher, RecursiveMode, Watcher}; @@ -25,111 +25,69 @@ mod project; mod run; mod verify; -// In sync with crate version -const VERSION: &str = "5.5.1"; - -#[derive(FromArgs, PartialEq, Debug)] /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code +#[derive(Parser)] +#[command(version)] struct Args { - /// show outputs from the test exercises - #[argh(switch)] + /// Show outputs from the test exercises + #[arg(long)] nocapture: bool, - /// show the executable version - #[argh(switch, short = 'v')] - version: bool, - #[argh(subcommand)] - nested: Option, + #[command(subcommand)] + command: Option, } -#[derive(FromArgs, PartialEq, Debug)] -#[argh(subcommand)] +#[derive(Subcommand)] enum Subcommands { - Verify(VerifyArgs), - Watch(WatchArgs), - Run(RunArgs), - Reset(ResetArgs), - Hint(HintArgs), - List(ListArgs), - Lsp(LspArgs), -} - -#[derive(FromArgs, PartialEq, Debug)] -#[argh(subcommand, name = "verify")] -/// Verifies all exercises according to the recommended order -struct VerifyArgs {} - -#[derive(FromArgs, PartialEq, Debug)] -#[argh(subcommand, name = "watch")] -/// Reruns `verify` when files were edited -struct WatchArgs { - /// show hints on success - #[argh(switch)] - success_hints: bool, -} - -#[derive(FromArgs, PartialEq, Debug)] -#[argh(subcommand, name = "run")] -/// Runs/Tests a single exercise -struct RunArgs { - #[argh(positional)] - /// the name of the exercise - name: String, -} - -#[derive(FromArgs, PartialEq, Debug)] -#[argh(subcommand, name = "reset")] -/// Resets a single exercise using "git stash -- " -struct ResetArgs { - #[argh(positional)] - /// the name of the exercise - name: String, -} - -#[derive(FromArgs, PartialEq, Debug)] -#[argh(subcommand, name = "hint")] -/// Returns a hint for the given exercise -struct HintArgs { - #[argh(positional)] - /// the name of the exercise - name: String, -} - -#[derive(FromArgs, PartialEq, Debug)] -#[argh(subcommand, name = "lsp")] -/// Enable rust-analyzer for exercises -struct LspArgs {} - -#[derive(FromArgs, PartialEq, Debug)] -#[argh(subcommand, name = "list")] -/// Lists the exercises available in Rustlings -struct ListArgs { - #[argh(switch, short = 'p')] - /// show only the paths of the exercises - paths: bool, - #[argh(switch, short = 'n')] - /// show only the names of the exercises - names: bool, - #[argh(option, short = 'f')] - /// provide a string to match exercise names - /// comma separated patterns are acceptable - filter: Option, - #[argh(switch, short = 'u')] - /// display only exercises not yet solved - unsolved: bool, - #[argh(switch, short = 's')] - /// display only exercises that have been solved - solved: bool, + /// Verify all exercises according to the recommended order + Verify, + /// Rerun `verify` when files were edited + Watch { + /// Show hints on success + #[arg(long)] + success_hints: bool, + }, + /// Run/Test a single exercise + Run { + /// The name of the exercise + name: String, + }, + /// Reset a single exercise using "git stash -- " + Reset { + /// The name of the exercise + name: String, + }, + /// Return a hint for the given exercise + Hint { + /// The name of the exercise + name: String, + }, + /// List the exercises available in Rustlings + List { + /// Show only the paths of the exercises + #[arg(short, long)] + paths: bool, + /// Show only the names of the exercises + #[arg(short, long)] + names: bool, + /// Provide a string to match exercise names. + /// Comma separated patterns are accepted + #[arg(short, long)] + filter: Option, + /// Display only exercises not yet solved + #[arg(short, long)] + unsolved: bool, + /// Display only exercises that have been solved + #[arg(short, long)] + solved: bool, + }, + /// Enable rust-analyzer for exercises + Lsp, } fn main() { - let args: Args = argh::from_env(); + let args = Args::parse(); - if args.version { - println!("v{VERSION}"); - std::process::exit(0); - } - - if args.nested.is_none() { + if args.command.is_none() { println!("\n{WELCOME}\n"); } @@ -153,17 +111,24 @@ fn main() { let exercises = toml::from_str::(toml_str).unwrap().exercises; let verbose = args.nocapture; - let command = args.nested.unwrap_or_else(|| { + let command = args.command.unwrap_or_else(|| { println!("{DEFAULT_OUT}\n"); std::process::exit(0); }); + match command { - Subcommands::List(subargs) => { - if !subargs.paths && !subargs.names { + Subcommands::List { + paths, + names, + filter, + unsolved, + solved, + } => { + if !paths && !names { println!("{:<17}\t{:<46}\t{:<7}", "Name", "Path", "Status"); } let mut exercises_done: u16 = 0; - let filters = subargs.filter.clone().unwrap_or_default().to_lowercase(); + let filters = filter.clone().unwrap_or_default().to_lowercase(); exercises.iter().for_each(|e| { let fname = format!("{}", e.path.display()); let filter_cond = filters @@ -177,14 +142,14 @@ fn main() { "Pending" }; let solve_cond = { - (e.looks_done() && subargs.solved) - || (!e.looks_done() && subargs.unsolved) - || (!subargs.solved && !subargs.unsolved) + (e.looks_done() && solved) + || (!e.looks_done() && unsolved) + || (!solved && !unsolved) }; - if solve_cond && (filter_cond || subargs.filter.is_none()) { - let line = if subargs.paths { + if solve_cond && (filter_cond || filter.is_none()) { + let line = if paths { format!("{fname}\n") - } else if subargs.names { + } else if names { format!("{}\n", e.name) } else { format!("{:<17}\t{fname:<46}\t{status:<7}\n", e.name) @@ -214,30 +179,30 @@ fn main() { std::process::exit(0); } - Subcommands::Run(subargs) => { - let exercise = find_exercise(&subargs.name, &exercises); + Subcommands::Run { name } => { + let exercise = find_exercise(&name, &exercises); run(exercise, verbose).unwrap_or_else(|_| std::process::exit(1)); } - Subcommands::Reset(subargs) => { - let exercise = find_exercise(&subargs.name, &exercises); + Subcommands::Reset { name } => { + let exercise = find_exercise(&name, &exercises); reset(exercise).unwrap_or_else(|_| std::process::exit(1)); } - Subcommands::Hint(subargs) => { - let exercise = find_exercise(&subargs.name, &exercises); + Subcommands::Hint { name } => { + let exercise = find_exercise(&name, &exercises); println!("{}", exercise.hint); } - Subcommands::Verify(_subargs) => { + Subcommands::Verify => { verify(&exercises, (0, exercises.len()), verbose, false) .unwrap_or_else(|_| std::process::exit(1)); } - Subcommands::Lsp(_subargs) => { + Subcommands::Lsp => { let mut project = RustAnalyzerProject::new(); project .get_sysroot_src() @@ -256,7 +221,7 @@ fn main() { } } - Subcommands::Watch(_subargs) => match watch(&exercises, verbose, _subargs.success_hints) { + Subcommands::Watch { success_hints } => match watch(&exercises, verbose, success_hints) { Err(e) => { println!( "Error: Could not watch your progress. Error message was {:?}.", From 362318a6e04a1ffa80fe85e1f4c1cf03686d1109 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sat, 26 Aug 2023 00:00:56 +0200 Subject: [PATCH 1064/1293] Adapt tests --- tests/integration_tests.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 4c236fd0..d1694a39 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -97,7 +97,10 @@ fn run_single_test_no_filename() { .arg("run") .current_dir("tests/fixture/") .assert() - .code(1); + .code(2) + .stderr(predicates::str::contains( + "required arguments were not provided", + )); } #[test] @@ -125,9 +128,9 @@ fn reset_no_exercise() { .unwrap() .arg("reset") .assert() - .code(1) + .code(2) .stderr(predicates::str::contains( - "positional arguments not provided", + "required arguments were not provided", )); } From 11f4ec93aceab5491e57cf10390b6838baaa2f98 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:37:09 +0000 Subject: [PATCH 1065/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index ed165b75..8cfab68a 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -325,6 +325,7 @@ authors. shirts
shirts

πŸ–‹ Ivan Vasiunyk
Ivan Vasiunyk

πŸ–‹ Mo
Mo

πŸ’» + x10an14
x10an14

πŸš‡ From 4a9699226a1777a5a98cb37eaf1b09e3d2427d6f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:37:10 +0000 Subject: [PATCH 1066/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c3df1ad0..656bf1d5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2298,6 +2298,15 @@ "contributions": [ "code" ] + }, + { + "login": "x10an14", + "name": "x10an14", + "avatar_url": "https://avatars.githubusercontent.com/u/710608?v=4", + "profile": "https://github.com/x10an14", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 8, From a059ded709b838a62dc2544553d749409e0c0b7e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:46:41 +0000 Subject: [PATCH 1067/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 8cfab68a..4b673e6f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -326,6 +326,7 @@ authors. Ivan Vasiunyk
Ivan Vasiunyk

πŸ–‹ Mo
Mo

πŸ’» x10an14
x10an14

πŸš‡ + Roi Gabay
Roi Gabay

πŸ–‹ From 7d53abdb0af4771ccb0917550636ef2e4100bb80 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:46:42 +0000 Subject: [PATCH 1068/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 656bf1d5..c4aabed6 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2307,6 +2307,15 @@ "contributions": [ "infra" ] + }, + { + "login": "gabay", + "name": "Roi Gabay", + "avatar_url": "https://avatars.githubusercontent.com/u/5773610?v=4", + "profile": "https://github.com/gabay", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 27881a83d4b569871845261d57c9a65d0b1be440 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:52:11 +0000 Subject: [PATCH 1069/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4b673e6f..7bc44689 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -327,6 +327,7 @@ authors. Mo
Mo

πŸ’» x10an14
x10an14

πŸš‡ Roi Gabay
Roi Gabay

πŸ–‹ + MΓ‘tΓ© KovΓ‘cs
MΓ‘tΓ© KovΓ‘cs

πŸ–‹ From 4aa5ca28183eb76b4e06bd6cfcfe1c0a80a93e48 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:52:13 +0000 Subject: [PATCH 1070/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c4aabed6..65479367 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2316,6 +2316,15 @@ "contributions": [ "content" ] + }, + { + "login": "mkovaxx", + "name": "MΓ‘tΓ© KovΓ‘cs", + "avatar_url": "https://avatars.githubusercontent.com/u/481354?v=4", + "profile": "https://github.com/mkovaxx", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From a09a0c47aec37215ed3ff5260ee77f732fc866de Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 4 Sep 2023 13:53:54 +0200 Subject: [PATCH 1071/1293] fix: add extra line in if3 comment --- exercises/if/if3.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/if/if3.rs b/exercises/if/if3.rs index 00400236..16962740 100644 --- a/exercises/if/if3.rs +++ b/exercises/if/if3.rs @@ -28,6 +28,7 @@ pub fn animal_habitat(animal: &str) -> &'static str { habitat } + // No test changes needed. #[cfg(test)] mod tests { From bb550497d5211ff71d1fa4867a4e4ce2e1a67d04 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:55:27 +0000 Subject: [PATCH 1072/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 7bc44689..cbf7436a 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -328,6 +328,7 @@ authors. x10an14
x10an14

πŸš‡ Roi Gabay
Roi Gabay

πŸ–‹ MΓ‘tΓ© KovΓ‘cs
MΓ‘tΓ© KovΓ‘cs

πŸ–‹ + GΓ‘bor SzabΓ³
GΓ‘bor SzabΓ³

πŸ–‹ From 8ca60f2cbbe635d921b471f0e9b7965e000e7a08 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:55:28 +0000 Subject: [PATCH 1073/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 65479367..f1b1fe11 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2325,6 +2325,15 @@ "contributions": [ "content" ] + }, + { + "login": "szabgab", + "name": "GΓ‘bor SzabΓ³", + "avatar_url": "https://avatars.githubusercontent.com/u/48833?v=4", + "profile": "https://szabgab.com/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 47e14cff8da2de6f5bb2d328ac56275e65d00dde Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:58:24 +0000 Subject: [PATCH 1074/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index cbf7436a..76d3a58c 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -330,6 +330,9 @@ authors. MΓ‘tΓ© KovΓ‘cs
MΓ‘tΓ© KovΓ‘cs

πŸ–‹ GΓ‘bor SzabΓ³
GΓ‘bor SzabΓ³

πŸ–‹ + + Yamila Moreno
Yamila Moreno

πŸ–‹ + From dce89aefb99bc6d774c98e45121989253fa8c5a3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:58:25 +0000 Subject: [PATCH 1075/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index f1b1fe11..8ceb8990 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2334,6 +2334,15 @@ "contributions": [ "content" ] + }, + { + "login": "yamila-moreno", + "name": "Yamila Moreno", + "avatar_url": "https://avatars.githubusercontent.com/u/3340793?v=4", + "profile": "https://moduslaborandi.net", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 51e237d5f97610294798710ef8ba5349c2fd50c7 Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 4 Sep 2023 14:20:37 +0200 Subject: [PATCH 1076/1293] fix: refactor move semantics 1-4 into tests --- exercises/move_semantics/move_semantics1.rs | 15 +++++---------- exercises/move_semantics/move_semantics2.rs | 18 ++++++------------ exercises/move_semantics/move_semantics3.rs | 13 ++++--------- exercises/move_semantics/move_semantics4.rs | 16 ++++++---------- info.toml | 16 ++++++---------- 5 files changed, 27 insertions(+), 51 deletions(-) diff --git a/exercises/move_semantics/move_semantics1.rs b/exercises/move_semantics/move_semantics1.rs index 710d20d8..e0639375 100644 --- a/exercises/move_semantics/move_semantics1.rs +++ b/exercises/move_semantics/move_semantics1.rs @@ -5,24 +5,19 @@ // I AM NOT DONE +#[test] fn main() { - let vec0 = Vec::new(); + let vec0 = vec![22, 44, 66]; let vec1 = fill_vec(vec0); - println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); - - vec1.push(88); - - println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); + assert_eq!(vec1, vec![22, 44, 66, 88]); } fn fill_vec(vec: Vec) -> Vec { - let mut vec = vec; + let vec = vec; - vec.push(22); - vec.push(44); - vec.push(66); + vec.push(88); vec } diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs index 72d37fa4..baf6bcc9 100644 --- a/exercises/move_semantics/move_semantics2.rs +++ b/exercises/move_semantics/move_semantics2.rs @@ -1,32 +1,26 @@ // move_semantics2.rs // -// Expected output: -// vec0 has length 3, with contents `[22, 44, 66]` -// vec1 has length 4, with contents `[22, 44, 66, 88]` +// Make the test pass by finding a way to keep both Vecs separate! // // Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand // for a hint. // I AM NOT DONE +#[test] fn main() { - let vec0 = Vec::new(); + let vec0 = vec![22, 44, 66]; let mut vec1 = fill_vec(vec0); - println!("{} has length {}, with contents: `{:?}`", "vec0", vec0.len(), vec0); - - vec1.push(88); - - println!("{} has length {}, with contents `{:?}`", "vec1", vec1.len(), vec1); + assert_eq!(vec0, vec![22, 44, 66]); + assert_eq!(vec1, vec![22, 44, 66, 88]); } fn fill_vec(vec: Vec) -> Vec { let mut vec = vec; - vec.push(22); - vec.push(44); - vec.push(66); + vec.push(88); vec } diff --git a/exercises/move_semantics/move_semantics3.rs b/exercises/move_semantics/move_semantics3.rs index ea214934..69e564ab 100644 --- a/exercises/move_semantics/move_semantics3.rs +++ b/exercises/move_semantics/move_semantics3.rs @@ -8,22 +8,17 @@ // I AM NOT DONE +#[test] fn main() { - let vec0 = Vec::new(); + let vec0 = vec![22, 44, 66]; let mut vec1 = fill_vec(vec0); - println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); - - vec1.push(88); - - println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); + assert_eq!(vec1, vec![22, 44, 66, 88]); } fn fill_vec(vec: Vec) -> Vec { - vec.push(22); - vec.push(44); - vec.push(66); + vec.push(88); vec } diff --git a/exercises/move_semantics/move_semantics4.rs b/exercises/move_semantics/move_semantics4.rs index 75a3b6bd..80b49dba 100644 --- a/exercises/move_semantics/move_semantics4.rs +++ b/exercises/move_semantics/move_semantics4.rs @@ -9,25 +9,21 @@ // I AM NOT DONE +#[test] fn main() { - let vec0 = Vec::new(); + let vec0 = vec![22, 44, 66]; let mut vec1 = fill_vec(vec0); - println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); - - vec1.push(88); - - println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1); + assert_eq!(vec1, vec![22, 44, 66, 88]); } -// `fill_vec()` no longer takes `vec: Vec` as argument +// `fill_vec()` no longer takes `vec: Vec` as argument - don't change this! fn fill_vec() -> Vec { + // Instead, let's create and fill the Vec in here - how do you do that? let mut vec = vec; - vec.push(22); - vec.push(44); - vec.push(66); + vec.push(88); vec } diff --git a/info.toml b/info.toml index 0aca0220..b41985e1 100644 --- a/info.toml +++ b/info.toml @@ -284,9 +284,9 @@ better. What do you think is the more commonly used pattern under Rust developer [[exercises]] name = "move_semantics1" path = "exercises/move_semantics/move_semantics1.rs" -mode = "compile" +mode = "test" hint = """ -So you've got the "cannot borrow immutable local variable `vec1` as mutable" error on the line +So you've got the "cannot borrow immutable local variable `vec` as mutable" error on the line where we push an element to the vector, right? The fix for this is going to be adding one keyword, and the addition is NOT on the line where we push to the vector (where the error is). @@ -296,7 +296,7 @@ Also: Try accessing `vec0` after having called `fill_vec()`. See what happens!"" [[exercises]] name = "move_semantics2" path = "exercises/move_semantics/move_semantics2.rs" -mode = "compile" +mode = "test" hint = """ When running this exercise for the first time, you'll notice an error about "borrow of moved value". In Rust, when an argument is passed to a function and @@ -309,16 +309,12 @@ Rust provides a couple of different ways to mitigate this issue, feel free to tr 2. Make `fill_vec` borrow its argument instead of taking ownership of it, and then copy the data within the function (`vec.clone()`) in order to return an owned `Vec`. -3. Or, you could make `fill_vec` *mutably* borrow a reference to its argument (which will need to be - mutable), modify it directly, then not return anything. This means that `vec0` will change over the - course of the function, and makes `vec1` redundant (make sure to change the parameters of the `println!` - statements if you go this route) """ [[exercises]] name = "move_semantics3" path = "exercises/move_semantics/move_semantics3.rs" -mode = "compile" +mode = "test" hint = """ The difference between this one and the previous ones is that the first line of `fn fill_vec` that had `let mut vec = vec;` is no longer there. You can, @@ -328,7 +324,7 @@ an existing binding to be a mutable binding instead of an immutable one :)""" [[exercises]] name = "move_semantics4" path = "exercises/move_semantics/move_semantics4.rs" -mode = "compile" +mode = "test" hint = """ Stop reading whenever you feel like you have enough direction :) Or try doing one step and then fixing the compiler errors that result! @@ -337,7 +333,7 @@ So the end goal is to: - so then `vec0` doesn't exist, so we can't pass it to `fill_vec` - `fill_vec` has had its signature changed, which our call should reflect - since we're not creating a new vec in `main` anymore, we need to create - a new vec in `fill_vec`, similarly to the way we did in `main`""" + a new vec in `fill_vec`, and fill it with the expected values""" [[exercises]] name = "move_semantics5" From e8c2d27b4af5d385ecad7d22cbf5763099e15f41 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 12:34:37 +0000 Subject: [PATCH 1077/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 76d3a58c..831963a7 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -332,6 +332,7 @@ authors. Yamila Moreno
Yamila Moreno

πŸ–‹ + Will Hack
Will Hack

πŸ–‹ From fcac2b553cef016344196019949f3ed27144d25a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 12:34:38 +0000 Subject: [PATCH 1078/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8ceb8990..9ea25f2e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2343,6 +2343,15 @@ "contributions": [ "content" ] + }, + { + "login": "willhack", + "name": "Will Hack", + "avatar_url": "https://avatars.githubusercontent.com/u/18036720?v=4", + "profile": "https://github.com/willhack", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 9a0e5bd00355d56527ab9cb04c0bede2d117bbfc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 12:35:34 +0000 Subject: [PATCH 1079/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 831963a7..9c5b1166 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -333,6 +333,7 @@ authors. Yamila Moreno
Yamila Moreno

πŸ–‹ Will Hack
Will Hack

πŸ–‹ + Michael
Michael

πŸ–‹ From b5473218685fef0d4ef027ce5781aeb8efa71ac1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 12:35:35 +0000 Subject: [PATCH 1080/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9ea25f2e..40cebc11 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2352,6 +2352,15 @@ "contributions": [ "content" ] + }, + { + "login": "bean5", + "name": "Michael", + "avatar_url": "https://avatars.githubusercontent.com/u/2052646?v=4", + "profile": "http://cancompute.tech", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 3f7ef6fe33ac5e898115157e249802f7f8511843 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 12:37:56 +0000 Subject: [PATCH 1081/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 9c5b1166..54ead917 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -334,6 +334,7 @@ authors. Yamila Moreno
Yamila Moreno

πŸ–‹ Will Hack
Will Hack

πŸ–‹ Michael
Michael

πŸ–‹ + Mohammed Sadiq
Mohammed Sadiq

πŸ–‹ From d5525794f893714a01ccb28be24d84e1c992a64c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 12:37:58 +0000 Subject: [PATCH 1082/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 40cebc11..1ad4d589 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2361,6 +2361,15 @@ "contributions": [ "content" ] + }, + { + "login": "pksadiq", + "name": "Mohammed Sadiq", + "avatar_url": "https://avatars.githubusercontent.com/u/1289514?v=4", + "profile": "https://www.sadiqpk.org", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 951dde4e949f6c176c11dd77dcb1a9021f2fdcbf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 12:39:45 +0000 Subject: [PATCH 1083/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 54ead917..4e34f56f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -335,6 +335,7 @@ authors. Will Hack
Will Hack

πŸ–‹ Michael
Michael

πŸ–‹ Mohammed Sadiq
Mohammed Sadiq

πŸ–‹ + Jakob
Jakob

πŸ–‹ From 680a32a85c265b81ab7b84a79e90b677482ff170 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 12:39:46 +0000 Subject: [PATCH 1084/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 1ad4d589..b1db5fa4 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2370,6 +2370,15 @@ "contributions": [ "content" ] + }, + { + "login": "Jak-Ch-ll", + "name": "Jakob", + "avatar_url": "https://avatars.githubusercontent.com/u/56225668?v=4", + "profile": "https://github.com/Jak-Ch-ll", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 6c0c397507dd2e244167654f5ee46b68b5921a37 Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 4 Sep 2023 14:49:52 +0200 Subject: [PATCH 1085/1293] fix: absolut-ize readme links --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 300aee37..a7b7a9af 100644 --- a/README.md +++ b/README.md @@ -173,12 +173,8 @@ Now you should be done! ## Contributing -See [CONTRIBUTING.md](./CONTRIBUTING.md). - -Development-focused discussion about Rustlings happens in the [**rustlings** stream](https://rust-lang.zulipchat.com/#narrow/stream/334454-rustlings) -on the [Rust Project Zulip](https://rust-lang.zulipchat.com). Feel free to start a new thread there -if you have ideas or suggestions! +See [CONTRIBUTING.md](https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md). ## Contributors ✨ -Thanks goes to the wonderful people listed in [AUTHORS.md](./AUTHORS.md) πŸŽ‰ +Thanks goes to the wonderful people listed in [AUTHORS.md](https://github.com/rust-lang/rustlings/blob/main/AUTHORS.md) πŸŽ‰ From 3ad30308ec39dc6f108493fdca7dd133a8b28b8e Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 4 Sep 2023 14:50:31 +0200 Subject: [PATCH 1086/1293] feat: add oranda deploy workflow --- .github/workflows/web.yml | 98 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 .github/workflows/web.yml diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml new file mode 100644 index 00000000..f20e24e4 --- /dev/null +++ b/.github/workflows/web.yml @@ -0,0 +1,98 @@ +# Workflow to build your docs with oranda (and mdbook) +# and deploy them to Github Pages +name: Web + +# We're going to push to the gh-pages branch, so we need that permission +permissions: + contents: write + +# What situations do we want to build docs in? +# All of these work independently and can be removed / commented out +# if you don't want oranda/mdbook running in that situation +on: + # Check that a PR didn't break docs! + # + # Note that the "Deploy to Github Pages" step won't run in this mode, + # so this won't have any side-effects. But it will tell you if a PR + # completely broke oranda/mdbook. Sadly we don't provide previews (yet)! + pull_request: + + # Whenever something gets pushed to main, update the docs! + # This is great for getting docs changes live without cutting a full release. + # + # Note that if you're using cargo-dist, this will "race" the Release workflow + # that actually builds the Github Release that oranda tries to read (and + # this will almost certainly complete first). As a result you will publish + # docs for the latest commit but the oranda landing page won't know about + # the latest release. The workflow_run trigger below will properly wait for + # cargo-dist, and so this half-published state will only last for ~10 minutes. + # + # If you only want docs to update with releases, disable this, or change it to + # a "release" branch. You can, of course, also manually trigger a workflow run + # when you want the docs to update. + push: + branches: + - main + + # Whenever a workflow called "Release" completes, update the docs! + # + # If you're using cargo-dist, this is recommended, as it will ensure that + # oranda always sees the latest release right when it's available. Note + # however that Github's UI is wonky when you use workflow_run, and won't + # show this workflow as part of any commit. You have to go to the "actions" + # tab for your repo to see this one running (the gh-pages deploy will also + # only show up there). + workflow_run: + workflows: [ "Release" ] + types: + - completed + +# Alright, let's do it! +jobs: + web: + name: Build and deploy site and docs + runs-on: ubuntu-latest + steps: + # Setup + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: dtolnay/rust-toolchain@stable + - uses: swatinem/rust-cache@v2 + + # If you use any mdbook plugins, here's the place to install them! + + # Install and run oranda (and mdbook) + # This will write all output to ./public/ (including copying mdbook's output to there) + - name: Install and run oranda + run: | + curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/oranda/releases/download/v0.3.1/oranda-installer.sh | sh + oranda build + + - name: Prepare HTML for link checking + # untitaker/hyperlink supports no site prefixes, move entire site into + # a subfolder + run: mkdir /tmp/public/ && cp -R public /tmp/public/oranda + + - name: Check HTML for broken internal links + uses: untitaker/hyperlink@0.1.29 + with: + args: /tmp/public/ --sources docs/ + + # Deploy to our gh-pages branch (creating it if it doesn't exist) + # the "public" dir that oranda made above will become the root dir + # of this branch. + # + # Note that once the gh-pages branch exists, you must + # go into repo's settings > pages and set "deploy from branch: gh-pages" + # the other defaults work fine. + - name: Deploy to Github Pages + uses: JamesIves/github-pages-deploy-action@v4.4.1 + # ONLY if we're on main (so no PRs or feature branches allowed!) + if: ${{ github.ref == 'refs/heads/main' }} + with: + branch: gh-pages + # Gotta tell the action where to find oranda's output + folder: public + token: ${{ secrets.GITHUB_TOKEN }} + single-commit: true \ No newline at end of file From f31a18429b051c265a3ffcdc1888dd4053e6a572 Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 4 Sep 2023 14:57:16 +0200 Subject: [PATCH 1087/1293] chore: consolidate CI workflows --- .github/workflows/lint.yml | 18 ------------------ .github/workflows/rust.yml | 31 +++++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 26 deletions(-) delete mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 67339d1b..00000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Lint - -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - lint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: DavidAnson/markdownlint-cli2-action@v9 - with: - globs: "exercises/**/*.md" diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 1b244b1a..226d4137 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -10,13 +10,28 @@ env: CARGO_TERM_COLOR: always jobs: - build: + fmt: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: Fetch & maybe update Cargo.lock - run: cargo fetch --locked - - name: Build - run: cargo build --verbose - - name: Run tests - run: cargo test --verbose + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt + - uses: DavidAnson/markdownlint-cli2-action@v9 + with: + globs: "exercises/**/*.md" + - name: Run cargo fmt + run: | + cargo fmt --all -- --check + test: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macOS-latest] + steps: + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@stable + - uses: swatinem/rust-cache@v2 + - name: Run cargo test + run: | + cargo test From 0d36050b364a2dfa342d4c00f820e67c38738726 Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 4 Sep 2023 14:58:13 +0200 Subject: [PATCH 1088/1293] chore: remove link checker --- .github/workflows/web.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index f20e24e4..5d9abe4f 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -68,17 +68,7 @@ jobs: run: | curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/oranda/releases/download/v0.3.1/oranda-installer.sh | sh oranda build - - - name: Prepare HTML for link checking - # untitaker/hyperlink supports no site prefixes, move entire site into - # a subfolder - run: mkdir /tmp/public/ && cp -R public /tmp/public/oranda - - name: Check HTML for broken internal links - uses: untitaker/hyperlink@0.1.29 - with: - args: /tmp/public/ --sources docs/ - # Deploy to our gh-pages branch (creating it if it doesn't exist) # the "public" dir that oranda made above will become the root dir # of this branch. @@ -95,4 +85,4 @@ jobs: # Gotta tell the action where to find oranda's output folder: public token: ${{ secrets.GITHUB_TOKEN }} - single-commit: true \ No newline at end of file + single-commit: true From de45998f69ac95cd81175fef9e054c2c77ce82ab Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 4 Sep 2023 15:02:02 +0200 Subject: [PATCH 1089/1293] chore: remove argh --- Cargo.lock | 32 -------------------------------- Cargo.toml | 1 - 2 files changed, 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e5b85530..f7c7a86b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,37 +59,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "argh" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7af5ba06967ff7214ce4c7419c7d185be7ecd6cc4965a8f6e1d8ce0398aad219" -dependencies = [ - "argh_derive", - "argh_shared", -] - -[[package]] -name = "argh_derive" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56df0aeedf6b7a2fc67d06db35b09684c3e8da0c95f8f27685cb17e08413d87a" -dependencies = [ - "argh_shared", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "argh_shared" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5693f39141bda5760ecc4111ab08da40565d1771038c4a0250f03457ec707531" -dependencies = [ - "serde", -] - [[package]] name = "assert_cmd" version = "2.0.12" @@ -618,7 +587,6 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" name = "rustlings" version = "5.5.1" dependencies = [ - "argh", "assert_cmd", "clap", "console", diff --git a/Cargo.toml b/Cargo.toml index 2c2a92b2..85017f49 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,6 @@ authors = [ edition = "2021" [dependencies] -argh = "0.1" indicatif = "0.17.6" console = "0.15" notify = "4.0" From 58cabf2ebd9092fecab3cfe75c16cad08591eeec Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 4 Sep 2023 15:23:04 +0200 Subject: [PATCH 1090/1293] release: 5.6.0 --- CHANGELOG.md | 40 ++++++++++++++++++++++++++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 8 ++++---- flake.nix | 2 +- oranda.json | 5 ++--- 6 files changed, 49 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a802faaf..69262b34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,43 @@ + +## 5.6.0 (2023-09-04) + +#### Added + +- New exercise: `if3`, teaching the user about `if let` statements. +- `hashmaps2`: Added an extra test function to check if the amount of fruits is higher than zero. +- `enums3`: Added a test for `Message`. +- `if1`: Added a test case to check equal values. +- `if3`: Added a note specifying that there are no test changes needed. + +#### Changed + +- Swapped the order of threads and smart pointer exercises. +- Rewrote the CLI to use `clap` - it's matured much since we switched to `argh` :) +- `structs3`: Switched from i32 to u32. +- `move_semantics`: Switched 1-4 to tests, and rewrote them to be way simpler, while still teaching about the same + concepts. + +#### Fixed + +- `iterators5`: + - Removed an outdated part of the hint. + - Renamed variables to use snake_case. +- `vecs2`: Updated the hint to reference the renamed loop variable. +- `enums3`: Changed message string in test so that it gets properly tested. +- `strings2`: Corrected line number in hint, then removed it (this both happened as part of this release cycle). +- `primitive_types4`: Updated hint to the correct ending index. +- `quiz1`: Removed duplicated sentence from exercise comments. +- `errors4`: Improved comment. +- `from_into`: Fixed test values. +- `cow1`: Added `.to_mut()` to distinguish from the previous test case. +- `threads2`: Updated hint text to reference the correct book heading. + +#### Housekeeping + +- Cleaned up the explanation paragraphs at the start of each exercise. +- Lots of Nix housekeeping that I don't feel qualified to write about! +- Improved CI workflows, we're now testing on multiple platforms at once. + ## 5.5.1 (2023-05-17) diff --git a/Cargo.lock b/Cargo.lock index f7c7a86b..a8408edf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,7 +585,7 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "rustlings" -version = "5.5.1" +version = "5.6.0" dependencies = [ "assert_cmd", "clap", diff --git a/Cargo.toml b/Cargo.toml index 85017f49..d64ef756 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustlings" description = "Small exercises to get you used to reading and writing Rust code!" -version = "5.5.1" +version = "5.6.0" authors = [ "Liv ", "Carol (Nichols || Goulding) ", diff --git a/README.md b/README.md index a7b7a9af..a16f7534 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,8 @@ This will install Rustlings and give you access to the `rustlings` command. Run Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.1) -git clone -b 5.5.1 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.0) +git clone -b 5.6.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings # if nix version > 2.3 nix develop @@ -79,8 +79,8 @@ If you get a permission denied message, you might have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install --path .`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.1) -git clone -b 5.5.1 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.0) +git clone -b 5.6.0 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/flake.nix b/flake.nix index f65c2907..94f41775 100644 --- a/flake.nix +++ b/flake.nix @@ -22,7 +22,7 @@ rustlings = pkgs.rustPlatform.buildRustPackage { name = "rustlings"; - version = "5.5.1"; + version = "5.6.0"; buildInputs = cargoBuildInputs; nativeBuildInputs = [pkgs.git]; diff --git a/oranda.json b/oranda.json index 603e474e..be88e5e0 100644 --- a/oranda.json +++ b/oranda.json @@ -12,14 +12,13 @@ }, "components": { "artifacts": { - "cargo_dist": false, + "auto": true, "package_managers": { "preferred": { "macos/linux/unix": "curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash", "windows": "Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1" } } - }, - "changelog": true + } } } From 847b57423f2a2500b666ec0085cbd897b7b7139f Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 4 Sep 2023 15:26:22 +0200 Subject: [PATCH 1091/1293] update for page build From a5e41335161601acc3e86e0b9425c66c9af354c3 Mon Sep 17 00:00:00 2001 From: Jon Erling Hustadnes Date: Fri, 8 Sep 2023 16:42:16 +0200 Subject: [PATCH 1092/1293] Make primitive_types3 require at least 100 elements Made the function panic if it's not long enough --- exercises/primitive_types/primitive_types3.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/primitive_types/primitive_types3.rs b/exercises/primitive_types/primitive_types3.rs index 06a7a621..8b0de44e 100644 --- a/exercises/primitive_types/primitive_types3.rs +++ b/exercises/primitive_types/primitive_types3.rs @@ -14,5 +14,6 @@ fn main() { println!("Wow, that's a big array!"); } else { println!("Meh, I eat arrays like that for breakfast."); + panic!("Array not big enough, more elements needed") } } From 33a4f4e454031ea7b318c855625553b413b8afcd Mon Sep 17 00:00:00 2001 From: Oscar Bonilla <6f6231@gmail.com> Date: Fri, 8 Sep 2023 09:49:11 -0700 Subject: [PATCH 1093/1293] Fix compiler error and clarify instructions --- exercises/smart_pointers/cow1.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/smart_pointers/cow1.rs b/exercises/smart_pointers/cow1.rs index 5ab51152..fcd3e0bb 100644 --- a/exercises/smart_pointers/cow1.rs +++ b/exercises/smart_pointers/cow1.rs @@ -67,10 +67,10 @@ mod tests { #[test] fn owned_mutation() -> Result<(), &'static str> { // Of course this is also the case if a mutation does occur. In this - // case the call to `to_mut()` returns a reference to the same data as - // before. + // case the call to `to_mut()` in the abs_all() function returns a + // reference to the same data as before. let slice = vec![-1, 0, 1]; - let mut input = Cow::from(slice).to_mut(); + let mut input = Cow::from(slice); match abs_all(&mut input) { // TODO } From 47fbd6d16045023121672b8792764a5c6c6d3e01 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 8 Sep 2023 23:23:31 +0000 Subject: [PATCH 1094/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4e34f56f..1312a056 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -336,6 +336,7 @@ authors. Michael
Michael

πŸ–‹ Mohammed Sadiq
Mohammed Sadiq

πŸ–‹ Jakob
Jakob

πŸ–‹ + Oscar Bonilla
Oscar Bonilla

πŸ–‹ From e17d603201458029defd88ebf61e24ed2e639bfb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 8 Sep 2023 23:23:32 +0000 Subject: [PATCH 1095/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b1db5fa4..9f644f1f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2379,6 +2379,15 @@ "contributions": [ "content" ] + }, + { + "login": "ob", + "name": "Oscar Bonilla", + "avatar_url": "https://avatars.githubusercontent.com/u/4950?v=4", + "profile": "http://oscarbonilla.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From dceba07e829ab27c95600696b9972f8f82fb954d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Sep 2023 12:58:35 +0000 Subject: [PATCH 1096/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 1312a056..8887dc22 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -337,6 +337,7 @@ authors. Mohammed Sadiq
Mohammed Sadiq

πŸ–‹ Jakob
Jakob

πŸ–‹ Oscar Bonilla
Oscar Bonilla

πŸ–‹ + Jon Erling Hustadnes
Jon Erling Hustadnes

πŸ–‹ From b33ef03ac6ef38a31d5c22583b9eeaf71ee4acc6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Sep 2023 12:58:36 +0000 Subject: [PATCH 1097/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9f644f1f..95b50a7d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2388,6 +2388,15 @@ "contributions": [ "content" ] + }, + { + "login": "husjon", + "name": "Jon Erling Hustadnes", + "avatar_url": "https://avatars.githubusercontent.com/u/554229?v=4", + "profile": "https://github.com/husjon", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 4a1290cb669fe324439c8a58a4437f141f5b1641 Mon Sep 17 00:00:00 2001 From: Charles Hall Date: Mon, 11 Sep 2023 19:56:25 -0700 Subject: [PATCH 1098/1293] chore: update flake.lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: β€’ Updated input 'flake-compat': 'github:edolstra/flake-compat/b4a34015c698c7793d592d66adbab377907a2be8' (2022-04-19) β†’ 'github:edolstra/flake-compat/35bb57c0c8d8b62bbfd284272c928ceb64ddbde9' (2023-01-17) β€’ Updated input 'flake-utils': 'github:numtide/flake-utils/c0e246b9b83f637f4681389ecabcb2681b4f3af0' (2022-08-07) β†’ 'github:numtide/flake-utils/f9e7cf818399d17d347f847525c5a5a8032e4e44' (2023-08-23) β€’ Added input 'flake-utils/systems': 'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e' (2023-04-09) β€’ Updated input 'nixpkgs': 'github:nixos/nixpkgs/b39fd6e4edef83cb4a135ebef98751ce23becc33' (2022-10-24) β†’ 'github:nixos/nixpkgs/db9208ab987cdeeedf78ad9b4cf3c55f5ebd269b' (2023-09-08) --- flake.lock | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/flake.lock b/flake.lock index ceb62c6d..15238981 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1650374568, - "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", "owner": "edolstra", "repo": "flake-compat", - "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", "type": "github" }, "original": { @@ -17,12 +17,15 @@ } }, "flake-utils": { + "inputs": { + "systems": "systems" + }, "locked": { - "lastModified": 1659877975, - "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "lastModified": 1692799911, + "narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", "owner": "numtide", "repo": "flake-utils", - "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", "type": "github" }, "original": { @@ -33,11 +36,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1666629043, - "narHash": "sha256-Yoq6Ut2F3Ol73yO9hG93x6ts5c4F5BhKTbcF3DtBEAw=", + "lastModified": 1694183432, + "narHash": "sha256-YyPGNapgZNNj51ylQMw9lAgvxtM2ai1HZVUu3GS8Fng=", "owner": "nixos", "repo": "nixpkgs", - "rev": "b39fd6e4edef83cb4a135ebef98751ce23becc33", + "rev": "db9208ab987cdeeedf78ad9b4cf3c55f5ebd269b", "type": "github" }, "original": { @@ -53,6 +56,21 @@ "flake-utils": "flake-utils", "nixpkgs": "nixpkgs" } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } } }, "root": "root", From 241889159ad80e5a5ed636a9e071fb598e366627 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 08:57:11 +0000 Subject: [PATCH 1099/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 8887dc22..2afa56a3 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -338,6 +338,7 @@ authors. Jakob
Jakob

πŸ–‹ Oscar Bonilla
Oscar Bonilla

πŸ–‹ Jon Erling Hustadnes
Jon Erling Hustadnes

πŸ–‹ + Charles Hall
Charles Hall

πŸš‡ From 95640cba232aadf5c12c25d0acc94f24b5ee0191 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 08:57:12 +0000 Subject: [PATCH 1100/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 95b50a7d..55bd126b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2397,6 +2397,15 @@ "contributions": [ "content" ] + }, + { + "login": "CobaltCause", + "name": "Charles Hall", + "avatar_url": "https://avatars.githubusercontent.com/u/7003738?v=4", + "profile": "https://github.com/CobaltCause", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 8, From 0ee9c5b776cf5d196013fb49d885c4dd67e8cd98 Mon Sep 17 00:00:00 2001 From: Jon Erling Hustadnes Date: Wed, 13 Sep 2023 20:26:47 +0200 Subject: [PATCH 1101/1293] Fixed formatting with rust-analyzer --- exercises/enums/enums3.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs index 98da1691..2dcdad06 100644 --- a/exercises/enums/enums3.rs +++ b/exercises/enums/enums3.rs @@ -20,7 +20,7 @@ struct State { color: (u8, u8, u8), position: Point, quit: bool, - message: String + message: String, } impl State { @@ -32,7 +32,9 @@ impl State { self.quit = true; } - fn echo(&mut self, s: String) { self.message = s } + fn echo(&mut self, s: String) { + self.message = s + } fn move_position(&mut self, p: Point) { self.position = p; From a0699bd91765c0702d925de6a176f4bdabdfd8d7 Mon Sep 17 00:00:00 2001 From: Jurglic Date: Thu, 14 Sep 2023 17:10:06 +0200 Subject: [PATCH 1102/1293] fix: test name typo --- exercises/conversions/as_ref_mut.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/conversions/as_ref_mut.rs index 626a36c4..2ba9e3f0 100644 --- a/exercises/conversions/as_ref_mut.rs +++ b/exercises/conversions/as_ref_mut.rs @@ -57,7 +57,7 @@ mod tests { } #[test] - fn mult_box() { + fn mut_box() { let mut num: Box = Box::new(3); num_sq(&mut num); assert_eq!(*num, 9); From eb84eaf15123acb5c014ef579a480984a543e26c Mon Sep 17 00:00:00 2001 From: Luka Krmpotic Date: Fri, 15 Sep 2023 22:29:55 +0200 Subject: [PATCH 1103/1293] remove hint comments when no hint exists --- exercises/clippy/clippy3.rs | 3 +-- exercises/primitive_types/primitive_types1.rs | 3 --- exercises/primitive_types/primitive_types2.rs | 3 --- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/exercises/clippy/clippy3.rs b/exercises/clippy/clippy3.rs index 35021f84..5a95f5b8 100644 --- a/exercises/clippy/clippy3.rs +++ b/exercises/clippy/clippy3.rs @@ -1,8 +1,7 @@ // clippy3.rs // // Here's a couple more easy Clippy fixes, so you can see its utility. -// -// Execute `rustlings hint clippy3` or use the `hint` watch subcommand for a hint. +// No hints. // I AM NOT DONE diff --git a/exercises/primitive_types/primitive_types1.rs b/exercises/primitive_types/primitive_types1.rs index e1cf52a2..36633400 100644 --- a/exercises/primitive_types/primitive_types1.rs +++ b/exercises/primitive_types/primitive_types1.rs @@ -2,9 +2,6 @@ // // Fill in the rest of the line that has code missing! No hints, there's no // tricks, just get used to typing these :) -// -// Execute `rustlings hint primitive_types1` or use the `hint` watch subcommand -// for a hint. // I AM NOT DONE diff --git a/exercises/primitive_types/primitive_types2.rs b/exercises/primitive_types/primitive_types2.rs index fcc9705a..f1616ed3 100644 --- a/exercises/primitive_types/primitive_types2.rs +++ b/exercises/primitive_types/primitive_types2.rs @@ -2,9 +2,6 @@ // // Fill in the rest of the line that has code missing! No hints, there's no // tricks, just get used to typing these :) -// -// Execute `rustlings hint primitive_types2` or use the `hint` watch subcommand -// for a hint. // I AM NOT DONE From 8716558696cc4149220a5bd67b7dd9c8e883e731 Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 18 Sep 2023 09:54:08 +0200 Subject: [PATCH 1104/1293] Revert "Fix 1611" From 62415f758b40ff8bd027ca1ec493bfd4904e848a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 08:03:48 +0000 Subject: [PATCH 1105/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 2afa56a3..329887ab 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -340,6 +340,9 @@ authors. Jon Erling Hustadnes
Jon Erling Hustadnes

πŸ–‹ Charles Hall
Charles Hall

πŸš‡ + + Luka KrmpotiΔ‡
Luka Krmpotić

πŸ–‹ + From 746180b153744c63fa57783b1bb7db61fb6caa7d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 08:03:49 +0000 Subject: [PATCH 1106/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 55bd126b..7d574867 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2406,6 +2406,15 @@ "contributions": [ "infra" ] + }, + { + "login": "krmpotic", + "name": "Luka KrmpotiΔ‡", + "avatar_url": "https://avatars.githubusercontent.com/u/10350645?v=4", + "profile": "https://github.com/krmpotic", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From a38840ae92969fff2e972311ea797a3434c269b9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 08:05:51 +0000 Subject: [PATCH 1107/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 329887ab..fb249acb 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -342,6 +342,7 @@ authors. Luka KrmpotiΔ‡
Luka Krmpotić

πŸ–‹ + Jurglic
Jurglic

πŸ–‹ From 8e8c74c6c03017a9d0bbb089354b50a2a143e2fa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 08:05:52 +0000 Subject: [PATCH 1108/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7d574867..92bf2a09 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2415,6 +2415,15 @@ "contributions": [ "content" ] + }, + { + "login": "jurglic", + "name": "Jurglic", + "avatar_url": "https://avatars.githubusercontent.com/u/112600?v=4", + "profile": "https://github.com/jurglic", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 9a743f80c57cc6bf27819589a8ddb5a5579ab1a4 Mon Sep 17 00:00:00 2001 From: liv Date: Mon, 18 Sep 2023 10:16:05 +0200 Subject: [PATCH 1109/1293] release: 5.6.1 --- CHANGELOG.md | 16 +++++++ Cargo.lock | 132 ++++++++++++++++++++++++++++----------------------- Cargo.toml | 2 +- README.md | 8 ++-- flake.nix | 2 +- 5 files changed, 94 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69262b34..a7226a47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ + +## 5.6.1 (2023-09-18) + +#### Changed + +- Converted all exercises with assertions to test mode. + +#### Fixed + +- `cow1`: Reverted regression introduced by calling `to_mut` where it + shouldn't have been called, and clarified comment. +- `primitive_types3`: Require at least an array of 100 elements. +- Removed hint comments when no hint exists for the exercise. +- `as_ref_mut`: Fixed a typo in a test function name. +- `enums3`: Fixed formatting with `rustfmt`. + ## 5.6.0 (2023-09-04) diff --git a/Cargo.lock b/Cargo.lock index a8408edf..418032a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aho-corasick" -version = "1.0.5" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] @@ -27,9 +27,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" +checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46" [[package]] name = "anstyle-parse" @@ -111,9 +111,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.4.2" +version = "4.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6" +checksum = "84ed82781cea27b43c9b106a979fe450a13a31aab0500595fb3fc06616de08e6" dependencies = [ "clap_builder", "clap_derive", @@ -157,15 +157,15 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "console" -version = "0.15.7" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", - "windows-sys 0.45.0", + "windows-sys 0.42.0", ] [[package]] @@ -200,14 +200,14 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412" dependencies = [ "cfg-if 1.0.0", "libc", "redox_syscall", - "windows-sys 0.48.0", + "windows-sys 0.45.0", ] [[package]] @@ -274,11 +274,11 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "home" -version = "0.5.5" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" dependencies = [ - "windows-sys 0.48.0", + "winapi 0.3.9", ] [[package]] @@ -353,9 +353,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "kernel32-sys" @@ -381,15 +381,18 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" [[package]] name = "log" -version = "0.4.20" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if 1.0.0", +] [[package]] name = "memchr" @@ -442,9 +445,9 @@ dependencies = [ [[package]] name = "net2" -version = "0.2.39" +version = "0.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" dependencies = [ "cfg-if 0.1.10", "libc", @@ -477,9 +480,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] @@ -529,40 +532,39 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.9.5" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" +checksum = "cce168fea28d3e05f158bda4576cf0c844d5045bc2cc3620fa0292ed5bb5814c" dependencies = [ "aho-corasick", "memchr", - "regex-automata", "regex-syntax", ] @@ -571,21 +573,16 @@ name = "regex-automata" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "rustlings" -version = "5.6.0" +version = "5.6.1" dependencies = [ "assert_cmd", "clap", @@ -603,9 +600,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "same-file" @@ -618,18 +615,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.188" +version = "1.0.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad" dependencies = [ "proc-macro2", "quote", @@ -638,9 +635,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" dependencies = [ "itoa", "ryu", @@ -658,9 +655,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] @@ -673,9 +670,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "2.0.31" +version = "2.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" +checksum = "bcc02725fd69ab9f26eab07fad303e2497fad6fb9eba4f96c4d1687bdf704ad9" dependencies = [ "proc-macro2", "quote", @@ -690,9 +687,9 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "toml" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", "serde_spanned", @@ -711,9 +708,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap", "serde", @@ -724,9 +721,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" [[package]] name = "unicode-width" @@ -802,6 +799,21 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-sys" version = "0.45.0" diff --git a/Cargo.toml b/Cargo.toml index d64ef756..a055d4f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustlings" description = "Small exercises to get you used to reading and writing Rust code!" -version = "5.6.0" +version = "5.6.1" authors = [ "Liv ", "Carol (Nichols || Goulding) ", diff --git a/README.md b/README.md index a16f7534..8fac7a28 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,8 @@ This will install Rustlings and give you access to the `rustlings` command. Run Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.0) -git clone -b 5.6.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.1) +git clone -b 5.6.1 --depth 1 https://github.com/rust-lang/rustlings cd rustlings # if nix version > 2.3 nix develop @@ -79,8 +79,8 @@ If you get a permission denied message, you might have to exclude the directory Basically: Clone the repository at the latest tag, run `cargo install --path .`. ```bash -# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.0) -git clone -b 5.6.0 --depth 1 https://github.com/rust-lang/rustlings +# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.1) +git clone -b 5.6.1 --depth 1 https://github.com/rust-lang/rustlings cd rustlings cargo install --force --path . ``` diff --git a/flake.nix b/flake.nix index 94f41775..152d38e6 100644 --- a/flake.nix +++ b/flake.nix @@ -22,7 +22,7 @@ rustlings = pkgs.rustPlatform.buildRustPackage { name = "rustlings"; - version = "5.6.0"; + version = "5.6.1"; buildInputs = cargoBuildInputs; nativeBuildInputs = [pkgs.git]; From 83ac243c00d0b99c6d038546a4ffda2d5b23ca07 Mon Sep 17 00:00:00 2001 From: Ofir Lauber Date: Thu, 21 Sep 2023 01:32:46 +0300 Subject: [PATCH 1110/1293] chore: fix comment in enums3.rs --- exercises/enums/enums3.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs index 2dcdad06..92d18c46 100644 --- a/exercises/enums/enums3.rs +++ b/exercises/enums/enums3.rs @@ -41,10 +41,9 @@ impl State { } fn process(&mut self, message: Message) { - // TODO: create a match expression to process the different message - // variants - // Remember: When passing a tuple as a function argument, you'll need - // extra parentheses: fn function((t, u, p, l, e)) + // TODO: create a match expression to process the different message variants + // Remember: When passing a tuple as a function argument, you'll need extra parentheses: + // fn function((t, u, p, l, e)) } } From 666857dc4eb7f1187f40d5631dbf1a10d63ac2cb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 10:01:30 +0000 Subject: [PATCH 1111/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index fb249acb..51255a9a 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -343,6 +343,7 @@ authors. Luka KrmpotiΔ‡
Luka Krmpotić

πŸ–‹ Jurglic
Jurglic

πŸ–‹ + Ofir Lauber
Ofir Lauber

πŸ–‹ From f86a3c5ddcf29c01c9c4308e2556cf3cc35917de Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 10:01:31 +0000 Subject: [PATCH 1112/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 92bf2a09..d2ad2529 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2424,6 +2424,15 @@ "contributions": [ "content" ] + }, + { + "login": "OfirLauber", + "name": "Ofir Lauber", + "avatar_url": "https://avatars.githubusercontent.com/u/5631030?v=4", + "profile": "https://github.com/OfirLauber", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From c63c44ac70667c0696997a6f40efbf9239789d18 Mon Sep 17 00:00:00 2001 From: Chris Rose Date: Thu, 21 Sep 2023 11:00:04 -0600 Subject: [PATCH 1113/1293] Remove .envrc --- .envrc | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .envrc diff --git a/.envrc b/.envrc deleted file mode 100644 index 48541064..00000000 --- a/.envrc +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash - -# Automatically Load nix devShell w/dotenv -use flake From 6aa47be78e9b80beec3bdd5b96a8f985138358b2 Mon Sep 17 00:00:00 2001 From: d1t2 <507502+dieterplex@users.noreply.github.com> Date: Fri, 22 Sep 2023 11:32:39 +0800 Subject: [PATCH 1114/1293] fix(installation): bump MinRustVersion to 1.70 Since #1633 porting to Clap, min Rust version reqirement changes. --- install.ps1 | 2 +- install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/install.ps1 b/install.ps1 index 7bab21f6..844b0134 100644 --- a/install.ps1 +++ b/install.ps1 @@ -53,7 +53,7 @@ function vercomp($v1, $v2) { } $rustVersion = $(rustc --version).Split(" ")[1] -$minRustVersion = "1.56" +$minRustVersion = "1.70" if ((vercomp $rustVersion $minRustVersion) -eq 2) { Write-Host "WARNING: Rust version is too old: $rustVersion - needs at least $minRustVersion" Write-Host "Please update Rust with 'rustup update'" diff --git a/install.sh b/install.sh index 4ee56bb1..9aca5b68 100755 --- a/install.sh +++ b/install.sh @@ -124,7 +124,7 @@ function vercomp() { } RustVersion=$(rustc --version | cut -d " " -f 2) -MinRustVersion=1.58 +MinRustVersion=1.70 vercomp "$RustVersion" $MinRustVersion || ec=$? if [ ${ec:-0} -eq 2 ] then From b88c23897f27ff5aa7d700f0bc16a289068445d5 Mon Sep 17 00:00:00 2001 From: jyn Date: Mon, 25 Sep 2023 03:36:43 -0400 Subject: [PATCH 1115/1293] Give a more helpful error when a file is missing Previously, this would just say "missing file". Now it shows the path of the file that was missing, which should make it easier to debug what went wrong. --- src/exercise.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 07251dba..2c740fbf 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -201,14 +201,21 @@ path = "{}.rs""#, } pub fn state(&self) -> State { - let mut source_file = - File::open(&self.path).expect("We were unable to open the exercise file!"); + let mut source_file = File::open(&self.path).unwrap_or_else(|e| { + panic!( + "We were unable to open the exercise file {}! {e}", + self.path.display() + ) + }); let source = { let mut s = String::new(); - source_file - .read_to_string(&mut s) - .expect("We were unable to read the exercise file!"); + source_file.read_to_string(&mut s).unwrap_or_else(|e| { + panic!( + "We were unable to read the exercise file {}! {e}", + self.path.display() + ) + }); s }; From be78831ac02f969f02f4c2f35193dd2a2bb3aa62 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 08:58:45 +0000 Subject: [PATCH 1116/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 51255a9a..09d74809 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -344,6 +344,7 @@ authors. Luka KrmpotiΔ‡
Luka Krmpotić

πŸ–‹ Jurglic
Jurglic

πŸ–‹ Ofir Lauber
Ofir Lauber

πŸ–‹ + Chris Rose
Chris Rose

πŸš‡ From e58c8322e90f8435b9e5a7adaaebaeec2fe10c3d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 08:58:46 +0000 Subject: [PATCH 1117/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d2ad2529..0239dd42 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2433,6 +2433,15 @@ "contributions": [ "content" ] + }, + { + "login": "offbyone", + "name": "Chris Rose", + "avatar_url": "https://avatars.githubusercontent.com/u/181693?v=4", + "profile": "https://github.com/offbyone", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 8, From 463e23e006a314d80139afe6a9144a34d6de358a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 08:59:25 +0000 Subject: [PATCH 1118/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 51255a9a..1ee1bf7e 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -344,6 +344,7 @@ authors. Luka KrmpotiΔ‡
Luka Krmpotić

πŸ–‹ Jurglic
Jurglic

πŸ–‹ Ofir Lauber
Ofir Lauber

πŸ–‹ + d1t2
d1t2

πŸš‡ From 00e16b49e576adfebf34b45c4d7492595656246c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 08:59:26 +0000 Subject: [PATCH 1119/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d2ad2529..0bf80fce 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2433,6 +2433,15 @@ "contributions": [ "content" ] + }, + { + "login": "dieterplex", + "name": "d1t2", + "avatar_url": "https://avatars.githubusercontent.com/u/507502?v=4", + "profile": "https://github.com/dieterplex", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 8, From cc658eb28840e63f69f89c8562bbf10333461355 Mon Sep 17 00:00:00 2001 From: DocWilco Date: Wed, 27 Sep 2023 21:33:49 +0200 Subject: [PATCH 1120/1293] fix(cli): make debugging in windows work On windows, if `stderr` or `stdin` aren't also set to `Stdio::null()` the `spawn()` fails with `The handle is invalid`, and `rustlings` thinks that there's no `rustc` installed. --- src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.rs b/src/main.rs index a4b764d7..89bd444f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -396,6 +396,8 @@ fn rustc_exists() -> bool { Command::new("rustc") .args(["--version"]) .stdout(Stdio::null()) + .stderr(Stdio::null()) + .stdin(Stdio::null()) .spawn() .and_then(|mut child| child.wait()) .map(|status| status.success()) From 511e3343650a880435f8fb3e96eecbc674d6ebfa Mon Sep 17 00:00:00 2001 From: DocWilco Date: Wed, 27 Sep 2023 22:02:14 +0200 Subject: [PATCH 1121/1293] fix(cli): stop littering pdb files on windows --- src/exercise.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/exercise.rs b/src/exercise.rs index 2c740fbf..c7b5672d 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -9,6 +9,7 @@ use std::process::{self, Command}; const RUSTC_COLOR_ARGS: &[&str] = &["--color", "always"]; const RUSTC_EDITION_ARGS: &[&str] = &["--edition", "2021"]; +const RUSTC_NO_DEBUG_ARGS: &[&str] = &["-C", "strip=debuginfo"]; const I_AM_DONE_REGEX: &str = r"(?m)^\s*///?\s*I\s+AM\s+NOT\s+DONE"; const CONTEXT: usize = 2; const CLIPPY_CARGO_TOML_PATH: &str = "./exercises/clippy/Cargo.toml"; @@ -113,11 +114,13 @@ impl Exercise { .args([self.path.to_str().unwrap(), "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) .args(RUSTC_EDITION_ARGS) + .args(RUSTC_NO_DEBUG_ARGS) .output(), Mode::Test => Command::new("rustc") .args(["--test", self.path.to_str().unwrap(), "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) .args(RUSTC_EDITION_ARGS) + .args(RUSTC_NO_DEBUG_ARGS) .output(), Mode::Clippy => { let cargo_toml = format!( @@ -144,6 +147,7 @@ path = "{}.rs""#, .args([self.path.to_str().unwrap(), "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) .args(RUSTC_EDITION_ARGS) + .args(RUSTC_NO_DEBUG_ARGS) .output() .expect("Failed to compile!"); // Due to an issue with Clippy, a cargo clean is required to catch all lints. @@ -289,6 +293,24 @@ mod test { assert!(!Path::new(&temp_file()).exists()); } + #[test] + #[cfg(target_os = "windows")] + fn test_no_pdb_file() { + [Mode::Compile, Mode::Test] // Clippy doesn't like to test + .iter() + .for_each(|mode| { + let exercise = Exercise { + name: String::from("example"), + // We want a file that does actually compile + path: PathBuf::from("tests/fixture/state/pending_exercise.rs"), + mode: *mode, + hint: String::from(""), + }; + let _ = exercise.compile().unwrap(); + assert!(!Path::new(&format!("{}.pdb", temp_file())).exists()); + }); + } + #[test] fn test_pending_state() { let exercise = Exercise { From 177981d1cd4812dd7b67d4fc7f74227e21f1691b Mon Sep 17 00:00:00 2001 From: liv Date: Thu, 28 Sep 2023 11:02:25 +0200 Subject: [PATCH 1122/1293] chore: fix missing opening brace --- .all-contributorsrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 27f69c3b..d8aeff54 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2443,6 +2443,7 @@ "infra" ] }, + { "login": "dieterplex", "name": "d1t2", "avatar_url": "https://avatars.githubusercontent.com/u/507502?v=4", From 11227403cecec2cb27fc9d3758ccb2962b352002 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 28 Sep 2023 09:02:43 +0000 Subject: [PATCH 1123/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index a2decea4..3dcc3e6f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -346,6 +346,7 @@ authors. Ofir Lauber
Ofir Lauber

πŸ–‹ Chris Rose
Chris Rose

πŸš‡ d1t2
d1t2

πŸš‡ + docwilco
docwilco

πŸ’» From 2fcafc66020fbe169efd4ff948d751f7be9a1b98 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 28 Sep 2023 09:02:44 +0000 Subject: [PATCH 1124/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d8aeff54..d31607fd 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2451,6 +2451,15 @@ "contributions": [ "infra" ] + }, + { + "login": "docwilco", + "name": "docwilco", + "avatar_url": "https://avatars.githubusercontent.com/u/66911096?v=4", + "profile": "https://github.com/docwilco", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 8e6c83b4cf8e61ad8a0fbbb42bdf968e93278736 Mon Sep 17 00:00:00 2001 From: Rogier 'DocWilco' Mulhuijzen Date: Fri, 29 Sep 2023 00:39:51 +0200 Subject: [PATCH 1125/1293] chore: make hints proper markdown Also rewrapped some hints to 80 columns so that they also look good in a terminal. closes #1698 --- info.toml | 614 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 379 insertions(+), 235 deletions(-) diff --git a/info.toml b/info.toml index 9930917c..e3f66e28 100644 --- a/info.toml +++ b/info.toml @@ -5,7 +5,7 @@ name = "intro1" path = "exercises/intro/intro1.rs" mode = "compile" hint = """ -Remove the I AM NOT DONE comment in the exercises/intro/intro1.rs file +Remove the `I AM NOT DONE` comment in the `exercises/intro/intro1.rs` file to move on to the next exercise.""" [[exercises]] @@ -32,21 +32,29 @@ mode = "compile" hint = """ The compiler message is saying that Rust cannot infer the type that the variable binding `x` has with what is given here. -What happens if you annotate the first line in the main function with a type annotation? -What if you give x a value? + +What happens if you annotate the first line in the main function with a type +annotation? + +What if you give `x` a value? + What if you do both? -What type should x be, anyway? -What if x is the same type as 10? What if it's a different type?""" + +What type should `x` be, anyway? + +What if `x` is the same type as `10`? What if it's a different type?""" [[exercises]] name = "variables3" path = "exercises/variables/variables3.rs" mode = "compile" hint = """ -Oops! In this exercise, we have a variable binding that we've created on -in the first line in the main function, and we're trying to use it in the next line, +Oops! In this exercise, we have a variable binding that we've created on in the +first line in the `main` function, and we're trying to use it in the next line, but we haven't given it a value. -We can't print out something that isn't there; try giving x a value! + +We can't print out something that isn't there; try giving `x` a value! + This is an error that can cause bugs that's very easy to make in any programming language -- thankfully the Rust compiler has caught this for us!""" @@ -56,7 +64,7 @@ path = "exercises/variables/variables4.rs" mode = "compile" hint = """ In Rust, variable bindings are immutable by default. But here we're trying -to reassign a different value to x! There's a keyword we can use to make +to reassign a different value to `x`! There's a keyword we can use to make a variable binding mutable instead.""" [[exercises]] @@ -64,14 +72,17 @@ name = "variables5" path = "exercises/variables/variables5.rs" mode = "compile" hint = """ -In variables4 we already learned how to make an immutable variable mutable -using a special keyword. Unfortunately this doesn't help us much in this exercise -because we want to assign a different typed value to an existing variable. Sometimes -you may also like to reuse existing variable names because you are just converting -values to different types like in this exercise. +In `variables4` we already learned how to make an immutable variable mutable +using a special keyword. Unfortunately this doesn't help us much in this +exercise because we want to assign a different typed value to an existing +variable. Sometimes you may also like to reuse existing variable names because +you are just converting values to different types like in this exercise. + Fortunately Rust has a powerful solution to this problem: 'Shadowing'! -You can read more about 'Shadowing' in the book's section 'Variables and Mutability': +You can read more about 'Shadowing' in the book's section 'Variables and +Mutability': https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#shadowing + Try to solve this exercise afterwards using this technique.""" [[exercises]] @@ -81,11 +92,14 @@ mode = "compile" hint = """ We know about variables and mutability, but there is another important type of variable available: constants. -Constants are always immutable and they are declared with keyword 'const' rather -than keyword 'let'. + +Constants are always immutable and they are declared with keyword `const` rather +than keyword `let`. + Constants types must also always be annotated. -Read more about constants and the differences between variables and constants under 'Constants' in the book's section 'Variables and Mutability': +Read more about constants and the differences between variables and constants +under 'Constants' in the book's section 'Variables and Mutability': https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#constants """ @@ -116,8 +130,10 @@ mode = "compile" hint = """ This time, the function *declaration* is okay, but there's something wrong with the place where we're calling the function. + As a reminder, you can freely play around with different solutions in Rustlings! -Watch mode will only jump to the next exercise if you remove the I AM NOT DONE comment.""" +Watch mode will only jump to the next exercise if you remove the `I AM NOT +DONE` comment.""" [[exercises]] name = "functions4" @@ -125,10 +141,10 @@ path = "exercises/functions/functions4.rs" mode = "compile" hint = """ The error message points to the function `sale_price` and says it expects a type -after the `->`. This is where the function's return type should be -- take a look at -the `is_even` function for an example! +after the `->`. This is where the function's return type should be -- take a +look at the `is_even` function for an example! -Also: Did you figure out that, technically, u32 would be the more fitting type +Also: Did you figure out that, technically, `u32` would be the more fitting type for the prices here, since they can't be negative? If so, kudos!""" [[exercises]] @@ -137,8 +153,13 @@ path = "exercises/functions/functions5.rs" mode = "compile" hint = """ This is a really common error that can be fixed by removing one character. -It happens because Rust distinguishes between expressions and statements: expressions return a value based on their operand(s), and statements simply return a () type which behaves just like `void` in C/C++ language. -We want to return a value of `i32` type from the `square` function, but it is returning a `()` type... +It happens because Rust distinguishes between expressions and statements: +expressions return a value based on their operand(s), and statements simply +return a `()` type which behaves just like `void` in C/C++ language. + +We want to return a value of `i32` type from the `square` function, but it is +returning a `()` type... + They are not the same. There are two solutions: 1. Add a `return` ahead of `num * num;` 2. remove `;`, make it to be `num * num`""" @@ -151,9 +172,11 @@ path = "exercises/if/if1.rs" mode = "test" hint = """ It's possible to do this in one line if you would like! + Some similar examples from other languages: - In C(++) this would be: `a > b ? a : b` - In Python this would be: `a if a > b else b` + Remember in Rust that: - the `if` condition does not need to be surrounded by parentheses - `if`/`else` conditionals are expressions @@ -173,7 +196,8 @@ name = "if3" path = "exercises/if/if3.rs" mode = "test" hint = """ -In Rust, every arm of an `if` expression has to return the same type of value. Make sure the type is consistent across all arms.""" +In Rust, every arm of an `if` expression has to return the same type of value. +Make sure the type is consistent across all arms.""" # QUIZ 1 @@ -204,10 +228,13 @@ mode = "compile" hint = """ There's a shorthand to initialize Arrays with a certain size that does not require you to type in 100 items (but you certainly can if you want!). -For example, you can do: -let array = ["Are we there yet?"; 10]; -Bonus: what are some other things you could have that would return true +For example, you can do: +``` +let array = ["Are we there yet?"; 10]; +``` + +Bonus: what are some other things you could have that would return `true` for `a.len() >= 100`?""" [[exercises]] @@ -215,14 +242,14 @@ name = "primitive_types4" path = "exercises/primitive_types/primitive_types4.rs" mode = "test" hint = """ -Take a look at the Understanding Ownership -> Slices -> Other Slices section of the book: -https://doc.rust-lang.org/book/ch04-03-slices.html -and use the starting and ending (plus one) indices of the items in the Array -that you want to end up in the slice. +Take a look at the 'Understanding Ownership -> Slices -> Other Slices' section +of the book: https://doc.rust-lang.org/book/ch04-03-slices.html and use the +starting and ending (plus one) indices of the items in the `Array` that you +want to end up in the slice. -If you're curious why the first argument of `assert_eq!` does not -have an ampersand for a reference since the second argument is a -reference, take a look at the coercion chapter of the nomicon: +If you're curious why the first argument of `assert_eq!` does not have an +ampersand for a reference since the second argument is areference, take a look +at the coercion chapter of the nomicon: https://doc.rust-lang.org/nomicon/coercions.html""" [[exercises]] @@ -230,9 +257,11 @@ name = "primitive_types5" path = "exercises/primitive_types/primitive_types5.rs" mode = "compile" hint = """ -Take a look at the Data Types -> The Tuple Type section of the book: +Take a look at the 'Data Types -> The Tuple Type' section of the book: https://doc.rust-lang.org/book/ch03-02-data-types.html#the-tuple-type -Particularly the part about destructuring (second to last example in the section). +Particularly the part about destructuring (second to last example in the +section). + You'll need to make a pattern to bind `name` and `age` to the appropriate parts of the tuple. You can do it!!""" @@ -243,7 +272,7 @@ mode = "test" hint = """ While you could use a destructuring `let` for the tuple here, try indexing into it instead, as explained in the last example of the -Data Types -> The Tuple Type section of the book: +'Data Types -> The Tuple Type' section of the book: https://doc.rust-lang.org/book/ch03-02-data-types.html#the-tuple-type Now you have another tool in your toolbox!""" @@ -256,9 +285,10 @@ mode = "test" hint = """ In Rust, there are two ways to define a Vector. 1. One way is to use the `Vec::new()` function to create a new vector - and fill it with the `push()` method. + and fill it with the `push()` method. 2. The second way, which is simpler is to use the `vec![]` macro and - define your elements inside the square brackets. + define your elements inside the square brackets. + Check this chapter: https://doc.rust-lang.org/stable/book/ch08-01-vectors.html of the Rust book to learn more. """ @@ -268,13 +298,19 @@ name = "vecs2" path = "exercises/vecs/vecs2.rs" mode = "test" hint = """ -In the first function we are looping over the Vector and getting a reference to one `element` at a time. -To modify the value of that `element` we need to use the * dereference operator. You can learn more in this chapter of the Rust book: +In the first function we are looping over the Vector and getting a reference to +one `element` at a time. + +To modify the value of that `element` we need to use the `*` dereference +operator. You can learn more in this chapter of the Rust book: https://doc.rust-lang.org/stable/book/ch08-01-vectors.html#iterating-over-the-values-in-a-vector -In the second function this dereferencing is not necessary, because the map function expects the new value to be returned. +In the second function this dereferencing is not necessary, because the `map` +function expects the new value to be returned. + +After you've completed both functions, decide for yourself which approach you +like better. -After you've completed both functions, decide for yourself which approach you like better. What do you think is the more commonly used pattern under Rust developers? """ @@ -285,12 +321,14 @@ name = "move_semantics1" path = "exercises/move_semantics/move_semantics1.rs" mode = "test" hint = """ -So you've got the "cannot borrow immutable local variable `vec` as mutable" error on the line -where we push an element to the vector, right? -The fix for this is going to be adding one keyword, and the addition is NOT on the line where -we push to the vector (where the error is). +So you've got the "cannot borrow immutable local variable `vec` as mutable" +error on the line where we push an element to the vector, right? -Also: Try accessing `vec0` after having called `fill_vec()`. See what happens!""" +The fix for this is going to be adding one keyword, and the addition is NOT on +the line where we push to the vector (where the error is). + +Also: Try accessing `vec0` after having called `fill_vec()`. See what +happens!""" [[exercises]] name = "move_semantics2" @@ -300,14 +338,17 @@ hint = """ When running this exercise for the first time, you'll notice an error about "borrow of moved value". In Rust, when an argument is passed to a function and it's not explicitly returned, you can't use the original variable anymore. -We call this "moving" a variable. When we pass `vec0` into `fill_vec`, it's being -"moved" into `vec1`, meaning we can't access `vec0` anymore after the fact. -Rust provides a couple of different ways to mitigate this issue, feel free to try them all: -1. You could make another, separate version of the data that's in `vec0` and pass that - to `fill_vec` instead. +We call this "moving" a variable. When we pass `vec0` into `fill_vec`, it's +being "moved" into `vec1`, meaning we can't access `vec0` anymore after the +fact. + +Rust provides a couple of different ways to mitigate this issue, feel free to +try them all: +1. You could make another, separate version of the data that's in `vec0` and + pass that to `fill_vec` instead. 2. Make `fill_vec` borrow its argument instead of taking ownership of it, - and then copy the data within the function (`vec.clone()`) in order to return an owned - `Vec`. + and then copy the data within the function (`vec.clone()`) in order to + return an owned `Vec`. """ [[exercises]] @@ -340,9 +381,9 @@ path = "exercises/move_semantics/move_semantics5.rs" mode = "test" hint = """ Carefully reason about the range in which each mutable reference is in -scope. Does it help to update the value of referent (x) immediately after +scope. Does it help to update the value of referent (`x`) immediately after the mutable reference is taken? Read more about 'Mutable References' -in the book's section References and Borrowing': +in the book's section 'References and Borrowing': https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references. """ @@ -353,10 +394,14 @@ mode = "compile" hint = """ To find the answer, you can consult the book section "References and Borrowing": https://doc.rust-lang.org/stable/book/ch04-02-references-and-borrowing.html -The first problem is that `get_char` is taking ownership of the string. -So `data` is moved and can't be used for `string_uppercase` -`data` is moved to `get_char` first, meaning that `string_uppercase` cannot manipulate the data. -Once you've fixed that, `string_uppercase`'s function signature will also need to be adjusted. + +The first problem is that `get_char` is taking ownership of the string. So +`data` is moved and can't be used for `string_uppercase`. `data` is moved to +`get_char` first, meaning that `string_uppercase` cannot manipulate the data. + +Once you've fixed that, `string_uppercase`'s function signature will also need +to be adjusted. + Can you figure out how? Another hint: it has to do with the `&` character.""" @@ -368,33 +413,46 @@ name = "structs1" path = "exercises/structs/structs1.rs" mode = "test" hint = """ -Rust has more than one type of struct. Three actually, all variants are used to package related data together. -There are normal (or classic) structs. These are named collections of related data stored in fields. +Rust has more than one type of struct. Three actually, all variants are used to +package related data together. + +There are normal (or classic) structs. These are named collections of related +data stored in fields. + Tuple structs are basically just named tuples. -Finally, Unit-like structs. These don't have any fields and are useful for generics. + +Finally, Unit-like structs. These don't have any fields and are useful for +generics. In this exercise you need to complete and implement one of each kind. -Read more about structs in The Book: https://doc.rust-lang.org/book/ch05-01-defining-structs.html""" +Read more about structs in The Book: +https://doc.rust-lang.org/book/ch05-01-defining-structs.html""" [[exercises]] name = "structs2" path = "exercises/structs/structs2.rs" mode = "test" hint = """ -Creating instances of structs is easy, all you need to do is assign some values to its fields. +Creating instances of structs is easy, all you need to do is assign some values +to its fields. + There are however some shortcuts that can be taken when instantiating structs. -Have a look in The Book, to find out more: https://doc.rust-lang.org/stable/book/ch05-01-defining-structs.html#creating-instances-from-other-instances-with-struct-update-syntax""" +Have a look in The Book, to find out more: +https://doc.rust-lang.org/stable/book/ch05-01-defining-structs.html#creating-instances-from-other-instances-with-struct-update-syntax""" [[exercises]] name = "structs3" path = "exercises/structs/structs3.rs" mode = "test" hint = """ -For is_international: What makes a package international? Seems related to the places it goes through right? +For `is_international`: What makes a package international? Seems related to +the places it goes through right? -For get_fees: This method takes an additional argument, is there a field in the Package struct that this relates to? +For `get_fees`: This method takes an additional argument, is there a field in +the `Package` struct that this relates to? -Have a look in The Book, to find out more about method implementations: https://doc.rust-lang.org/book/ch05-03-method-syntax.html""" +Have a look in The Book, to find out more about method implementations: +https://doc.rust-lang.org/book/ch05-03-method-syntax.html""" # ENUMS @@ -418,9 +476,11 @@ path = "exercises/enums/enums3.rs" mode = "test" hint = """ As a first step, you can define enums to compile this code without errors. -and then create a match expression in `process()`. -Note that you need to deconstruct some message variants -in the match expression to get value in the variant.""" + +And then create a match expression in `process()`. + +Note that you need to deconstruct some message variants in the match expression +to get value in the variant.""" # STRINGS @@ -429,34 +489,40 @@ name = "strings1" path = "exercises/strings/strings1.rs" mode = "compile" hint = """ -The `current_favorite_color` function is currently returning a string slice with the `'static` -lifetime. We know this because the data of the string lives in our code itself -- it doesn't -come from a file or user input or another program -- so it will live as long as our program -lives. But it is still a string slice. There's one way to create a `String` by converting a -string slice covered in the Strings chapter of the book, and another way that uses the `From` -trait.""" +The `current_favorite_color` function is currently returning a string slice +with the `'static` lifetime. We know this because the data of the string lives +in our code itself -- it doesn't come from a file or user input or another +program -- so it will live as long as our program lives. + +But it is still a string slice. There's one way to create a `String` by +converting a string slice covered in the Strings chapter of the book, and +another way that uses the `From` trait.""" [[exercises]] name = "strings2" path = "exercises/strings/strings2.rs" mode = "compile" hint = """ -Yes, it would be really easy to fix this by just changing the value bound to `word` to be a -string slice instead of a `String`, wouldn't it?? There is a way to add one character to the -if statement, though, that will coerce the `String` into a string slice. +Yes, it would be really easy to fix this by just changing the value bound to +`word` to be a string slice instead of a `String`, wouldn't it?? There is a way +to add one character to the `if` statement, though, that will coerce the +`String` into a string slice. -Side note: If you're interested in learning about how this kind of reference conversion works, you can jump ahead in the book and read this part in the smart pointers chapter: https://doc.rust-lang.org/stable/book/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods""" +Side note: If you're interested in learning about how this kind of reference +conversion works, you can jump ahead in the book and read this part in the +smart pointers chapter: +https://doc.rust-lang.org/stable/book/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods""" [[exercises]] name = "strings3" path = "exercises/strings/strings3.rs" mode = "test" hint = """ -There's tons of useful standard library functions for strings. Let's try and use some of -them: ! +There's tons of useful standard library functions for strings. Let's try and use some of them: +https://doc.rust-lang.org/std/string/struct.String.html#method.trim -For the compose_me method: You can either use the `format!` macro, or convert the string -slice into an owned string, which you can then freely extend.""" +For the `compose_me` method: You can either use the `format!` macro, or convert +the string slice into an owned string, which you can then freely extend.""" [[exercises]] name = "strings4" @@ -484,6 +550,7 @@ The delicious_snacks module is trying to present an external interface that is different than its internal structure (the `fruits` and `veggies` modules and associated constants). Complete the `use` statements to fit the uses in main and find the one keyword missing for both constants. + Learn more at https://doc.rust-lang.org/book/ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#re-exporting-names-with-pub-use""" [[exercises]] @@ -491,9 +558,9 @@ name = "modules3" path = "exercises/modules/modules3.rs" mode = "compile" hint = """ -UNIX_EPOCH and SystemTime are declared in the std::time module. Add a use statement -for these two to bring them into scope. You can use nested paths or the glob -operator to bring these two in using only one line.""" +`UNIX_EPOCH` and `SystemTime` are declared in the `std::time` module. Add a +`use` statement for these two to bring them into scope. You can use nested +paths or the glob operator to bring these two in using only one line.""" # HASHMAPS @@ -503,9 +570,10 @@ path = "exercises/hashmaps/hashmaps1.rs" mode = "test" hint = """ Hint 1: Take a look at the return type of the function to figure out - the type for the `basket`. + the type for the `basket`. + Hint 2: Number of fruits should be at least 5. And you have to put - at least three different types of fruits. + at least three different types of fruits. """ [[exercises]] @@ -522,9 +590,14 @@ name = "hashmaps3" path = "exercises/hashmaps/hashmaps3.rs" mode = "test" hint = """ -Hint 1: Use the `entry()` and `or_insert()` methods of `HashMap` to insert entries corresponding to each team in the scores table. +Hint 1: Use the `entry()` and `or_insert()` methods of `HashMap` to insert + entries corresponding to each team in the scores table. + Learn more at https://doc.rust-lang.org/stable/book/ch08-03-hash-maps.html#only-inserting-a-value-if-the-key-has-no-value -Hint 2: If there is already an entry for a given key, the value returned by `entry()` can be updated based on the existing value. + +Hint 2: If there is already an entry for a given key, the value returned by + `entry()` can be updated based on the existing value. + Learn more at https://doc.rust-lang.org/book/ch08-03-hash-maps.html#updating-a-value-based-on-the-old-value """ @@ -543,22 +616,28 @@ name = "options1" path = "exercises/options/options1.rs" mode = "test" hint = """ -Options can have a Some value, with an inner value, or a None value, without an inner value. -There's multiple ways to get at the inner value, you can use unwrap, or pattern match. Unwrapping -is the easiest, but how do you do it safely so that it doesn't panic in your face later?""" +Options can have a `Some` value, with an inner value, or a `None` value, +without an inner value. + +There's multiple ways to get at the inner value, you can use `unwrap`, or +pattern match. Unwrapping is the easiest, but how do you do it safely so that +it doesn't panic in your face later?""" [[exercises]] name = "options2" path = "exercises/options/options2.rs" mode = "test" hint = """ -check out: -https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html -https://doc.rust-lang.org/rust-by-example/flow_control/while_let.html +Check out: -Remember that Options can be stacked in if let and while let. -For example: Some(Some(variable)) = variable2 -Also see Option::flatten +- https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html +- https://doc.rust-lang.org/rust-by-example/flow_control/while_let.html + +Remember that `Option`s can be stacked in `if let` and `while let`. + +For example: `Some(Some(variable)) = variable2` + +Also see `Option::flatten` """ [[exercises]] @@ -566,10 +645,11 @@ name = "options3" path = "exercises/options/options3.rs" mode = "compile" hint = """ -The compiler says a partial move happened in the `match` -statement. How can this be avoided? The compiler shows the correction -needed. After making the correction as suggested by the compiler, do -read: https://doc.rust-lang.org/std/keyword.ref.html""" +The compiler says a partial move happened in the `match` statement. How can +this be avoided? The compiler shows the correction needed. + +After making the correction as suggested by the compiler, do read: +https://doc.rust-lang.org/std/keyword.ref.html""" # ERROR HANDLING @@ -579,16 +659,15 @@ path = "exercises/error_handling/errors1.rs" mode = "test" hint = """ `Ok` and `Err` are one of the variants of `Result`, so what the tests are saying -is that `generate_nametag_text` should return a `Result` instead of an -`Option`. +is that `generate_nametag_text` should return a `Result` instead of an `Option`. To make this change, you'll need to: - - update the return type in the function signature to be a Result that - could be the variants `Ok(String)` and `Err(String)` - - change the body of the function to return `Ok(stuff)` where it currently - returns `Some(stuff)` - - change the body of the function to return `Err(error message)` where it - currently returns `None`""" + - update the return type in the function signature to be a `Result` that could be the variants `Ok(String)` and `Err(String)` + - change the body of the function to return `Ok(stuff)` where it currently + returns `Some(stuff)` + - change the body of the function to return `Err(error message)` where it + currently returns `None`""" [[exercises]] name = "errors2" @@ -597,9 +676,12 @@ mode = "test" hint = """ One way to handle this is using a `match` statement on `item_quantity.parse::()` where the cases are `Ok(something)` and -`Err(something)`. This pattern is very common in Rust, though, so there's -a `?` operator that does pretty much what you would make that match statement -do for you! Take a look at this section of the Error Handling chapter: +`Err(something)`. + +This pattern is very common in Rust, though, so there's a `?` operator that +does pretty much what you would make that match statement do for you! + +Take a look at this section of the 'Error Handling' chapter: https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html#a-shortcut-for-propagating-errors-the--operator and give it a try!""" @@ -608,32 +690,38 @@ name = "errors3" path = "exercises/error_handling/errors3.rs" mode = "compile" hint = """ -If other functions can return a `Result`, why shouldn't `main`? It's a fairly common -convention to return something like Result<(), ErrorType> from your main function. -The unit (`()`) type is there because nothing is really needed in terms of positive -results.""" +If other functions can return a `Result`, why shouldn't `main`? It's a fairly +common convention to return something like `Result<(), ErrorType>` from your +main function. + +The unit (`()`) type is there because nothing is really needed in terms of +positive results.""" [[exercises]] name = "errors4" path = "exercises/error_handling/errors4.rs" mode = "test" hint = """ -`PositiveNonzeroInteger::new` is always creating a new instance and returning an `Ok` result. -It should be doing some checking, returning an `Err` result if those checks fail, and only -returning an `Ok` result if those checks determine that everything is... okay :)""" +`PositiveNonzeroInteger::new` is always creating a new instance and returning +an `Ok` result. + +It should be doing some checking, returning an `Err` result if those checks +fail, and only returning an `Ok` result if those checks determine that +everything is... okay :)""" [[exercises]] name = "errors5" path = "exercises/error_handling/errors5.rs" mode = "compile" hint = """ -There are two different possible `Result` types produced within `main()`, which are -propagated using `?` operators. How do we declare a return type from `main()` that allows both? +There are two different possible `Result` types produced within `main()`, which +are propagated using `?` operators. How do we declare a return type from +`main()` that allows both? -Under the hood, the `?` operator calls `From::from` on the error value to convert it to a boxed -trait object, a `Box`. This boxed trait object is polymorphic, and since all -errors implement the `error::Error` trait, we can capture lots of different errors in one "Box" -object. +Under the hood, the `?` operator calls `From::from` on the error value to +convert it to a boxed trait object, a `Box`. This boxed trait +object is polymorphic, and since all errors implement the `error::Error` trait, +we can capture lots of different errors in one "Box" object. Check out this section of the book: https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html#a-shortcut-for-propagating-errors-the--operator @@ -653,7 +741,7 @@ hint = """ This exercise uses a completed version of `PositiveNonzeroInteger` from errors4. -Below the line that TODO asks you to change, there is an example of using +Below the line that `TODO` asks you to change, there is an example of using the `map_err()` method on a `Result` to transform one type of error into another. Try using something similar on the `Result` from `parse()`. You might use the `?` operator to return early from the function, or you might @@ -672,7 +760,9 @@ name = "generics1" path = "exercises/generics/generics1.rs" mode = "compile" hint = """ -Vectors in Rust make use of generics to create dynamically sized arrays of any type. +Vectors in Rust make use of generics to create dynamically sized arrays of any +type. + You need to tell the compiler what type we are pushing onto this vector.""" [[exercises]] @@ -680,7 +770,8 @@ name = "generics2" path = "exercises/generics/generics2.rs" mode = "test" hint = """ -Currently we are wrapping only values of type 'u32'. +Currently we are wrapping only values of type `u32`. + Maybe we could update the explicit references to this data type somehow? If you are still stuck https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-method-definitions @@ -702,7 +793,8 @@ name = "traits2" path = "exercises/traits/traits2.rs" mode = "test" hint = """ -Notice how the trait takes ownership of 'self',and returns `Self`. +Notice how the trait takes ownership of `self`, and returns `Self`. + Try mutating the incoming string vector. Have a look at the tests to see what the result should look like! @@ -726,8 +818,8 @@ name = "traits4" path = "exercises/traits/traits4.rs" mode = "test" hint = """ -Instead of using concrete types as parameters you can use traits. Try replacing the -'??' with 'impl ' +Instead of using concrete types as parameters you can use traits. Try replacing +the '??' with 'impl ' See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters """ @@ -737,8 +829,8 @@ name = "traits5" path = "exercises/traits/traits5.rs" mode = "compile" hint = """ -To ensure a parameter implements multiple traits use the '+ syntax'. Try replacing the -'??' with 'impl <> + <>'. +To ensure a parameter implements multiple traits use the '+ syntax'. Try +replacing the '??' with 'impl <> + <>'. See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#specifying-multiple-trait-bounds-with-the--syntax """ @@ -750,8 +842,10 @@ name = "quiz3" path = "exercises/quiz3.rs" mode = "test" hint = """ -To find the best solution to this challenge you're going to need to think back to your -knowledge of traits, specifically Trait Bound Syntax - you may also need this: `use std::fmt::Display;`.""" +To find the best solution to this challenge you're going to need to think back +to your knowledge of traits, specifically 'Trait Bound Syntax' + +You may also need this: `use std::fmt::Display;`.""" # LIFETIMES @@ -768,17 +862,22 @@ name = "lifetimes2" path = "exercises/lifetimes/lifetimes2.rs" mode = "compile" hint = """ -Remember that the generic lifetime 'a will get the concrete lifetime that is equal to the smaller of the lifetimes of x and y. -You can take at least two paths to achieve the desired result while keeping the inner block: -1. Move the string2 declaration to make it live as long as string1 (how is result declared?) -2. Move println! into the inner block""" +Remember that the generic lifetime `'a` will get the concrete lifetime that is +equal to the smaller of the lifetimes of `x` and `y`. + +You can take at least two paths to achieve the desired result while keeping the +inner block: +1. Move the `string2` declaration to make it live as long as `string1` (how is + `result` declared?) +2. Move `println!` into the inner block""" [[exercises]] name = "lifetimes3" path = "exercises/lifetimes/lifetimes3.rs" mode = "compile" hint = """ -If you use a lifetime annotation in a struct's fields, where else does it need to be added?""" +If you use a lifetime annotation in a struct's fields, where else does it need +to be added?""" # TESTS @@ -787,30 +886,39 @@ name = "tests1" path = "exercises/tests/tests1.rs" mode = "test" hint = """ -You don't even need to write any code to test -- you can just test values and run that, even -though you wouldn't do that in real life :) `assert!` is a macro that needs an argument. -Depending on the value of the argument, `assert!` will do nothing (in which case the test will -pass) or `assert!` will panic (in which case the test will fail). So try giving different values -to `assert!` and see which ones compile, which ones pass, and which ones fail :)""" +You don't even need to write any code to test -- you can just test values and +run that, even though you wouldn't do that in real life. :) + +`assert!` is a macro that needs an argument. Depending on the value of the +argument, `assert!` will do nothing (in which case the test will pass) or +`assert!` will panic (in which case the test will fail). + +So try giving different values to `assert!` and see which ones compile, which +ones pass, and which ones fail :)""" [[exercises]] name = "tests2" path = "exercises/tests/tests2.rs" mode = "test" hint = """ -Like the previous exercise, you don't need to write any code to get this test to compile and -run. `assert_eq!` is a macro that takes two arguments and compares them. Try giving it two -values that are equal! Try giving it two arguments that are different! Try giving it two values -that are of different types! Try switching which argument comes first and which comes second!""" +Like the previous exercise, you don't need to write any code to get this test +to compile and run. + +`assert_eq!` is a macro that takes two arguments and compares them. Try giving +it two values that are equal! Try giving it two arguments that are different! +Try giving it two values that are of different types! Try switching which +argument comes first and which comes second!""" [[exercises]] name = "tests3" path = "exercises/tests/tests3.rs" mode = "test" hint = """ -You can call a function right where you're passing arguments to `assert!` -- so you could do -something like `assert!(having_fun())`. If you want to check that you indeed get false, you -can negate the result of what you're doing using `!`, like `assert!(!having_fun())`.""" +You can call a function right where you're passing arguments to `assert!`. So +you could do something like `assert!(having_fun())`. + +If you want to check that you indeed get `false`, you can negate the result of +what you're doing using `!`, like `assert!(!having_fun())`.""" [[exercises]] name = "tests4" @@ -818,7 +926,9 @@ path = "exercises/tests/tests4.rs" mode = "test" hint = """ We expect method `Rectangle::new()` to panic for negative values. + To handle that you need to add a special attribute to the test function. + You can refer to the docs: https://doc.rust-lang.org/stable/book/ch11-01-writing-tests.html#checking-for-panics-with-should_panic""" @@ -830,14 +940,20 @@ path = "exercises/iterators/iterators1.rs" mode = "test" hint = """ Step 1: -We need to apply something to the collection `my_fav_fruits` before we start to go through -it. What could that be? Take a look at the struct definition for a vector for inspiration: + +We need to apply something to the collection `my_fav_fruits` before we start to +go through it. What could that be? Take a look at the struct definition for a +vector for inspiration: https://doc.rust-lang.org/std/vec/struct.Vec.html + Step 2 & step 3: + Very similar to the lines above and below. You've got this! + Step 4: -An iterator goes through all elements in a collection, but what if we've run out of -elements? What should we expect here? If you're stuck, take a look at + +An iterator goes through all elements in a collection, but what if we've run +out of elements? What should we expect here? If you're stuck, take a look at https://doc.rust-lang.org/std/iter/trait.Iterator.html for some ideas. """ @@ -846,50 +962,55 @@ name = "iterators2" path = "exercises/iterators/iterators2.rs" mode = "test" hint = """ -Step 1 +Step 1: + The variable `first` is a `char`. It needs to be capitalized and added to the remaining characters in `c` in order to return the correct `String`. + The remaining characters in `c` can be viewed as a string slice using the `as_str` method. + The documentation for `char` contains many useful methods. https://doc.rust-lang.org/std/primitive.char.html -Step 2 -Create an iterator from the slice. Transform the iterated values by applying -the `capitalize_first` function. Remember to collect the iterator. +Step 2: -Step 3. -This is surprisingly similar to the previous solution. Collect is very powerful -and very general. Rust just needs to know the desired type.""" +Create an iterator from the slice. Transform the iterated values by applying +the `capitalize_first` function. Remember to `collect` the iterator. + +Step 3: + +This is surprisingly similar to the previous solution. `collect` is very +powerful and very general. Rust just needs to know the desired type.""" [[exercises]] name = "iterators3" path = "exercises/iterators/iterators3.rs" mode = "test" hint = """ -The divide function needs to return the correct error when even division is not -possible. +The `divide` function needs to return the correct error when even division is +not possible. -The division_results variable needs to be collected into a collection type. +The `division_results` variable needs to be collected into a collection type. -The result_with_list function needs to return a single Result where the success -case is a vector of integers and the failure case is a DivisionError. +The `result_with_list` function needs to return a single `Result` where the +success case is a vector of integers and the failure case is a `DivisionError`. -The list_of_results function needs to return a vector of results. +The `list_of_results` function needs to return a vector of results. -See https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect for how -the `FromIterator` trait is used in `collect()`. This trait is REALLY powerful! It -can make the solution to this exercise infinitely easier.""" +See https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect for +how the `FromIterator` trait is used in `collect()`. This trait is REALLY +powerful! It can make the solution to this exercise infinitely easier.""" [[exercises]] name = "iterators4" path = "exercises/iterators/iterators4.rs" mode = "test" hint = """ -In an imperative language, you might write a for loop that updates -a mutable variable. Or, you might write code utilizing recursion -and a match clause. In Rust you can take another functional -approach, computing the factorial elegantly with ranges and iterators. +In an imperative language, you might write a `for` loop that updates a mutable +variable. Or, you might write code utilizing recursion and a match clause. In +Rust you can take another functional approach, computing the factorial +elegantly with ranges and iterators. Hint 2: Check out the `fold` and `rfold` methods!""" @@ -898,16 +1019,17 @@ name = "iterators5" path = "exercises/iterators/iterators5.rs" mode = "test" hint = """ -The documentation for the std::iter::Iterator trait contains numerous methods +The documentation for the `std::iter::Iterator` trait contains numerous methods that would be helpful here. -The collection variable in count_collection_iterator is a slice of HashMaps. It -needs to be converted into an iterator in order to use the iterator methods. +The `collection` variable in `count_collection_iterator` is a slice of +`HashMap`s. It needs to be converted into an iterator in order to use the +iterator methods. -The fold method can be useful in the count_collection_iterator function. +The `fold` method can be useful in the `count_collection_iterator` function. -For a further challenge, consult the documentation for Iterator to find -a different method that could make your code more compact than using fold.""" +For a further challenge, consult the documentation for `Iterator` to find +a different method that could make your code more compact than using `fold`.""" # SMART POINTERS @@ -916,17 +1038,23 @@ name = "box1" path = "exercises/smart_pointers/box1.rs" mode = "test" hint = """ -Step 1 -The compiler's message should help: since we cannot store the value of the actual type -when working with recursive types, we need to store a reference (pointer) to its value. -We should, therefore, place our `List` inside a `Box`. More details in the book here: -https://doc.rust-lang.org/book/ch15-01-box.html#enabling-recursive-types-with-boxes +Step 1: -Step 2 -Creating an empty list should be fairly straightforward (hint: peek at the assertions). -For a non-empty list keep in mind that we want to use our Cons "list builder". -Although the current list is one of integers (i32), feel free to change the definition -and try other types! +The compiler's message should help: since we cannot store the value of the +actual type when working with recursive types, we need to store a reference +(pointer) to its value. + +We should, therefore, place our `List` inside a `Box`. More details in the book +here: https://doc.rust-lang.org/book/ch15-01-box.html#enabling-recursive-types-with-boxes + +Step 2: + +Creating an empty list should be fairly straightforward (hint: peek at the +assertions). + +For a non-empty list keep in mind that we want to use our `Cons` "list builder". +Although the current list is one of integers (`i32`), feel free to change the +definition and try other types! """ [[exercises]] @@ -934,11 +1062,16 @@ name = "rc1" path = "exercises/smart_pointers/rc1.rs" mode = "test" hint = """ -This is a straightforward exercise to use the Rc type. Each Planet has -ownership of the Sun, and uses Rc::clone() to increment the reference count of the Sun. -After using drop() to move the Planets out of scope individually, the reference count goes down. -In the end the sun only has one reference again, to itself. See more at: -https://doc.rust-lang.org/book/ch15-04-rc.html +This is a straightforward exercise to use the `Rc` type. Each `Planet` has +ownership of the `Sun`, and uses `Rc::clone()` to increment the reference count +of the `Sun`. + +After using `drop()` to move the `Planet`s out of scope individually, the +reference count goes down. + +In the end the `Sun` only has one reference again, to itself. + +See more at: https://doc.rust-lang.org/book/ch15-04-rc.html * Unfortunately Pluto is no longer considered a planet :( """ @@ -952,11 +1085,12 @@ Make `shared_numbers` be an `Arc` from the numbers vector. Then, in order to avoid creating a copy of `numbers`, you'll need to create `child_numbers` inside the loop but still in the main thread. -`child_numbers` should be a clone of the Arc of the numbers instead of a +`child_numbers` should be a clone of the `Arc` of the numbers instead of a thread-local copy of the numbers. This is a simple exercise if you understand the underlying concepts, but if this -is too much of a struggle, consider reading through all of Chapter 16 in the book: +is too much of a struggle, consider reading through all of Chapter 16 in the +book: https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html """ @@ -965,7 +1099,8 @@ name = "cow1" path = "exercises/smart_pointers/cow1.rs" mode = "test" hint = """ -If Cow already owns the data it doesn't need to clone it when to_mut() is called. +If `Cow` already owns the data it doesn't need to clone it when `to_mut()` is +called. Check out https://doc.rust-lang.org/std/borrow/enum.Cow.html for documentation on the `Cow` type. @@ -985,7 +1120,9 @@ A challenge with multi-threaded applications is that the main thread can finish before the spawned threads are completed. https://doc.rust-lang.org/book/ch16-01-threads.html#waiting-for-all-threads-to-finish-using-join-handles -Use the JoinHandles to wait for each thread to finish and collect their results. +Use the `JoinHandle`s to wait for each thread to finish and collect their +results. + https://doc.rust-lang.org/std/thread/struct.JoinHandle.html """ @@ -1001,13 +1138,14 @@ mutate the data at a time. Take a look at this section of the book: https://doc.rust-lang.org/book/ch16-03-shared-state.html#atomic-reference-counting-with-arct and keep reading if you'd like more hints :) - Do you now have an `Arc` `Mutex` `JobStatus` at the beginning of main? Like: -`let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 }));` -Similar to the code in the example in the book that happens after the text -that says "Sharing a Mutex Between Multiple Threads". If not, give that a try! If you -do and would like more hints, keep reading!! +``` +let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 })); +``` +Similar to the code in the example in the book that happens after the text +that says 'Sharing a Mutex Between Multiple Threads'. If not, give that a +try! If you do and would like more hints, keep reading!! Make sure neither of your threads are holding onto the lock of the mutex while they are sleeping, since this will prevent the other thread from @@ -1023,12 +1161,15 @@ name = "threads3" path = "exercises/threads/threads3.rs" mode = "test" hint = """ -An alternate way to handle concurrency between threads is to use -a mpsc (multiple producer, single consumer) channel to communicate. -With both a sending end and a receiving end, it's possible to -send values in one thread and receive them in another. -Multiple producers are possible by using clone() to create a duplicate -of the original sending end. +An alternate way to handle concurrency between threads is to use an `mpsc` +(multiple producer, single consumer) channel to communicate. + +With both a sending end and a receiving end, it's possible to send values in +one thread and receive them in another. + +Multiple producers are possible by using clone() to create a duplicate of the +original sending end. + See https://doc.rust-lang.org/book/ch16-02-message-passing.html for more info. """ @@ -1071,13 +1212,14 @@ path = "exercises/macros/macros4.rs" mode = "compile" hint = """ You only need to add a single character to make this compile. -The way macros are written, it wants to see something between each -"macro arm", so it can separate them. -That's all the macro exercises we have in here, but it's barely even -scratching the surface of what you can do with Rust's macros. For a more -thorough introduction, you can have a read through the little book of Rust -macros: https://veykril.github.io/tlborm/""" +The way macros are written, it wants to see something between each "macro arm", +so it can separate them. + +That's all the macro exercises we have in here, but it's barely even scratching +the surface of what you can do with Rust's macros. For a more thorough +introduction, you can have a read through 'The Little Book of Rust Macros': +https://veykril.github.io/tlborm/""" # CLIPPY @@ -1087,21 +1229,22 @@ path = "exercises/clippy/clippy1.rs" mode = "clippy" hint = """ Rust stores the highest precision version of any long or infinite precision -mathematical constants in the Rust standard library. +mathematical constants in the Rust standard library: https://doc.rust-lang.org/stable/std/f32/consts/index.html -We may be tempted to use our own approximations for certain mathematical constants, -but clippy recognizes those imprecise mathematical constants as a source of -potential error. +We may be tempted to use our own approximations for certain mathematical +constants, but clippy recognizes those imprecise mathematical constants as a +source of potential error. + See the suggestions of the clippy warning in compile output and use the -appropriate replacement constant from std::f32::consts...""" +appropriate replacement constant from `std::f32::consts`...""" [[exercises]] name = "clippy2" path = "exercises/clippy/clippy2.rs" mode = "clippy" hint = """ -`for` loops over Option values are more clearly expressed as an `if let`""" +`for` loops over `Option` values are more clearly expressed as an `if let`""" [[exercises]] name = "clippy3" @@ -1131,8 +1274,8 @@ name = "from_str" path = "exercises/conversions/from_str.rs" mode = "test" 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. +The implementation of `FromStr` should return an `Ok` with a `Person` object, +or an `Err` with an error if the string is not valid. This is almost like the `from_into` exercise, but returning errors instead of falling back to a default value. @@ -1153,7 +1296,8 @@ path = "exercises/conversions/try_from_into.rs" mode = "test" hint = """ Follow the steps provided right before the `TryFrom` implementation. -You can also use the example at https://doc.rust-lang.org/std/convert/trait.TryFrom.html +You can also use the example at +https://doc.rust-lang.org/std/convert/trait.TryFrom.html 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? @@ -1174,4 +1318,4 @@ name = "as_ref_mut" path = "exercises/conversions/as_ref_mut.rs" mode = "test" hint = """ -Add AsRef or AsMut as a trait bound to the functions.""" +Add `AsRef` or `AsMut` as a trait bound to the functions.""" From b97c88f202b9b9c6f635748198203f2dd5b5cfbe Mon Sep 17 00:00:00 2001 From: liv Date: Fri, 13 Oct 2023 13:28:45 +0200 Subject: [PATCH 1126/1293] docs: use new fancy install aliases --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8fac7a28..cf001e28 100644 --- a/README.md +++ b/README.md @@ -25,13 +25,13 @@ You will need to have Rust installed. You can get it by visiting Date: Fri, 13 Oct 2023 15:28:14 -0400 Subject: [PATCH 1127/1293] chore(errors1): fix grammar typo in hint for exercise errors1 This commit corrects a grammar typo in the hint of the errors1 exercise, changing from: "`Ok` and `Err` are one of the variants of `Result`," to: "`Ok` and `Err` are the two variants of `Result`," --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index e3f66e28..02599fc5 100644 --- a/info.toml +++ b/info.toml @@ -658,7 +658,7 @@ name = "errors1" path = "exercises/error_handling/errors1.rs" mode = "test" hint = """ -`Ok` and `Err` are one of the variants of `Result`, so what the tests are saying +`Ok` and `Err` are the two variants of `Result`, so what the tests are saying is that `generate_nametag_text` should return a `Result` instead of an `Option`. To make this change, you'll need to: From 642aac6f43f49407308f18306399a910cf8fe6f6 Mon Sep 17 00:00:00 2001 From: Matt Nield <64328730+matthewjnield@users.noreply.github.com> Date: Fri, 13 Oct 2023 15:47:38 -0400 Subject: [PATCH 1128/1293] chore(errors2): minor description wording change This commit makes a minor change in the wording of the description of the errors2 exercise to avoid potential confusion, changing: "A player of the game will type in how many items they want to buy, and the `total_cost` function will calculate the total cost of the tokens." to "A player of the game will type in how many items they want to buy, and the `total_cost` function will calculate the total cost of the items." --- exercises/error_handling/errors2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/error_handling/errors2.rs b/exercises/error_handling/errors2.rs index d4a5477b..631fe67f 100644 --- a/exercises/error_handling/errors2.rs +++ b/exercises/error_handling/errors2.rs @@ -3,7 +3,7 @@ // Say we're writing a game where you can buy items with tokens. All items cost // 5 tokens, and whenever you purchase items there is a processing fee of 1 // token. A player of the game will type in how many items they want to buy, and -// the `total_cost` function will calculate the total cost of the tokens. Since +// the `total_cost` function will calculate the total cost of the items. Since // the player typed in the quantity, though, we get it as a string-- and they // might have typed anything, not just numbers! // From c7fccf74c9341fba294dbd895d3e05646d65a558 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 09:27:25 +0000 Subject: [PATCH 1129/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 3dcc3e6f..f3807bba 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -347,6 +347,7 @@ authors. Chris Rose
Chris Rose

πŸš‡ d1t2
d1t2

πŸš‡ docwilco
docwilco

πŸ’» + Matt Nield
Matt Nield

πŸ–‹ From 9a7d88f139e95fb94d42c09ba790afb012f9aad5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 09:27:26 +0000 Subject: [PATCH 1130/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d31607fd..42f04e49 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2460,6 +2460,15 @@ "contributions": [ "code" ] + }, + { + "login": "matthewjnield", + "name": "Matt Nield", + "avatar_url": "https://avatars.githubusercontent.com/u/64328730?v=4", + "profile": "https://www.linkedin.com/in/matthew-nield1/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 64d95837e9813541cf5b357de13865ce687ae98d Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Mon, 16 Oct 2023 07:37:12 -0400 Subject: [PATCH 1131/1293] Update Exercises Directory Names to Reflect Order --- exercises/{intro => 00_intro}/README.md | 0 exercises/{intro => 00_intro}/intro1.rs | 2 +- exercises/{intro => 00_intro}/intro2.rs | 0 .../{variables => 01_variables}/README.md | 0 .../{variables => 01_variables}/variables1.rs | 0 .../{variables => 01_variables}/variables2.rs | 0 .../{variables => 01_variables}/variables3.rs | 0 .../{variables => 01_variables}/variables4.rs | 0 .../{variables => 01_variables}/variables5.rs | 0 .../{variables => 01_variables}/variables6.rs | 0 .../{functions => 02_functions}/README.md | 0 .../{functions => 02_functions}/functions1.rs | 0 .../{functions => 02_functions}/functions2.rs | 0 .../{functions => 02_functions}/functions3.rs | 0 .../{functions => 02_functions}/functions4.rs | 0 .../{functions => 02_functions}/functions5.rs | 0 exercises/{if => 03_if}/README.md | 0 exercises/{if => 03_if}/if1.rs | 0 exercises/{if => 03_if}/if2.rs | 0 exercises/{if => 03_if}/if3.rs | 0 .../README.md | 0 .../primitive_types1.rs | 0 .../primitive_types2.rs | 0 .../primitive_types3.rs | 0 .../primitive_types4.rs | 0 .../primitive_types5.rs | 0 .../primitive_types6.rs | 0 exercises/{vecs => 05_vecs}/README.md | 0 exercises/{vecs => 05_vecs}/vecs1.rs | 0 exercises/{vecs => 05_vecs}/vecs2.rs | 0 .../README.md | 0 .../move_semantics1.rs | 0 .../move_semantics2.rs | 0 .../move_semantics3.rs | 0 .../move_semantics4.rs | 0 .../move_semantics5.rs | 0 .../move_semantics6.rs | 0 exercises/{structs => 07_structs}/README.md | 0 exercises/{structs => 07_structs}/structs1.rs | 0 exercises/{structs => 07_structs}/structs2.rs | 0 exercises/{structs => 07_structs}/structs3.rs | 0 exercises/{enums => 08_enums}/README.md | 0 exercises/{enums => 08_enums}/enums1.rs | 0 exercises/{enums => 08_enums}/enums2.rs | 0 exercises/{enums => 08_enums}/enums3.rs | 0 exercises/{strings => 09_strings}/README.md | 0 exercises/{strings => 09_strings}/strings1.rs | 0 exercises/{strings => 09_strings}/strings2.rs | 0 exercises/{strings => 09_strings}/strings3.rs | 0 exercises/{strings => 09_strings}/strings4.rs | 0 exercises/{modules => 10_modules}/README.md | 0 exercises/{modules => 10_modules}/modules1.rs | 0 exercises/{modules => 10_modules}/modules2.rs | 0 exercises/{modules => 10_modules}/modules3.rs | 0 exercises/{hashmaps => 11_hashmaps}/README.md | 0 .../{hashmaps => 11_hashmaps}/hashmaps1.rs | 0 .../{hashmaps => 11_hashmaps}/hashmaps2.rs | 0 .../{hashmaps => 11_hashmaps}/hashmaps3.rs | 0 exercises/{options => 12_options}/README.md | 0 exercises/{options => 12_options}/options1.rs | 0 exercises/{options => 12_options}/options2.rs | 0 exercises/{options => 12_options}/options3.rs | 0 .../README.md | 0 .../errors1.rs | 0 .../errors2.rs | 0 .../errors3.rs | 0 .../errors4.rs | 0 .../errors5.rs | 0 .../errors6.rs | 0 exercises/{generics => 14_generics}/README.md | 0 .../{generics => 14_generics}/generics1.rs | 0 .../{generics => 14_generics}/generics2.rs | 0 exercises/{traits => 15_traits}/README.md | 0 exercises/{traits => 15_traits}/traits1.rs | 0 exercises/{traits => 15_traits}/traits2.rs | 0 exercises/{traits => 15_traits}/traits3.rs | 0 exercises/{traits => 15_traits}/traits4.rs | 0 exercises/{traits => 15_traits}/traits5.rs | 0 .../{lifetimes => 16_lifetimes}/README.md | 0 .../{lifetimes => 16_lifetimes}/lifetimes1.rs | 0 .../{lifetimes => 16_lifetimes}/lifetimes2.rs | 0 .../{lifetimes => 16_lifetimes}/lifetimes3.rs | 0 exercises/{tests => 17_tests}/README.md | 0 exercises/{tests => 17_tests}/tests1.rs | 0 exercises/{tests => 17_tests}/tests2.rs | 0 exercises/{tests => 17_tests}/tests3.rs | 0 exercises/{tests => 17_tests}/tests4.rs | 0 .../{iterators => 18_iterators}/README.md | 0 .../{iterators => 18_iterators}/iterators1.rs | 0 .../{iterators => 18_iterators}/iterators2.rs | 0 .../{iterators => 18_iterators}/iterators3.rs | 0 .../{iterators => 18_iterators}/iterators4.rs | 0 .../{iterators => 18_iterators}/iterators5.rs | 0 .../README.md | 0 .../arc1.rs | 0 .../box1.rs | 0 .../cow1.rs | 0 .../rc1.rs | 0 exercises/{threads => 20_threads}/README.md | 0 exercises/{threads => 20_threads}/threads1.rs | 0 exercises/{threads => 20_threads}/threads2.rs | 0 exercises/{threads => 20_threads}/threads3.rs | 0 exercises/{macros => 21_macros}/README.md | 0 exercises/{macros => 21_macros}/macros1.rs | 0 exercises/{macros => 21_macros}/macros2.rs | 0 exercises/{macros => 21_macros}/macros3.rs | 0 exercises/{macros => 21_macros}/macros4.rs | 0 exercises/{clippy => 22_clippy}/README.md | 0 exercises/{clippy => 22_clippy}/clippy1.rs | 0 exercises/{clippy => 22_clippy}/clippy2.rs | 0 exercises/{clippy => 22_clippy}/clippy3.rs | 0 .../{conversions => 23_conversions}/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 info.toml | 188 +++++++++--------- 118 files changed, 95 insertions(+), 95 deletions(-) rename exercises/{intro => 00_intro}/README.md (100%) rename exercises/{intro => 00_intro}/intro1.rs (98%) rename exercises/{intro => 00_intro}/intro2.rs (100%) rename exercises/{variables => 01_variables}/README.md (100%) rename exercises/{variables => 01_variables}/variables1.rs (100%) rename exercises/{variables => 01_variables}/variables2.rs (100%) rename exercises/{variables => 01_variables}/variables3.rs (100%) rename exercises/{variables => 01_variables}/variables4.rs (100%) rename exercises/{variables => 01_variables}/variables5.rs (100%) rename exercises/{variables => 01_variables}/variables6.rs (100%) rename exercises/{functions => 02_functions}/README.md (100%) rename exercises/{functions => 02_functions}/functions1.rs (100%) rename exercises/{functions => 02_functions}/functions2.rs (100%) rename exercises/{functions => 02_functions}/functions3.rs (100%) rename exercises/{functions => 02_functions}/functions4.rs (100%) rename exercises/{functions => 02_functions}/functions5.rs (100%) rename exercises/{if => 03_if}/README.md (100%) rename exercises/{if => 03_if}/if1.rs (100%) rename exercises/{if => 03_if}/if2.rs (100%) rename exercises/{if => 03_if}/if3.rs (100%) rename exercises/{primitive_types => 04_primitive_types}/README.md (100%) rename exercises/{primitive_types => 04_primitive_types}/primitive_types1.rs (100%) rename exercises/{primitive_types => 04_primitive_types}/primitive_types2.rs (100%) rename exercises/{primitive_types => 04_primitive_types}/primitive_types3.rs (100%) rename exercises/{primitive_types => 04_primitive_types}/primitive_types4.rs (100%) rename exercises/{primitive_types => 04_primitive_types}/primitive_types5.rs (100%) rename exercises/{primitive_types => 04_primitive_types}/primitive_types6.rs (100%) rename exercises/{vecs => 05_vecs}/README.md (100%) rename exercises/{vecs => 05_vecs}/vecs1.rs (100%) rename exercises/{vecs => 05_vecs}/vecs2.rs (100%) rename exercises/{move_semantics => 06_move_semantics}/README.md (100%) rename exercises/{move_semantics => 06_move_semantics}/move_semantics1.rs (100%) rename exercises/{move_semantics => 06_move_semantics}/move_semantics2.rs (100%) rename exercises/{move_semantics => 06_move_semantics}/move_semantics3.rs (100%) rename exercises/{move_semantics => 06_move_semantics}/move_semantics4.rs (100%) rename exercises/{move_semantics => 06_move_semantics}/move_semantics5.rs (100%) rename exercises/{move_semantics => 06_move_semantics}/move_semantics6.rs (100%) rename exercises/{structs => 07_structs}/README.md (100%) rename exercises/{structs => 07_structs}/structs1.rs (100%) rename exercises/{structs => 07_structs}/structs2.rs (100%) rename exercises/{structs => 07_structs}/structs3.rs (100%) rename exercises/{enums => 08_enums}/README.md (100%) rename exercises/{enums => 08_enums}/enums1.rs (100%) rename exercises/{enums => 08_enums}/enums2.rs (100%) rename exercises/{enums => 08_enums}/enums3.rs (100%) rename exercises/{strings => 09_strings}/README.md (100%) rename exercises/{strings => 09_strings}/strings1.rs (100%) rename exercises/{strings => 09_strings}/strings2.rs (100%) rename exercises/{strings => 09_strings}/strings3.rs (100%) rename exercises/{strings => 09_strings}/strings4.rs (100%) rename exercises/{modules => 10_modules}/README.md (100%) rename exercises/{modules => 10_modules}/modules1.rs (100%) rename exercises/{modules => 10_modules}/modules2.rs (100%) rename exercises/{modules => 10_modules}/modules3.rs (100%) rename exercises/{hashmaps => 11_hashmaps}/README.md (100%) rename exercises/{hashmaps => 11_hashmaps}/hashmaps1.rs (100%) rename exercises/{hashmaps => 11_hashmaps}/hashmaps2.rs (100%) rename exercises/{hashmaps => 11_hashmaps}/hashmaps3.rs (100%) rename exercises/{options => 12_options}/README.md (100%) rename exercises/{options => 12_options}/options1.rs (100%) rename exercises/{options => 12_options}/options2.rs (100%) rename exercises/{options => 12_options}/options3.rs (100%) rename exercises/{error_handling => 13_error_handling}/README.md (100%) rename exercises/{error_handling => 13_error_handling}/errors1.rs (100%) rename exercises/{error_handling => 13_error_handling}/errors2.rs (100%) rename exercises/{error_handling => 13_error_handling}/errors3.rs (100%) rename exercises/{error_handling => 13_error_handling}/errors4.rs (100%) rename exercises/{error_handling => 13_error_handling}/errors5.rs (100%) rename exercises/{error_handling => 13_error_handling}/errors6.rs (100%) rename exercises/{generics => 14_generics}/README.md (100%) rename exercises/{generics => 14_generics}/generics1.rs (100%) rename exercises/{generics => 14_generics}/generics2.rs (100%) rename exercises/{traits => 15_traits}/README.md (100%) rename exercises/{traits => 15_traits}/traits1.rs (100%) rename exercises/{traits => 15_traits}/traits2.rs (100%) rename exercises/{traits => 15_traits}/traits3.rs (100%) rename exercises/{traits => 15_traits}/traits4.rs (100%) rename exercises/{traits => 15_traits}/traits5.rs (100%) rename exercises/{lifetimes => 16_lifetimes}/README.md (100%) rename exercises/{lifetimes => 16_lifetimes}/lifetimes1.rs (100%) rename exercises/{lifetimes => 16_lifetimes}/lifetimes2.rs (100%) rename exercises/{lifetimes => 16_lifetimes}/lifetimes3.rs (100%) rename exercises/{tests => 17_tests}/README.md (100%) rename exercises/{tests => 17_tests}/tests1.rs (100%) rename exercises/{tests => 17_tests}/tests2.rs (100%) rename exercises/{tests => 17_tests}/tests3.rs (100%) rename exercises/{tests => 17_tests}/tests4.rs (100%) rename exercises/{iterators => 18_iterators}/README.md (100%) rename exercises/{iterators => 18_iterators}/iterators1.rs (100%) rename exercises/{iterators => 18_iterators}/iterators2.rs (100%) rename exercises/{iterators => 18_iterators}/iterators3.rs (100%) rename exercises/{iterators => 18_iterators}/iterators4.rs (100%) rename exercises/{iterators => 18_iterators}/iterators5.rs (100%) rename exercises/{smart_pointers => 19_smart_pointers}/README.md (100%) rename exercises/{smart_pointers => 19_smart_pointers}/arc1.rs (100%) rename exercises/{smart_pointers => 19_smart_pointers}/box1.rs (100%) rename exercises/{smart_pointers => 19_smart_pointers}/cow1.rs (100%) rename exercises/{smart_pointers => 19_smart_pointers}/rc1.rs (100%) rename exercises/{threads => 20_threads}/README.md (100%) rename exercises/{threads => 20_threads}/threads1.rs (100%) rename exercises/{threads => 20_threads}/threads2.rs (100%) rename exercises/{threads => 20_threads}/threads3.rs (100%) rename exercises/{macros => 21_macros}/README.md (100%) rename exercises/{macros => 21_macros}/macros1.rs (100%) rename exercises/{macros => 21_macros}/macros2.rs (100%) rename exercises/{macros => 21_macros}/macros3.rs (100%) rename exercises/{macros => 21_macros}/macros4.rs (100%) rename exercises/{clippy => 22_clippy}/README.md (100%) rename exercises/{clippy => 22_clippy}/clippy1.rs (100%) rename exercises/{clippy => 22_clippy}/clippy2.rs (100%) rename exercises/{clippy => 22_clippy}/clippy3.rs (100%) rename exercises/{conversions => 23_conversions}/README.md (100%) rename exercises/{conversions => 23_conversions}/as_ref_mut.rs (100%) rename exercises/{conversions => 23_conversions}/from_into.rs (100%) rename exercises/{conversions => 23_conversions}/from_str.rs (100%) rename exercises/{conversions => 23_conversions}/try_from_into.rs (100%) rename exercises/{conversions => 23_conversions}/using_as.rs (100%) diff --git a/exercises/intro/README.md b/exercises/00_intro/README.md similarity index 100% rename from exercises/intro/README.md rename to exercises/00_intro/README.md diff --git a/exercises/intro/intro1.rs b/exercises/00_intro/intro1.rs similarity index 98% rename from exercises/intro/intro1.rs rename to exercises/00_intro/intro1.rs index 37fa0112..c5196d62 100644 --- a/exercises/intro/intro1.rs +++ b/exercises/00_intro/intro1.rs @@ -29,7 +29,7 @@ fn main() { println!("or logic error. The central concept behind Rustlings is to fix these errors and"); println!("solve the exercises. Good luck!"); println!(); - println!("The source for this exercise is in `exercises/intro/intro1.rs`. Have a look!"); + println!("The source for this exercise is in `exercises/intro00/intro1.rs`. Have a look!"); println!( "Going forward, the source of the exercises will always be in the success/failure output." ); diff --git a/exercises/intro/intro2.rs b/exercises/00_intro/intro2.rs similarity index 100% rename from exercises/intro/intro2.rs rename to exercises/00_intro/intro2.rs diff --git a/exercises/variables/README.md b/exercises/01_variables/README.md similarity index 100% rename from exercises/variables/README.md rename to exercises/01_variables/README.md diff --git a/exercises/variables/variables1.rs b/exercises/01_variables/variables1.rs similarity index 100% rename from exercises/variables/variables1.rs rename to exercises/01_variables/variables1.rs diff --git a/exercises/variables/variables2.rs b/exercises/01_variables/variables2.rs similarity index 100% rename from exercises/variables/variables2.rs rename to exercises/01_variables/variables2.rs diff --git a/exercises/variables/variables3.rs b/exercises/01_variables/variables3.rs similarity index 100% rename from exercises/variables/variables3.rs rename to exercises/01_variables/variables3.rs diff --git a/exercises/variables/variables4.rs b/exercises/01_variables/variables4.rs similarity index 100% rename from exercises/variables/variables4.rs rename to exercises/01_variables/variables4.rs diff --git a/exercises/variables/variables5.rs b/exercises/01_variables/variables5.rs similarity index 100% rename from exercises/variables/variables5.rs rename to exercises/01_variables/variables5.rs diff --git a/exercises/variables/variables6.rs b/exercises/01_variables/variables6.rs similarity index 100% rename from exercises/variables/variables6.rs rename to exercises/01_variables/variables6.rs diff --git a/exercises/functions/README.md b/exercises/02_functions/README.md similarity index 100% rename from exercises/functions/README.md rename to exercises/02_functions/README.md diff --git a/exercises/functions/functions1.rs b/exercises/02_functions/functions1.rs similarity index 100% rename from exercises/functions/functions1.rs rename to exercises/02_functions/functions1.rs diff --git a/exercises/functions/functions2.rs b/exercises/02_functions/functions2.rs similarity index 100% rename from exercises/functions/functions2.rs rename to exercises/02_functions/functions2.rs diff --git a/exercises/functions/functions3.rs b/exercises/02_functions/functions3.rs similarity index 100% rename from exercises/functions/functions3.rs rename to exercises/02_functions/functions3.rs diff --git a/exercises/functions/functions4.rs b/exercises/02_functions/functions4.rs similarity index 100% rename from exercises/functions/functions4.rs rename to exercises/02_functions/functions4.rs diff --git a/exercises/functions/functions5.rs b/exercises/02_functions/functions5.rs similarity index 100% rename from exercises/functions/functions5.rs rename to exercises/02_functions/functions5.rs diff --git a/exercises/if/README.md b/exercises/03_if/README.md similarity index 100% rename from exercises/if/README.md rename to exercises/03_if/README.md diff --git a/exercises/if/if1.rs b/exercises/03_if/if1.rs similarity index 100% rename from exercises/if/if1.rs rename to exercises/03_if/if1.rs diff --git a/exercises/if/if2.rs b/exercises/03_if/if2.rs similarity index 100% rename from exercises/if/if2.rs rename to exercises/03_if/if2.rs diff --git a/exercises/if/if3.rs b/exercises/03_if/if3.rs similarity index 100% rename from exercises/if/if3.rs rename to exercises/03_if/if3.rs diff --git a/exercises/primitive_types/README.md b/exercises/04_primitive_types/README.md similarity index 100% rename from exercises/primitive_types/README.md rename to exercises/04_primitive_types/README.md diff --git a/exercises/primitive_types/primitive_types1.rs b/exercises/04_primitive_types/primitive_types1.rs similarity index 100% rename from exercises/primitive_types/primitive_types1.rs rename to exercises/04_primitive_types/primitive_types1.rs diff --git a/exercises/primitive_types/primitive_types2.rs b/exercises/04_primitive_types/primitive_types2.rs similarity index 100% rename from exercises/primitive_types/primitive_types2.rs rename to exercises/04_primitive_types/primitive_types2.rs diff --git a/exercises/primitive_types/primitive_types3.rs b/exercises/04_primitive_types/primitive_types3.rs similarity index 100% rename from exercises/primitive_types/primitive_types3.rs rename to exercises/04_primitive_types/primitive_types3.rs diff --git a/exercises/primitive_types/primitive_types4.rs b/exercises/04_primitive_types/primitive_types4.rs similarity index 100% rename from exercises/primitive_types/primitive_types4.rs rename to exercises/04_primitive_types/primitive_types4.rs diff --git a/exercises/primitive_types/primitive_types5.rs b/exercises/04_primitive_types/primitive_types5.rs similarity index 100% rename from exercises/primitive_types/primitive_types5.rs rename to exercises/04_primitive_types/primitive_types5.rs diff --git a/exercises/primitive_types/primitive_types6.rs b/exercises/04_primitive_types/primitive_types6.rs similarity index 100% rename from exercises/primitive_types/primitive_types6.rs rename to exercises/04_primitive_types/primitive_types6.rs diff --git a/exercises/vecs/README.md b/exercises/05_vecs/README.md similarity index 100% rename from exercises/vecs/README.md rename to exercises/05_vecs/README.md diff --git a/exercises/vecs/vecs1.rs b/exercises/05_vecs/vecs1.rs similarity index 100% rename from exercises/vecs/vecs1.rs rename to exercises/05_vecs/vecs1.rs diff --git a/exercises/vecs/vecs2.rs b/exercises/05_vecs/vecs2.rs similarity index 100% rename from exercises/vecs/vecs2.rs rename to exercises/05_vecs/vecs2.rs diff --git a/exercises/move_semantics/README.md b/exercises/06_move_semantics/README.md similarity index 100% rename from exercises/move_semantics/README.md rename to exercises/06_move_semantics/README.md diff --git a/exercises/move_semantics/move_semantics1.rs b/exercises/06_move_semantics/move_semantics1.rs similarity index 100% rename from exercises/move_semantics/move_semantics1.rs rename to exercises/06_move_semantics/move_semantics1.rs diff --git a/exercises/move_semantics/move_semantics2.rs b/exercises/06_move_semantics/move_semantics2.rs similarity index 100% rename from exercises/move_semantics/move_semantics2.rs rename to exercises/06_move_semantics/move_semantics2.rs diff --git a/exercises/move_semantics/move_semantics3.rs b/exercises/06_move_semantics/move_semantics3.rs similarity index 100% rename from exercises/move_semantics/move_semantics3.rs rename to exercises/06_move_semantics/move_semantics3.rs diff --git a/exercises/move_semantics/move_semantics4.rs b/exercises/06_move_semantics/move_semantics4.rs similarity index 100% rename from exercises/move_semantics/move_semantics4.rs rename to exercises/06_move_semantics/move_semantics4.rs diff --git a/exercises/move_semantics/move_semantics5.rs b/exercises/06_move_semantics/move_semantics5.rs similarity index 100% rename from exercises/move_semantics/move_semantics5.rs rename to exercises/06_move_semantics/move_semantics5.rs diff --git a/exercises/move_semantics/move_semantics6.rs b/exercises/06_move_semantics/move_semantics6.rs similarity index 100% rename from exercises/move_semantics/move_semantics6.rs rename to exercises/06_move_semantics/move_semantics6.rs diff --git a/exercises/structs/README.md b/exercises/07_structs/README.md similarity index 100% rename from exercises/structs/README.md rename to exercises/07_structs/README.md diff --git a/exercises/structs/structs1.rs b/exercises/07_structs/structs1.rs similarity index 100% rename from exercises/structs/structs1.rs rename to exercises/07_structs/structs1.rs diff --git a/exercises/structs/structs2.rs b/exercises/07_structs/structs2.rs similarity index 100% rename from exercises/structs/structs2.rs rename to exercises/07_structs/structs2.rs diff --git a/exercises/structs/structs3.rs b/exercises/07_structs/structs3.rs similarity index 100% rename from exercises/structs/structs3.rs rename to exercises/07_structs/structs3.rs diff --git a/exercises/enums/README.md b/exercises/08_enums/README.md similarity index 100% rename from exercises/enums/README.md rename to exercises/08_enums/README.md diff --git a/exercises/enums/enums1.rs b/exercises/08_enums/enums1.rs similarity index 100% rename from exercises/enums/enums1.rs rename to exercises/08_enums/enums1.rs diff --git a/exercises/enums/enums2.rs b/exercises/08_enums/enums2.rs similarity index 100% rename from exercises/enums/enums2.rs rename to exercises/08_enums/enums2.rs diff --git a/exercises/enums/enums3.rs b/exercises/08_enums/enums3.rs similarity index 100% rename from exercises/enums/enums3.rs rename to exercises/08_enums/enums3.rs diff --git a/exercises/strings/README.md b/exercises/09_strings/README.md similarity index 100% rename from exercises/strings/README.md rename to exercises/09_strings/README.md diff --git a/exercises/strings/strings1.rs b/exercises/09_strings/strings1.rs similarity index 100% rename from exercises/strings/strings1.rs rename to exercises/09_strings/strings1.rs diff --git a/exercises/strings/strings2.rs b/exercises/09_strings/strings2.rs similarity index 100% rename from exercises/strings/strings2.rs rename to exercises/09_strings/strings2.rs diff --git a/exercises/strings/strings3.rs b/exercises/09_strings/strings3.rs similarity index 100% rename from exercises/strings/strings3.rs rename to exercises/09_strings/strings3.rs diff --git a/exercises/strings/strings4.rs b/exercises/09_strings/strings4.rs similarity index 100% rename from exercises/strings/strings4.rs rename to exercises/09_strings/strings4.rs diff --git a/exercises/modules/README.md b/exercises/10_modules/README.md similarity index 100% rename from exercises/modules/README.md rename to exercises/10_modules/README.md diff --git a/exercises/modules/modules1.rs b/exercises/10_modules/modules1.rs similarity index 100% rename from exercises/modules/modules1.rs rename to exercises/10_modules/modules1.rs diff --git a/exercises/modules/modules2.rs b/exercises/10_modules/modules2.rs similarity index 100% rename from exercises/modules/modules2.rs rename to exercises/10_modules/modules2.rs diff --git a/exercises/modules/modules3.rs b/exercises/10_modules/modules3.rs similarity index 100% rename from exercises/modules/modules3.rs rename to exercises/10_modules/modules3.rs diff --git a/exercises/hashmaps/README.md b/exercises/11_hashmaps/README.md similarity index 100% rename from exercises/hashmaps/README.md rename to exercises/11_hashmaps/README.md diff --git a/exercises/hashmaps/hashmaps1.rs b/exercises/11_hashmaps/hashmaps1.rs similarity index 100% rename from exercises/hashmaps/hashmaps1.rs rename to exercises/11_hashmaps/hashmaps1.rs diff --git a/exercises/hashmaps/hashmaps2.rs b/exercises/11_hashmaps/hashmaps2.rs similarity index 100% rename from exercises/hashmaps/hashmaps2.rs rename to exercises/11_hashmaps/hashmaps2.rs diff --git a/exercises/hashmaps/hashmaps3.rs b/exercises/11_hashmaps/hashmaps3.rs similarity index 100% rename from exercises/hashmaps/hashmaps3.rs rename to exercises/11_hashmaps/hashmaps3.rs diff --git a/exercises/options/README.md b/exercises/12_options/README.md similarity index 100% rename from exercises/options/README.md rename to exercises/12_options/README.md diff --git a/exercises/options/options1.rs b/exercises/12_options/options1.rs similarity index 100% rename from exercises/options/options1.rs rename to exercises/12_options/options1.rs diff --git a/exercises/options/options2.rs b/exercises/12_options/options2.rs similarity index 100% rename from exercises/options/options2.rs rename to exercises/12_options/options2.rs diff --git a/exercises/options/options3.rs b/exercises/12_options/options3.rs similarity index 100% rename from exercises/options/options3.rs rename to exercises/12_options/options3.rs diff --git a/exercises/error_handling/README.md b/exercises/13_error_handling/README.md similarity index 100% rename from exercises/error_handling/README.md rename to exercises/13_error_handling/README.md diff --git a/exercises/error_handling/errors1.rs b/exercises/13_error_handling/errors1.rs similarity index 100% rename from exercises/error_handling/errors1.rs rename to exercises/13_error_handling/errors1.rs diff --git a/exercises/error_handling/errors2.rs b/exercises/13_error_handling/errors2.rs similarity index 100% rename from exercises/error_handling/errors2.rs rename to exercises/13_error_handling/errors2.rs diff --git a/exercises/error_handling/errors3.rs b/exercises/13_error_handling/errors3.rs similarity index 100% rename from exercises/error_handling/errors3.rs rename to exercises/13_error_handling/errors3.rs diff --git a/exercises/error_handling/errors4.rs b/exercises/13_error_handling/errors4.rs similarity index 100% rename from exercises/error_handling/errors4.rs rename to exercises/13_error_handling/errors4.rs diff --git a/exercises/error_handling/errors5.rs b/exercises/13_error_handling/errors5.rs similarity index 100% rename from exercises/error_handling/errors5.rs rename to exercises/13_error_handling/errors5.rs diff --git a/exercises/error_handling/errors6.rs b/exercises/13_error_handling/errors6.rs similarity index 100% rename from exercises/error_handling/errors6.rs rename to exercises/13_error_handling/errors6.rs diff --git a/exercises/generics/README.md b/exercises/14_generics/README.md similarity index 100% rename from exercises/generics/README.md rename to exercises/14_generics/README.md diff --git a/exercises/generics/generics1.rs b/exercises/14_generics/generics1.rs similarity index 100% rename from exercises/generics/generics1.rs rename to exercises/14_generics/generics1.rs diff --git a/exercises/generics/generics2.rs b/exercises/14_generics/generics2.rs similarity index 100% rename from exercises/generics/generics2.rs rename to exercises/14_generics/generics2.rs diff --git a/exercises/traits/README.md b/exercises/15_traits/README.md similarity index 100% rename from exercises/traits/README.md rename to exercises/15_traits/README.md diff --git a/exercises/traits/traits1.rs b/exercises/15_traits/traits1.rs similarity index 100% rename from exercises/traits/traits1.rs rename to exercises/15_traits/traits1.rs diff --git a/exercises/traits/traits2.rs b/exercises/15_traits/traits2.rs similarity index 100% rename from exercises/traits/traits2.rs rename to exercises/15_traits/traits2.rs diff --git a/exercises/traits/traits3.rs b/exercises/15_traits/traits3.rs similarity index 100% rename from exercises/traits/traits3.rs rename to exercises/15_traits/traits3.rs diff --git a/exercises/traits/traits4.rs b/exercises/15_traits/traits4.rs similarity index 100% rename from exercises/traits/traits4.rs rename to exercises/15_traits/traits4.rs diff --git a/exercises/traits/traits5.rs b/exercises/15_traits/traits5.rs similarity index 100% rename from exercises/traits/traits5.rs rename to exercises/15_traits/traits5.rs diff --git a/exercises/lifetimes/README.md b/exercises/16_lifetimes/README.md similarity index 100% rename from exercises/lifetimes/README.md rename to exercises/16_lifetimes/README.md diff --git a/exercises/lifetimes/lifetimes1.rs b/exercises/16_lifetimes/lifetimes1.rs similarity index 100% rename from exercises/lifetimes/lifetimes1.rs rename to exercises/16_lifetimes/lifetimes1.rs diff --git a/exercises/lifetimes/lifetimes2.rs b/exercises/16_lifetimes/lifetimes2.rs similarity index 100% rename from exercises/lifetimes/lifetimes2.rs rename to exercises/16_lifetimes/lifetimes2.rs diff --git a/exercises/lifetimes/lifetimes3.rs b/exercises/16_lifetimes/lifetimes3.rs similarity index 100% rename from exercises/lifetimes/lifetimes3.rs rename to exercises/16_lifetimes/lifetimes3.rs diff --git a/exercises/tests/README.md b/exercises/17_tests/README.md similarity index 100% rename from exercises/tests/README.md rename to exercises/17_tests/README.md diff --git a/exercises/tests/tests1.rs b/exercises/17_tests/tests1.rs similarity index 100% rename from exercises/tests/tests1.rs rename to exercises/17_tests/tests1.rs diff --git a/exercises/tests/tests2.rs b/exercises/17_tests/tests2.rs similarity index 100% rename from exercises/tests/tests2.rs rename to exercises/17_tests/tests2.rs diff --git a/exercises/tests/tests3.rs b/exercises/17_tests/tests3.rs similarity index 100% rename from exercises/tests/tests3.rs rename to exercises/17_tests/tests3.rs diff --git a/exercises/tests/tests4.rs b/exercises/17_tests/tests4.rs similarity index 100% rename from exercises/tests/tests4.rs rename to exercises/17_tests/tests4.rs diff --git a/exercises/iterators/README.md b/exercises/18_iterators/README.md similarity index 100% rename from exercises/iterators/README.md rename to exercises/18_iterators/README.md diff --git a/exercises/iterators/iterators1.rs b/exercises/18_iterators/iterators1.rs similarity index 100% rename from exercises/iterators/iterators1.rs rename to exercises/18_iterators/iterators1.rs diff --git a/exercises/iterators/iterators2.rs b/exercises/18_iterators/iterators2.rs similarity index 100% rename from exercises/iterators/iterators2.rs rename to exercises/18_iterators/iterators2.rs diff --git a/exercises/iterators/iterators3.rs b/exercises/18_iterators/iterators3.rs similarity index 100% rename from exercises/iterators/iterators3.rs rename to exercises/18_iterators/iterators3.rs diff --git a/exercises/iterators/iterators4.rs b/exercises/18_iterators/iterators4.rs similarity index 100% rename from exercises/iterators/iterators4.rs rename to exercises/18_iterators/iterators4.rs diff --git a/exercises/iterators/iterators5.rs b/exercises/18_iterators/iterators5.rs similarity index 100% rename from exercises/iterators/iterators5.rs rename to exercises/18_iterators/iterators5.rs diff --git a/exercises/smart_pointers/README.md b/exercises/19_smart_pointers/README.md similarity index 100% rename from exercises/smart_pointers/README.md rename to exercises/19_smart_pointers/README.md diff --git a/exercises/smart_pointers/arc1.rs b/exercises/19_smart_pointers/arc1.rs similarity index 100% rename from exercises/smart_pointers/arc1.rs rename to exercises/19_smart_pointers/arc1.rs diff --git a/exercises/smart_pointers/box1.rs b/exercises/19_smart_pointers/box1.rs similarity index 100% rename from exercises/smart_pointers/box1.rs rename to exercises/19_smart_pointers/box1.rs diff --git a/exercises/smart_pointers/cow1.rs b/exercises/19_smart_pointers/cow1.rs similarity index 100% rename from exercises/smart_pointers/cow1.rs rename to exercises/19_smart_pointers/cow1.rs diff --git a/exercises/smart_pointers/rc1.rs b/exercises/19_smart_pointers/rc1.rs similarity index 100% rename from exercises/smart_pointers/rc1.rs rename to exercises/19_smart_pointers/rc1.rs diff --git a/exercises/threads/README.md b/exercises/20_threads/README.md similarity index 100% rename from exercises/threads/README.md rename to exercises/20_threads/README.md diff --git a/exercises/threads/threads1.rs b/exercises/20_threads/threads1.rs similarity index 100% rename from exercises/threads/threads1.rs rename to exercises/20_threads/threads1.rs diff --git a/exercises/threads/threads2.rs b/exercises/20_threads/threads2.rs similarity index 100% rename from exercises/threads/threads2.rs rename to exercises/20_threads/threads2.rs diff --git a/exercises/threads/threads3.rs b/exercises/20_threads/threads3.rs similarity index 100% rename from exercises/threads/threads3.rs rename to exercises/20_threads/threads3.rs diff --git a/exercises/macros/README.md b/exercises/21_macros/README.md similarity index 100% rename from exercises/macros/README.md rename to exercises/21_macros/README.md diff --git a/exercises/macros/macros1.rs b/exercises/21_macros/macros1.rs similarity index 100% rename from exercises/macros/macros1.rs rename to exercises/21_macros/macros1.rs diff --git a/exercises/macros/macros2.rs b/exercises/21_macros/macros2.rs similarity index 100% rename from exercises/macros/macros2.rs rename to exercises/21_macros/macros2.rs diff --git a/exercises/macros/macros3.rs b/exercises/21_macros/macros3.rs similarity index 100% rename from exercises/macros/macros3.rs rename to exercises/21_macros/macros3.rs diff --git a/exercises/macros/macros4.rs b/exercises/21_macros/macros4.rs similarity index 100% rename from exercises/macros/macros4.rs rename to exercises/21_macros/macros4.rs diff --git a/exercises/clippy/README.md b/exercises/22_clippy/README.md similarity index 100% rename from exercises/clippy/README.md rename to exercises/22_clippy/README.md diff --git a/exercises/clippy/clippy1.rs b/exercises/22_clippy/clippy1.rs similarity index 100% rename from exercises/clippy/clippy1.rs rename to exercises/22_clippy/clippy1.rs diff --git a/exercises/clippy/clippy2.rs b/exercises/22_clippy/clippy2.rs similarity index 100% rename from exercises/clippy/clippy2.rs rename to exercises/22_clippy/clippy2.rs diff --git a/exercises/clippy/clippy3.rs b/exercises/22_clippy/clippy3.rs similarity index 100% rename from exercises/clippy/clippy3.rs rename to exercises/22_clippy/clippy3.rs diff --git a/exercises/conversions/README.md b/exercises/23_conversions/README.md similarity index 100% rename from exercises/conversions/README.md rename to exercises/23_conversions/README.md diff --git a/exercises/conversions/as_ref_mut.rs b/exercises/23_conversions/as_ref_mut.rs similarity index 100% rename from exercises/conversions/as_ref_mut.rs rename to exercises/23_conversions/as_ref_mut.rs diff --git a/exercises/conversions/from_into.rs b/exercises/23_conversions/from_into.rs similarity index 100% rename from exercises/conversions/from_into.rs rename to exercises/23_conversions/from_into.rs diff --git a/exercises/conversions/from_str.rs b/exercises/23_conversions/from_str.rs similarity index 100% rename from exercises/conversions/from_str.rs rename to exercises/23_conversions/from_str.rs diff --git a/exercises/conversions/try_from_into.rs b/exercises/23_conversions/try_from_into.rs similarity index 100% rename from exercises/conversions/try_from_into.rs rename to exercises/23_conversions/try_from_into.rs diff --git a/exercises/conversions/using_as.rs b/exercises/23_conversions/using_as.rs similarity index 100% rename from exercises/conversions/using_as.rs rename to exercises/23_conversions/using_as.rs diff --git a/info.toml b/info.toml index 02599fc5..bbfee142 100644 --- a/info.toml +++ b/info.toml @@ -2,15 +2,15 @@ [[exercises]] name = "intro1" -path = "exercises/intro/intro1.rs" +path = "exercises/00_intro/intro1.rs" mode = "compile" hint = """ -Remove the `I AM NOT DONE` comment in the `exercises/intro/intro1.rs` file +Remove the `I AM NOT DONE` comment in the `exercises/intro00/intro1.rs` file to move on to the next exercise.""" [[exercises]] name = "intro2" -path = "exercises/intro/intro2.rs" +path = "exercises/00_intro/intro2.rs" mode = "compile" hint = """ Add an argument after the format string.""" @@ -19,7 +19,7 @@ Add an argument after the format string.""" [[exercises]] name = "variables1" -path = "exercises/variables/variables1.rs" +path = "exercises/01_variables/variables1.rs" mode = "compile" hint = """ The declaration in the first line in the main function is missing a keyword @@ -27,7 +27,7 @@ that is needed in Rust to create a new variable binding.""" [[exercises]] name = "variables2" -path = "exercises/variables/variables2.rs" +path = "exercises/01_variables/variables2.rs" mode = "compile" hint = """ The compiler message is saying that Rust cannot infer the type that the @@ -46,7 +46,7 @@ What if `x` is the same type as `10`? What if it's a different type?""" [[exercises]] name = "variables3" -path = "exercises/variables/variables3.rs" +path = "exercises/01_variables/variables3.rs" mode = "compile" hint = """ Oops! In this exercise, we have a variable binding that we've created on in the @@ -60,7 +60,7 @@ programming language -- thankfully the Rust compiler has caught this for us!""" [[exercises]] name = "variables4" -path = "exercises/variables/variables4.rs" +path = "exercises/01_variables/variables4.rs" mode = "compile" hint = """ In Rust, variable bindings are immutable by default. But here we're trying @@ -69,7 +69,7 @@ a variable binding mutable instead.""" [[exercises]] name = "variables5" -path = "exercises/variables/variables5.rs" +path = "exercises/01_variables/variables5.rs" mode = "compile" hint = """ In `variables4` we already learned how to make an immutable variable mutable @@ -87,7 +87,7 @@ Try to solve this exercise afterwards using this technique.""" [[exercises]] name = "variables6" -path = "exercises/variables/variables6.rs" +path = "exercises/01_variables/variables6.rs" mode = "compile" hint = """ We know about variables and mutability, but there is another important type of @@ -107,7 +107,7 @@ https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#constants [[exercises]] name = "functions1" -path = "exercises/functions/functions1.rs" +path = "exercises/02_functions/functions1.rs" mode = "compile" hint = """ This main function is calling a function that it expects to exist, but the @@ -117,7 +117,7 @@ Sounds a lot like `main`, doesn't it?""" [[exercises]] name = "functions2" -path = "exercises/functions/functions2.rs" +path = "exercises/02_functions/functions2.rs" mode = "compile" hint = """ Rust requires that all parts of a function's signature have type annotations, @@ -125,7 +125,7 @@ but `call_me` is missing the type annotation of `num`.""" [[exercises]] name = "functions3" -path = "exercises/functions/functions3.rs" +path = "exercises/02_functions/functions3.rs" mode = "compile" hint = """ This time, the function *declaration* is okay, but there's something wrong @@ -137,7 +137,7 @@ DONE` comment.""" [[exercises]] name = "functions4" -path = "exercises/functions/functions4.rs" +path = "exercises/02_functions/functions4.rs" mode = "compile" hint = """ The error message points to the function `sale_price` and says it expects a type @@ -149,7 +149,7 @@ for the prices here, since they can't be negative? If so, kudos!""" [[exercises]] name = "functions5" -path = "exercises/functions/functions5.rs" +path = "exercises/02_functions/functions5.rs" mode = "compile" hint = """ This is a really common error that can be fixed by removing one character. @@ -168,7 +168,7 @@ They are not the same. There are two solutions: [[exercises]] name = "if1" -path = "exercises/if/if1.rs" +path = "exercises/03_if/if1.rs" mode = "test" hint = """ It's possible to do this in one line if you would like! @@ -184,7 +184,7 @@ Remember in Rust that: [[exercises]] name = "if2" -path = "exercises/if/if2.rs" +path = "exercises/03_if/if2.rs" mode = "test" hint = """ For that first compiler error, it's important in Rust that each conditional @@ -193,7 +193,7 @@ conditions checking different input values.""" [[exercises]] name = "if3" -path = "exercises/if/if3.rs" +path = "exercises/03_if/if3.rs" mode = "test" hint = """ In Rust, every arm of an `if` expression has to return the same type of value. @@ -211,19 +211,19 @@ hint = "No hints this time ;)" [[exercises]] name = "primitive_types1" -path = "exercises/primitive_types/primitive_types1.rs" +path = "exercises/04_primitive_types/primitive_types1.rs" mode = "compile" hint = "No hints this time ;)" [[exercises]] name = "primitive_types2" -path = "exercises/primitive_types/primitive_types2.rs" +path = "exercises/04_primitive_types/primitive_types2.rs" mode = "compile" hint = "No hints this time ;)" [[exercises]] name = "primitive_types3" -path = "exercises/primitive_types/primitive_types3.rs" +path = "exercises/04_primitive_types/primitive_types3.rs" mode = "compile" hint = """ There's a shorthand to initialize Arrays with a certain size that does not @@ -239,7 +239,7 @@ for `a.len() >= 100`?""" [[exercises]] name = "primitive_types4" -path = "exercises/primitive_types/primitive_types4.rs" +path = "exercises/04_primitive_types/primitive_types4.rs" mode = "test" hint = """ Take a look at the 'Understanding Ownership -> Slices -> Other Slices' section @@ -254,7 +254,7 @@ https://doc.rust-lang.org/nomicon/coercions.html""" [[exercises]] name = "primitive_types5" -path = "exercises/primitive_types/primitive_types5.rs" +path = "exercises/04_primitive_types/primitive_types5.rs" mode = "compile" hint = """ Take a look at the 'Data Types -> The Tuple Type' section of the book: @@ -267,7 +267,7 @@ of the tuple. You can do it!!""" [[exercises]] name = "primitive_types6" -path = "exercises/primitive_types/primitive_types6.rs" +path = "exercises/04_primitive_types/primitive_types6.rs" mode = "test" hint = """ While you could use a destructuring `let` for the tuple here, try @@ -280,7 +280,7 @@ Now you have another tool in your toolbox!""" [[exercises]] name = "vecs1" -path = "exercises/vecs/vecs1.rs" +path = "exercises/05_vecs/vecs1.rs" mode = "test" hint = """ In Rust, there are two ways to define a Vector. @@ -295,7 +295,7 @@ of the Rust book to learn more. [[exercises]] name = "vecs2" -path = "exercises/vecs/vecs2.rs" +path = "exercises/05_vecs/vecs2.rs" mode = "test" hint = """ In the first function we are looping over the Vector and getting a reference to @@ -318,7 +318,7 @@ What do you think is the more commonly used pattern under Rust developers? [[exercises]] name = "move_semantics1" -path = "exercises/move_semantics/move_semantics1.rs" +path = "exercises/06_move_semantics/move_semantics1.rs" mode = "test" hint = """ So you've got the "cannot borrow immutable local variable `vec` as mutable" @@ -332,7 +332,7 @@ happens!""" [[exercises]] name = "move_semantics2" -path = "exercises/move_semantics/move_semantics2.rs" +path = "exercises/06_move_semantics/move_semantics2.rs" mode = "test" hint = """ When running this exercise for the first time, you'll notice an error about @@ -353,7 +353,7 @@ try them all: [[exercises]] name = "move_semantics3" -path = "exercises/move_semantics/move_semantics3.rs" +path = "exercises/06_move_semantics/move_semantics3.rs" mode = "test" hint = """ The difference between this one and the previous ones is that the first line @@ -363,7 +363,7 @@ an existing binding to be a mutable binding instead of an immutable one :)""" [[exercises]] name = "move_semantics4" -path = "exercises/move_semantics/move_semantics4.rs" +path = "exercises/06_move_semantics/move_semantics4.rs" mode = "test" hint = """ Stop reading whenever you feel like you have enough direction :) Or try @@ -377,7 +377,7 @@ So the end goal is to: [[exercises]] name = "move_semantics5" -path = "exercises/move_semantics/move_semantics5.rs" +path = "exercises/06_move_semantics/move_semantics5.rs" mode = "test" hint = """ Carefully reason about the range in which each mutable reference is in @@ -389,7 +389,7 @@ https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-ref [[exercises]] name = "move_semantics6" -path = "exercises/move_semantics/move_semantics6.rs" +path = "exercises/06_move_semantics/move_semantics6.rs" mode = "compile" hint = """ To find the answer, you can consult the book section "References and Borrowing": @@ -410,7 +410,7 @@ Another hint: it has to do with the `&` character.""" [[exercises]] name = "structs1" -path = "exercises/structs/structs1.rs" +path = "exercises/07_structs/structs1.rs" mode = "test" hint = """ Rust has more than one type of struct. Three actually, all variants are used to @@ -430,7 +430,7 @@ https://doc.rust-lang.org/book/ch05-01-defining-structs.html""" [[exercises]] name = "structs2" -path = "exercises/structs/structs2.rs" +path = "exercises/07_structs/structs2.rs" mode = "test" hint = """ Creating instances of structs is easy, all you need to do is assign some values @@ -442,7 +442,7 @@ https://doc.rust-lang.org/stable/book/ch05-01-defining-structs.html#creating-ins [[exercises]] name = "structs3" -path = "exercises/structs/structs3.rs" +path = "exercises/07_structs/structs3.rs" mode = "test" hint = """ For `is_international`: What makes a package international? Seems related to @@ -458,13 +458,13 @@ https://doc.rust-lang.org/book/ch05-03-method-syntax.html""" [[exercises]] name = "enums1" -path = "exercises/enums/enums1.rs" +path = "exercises/08_enums/enums1.rs" mode = "compile" hint = "No hints this time ;)" [[exercises]] name = "enums2" -path = "exercises/enums/enums2.rs" +path = "exercises/08_enums/enums2.rs" mode = "compile" hint = """ You can create enumerations that have different variants with different types @@ -472,7 +472,7 @@ such as no data, anonymous structs, a single string, tuples, ...etc""" [[exercises]] name = "enums3" -path = "exercises/enums/enums3.rs" +path = "exercises/08_enums/enums3.rs" mode = "test" hint = """ As a first step, you can define enums to compile this code without errors. @@ -486,7 +486,7 @@ to get value in the variant.""" [[exercises]] name = "strings1" -path = "exercises/strings/strings1.rs" +path = "exercises/09_strings/strings1.rs" mode = "compile" hint = """ The `current_favorite_color` function is currently returning a string slice @@ -500,7 +500,7 @@ another way that uses the `From` trait.""" [[exercises]] name = "strings2" -path = "exercises/strings/strings2.rs" +path = "exercises/09_strings/strings2.rs" mode = "compile" hint = """ Yes, it would be really easy to fix this by just changing the value bound to @@ -515,7 +515,7 @@ https://doc.rust-lang.org/stable/book/ch15-02-deref.html#implicit-deref-coercion [[exercises]] name = "strings3" -path = "exercises/strings/strings3.rs" +path = "exercises/09_strings/strings3.rs" mode = "test" hint = """ There's tons of useful standard library functions for strings. Let's try and use some of them: @@ -526,7 +526,7 @@ the string slice into an owned string, which you can then freely extend.""" [[exercises]] name = "strings4" -path = "exercises/strings/strings4.rs" +path = "exercises/09_strings/strings4.rs" mode = "compile" hint = "No hints this time ;)" @@ -534,7 +534,7 @@ hint = "No hints this time ;)" [[exercises]] name = "modules1" -path = "exercises/modules/modules1.rs" +path = "exercises/10_modules/modules1.rs" mode = "compile" hint = """ Everything is private in Rust by default-- but there's a keyword we can use @@ -543,7 +543,7 @@ needs to be public.""" [[exercises]] name = "modules2" -path = "exercises/modules/modules2.rs" +path = "exercises/10_modules/modules2.rs" mode = "compile" hint = """ The delicious_snacks module is trying to present an external interface that is @@ -555,7 +555,7 @@ Learn more at https://doc.rust-lang.org/book/ch07-04-bringing-paths-into-scope-w [[exercises]] name = "modules3" -path = "exercises/modules/modules3.rs" +path = "exercises/10_modules/modules3.rs" mode = "compile" hint = """ `UNIX_EPOCH` and `SystemTime` are declared in the `std::time` module. Add a @@ -566,7 +566,7 @@ paths or the glob operator to bring these two in using only one line.""" [[exercises]] name = "hashmaps1" -path = "exercises/hashmaps/hashmaps1.rs" +path = "exercises/11_hashmaps/hashmaps1.rs" mode = "test" hint = """ Hint 1: Take a look at the return type of the function to figure out @@ -578,7 +578,7 @@ Hint 2: Number of fruits should be at least 5. And you have to put [[exercises]] name = "hashmaps2" -path = "exercises/hashmaps/hashmaps2.rs" +path = "exercises/11_hashmaps/hashmaps2.rs" mode = "test" hint = """ Use the `entry()` and `or_insert()` methods of `HashMap` to achieve this. @@ -587,7 +587,7 @@ Learn more at https://doc.rust-lang.org/stable/book/ch08-03-hash-maps.html#only- [[exercises]] name = "hashmaps3" -path = "exercises/hashmaps/hashmaps3.rs" +path = "exercises/11_hashmaps/hashmaps3.rs" mode = "test" hint = """ Hint 1: Use the `entry()` and `or_insert()` methods of `HashMap` to insert @@ -613,7 +613,7 @@ hint = "No hints this time ;)" [[exercises]] name = "options1" -path = "exercises/options/options1.rs" +path = "exercises/12_options/options1.rs" mode = "test" hint = """ Options can have a `Some` value, with an inner value, or a `None` value, @@ -625,7 +625,7 @@ it doesn't panic in your face later?""" [[exercises]] name = "options2" -path = "exercises/options/options2.rs" +path = "exercises/12_options/options2.rs" mode = "test" hint = """ Check out: @@ -642,7 +642,7 @@ Also see `Option::flatten` [[exercises]] name = "options3" -path = "exercises/options/options3.rs" +path = "exercises/12_options/options3.rs" mode = "compile" hint = """ The compiler says a partial move happened in the `match` statement. How can @@ -655,7 +655,7 @@ https://doc.rust-lang.org/std/keyword.ref.html""" [[exercises]] name = "errors1" -path = "exercises/error_handling/errors1.rs" +path = "exercises/13_error_handling/errors1.rs" mode = "test" hint = """ `Ok` and `Err` are the two variants of `Result`, so what the tests are saying @@ -671,7 +671,7 @@ To make this change, you'll need to: [[exercises]] name = "errors2" -path = "exercises/error_handling/errors2.rs" +path = "exercises/13_error_handling/errors2.rs" mode = "test" hint = """ One way to handle this is using a `match` statement on @@ -687,7 +687,7 @@ and give it a try!""" [[exercises]] name = "errors3" -path = "exercises/error_handling/errors3.rs" +path = "exercises/13_error_handling/errors3.rs" mode = "compile" hint = """ If other functions can return a `Result`, why shouldn't `main`? It's a fairly @@ -699,7 +699,7 @@ positive results.""" [[exercises]] name = "errors4" -path = "exercises/error_handling/errors4.rs" +path = "exercises/13_error_handling/errors4.rs" mode = "test" hint = """ `PositiveNonzeroInteger::new` is always creating a new instance and returning @@ -711,7 +711,7 @@ everything is... okay :)""" [[exercises]] name = "errors5" -path = "exercises/error_handling/errors5.rs" +path = "exercises/13_error_handling/errors5.rs" mode = "compile" hint = """ There are two different possible `Result` types produced within `main()`, which @@ -735,7 +735,7 @@ https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/reen [[exercises]] name = "errors6" -path = "exercises/error_handling/errors6.rs" +path = "exercises/13_error_handling/errors6.rs" mode = "test" hint = """ This exercise uses a completed version of `PositiveNonzeroInteger` from @@ -757,7 +757,7 @@ https://doc.rust-lang.org/std/result/enum.Result.html#method.map_err""" [[exercises]] name = "generics1" -path = "exercises/generics/generics1.rs" +path = "exercises/14_generics/generics1.rs" mode = "compile" hint = """ Vectors in Rust make use of generics to create dynamically sized arrays of any @@ -767,7 +767,7 @@ You need to tell the compiler what type we are pushing onto this vector.""" [[exercises]] name = "generics2" -path = "exercises/generics/generics2.rs" +path = "exercises/14_generics/generics2.rs" mode = "test" hint = """ Currently we are wrapping only values of type `u32`. @@ -781,7 +781,7 @@ If you are still stuck https://doc.rust-lang.org/stable/book/ch10-01-syntax.html [[exercises]] name = "traits1" -path = "exercises/traits/traits1.rs" +path = "exercises/15_traits/traits1.rs" mode = "test" hint = """ A discussion about Traits in Rust can be found at: @@ -790,7 +790,7 @@ https://doc.rust-lang.org/book/ch10-02-traits.html [[exercises]] name = "traits2" -path = "exercises/traits/traits2.rs" +path = "exercises/15_traits/traits2.rs" mode = "test" hint = """ Notice how the trait takes ownership of `self`, and returns `Self`. @@ -803,7 +803,7 @@ the documentation at: https://doc.rust-lang.org/std/vec/struct.Vec.html""" [[exercises]] name = "traits3" -path = "exercises/traits/traits3.rs" +path = "exercises/15_traits/traits3.rs" mode = "test" hint = """ Traits can have a default implementation for functions. Structs that implement @@ -815,7 +815,7 @@ See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#def [[exercises]] name = "traits4" -path = "exercises/traits/traits4.rs" +path = "exercises/15_traits/traits4.rs" mode = "test" hint = """ Instead of using concrete types as parameters you can use traits. Try replacing @@ -826,7 +826,7 @@ See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#tra [[exercises]] name = "traits5" -path = "exercises/traits/traits5.rs" +path = "exercises/15_traits/traits5.rs" mode = "compile" hint = """ To ensure a parameter implements multiple traits use the '+ syntax'. Try @@ -851,7 +851,7 @@ You may also need this: `use std::fmt::Display;`.""" [[exercises]] name = "lifetimes1" -path = "exercises/lifetimes/lifetimes1.rs" +path = "exercises/16_lifetimes/lifetimes1.rs" mode = "compile" hint = """ Let the compiler guide you. Also take a look at the book if you need help: @@ -859,7 +859,7 @@ https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html""" [[exercises]] name = "lifetimes2" -path = "exercises/lifetimes/lifetimes2.rs" +path = "exercises/16_lifetimes/lifetimes2.rs" mode = "compile" hint = """ Remember that the generic lifetime `'a` will get the concrete lifetime that is @@ -873,7 +873,7 @@ inner block: [[exercises]] name = "lifetimes3" -path = "exercises/lifetimes/lifetimes3.rs" +path = "exercises/16_lifetimes/lifetimes3.rs" mode = "compile" hint = """ If you use a lifetime annotation in a struct's fields, where else does it need @@ -883,7 +883,7 @@ to be added?""" [[exercises]] name = "tests1" -path = "exercises/tests/tests1.rs" +path = "exercises/17_tests/tests1.rs" mode = "test" hint = """ You don't even need to write any code to test -- you can just test values and @@ -898,7 +898,7 @@ ones pass, and which ones fail :)""" [[exercises]] name = "tests2" -path = "exercises/tests/tests2.rs" +path = "exercises/17_tests/tests2.rs" mode = "test" hint = """ Like the previous exercise, you don't need to write any code to get this test @@ -911,7 +911,7 @@ argument comes first and which comes second!""" [[exercises]] name = "tests3" -path = "exercises/tests/tests3.rs" +path = "exercises/17_tests/tests3.rs" mode = "test" hint = """ You can call a function right where you're passing arguments to `assert!`. So @@ -922,7 +922,7 @@ what you're doing using `!`, like `assert!(!having_fun())`.""" [[exercises]] name = "tests4" -path = "exercises/tests/tests4.rs" +path = "exercises/17_tests/tests4.rs" mode = "test" hint = """ We expect method `Rectangle::new()` to panic for negative values. @@ -936,7 +936,7 @@ https://doc.rust-lang.org/stable/book/ch11-01-writing-tests.html#checking-for-pa [[exercises]] name = "iterators1" -path = "exercises/iterators/iterators1.rs" +path = "exercises/18_iterators/iterators1.rs" mode = "test" hint = """ Step 1: @@ -959,7 +959,7 @@ https://doc.rust-lang.org/std/iter/trait.Iterator.html for some ideas. [[exercises]] name = "iterators2" -path = "exercises/iterators/iterators2.rs" +path = "exercises/18_iterators/iterators2.rs" mode = "test" hint = """ Step 1: @@ -985,7 +985,7 @@ powerful and very general. Rust just needs to know the desired type.""" [[exercises]] name = "iterators3" -path = "exercises/iterators/iterators3.rs" +path = "exercises/18_iterators/iterators3.rs" mode = "test" hint = """ The `divide` function needs to return the correct error when even division is @@ -1004,7 +1004,7 @@ powerful! It can make the solution to this exercise infinitely easier.""" [[exercises]] name = "iterators4" -path = "exercises/iterators/iterators4.rs" +path = "exercises/18_iterators/iterators4.rs" mode = "test" hint = """ In an imperative language, you might write a `for` loop that updates a mutable @@ -1016,7 +1016,7 @@ Hint 2: Check out the `fold` and `rfold` methods!""" [[exercises]] name = "iterators5" -path = "exercises/iterators/iterators5.rs" +path = "exercises/18_iterators/iterators5.rs" mode = "test" hint = """ The documentation for the `std::iter::Iterator` trait contains numerous methods @@ -1035,7 +1035,7 @@ a different method that could make your code more compact than using `fold`.""" [[exercises]] name = "box1" -path = "exercises/smart_pointers/box1.rs" +path = "exercises/19_smart_pointers/box1.rs" mode = "test" hint = """ Step 1: @@ -1059,7 +1059,7 @@ definition and try other types! [[exercises]] name = "rc1" -path = "exercises/smart_pointers/rc1.rs" +path = "exercises/19_smart_pointers/rc1.rs" mode = "test" hint = """ This is a straightforward exercise to use the `Rc` type. Each `Planet` has @@ -1078,7 +1078,7 @@ See more at: https://doc.rust-lang.org/book/ch15-04-rc.html [[exercises]] name = "arc1" -path = "exercises/smart_pointers/arc1.rs" +path = "exercises/19_smart_pointers/arc1.rs" mode = "compile" hint = """ Make `shared_numbers` be an `Arc` from the numbers vector. Then, in order @@ -1096,7 +1096,7 @@ https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html [[exercises]] name = "cow1" -path = "exercises/smart_pointers/cow1.rs" +path = "exercises/19_smart_pointers/cow1.rs" mode = "test" hint = """ If `Cow` already owns the data it doesn't need to clone it when `to_mut()` is @@ -1110,7 +1110,7 @@ on the `Cow` type. [[exercises]] name = "threads1" -path = "exercises/threads/threads1.rs" +path = "exercises/20_threads/threads1.rs" mode = "compile" hint = """ `JoinHandle` is a struct that is returned from a spawned thread: @@ -1128,7 +1128,7 @@ https://doc.rust-lang.org/std/thread/struct.JoinHandle.html [[exercises]] name = "threads2" -path = "exercises/threads/threads2.rs" +path = "exercises/20_threads/threads2.rs" mode = "compile" hint = """ `Arc` is an Atomic Reference Counted pointer that allows safe, shared access @@ -1158,7 +1158,7 @@ what you've learned :)""" [[exercises]] name = "threads3" -path = "exercises/threads/threads3.rs" +path = "exercises/20_threads/threads3.rs" mode = "test" hint = """ An alternate way to handle concurrency between threads is to use an `mpsc` @@ -1177,7 +1177,7 @@ See https://doc.rust-lang.org/book/ch16-02-message-passing.html for more info. [[exercises]] name = "macros1" -path = "exercises/macros/macros1.rs" +path = "exercises/21_macros/macros1.rs" mode = "compile" hint = """ When you call a macro, you need to add something special compared to a @@ -1186,7 +1186,7 @@ regular function call. If you're stuck, take a look at what's inside [[exercises]] name = "macros2" -path = "exercises/macros/macros2.rs" +path = "exercises/21_macros/macros2.rs" mode = "compile" hint = """ Macros don't quite play by the same rules as the rest of Rust, in terms of @@ -1197,7 +1197,7 @@ Unlike other things in Rust, the order of "where you define a macro" versus [[exercises]] name = "macros3" -path = "exercises/macros/macros3.rs" +path = "exercises/21_macros/macros3.rs" mode = "compile" hint = """ In order to use a macro outside of its module, you need to do something @@ -1208,7 +1208,7 @@ exported macros, if you've seen any of those around.""" [[exercises]] name = "macros4" -path = "exercises/macros/macros4.rs" +path = "exercises/21_macros/macros4.rs" mode = "compile" hint = """ You only need to add a single character to make this compile. @@ -1225,7 +1225,7 @@ https://veykril.github.io/tlborm/""" [[exercises]] name = "clippy1" -path = "exercises/clippy/clippy1.rs" +path = "exercises/22_clippy/clippy1.rs" mode = "clippy" hint = """ Rust stores the highest precision version of any long or infinite precision @@ -1241,14 +1241,14 @@ appropriate replacement constant from `std::f32::consts`...""" [[exercises]] name = "clippy2" -path = "exercises/clippy/clippy2.rs" +path = "exercises/22_clippy/clippy2.rs" mode = "clippy" hint = """ `for` loops over `Option` values are more clearly expressed as an `if let`""" [[exercises]] name = "clippy3" -path = "exercises/clippy/clippy3.rs" +path = "exercises/22_clippy/clippy3.rs" mode = "clippy" hint = "No hints this time!" @@ -1256,7 +1256,7 @@ hint = "No hints this time!" [[exercises]] name = "using_as" -path = "exercises/conversions/using_as.rs" +path = "exercises/23_conversions/using_as.rs" mode = "test" hint = """ Use the `as` operator to cast one of the operands in the last line of the @@ -1264,14 +1264,14 @@ Use the `as` operator to cast one of the operands in the last line of the [[exercises]] name = "from_into" -path = "exercises/conversions/from_into.rs" +path = "exercises/23_conversions/from_into.rs" mode = "test" hint = """ Follow the steps provided right before the `From` implementation""" [[exercises]] name = "from_str" -path = "exercises/conversions/from_str.rs" +path = "exercises/23_conversions/from_str.rs" mode = "test" hint = """ The implementation of `FromStr` should return an `Ok` with a `Person` object, @@ -1292,7 +1292,7 @@ https://doc.rust-lang.org/stable/rust-by-example/error/multiple_error_types/reen [[exercises]] name = "try_from_into" -path = "exercises/conversions/try_from_into.rs" +path = "exercises/23_conversions/try_from_into.rs" mode = "test" hint = """ Follow the steps provided right before the `TryFrom` implementation. @@ -1315,7 +1315,7 @@ Challenge: Can you make the `TryFrom` implementations generic over many integer [[exercises]] name = "as_ref_mut" -path = "exercises/conversions/as_ref_mut.rs" +path = "exercises/23_conversions/as_ref_mut.rs" mode = "test" hint = """ Add `AsRef` or `AsMut` as a trait bound to the functions.""" From 3c4fde46106efab749ab9af9fe76f5e75779ef5d Mon Sep 17 00:00:00 2001 From: markgreene74 Date: Mon, 16 Oct 2023 22:41:34 +0100 Subject: [PATCH 1132/1293] fix(watch): update the CLIPPY_CARGO_TOML_PATH ... to reflect the changes to the exercise directory names. The path exercises/clippy replaced with exercises/22_clippy. closes #1726 --- src/exercise.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exercise.rs b/src/exercise.rs index c7b5672d..664b362b 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -12,7 +12,7 @@ const RUSTC_EDITION_ARGS: &[&str] = &["--edition", "2021"]; const RUSTC_NO_DEBUG_ARGS: &[&str] = &["-C", "strip=debuginfo"]; const I_AM_DONE_REGEX: &str = r"(?m)^\s*///?\s*I\s+AM\s+NOT\s+DONE"; const CONTEXT: usize = 2; -const CLIPPY_CARGO_TOML_PATH: &str = "./exercises/clippy/Cargo.toml"; +const CLIPPY_CARGO_TOML_PATH: &str = "./exercises/22_clippy/Cargo.toml"; // Get a temporary file name that is hopefully unique #[inline] From 3545c5a7a403bda177084564c7ceedad50aec8e0 Mon Sep 17 00:00:00 2001 From: markgreene74 Date: Mon, 16 Oct 2023 22:53:21 +0100 Subject: [PATCH 1133/1293] fix(intro1.rs): typo in the exercise body --- exercises/00_intro/intro1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/00_intro/intro1.rs b/exercises/00_intro/intro1.rs index c5196d62..5dd18b45 100644 --- a/exercises/00_intro/intro1.rs +++ b/exercises/00_intro/intro1.rs @@ -29,7 +29,7 @@ fn main() { println!("or logic error. The central concept behind Rustlings is to fix these errors and"); println!("solve the exercises. Good luck!"); println!(); - println!("The source for this exercise is in `exercises/intro00/intro1.rs`. Have a look!"); + println!("The source for this exercise is in `exercises/00_intro/intro1.rs`. Have a look!"); println!( "Going forward, the source of the exercises will always be in the success/failure output." ); From d757726aca44bbb4f96de21990c29714a0a497ca Mon Sep 17 00:00:00 2001 From: Versha Dhankar <45564258+VeeDeltaVee@users.noreply.github.com> Date: Tue, 17 Oct 2023 11:54:59 -0700 Subject: [PATCH 1134/1293] docs: fix windows installation instructions Currently, the windows installation instructions download a script from the URL ps1.rustlings.cool. This URL isn't detected as a URL in some cases, which means that PowerShell tries to load the data from a local file called ps1.rustlings.cool. This was breaking my install, and adding the https:// fixed it. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf001e28..42e282e0 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser Then, you can run: ```ps1 -Start-BitsTransfer -Source ps1.rustlings.cool -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 +Start-BitsTransfer -Source https://ps1.rustlings.cool -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 ``` To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. Keep in mind that this works best in PowerShell, and any other terminals may give you errors. From be6630bec6fa0d08352ee70f31cb8e4e091fc64a Mon Sep 17 00:00:00 2001 From: The Bearodactyl <114454115+TheBearodactyl@users.noreply.github.com> Date: Wed, 18 Oct 2023 18:59:58 +0000 Subject: [PATCH 1135/1293] Update install.sh --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 9aca5b68..5915a33d 100755 --- a/install.sh +++ b/install.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -echo "Let's get you set up with Rustlings!" +echo -e "\nLet's get you set up with Rustlings!" echo "Checking requirements..." if [ -x "$(command -v git)" ] From 9394825018475e77915932e93300a30c8d392db1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:32:32 +0000 Subject: [PATCH 1136/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index f3807bba..f7174a36 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -348,6 +348,7 @@ authors. d1t2
d1t2

πŸš‡ docwilco
docwilco

πŸ’» Matt Nield
Matt Nield

πŸ–‹ + The Bearodactyl
The Bearodactyl

πŸ’» From faa261e3e20b17f65b609916ec351712b91595c1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:32:33 +0000 Subject: [PATCH 1137/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 42f04e49..51e14a0a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2469,6 +2469,15 @@ "contributions": [ "content" ] + }, + { + "login": "TheBearodactyl", + "name": "The Bearodactyl", + "avatar_url": "https://avatars.githubusercontent.com/u/114454115?v=4", + "profile": "https://github.com/TheBearodactyl", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From a4698d8e1043c01b61ce42ad62535c13c1934453 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:33:37 +0000 Subject: [PATCH 1138/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index f7174a36..4fa91c06 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -350,6 +350,9 @@ authors. Matt Nield
Matt Nield

πŸ–‹ The Bearodactyl
The Bearodactyl

πŸ’» + + markgreene74
markgreene74

πŸ’» + From 5b25de927e89f138779ad82963cc50c6d8def4ff Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:33:38 +0000 Subject: [PATCH 1139/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 51e14a0a..232aac3d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2478,6 +2478,15 @@ "contributions": [ "code" ] + }, + { + "login": "markgreene74", + "name": "markgreene74", + "avatar_url": "https://avatars.githubusercontent.com/u/18945890?v=4", + "profile": "https://github.com/markgreene74", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From c5c33578d9d1cad9f1df4b220d32a046dd4668a0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:34:40 +0000 Subject: [PATCH 1140/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4fa91c06..a120b0a8 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -352,6 +352,7 @@ authors. markgreene74
markgreene74

πŸ’» + Versha Dhankar
Versha Dhankar

πŸ“– From e74a7001ef29d482b6b28b4dbf3c7db952adeac9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:34:41 +0000 Subject: [PATCH 1141/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 232aac3d..574ac662 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2487,6 +2487,15 @@ "contributions": [ "code" ] + }, + { + "login": "VeeDeltaVee", + "name": "Versha Dhankar", + "avatar_url": "https://avatars.githubusercontent.com/u/45564258?v=4", + "profile": "https://github.com/VeeDeltaVee", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From 2ac6606c6c747f32f8ead1ec3505e4cae6edfa5d Mon Sep 17 00:00:00 2001 From: Tristram Oaten Date: Fri, 20 Oct 2023 17:31:56 +0100 Subject: [PATCH 1142/1293] fix(intro2): changed intro2 to be a name error, not a format string error. --- exercises/00_intro/intro2.rs | 2 +- info.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/00_intro/intro2.rs b/exercises/00_intro/intro2.rs index 990b20f0..a28ad3dc 100644 --- a/exercises/00_intro/intro2.rs +++ b/exercises/00_intro/intro2.rs @@ -8,5 +8,5 @@ // I AM NOT DONE fn main() { - println!("Hello {}!"); + printline!("Hello there!") } diff --git a/info.toml b/info.toml index bbfee142..44f344a3 100644 --- a/info.toml +++ b/info.toml @@ -13,7 +13,7 @@ name = "intro2" path = "exercises/00_intro/intro2.rs" mode = "compile" hint = """ -Add an argument after the format string.""" +The compiler is informing us that we've got the name of the print macro wrong, and has suggested an alternative.""" # VARIABLES From 24f819d8236ba963a52a4aed7d24fb6e3cf3c3ef Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 2 Nov 2023 09:03:37 +0000 Subject: [PATCH 1143/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index a120b0a8..26bf3693 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -353,6 +353,7 @@ authors. markgreene74
markgreene74

πŸ’» Versha Dhankar
Versha Dhankar

πŸ“– + Tristram Oaten
Tristram Oaten

πŸ–‹ From 9de432e6bf628dfb4ad2ff4b59ee731961cfcfda Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 2 Nov 2023 09:03:38 +0000 Subject: [PATCH 1144/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 574ac662..2e965fdc 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2496,6 +2496,15 @@ "contributions": [ "doc" ] + }, + { + "login": "0atman", + "name": "Tristram Oaten", + "avatar_url": "https://avatars.githubusercontent.com/u/114097?v=4", + "profile": "http://0atman.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 3181d9f3f88a2113c67ff784f414c7e89a21d425 Mon Sep 17 00:00:00 2001 From: danieltinazzi Date: Sat, 4 Nov 2023 17:29:10 +0100 Subject: [PATCH 1145/1293] fix progress bar count --- src/main.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 89bd444f..bbff712d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -362,7 +362,10 @@ fn watch( .iter() .filter(|e| !e.looks_done() && !filepath.ends_with(&e.path)), ); - let num_done = exercises.iter().filter(|e| e.looks_done()).count(); + let num_done = exercises + .iter() + .filter(|e| e.looks_done() && !filepath.ends_with(&e.path)) + .count(); clear_screen(); match verify( pending_exercises, From 7e16e7721ae22c39dc349cfa72d0ede83f8af2f5 Mon Sep 17 00:00:00 2001 From: Raymon Roos Date: Sun, 5 Nov 2023 15:30:47 +0100 Subject: [PATCH 1146/1293] fix(traits3): grammar mistake in the hint for traits3 --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 44f344a3..887662ab 100644 --- a/info.toml +++ b/info.toml @@ -808,7 +808,7 @@ mode = "test" hint = """ Traits can have a default implementation for functions. Structs that implement the trait can then use the default version of these functions if they choose not -implement the function themselves. +to implement the function themselves. See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#default-implementations """ From cb4776097882c31330da2b7aba8faac743bc4e57 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 11:38:19 +0000 Subject: [PATCH 1147/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 26bf3693..73c99ed8 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -354,6 +354,7 @@ authors. markgreene74
markgreene74

πŸ’» Versha Dhankar
Versha Dhankar

πŸ“– Tristram Oaten
Tristram Oaten

πŸ–‹ + Daniel Tinazzi
Daniel Tinazzi

πŸ–‹ From 3b3416792474f9528a83550408b1d7bccecdce36 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 11:38:20 +0000 Subject: [PATCH 1148/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2e965fdc..417bb395 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2505,6 +2505,15 @@ "contributions": [ "content" ] + }, + { + "login": "danieltinazzi", + "name": "Daniel Tinazzi", + "avatar_url": "https://avatars.githubusercontent.com/u/11833533?v=4", + "profile": "https://github.com/danieltinazzi", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From e0904de6ea38154ad1454f16569c0aa7f94ba718 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 11:39:54 +0000 Subject: [PATCH 1149/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 73c99ed8..05c48b6e 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -355,6 +355,7 @@ authors. Versha Dhankar
Versha Dhankar

πŸ“– Tristram Oaten
Tristram Oaten

πŸ–‹ Daniel Tinazzi
Daniel Tinazzi

πŸ–‹ + Raymon Roos
Raymon Roos

πŸ–‹ From 6e7f1f5f07237f4a9e4bdd06c1faf203df735372 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 11:39:55 +0000 Subject: [PATCH 1150/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 417bb395..8256c302 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2514,6 +2514,15 @@ "contributions": [ "content" ] + }, + { + "login": "raymon-roos", + "name": "Raymon Roos", + "avatar_url": "https://avatars.githubusercontent.com/u/38888470?v=4", + "profile": "https://github.com/raymon-roos", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From dad22169849a4d16d6a74c69a45017dab07677ff Mon Sep 17 00:00:00 2001 From: Sarup Banskota Date: Tue, 7 Nov 2023 13:02:59 +0800 Subject: [PATCH 1151/1293] Add CodeCrafters --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 42e282e0..fdaee283 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,8 @@ Run the command `rustlings lsp` which will generate a `rust-project.json` at the Once you've completed Rustlings, put your new knowledge to good use! Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to. +On [CodeCrafters](https://codecrafters.io/rust) you can get some quality practice through recreating different technologies from scratch in Rust (e.g Build your own BitTorrent, HTTP Server, SQLite, etc). + ## Uninstalling Rustlings If you want to remove Rustlings from your system, there are two steps. First, you'll need to remove the exercises folder that the install script created From 706e075908a6ae0ad2fa3da7ae7279c8b9514f6d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 09:13:11 +0000 Subject: [PATCH 1152/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 05c48b6e..cd64e360 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -356,6 +356,7 @@ authors. Tristram Oaten
Tristram Oaten

πŸ–‹ Daniel Tinazzi
Daniel Tinazzi

πŸ–‹ Raymon Roos
Raymon Roos

πŸ–‹ + Sarup Banskota
Sarup Banskota

πŸ“– From 761fced7868f3dd38da95676cb79723a5be91ae2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 09:13:12 +0000 Subject: [PATCH 1153/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8256c302..3033ee96 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2523,6 +2523,15 @@ "contributions": [ "content" ] + }, + { + "login": "sarupbanskota", + "name": "Sarup Banskota", + "avatar_url": "https://avatars.githubusercontent.com/u/3149580?v=4", + "profile": "https://codecrafters.io", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From 3080141c5ffc6c113506a44e00b7b949a8cc7648 Mon Sep 17 00:00:00 2001 From: junderw Date: Fri, 10 Nov 2023 23:19:23 -0700 Subject: [PATCH 1154/1293] Fix gitignore for clippy exercise --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index f319d39d..32f3c77b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,8 @@ target/ **/*.rs.bk .DS_Store *.pdb -exercises/clippy/Cargo.toml -exercises/clippy/Cargo.lock +exercises/22_clippy/Cargo.toml +exercises/22_clippy/Cargo.lock rust-project.json .idea .vscode/* From 4d6cd0ebb4791be37bc50ac6eddb57981eab0b23 Mon Sep 17 00:00:00 2001 From: Adwait Kumar Singh Date: Sat, 11 Nov 2023 16:39:44 -0800 Subject: [PATCH 1155/1293] Revert "Add CodeCrafters" This reverts commit dad22169849a4d16d6a74c69a45017dab07677ff. --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index fdaee283..42e282e0 100644 --- a/README.md +++ b/README.md @@ -154,8 +154,6 @@ Run the command `rustlings lsp` which will generate a `rust-project.json` at the Once you've completed Rustlings, put your new knowledge to good use! Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to. -On [CodeCrafters](https://codecrafters.io/rust) you can get some quality practice through recreating different technologies from scratch in Rust (e.g Build your own BitTorrent, HTTP Server, SQLite, etc). - ## Uninstalling Rustlings If you want to remove Rustlings from your system, there are two steps. First, you'll need to remove the exercises folder that the install script created From 3461c4f73dcedab0b7687e04a806a930ce5f3c17 Mon Sep 17 00:00:00 2001 From: Bastian Pedersen Date: Sun, 12 Nov 2023 11:39:14 +0100 Subject: [PATCH 1156/1293] Reword clippy1 exercise to be more readable --- exercises/22_clippy/clippy1.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/22_clippy/clippy1.rs b/exercises/22_clippy/clippy1.rs index 95c0141f..e0c6ce7c4 100644 --- a/exercises/22_clippy/clippy1.rs +++ b/exercises/22_clippy/clippy1.rs @@ -3,8 +3,8 @@ // The Clippy tool is a collection of lints to analyze your code so you can // catch common mistakes and improve your Rust code. // -// For these exercises the code will fail to compile when there are clippy -// warnings check clippy's suggestions from the output to solve the exercise. +// For these exercises the code will fail to compile when there are Clippy +// warnings. Check Clippy's suggestions from the output to solve the exercise. // // Execute `rustlings hint clippy1` or use the `hint` watch subcommand for a // hint. From f01f2d13c75c72282e323c3057cb54fbc29c4600 Mon Sep 17 00:00:00 2001 From: Dilshad <98999149+a-rustacean@users.noreply.github.com> Date: Sun, 12 Nov 2023 22:19:40 +0530 Subject: [PATCH 1157/1293] Revert "docs: add sarupbanskota as a contributor for doc" --- .all-contributorsrc | 9 --------- AUTHORS.md | 1 - 2 files changed, 10 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3033ee96..8256c302 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2523,15 +2523,6 @@ "contributions": [ "content" ] - }, - { - "login": "sarupbanskota", - "name": "Sarup Banskota", - "avatar_url": "https://avatars.githubusercontent.com/u/3149580?v=4", - "profile": "https://codecrafters.io", - "contributions": [ - "doc" - ] } ], "contributorsPerLine": 8, diff --git a/AUTHORS.md b/AUTHORS.md index cd64e360..05c48b6e 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -356,7 +356,6 @@ authors. Tristram Oaten
Tristram Oaten

πŸ–‹ Daniel Tinazzi
Daniel Tinazzi

πŸ–‹ Raymon Roos
Raymon Roos

πŸ–‹ - Sarup Banskota
Sarup Banskota

πŸ“– From 0f629a47a564427fc7348eeb370f3a97040fdea5 Mon Sep 17 00:00:00 2001 From: jbouganim-parallel <150748285+jbouganim-parallel@users.noreply.github.com> Date: Mon, 13 Nov 2023 17:30:38 -0800 Subject: [PATCH 1158/1293] fix broken link in windows installation instructions https://github.com/rust-lang/rustlings/issues/1759 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fdaee283..1011c806 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser Then, you can run: ```ps1 -Start-BitsTransfer -Source https://ps1.rustlings.cool -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 +Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1 ``` To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. Keep in mind that this works best in PowerShell, and any other terminals may give you errors. From 70f472484f0e43566d146e3184c39dc650f27a74 Mon Sep 17 00:00:00 2001 From: liv Date: Tue, 14 Nov 2023 15:49:52 +0100 Subject: [PATCH 1159/1293] docs: revert fancy install aliases --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fdaee283..20a65cfc 100644 --- a/README.md +++ b/README.md @@ -25,13 +25,13 @@ You will need to have Rust installed. You can get it by visiting Date: Wed, 15 Nov 2023 23:17:40 +0100 Subject: [PATCH 1160/1293] chore(watch): update notify dependency to v6 closes #1640 --- Cargo.lock | 261 +++++++++++++++++----------------------------------- Cargo.toml | 2 +- src/main.rs | 68 ++++++++------ 3 files changed, 124 insertions(+), 207 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 418032a7..93489eb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,6 +86,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "bstr" version = "1.6.2" @@ -97,12 +103,6 @@ dependencies = [ "serde", ] -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -168,6 +168,25 @@ dependencies = [ "windows-sys 0.42.0", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + [[package]] name = "difflib" version = "0.4.0" @@ -200,14 +219,14 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "filetime" -version = "0.2.20" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412" +checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -219,41 +238,15 @@ dependencies = [ "num-traits", ] -[[package]] -name = "fsevent" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" -dependencies = [ - "bitflags", - "fsevent-sys", -] - [[package]] name = "fsevent-sys" -version = "2.0.1" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" dependencies = [ "libc", ] -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -dependencies = [ - "bitflags", - "fuchsia-zircon-sys", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" - [[package]] name = "glob" version = "0.3.1" @@ -278,7 +271,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -306,11 +299,11 @@ dependencies = [ [[package]] name = "inotify" -version = "0.7.1" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" dependencies = [ - "bitflags", + "bitflags 1.3.2", "inotify-sys", "libc", ] @@ -330,16 +323,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", + "cfg-if", ] [[package]] @@ -358,13 +342,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] -name = "kernel32-sys" -version = "0.2.2" +name = "kqueue" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", ] [[package]] @@ -373,17 +367,11 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" -version = "0.2.140" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "log" @@ -391,7 +379,7 @@ version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -402,56 +390,14 @@ checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" [[package]] name = "mio" -version = "0.6.23" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", "libc", "log", - "miow", - "net2", - "slab", - "winapi 0.2.8", -] - -[[package]] -name = "mio-extras" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" -dependencies = [ - "lazycell", - "log", - "mio", - "slab", -] - -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", -] - -[[package]] -name = "net2" -version = "0.2.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi 0.3.9", + "wasi", + "windows-sys 0.48.0", ] [[package]] @@ -462,20 +408,32 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] name = "notify" -version = "4.0.17" +version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257" +checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" dependencies = [ - "bitflags", + "bitflags 2.4.1", + "crossbeam-channel", "filetime", - "fsevent", "fsevent-sys", "inotify", + "kqueue", "libc", + "log", "mio", - "mio-extras", "walkdir", - "winapi 0.3.9", + "windows-sys 0.48.0", +] + +[[package]] +name = "notify-debouncer-mini" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d40b221972a1fc5ef4d858a2f671fb34c75983eb385463dff3780eeff6a9d43" +dependencies = [ + "crossbeam-channel", + "log", + "notify", ] [[package]] @@ -550,11 +508,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -590,7 +548,7 @@ dependencies = [ "glob", "home", "indicatif", - "notify", + "notify-debouncer-mini", "predicates", "regex", "serde", @@ -653,15 +611,6 @@ dependencies = [ "serde", ] -[[package]] -name = "slab" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" -dependencies = [ - "autocfg", -] - [[package]] name = "strsim" version = "0.10.0" @@ -757,10 +706,10 @@ dependencies = [ ] [[package]] -name = "winapi" -version = "0.2.8" +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "winapi" @@ -772,12 +721,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -790,7 +733,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -814,37 +757,13 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets", ] [[package]] @@ -954,13 +873,3 @@ checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" dependencies = [ "memchr", ] - -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] diff --git a/Cargo.toml b/Cargo.toml index a055d4f3..24bee7cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ edition = "2021" [dependencies] indicatif = "0.17.6" console = "0.15" -notify = "4.0" +notify-debouncer-mini = "0.4.1" toml = "0.7.6" regex = "1.5" serde = { version = "1.0", features = ["derive"] } diff --git a/src/main.rs b/src/main.rs index bbff712d..f17d9d95 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,8 +4,8 @@ use crate::run::{reset, run}; use crate::verify::verify; use clap::{Parser, Subcommand}; use console::Emoji; -use notify::DebouncedEvent; -use notify::{RecommendedWatcher, RecursiveMode, Watcher}; +use notify_debouncer_mini::notify::{self, RecursiveMode}; +use notify_debouncer_mini::{new_debouncer, DebouncedEventKind}; use std::ffi::OsStr; use std::fs; use std::io::{self, prelude::*}; @@ -331,8 +331,10 @@ fn watch( let (tx, rx) = channel(); let should_quit = Arc::new(AtomicBool::new(false)); - let mut watcher: RecommendedWatcher = Watcher::new(tx, Duration::from_secs(1))?; - watcher.watch(Path::new("./exercises"), RecursiveMode::Recursive)?; + let mut debouncer = new_debouncer(Duration::from_secs(1), tx)?; + debouncer + .watcher() + .watch(Path::new("./exercises"), RecursiveMode::Recursive)?; clear_screen(); @@ -350,38 +352,44 @@ fn watch( loop { match rx.recv_timeout(Duration::from_secs(1)) { Ok(event) => match event { - DebouncedEvent::Create(b) | DebouncedEvent::Chmod(b) | DebouncedEvent::Write(b) => { - if b.extension() == Some(OsStr::new("rs")) && b.exists() { - let filepath = b.as_path().canonicalize().unwrap(); - let pending_exercises = exercises - .iter() - .find(|e| filepath.ends_with(&e.path)) - .into_iter() - .chain( + Ok(events) => { + for event in events { + let event_path = event.path; + if event.kind == DebouncedEventKind::Any + && event_path.extension() == Some(OsStr::new("rs")) + && event_path.exists() + { + let filepath = event_path.as_path().canonicalize().unwrap(); + let pending_exercises = exercises .iter() - .filter(|e| !e.looks_done() && !filepath.ends_with(&e.path)), - ); - let num_done = exercises - .iter() - .filter(|e| e.looks_done() && !filepath.ends_with(&e.path)) - .count(); - clear_screen(); - match verify( - pending_exercises, - (num_done, exercises.len()), - verbose, - success_hints, - ) { - Ok(_) => return Ok(WatchStatus::Finished), - Err(exercise) => { - let mut failed_exercise_hint = failed_exercise_hint.lock().unwrap(); - *failed_exercise_hint = Some(to_owned_hint(exercise)); + .find(|e| filepath.ends_with(&e.path)) + .into_iter() + .chain(exercises.iter().filter(|e| { + !e.looks_done() && !filepath.ends_with(&e.path) + })); + let num_done = exercises + .iter() + .filter(|e| e.looks_done() && !filepath.ends_with(&e.path)) + .count(); + clear_screen(); + match verify( + pending_exercises, + (num_done, exercises.len()), + verbose, + success_hints, + ) { + Ok(_) => return Ok(WatchStatus::Finished), + Err(exercise) => { + let mut failed_exercise_hint = + failed_exercise_hint.lock().unwrap(); + *failed_exercise_hint = Some(to_owned_hint(exercise)); + } } } } } - _ => {} + Err(e) => println!("watch error: {e:?}"), }, Err(RecvTimeoutError::Timeout) => { // the timeout expired, just check the `should_quit` variable below then loop again From 5c4821ac6ffb8f62db05895ebeed21ae397ed649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=2E=20Neusch=C3=A4fer?= Date: Wed, 22 Nov 2023 01:45:19 +0100 Subject: [PATCH 1161/1293] fix(watch): Fix rendering of the finishing ferris MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In commit 571bab2 ("Run clippy --fix"), the "" string was changed to r"", even though it contains an intentional escape sequence, which now looks wrong. My commit undoes this change: Before: +----------------------------------------------------+ | You made it to the Fe-nish line! | +-------------------------- ------------------------+ \\/ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ After: +----------------------------------------------------+ | You made it to the Fe-nish line! | +-------------------------- ------------------------+ \/ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ β–‘β–‘β–’β–’β–’β–’β–‘β–‘β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–‘β–‘β–’β–’β–’β–’ β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–ˆβ–ˆ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ β–’β–’β–’β–’ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’ β–ˆβ–ˆβ–ˆβ–ˆ β–’β–’β–‘β–‘ β–’β–’β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–“β–“β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’β–“β–“β–’β–’β–“β–“β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ Running `cargo clippy` (version 0.1.70) after this commit does not reveal any new warnings. Fixes: 571bab2 ("Run clippy --fix") --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index bbff712d..2aa6f6bd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -435,10 +435,10 @@ started, here's a couple of notes about how Rustlings operates: Got all that? Great! To get started, run `rustlings watch` in order to get the first exercise. Make sure to have your editor open!"#; -const FENISH_LINE: &str = r"+----------------------------------------------------+ +const FENISH_LINE: &str = "+----------------------------------------------------+ | You made it to the Fe-nish line! | +-------------------------- ------------------------+ - \\/ + \\/ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ From 12d1bf407ad85da0b1f0c062564af68117ae6111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=2E=20Neusch=C3=A4fer?= Date: Wed, 22 Nov 2023 01:40:01 +0100 Subject: [PATCH 1162/1293] feat(watch): Add red color to the finishing ferris This adds some eye-candy for users who finish Rustlings. It is based on ANSI terminal escape sequences and should work in most environments. --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 2aa6f6bd..97015af5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -438,7 +438,7 @@ exercise. Make sure to have your editor open!"#; const FENISH_LINE: &str = "+----------------------------------------------------+ | You made it to the Fe-nish line! | +-------------------------- ------------------------+ - \\/ + \\/\x1b[31m β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’ @@ -453,7 +453,7 @@ const FENISH_LINE: &str = "+---------------------------------------------------- β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ β–’β–’ - β–’β–’ β–’β–’ β–’β–’ β–’β–’ + β–’β–’ β–’β–’ β–’β–’ β–’β–’\x1b[0m We hope you enjoyed learning about the various aspects of Rust! If you noticed any issues, please don't hesitate to report them to our repo. From 21b1e6ecf875e1fe1453c54cdba8224e98acb740 Mon Sep 17 00:00:00 2001 From: parnavh Date: Wed, 22 Nov 2023 22:06:17 +0530 Subject: [PATCH 1163/1293] fix(move_semantics): removed unused mut --- exercises/06_move_semantics/move_semantics2.rs | 2 +- exercises/06_move_semantics/move_semantics3.rs | 2 +- exercises/06_move_semantics/move_semantics4.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/06_move_semantics/move_semantics2.rs b/exercises/06_move_semantics/move_semantics2.rs index baf6bcc9..dc58be50 100644 --- a/exercises/06_move_semantics/move_semantics2.rs +++ b/exercises/06_move_semantics/move_semantics2.rs @@ -11,7 +11,7 @@ fn main() { let vec0 = vec![22, 44, 66]; - let mut vec1 = fill_vec(vec0); + let vec1 = fill_vec(vec0); assert_eq!(vec0, vec![22, 44, 66]); assert_eq!(vec1, vec![22, 44, 66, 88]); diff --git a/exercises/06_move_semantics/move_semantics3.rs b/exercises/06_move_semantics/move_semantics3.rs index 7af9e694..7152c716 100644 --- a/exercises/06_move_semantics/move_semantics3.rs +++ b/exercises/06_move_semantics/move_semantics3.rs @@ -12,7 +12,7 @@ fn main() { let vec0 = vec![22, 44, 66]; - let mut vec1 = fill_vec(vec0); + let vec1 = fill_vec(vec0); assert_eq!(vec1, vec![22, 44, 66, 88]); } diff --git a/exercises/06_move_semantics/move_semantics4.rs b/exercises/06_move_semantics/move_semantics4.rs index 80b49dba..bfc917fa 100644 --- a/exercises/06_move_semantics/move_semantics4.rs +++ b/exercises/06_move_semantics/move_semantics4.rs @@ -13,7 +13,7 @@ fn main() { let vec0 = vec![22, 44, 66]; - let mut vec1 = fill_vec(vec0); + let vec1 = fill_vec(vec0); assert_eq!(vec1, vec![22, 44, 66, 88]); } From 194e0b951d5e2c3c869592c39a20e5acb311e1fa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:10:37 +0000 Subject: [PATCH 1164/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 05c48b6e..a768b3fa 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -356,6 +356,7 @@ authors. Tristram Oaten
Tristram Oaten

πŸ–‹ Daniel Tinazzi
Daniel Tinazzi

πŸ–‹ Raymon Roos
Raymon Roos

πŸ–‹ + Matthias
Matthias

πŸ’» From 5d78a2f103c8dad2f1d8084c04acb8a9c691ac5a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:10:38 +0000 Subject: [PATCH 1165/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8256c302..777e5946 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2523,6 +2523,15 @@ "contributions": [ "content" ] + }, + { + "login": "matthri", + "name": "Matthias", + "avatar_url": "https://avatars.githubusercontent.com/u/67913999?v=4", + "profile": "https://github.com/matthri", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 4b800978179c9a07636a17ce4060ab78ae78958b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:33:58 +0000 Subject: [PATCH 1166/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index a768b3fa..b07ffdc9 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -357,6 +357,7 @@ authors. Daniel Tinazzi
Daniel Tinazzi

πŸ–‹ Raymon Roos
Raymon Roos

πŸ–‹ Matthias
Matthias

πŸ’» + J. NeuschΓ€fer
J. NeuschΓ€fer

πŸ’» From 3e7f1e3ff24b8618e7738091a5c78d316f673450 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:33:59 +0000 Subject: [PATCH 1167/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 777e5946..681392bd 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2532,6 +2532,15 @@ "contributions": [ "code" ] + }, + { + "login": "neuschaefer", + "name": "J. NeuschΓ€fer", + "avatar_url": "https://avatars.githubusercontent.com/u/1021512?v=4", + "profile": "https://github.com/neuschaefer", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 5bbdb3d5ba758ea3fc143c0930ed84a92a4a814d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:39:43 +0000 Subject: [PATCH 1168/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index b07ffdc9..21597acb 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -358,6 +358,7 @@ authors. Raymon Roos
Raymon Roos

πŸ–‹ Matthias
Matthias

πŸ’» J. NeuschΓ€fer
J. NeuschΓ€fer

πŸ’» + Bastian Pedersen
Bastian Pedersen

πŸ–‹ From 8863855627648c140ef1bd64711936e8a6597e1d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:39:44 +0000 Subject: [PATCH 1169/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 681392bd..2008f03b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2541,6 +2541,15 @@ "contributions": [ "code" ] + }, + { + "login": "bastianpedersen", + "name": "Bastian Pedersen", + "avatar_url": "https://avatars.githubusercontent.com/u/58905488?v=4", + "profile": "https://scooterhacking.org", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From f35f63fa5763bde734ca086aa9e3398e8319539d Mon Sep 17 00:00:00 2001 From: NicolasRoelandt Date: Fri, 8 Dec 2023 17:52:21 +0000 Subject: [PATCH 1170/1293] Remove confusing aside in 23_conversions/from_str.rs The advice tell us how to return as String error message. Unless I missed something, we can't even return a String error message here, so this advice is more confusing than anything and should better be removed. --- exercises/23_conversions/from_str.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/exercises/23_conversions/from_str.rs b/exercises/23_conversions/from_str.rs index 34472c32..e2093474 100644 --- a/exercises/23_conversions/from_str.rs +++ b/exercises/23_conversions/from_str.rs @@ -44,10 +44,6 @@ enum ParsePersonError { // 6. If while extracting the name and the age something goes wrong, an error // should be returned // If everything goes well, then return a Result of a Person object -// -// As an aside: `Box` implements `From<&'_ str>`. This means that if -// you want to return a string error message, you can do so via just using -// return `Err("my error message".into())`. impl FromStr for Person { type Err = ParsePersonError; From 5453fad99146905b690f99d76992b840ad8772a2 Mon Sep 17 00:00:00 2001 From: Paul Leydier Date: Mon, 18 Dec 2023 21:16:18 -0500 Subject: [PATCH 1171/1293] docs: sort exercise to book chapter mapping by exercise --- exercises/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/README.md b/exercises/README.md index c7effa95..fd0926f1 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -17,11 +17,11 @@ | error_handling | Β§9 | | generics | Β§10 | | traits | Β§10.2 | -| tests | Β§11.1 | | lifetimes | Β§10.3 | +| tests | Β§11.1 | | iterators | Β§13.2-4 | -| threads | Β§16.1-3 | | smart_pointers | Β§15, Β§16.3 | +| threads | Β§16.1-3 | | macros | Β§19.6 | | clippy | Β§21.4 | | conversions | n/a | From 93aef73eb54759ad7491306e69946de1975012bd Mon Sep 17 00:00:00 2001 From: Sergei Gerasenko Date: Tue, 9 Jan 2024 10:16:51 -0600 Subject: [PATCH 1172/1293] Correct for more standard English --- exercises/11_hashmaps/hashmaps3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/11_hashmaps/hashmaps3.rs b/exercises/11_hashmaps/hashmaps3.rs index 08e977c3..36544ee3 100644 --- a/exercises/11_hashmaps/hashmaps3.rs +++ b/exercises/11_hashmaps/hashmaps3.rs @@ -36,7 +36,7 @@ fn build_scores_table(results: String) -> HashMap { let team_2_score: u8 = v[3].parse().unwrap(); // TODO: Populate the scores table with details extracted from the // current line. Keep in mind that goals scored by team_1 - // will be the number of goals conceded from team_2, and similarly + // will be the number of goals conceded by team_2, and similarly // goals scored by team_2 will be the number of goals conceded by // team_1. } From 3200581d4dfff638db6328990ad061be52b97643 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 14:51:47 +0000 Subject: [PATCH 1173/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 21597acb..5466c9cf 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -360,6 +360,9 @@ authors. J. NeuschΓ€fer
J. NeuschΓ€fer

πŸ’» Bastian Pedersen
Bastian Pedersen

πŸ–‹ + + gerases
gerases

πŸ–‹ + From e2674498c6504e7d7a7d55f1e19907c77f7b5d91 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 14:51:48 +0000 Subject: [PATCH 1174/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2008f03b..cc268765 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2550,6 +2550,15 @@ "contributions": [ "content" ] + }, + { + "login": "gerases", + "name": "gerases", + "avatar_url": "https://avatars.githubusercontent.com/u/8953623?v=4", + "profile": "https://github.com/gerases", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From b70ed105db29fb908f97b117b56ed3732837df08 Mon Sep 17 00:00:00 2001 From: reifenrath-dev Date: Fri, 19 Jan 2024 11:18:54 +0100 Subject: [PATCH 1175/1293] chore: update from_into.rs task description to fit the code --- exercises/23_conversions/from_into.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/23_conversions/from_into.rs b/exercises/23_conversions/from_into.rs index 60911f3e..d78b7b5b 100644 --- a/exercises/23_conversions/from_into.rs +++ b/exercises/23_conversions/from_into.rs @@ -24,7 +24,7 @@ impl Default for Person { } } -// Your task is to complete this implementation in order for the line `let p = +// Your task is to complete this implementation in order for the line `let p1 = // Person::from("Mark,20")` to compile Please note that you'll need to parse the // age component into a `usize` with something like `"4".parse::()`. The // outcome of this needs to be handled appropriately. From 6072ec16a01461af9914ad89899de498d0309de7 Mon Sep 17 00:00:00 2001 From: Peter Neave Date: Tue, 23 Jan 2024 12:33:21 +1100 Subject: [PATCH 1176/1293] fix: Ensure scripts have LF line endings Use gitattributes file to ensure script files have LF line endings. This solves a problem for users who wish to use DevContainers on Windows machines and the file has been cloned from the repository with CRLF line endings. --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..efdba876 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +* text=auto +*.sh text eol=lf From bcb192c707009ab9d9bb06812cb09b9d446ccc11 Mon Sep 17 00:00:00 2001 From: LeverImmy <506503360@qq.com> Date: Sun, 4 Feb 2024 10:51:06 +0800 Subject: [PATCH 1177/1293] chore: fixed minor typo --- exercises/23_conversions/from_into.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/23_conversions/from_into.rs b/exercises/23_conversions/from_into.rs index 60911f3e..00f8c2ff 100644 --- a/exercises/23_conversions/from_into.rs +++ b/exercises/23_conversions/from_into.rs @@ -25,7 +25,7 @@ impl Default for Person { } // Your task is to complete this implementation in order for the line `let p = -// Person::from("Mark,20")` to compile Please note that you'll need to parse the +// Person::from("Mark,20")` to compile. Please note that you'll need to parse the // age component into a `usize` with something like `"4".parse::()`. The // outcome of this needs to be handled appropriately. // From 53c40024d894beb45f4319d08ff054d7d7ac319f Mon Sep 17 00:00:00 2001 From: luvchurchill <46406654+luvchurchill@users.noreply.github.com> Date: Tue, 6 Feb 2024 01:54:04 +0200 Subject: [PATCH 1178/1293] Added .git to end of Repo's https URL The install.sh script didn't work for me, after I changed this locally it worked URL needs to end in .git --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 5915a33d..fdbe8d43 100755 --- a/install.sh +++ b/install.sh @@ -137,7 +137,7 @@ fi Path=${1:-rustlings/} echo "Cloning Rustlings at $Path..." -git clone -q https://github.com/rust-lang/rustlings "$Path" +git clone -q https://github.com/rust-lang/rustlings.git "$Path" cd "$Path" From 75ee0e42450713cc8c8288c71a0f148cdefea526 Mon Sep 17 00:00:00 2001 From: Jan Date: Mon, 12 Feb 2024 18:13:20 +0100 Subject: [PATCH 1179/1293] Clarified hint text --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 887662ab..aa4ed052 100644 --- a/info.toml +++ b/info.toml @@ -145,7 +145,7 @@ after the `->`. This is where the function's return type should be -- take a look at the `is_even` function for an example! Also: Did you figure out that, technically, `u32` would be the more fitting type -for the prices here, since they can't be negative? If so, kudos!""" +for the inputs of the functions here, since the original prices shouldn't be negative? If so, kudos!""" [[exercises]] name = "functions5" From 1da82a0eabdae611519d0c58aff34eb9c792dc90 Mon Sep 17 00:00:00 2001 From: Guizoul Date: Wed, 28 Feb 2024 14:19:05 +0100 Subject: [PATCH 1180/1293] docs: Added comment for handling equal numbers in if/if1.rs `bigger` function --- exercises/03_if/if1.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/03_if/if1.rs b/exercises/03_if/if1.rs index 4734d78f..38d283c2 100644 --- a/exercises/03_if/if1.rs +++ b/exercises/03_if/if1.rs @@ -6,6 +6,7 @@ pub fn bigger(a: i32, b: i32) -> i32 { // Complete this function to return the bigger number! + // If both numbers are equal, any of them is returned. // Do not use: // - another function call // - additional variables From 19b5e24d5caf551aef5fd749ed7437d3044bf6ce Mon Sep 17 00:00:00 2001 From: Evan Miller Date: Mon, 4 Mar 2024 10:38:09 -0500 Subject: [PATCH 1181/1293] Update hashmaps3.rs description for clarity I struggled with this exercise and didn't understand that it was looking for a summary of goals scored/conceded per team, instead of per match. My goal here is just to clarify the language, essentially saying "the total number of goals the team scored" to indicate that we are looking for a sum. Updated the exercise description to clarify this point. Relates loosely to closed issue https://github.com/rust-lang/rustlings/issues/1361 --- exercises/11_hashmaps/hashmaps3.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/exercises/11_hashmaps/hashmaps3.rs b/exercises/11_hashmaps/hashmaps3.rs index 36544ee3..8d9236df 100644 --- a/exercises/11_hashmaps/hashmaps3.rs +++ b/exercises/11_hashmaps/hashmaps3.rs @@ -4,10 +4,11 @@ // the form : ",,," // Example: England,France,4,2 (England scored 4 goals, France 2). // -// You have to build a scores table containing the name of the team, goals the -// team scored, and goals the team conceded. One approach to build the scores -// table is to use a Hashmap. The solution is partially written to use a -// Hashmap, complete it to pass the test. +// You have to build a scores table containing the name of the team, the total +// number of goals the team scored, and the total number of goals the team +// conceded. One approach to build the scores table is to use a Hashmap. +// The solution is partially written to use a Hashmap, +// complete it to pass the test. // // Make me pass the tests! // From 373676a57601374a7c7d8b2aa447ecf249a1caa1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 22:02:08 +0000 Subject: [PATCH 1182/1293] chore(deps): bump mio from 0.8.9 to 0.8.11 Bumps [mio](https://github.com/tokio-rs/mio) from 0.8.9 to 0.8.11. - [Release notes](https://github.com/tokio-rs/mio/releases) - [Changelog](https://github.com/tokio-rs/mio/blob/master/CHANGELOG.md) - [Commits](https://github.com/tokio-rs/mio/compare/v0.8.9...v0.8.11) --- updated-dependencies: - dependency-name: mio dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 93489eb0..5858d3ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -390,9 +390,9 @@ checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" [[package]] name = "mio" -version = "0.8.9" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", From 547f3ac835bb6cf0db654c528d31bce361d01381 Mon Sep 17 00:00:00 2001 From: luna <26529488+hyphena@users.noreply.github.com> Date: Thu, 7 Mar 2024 18:31:33 -0500 Subject: [PATCH 1183/1293] chore: minor typo fix --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 887662ab..39eb33ed 100644 --- a/info.toml +++ b/info.toml @@ -248,7 +248,7 @@ starting and ending (plus one) indices of the items in the `Array` that you want to end up in the slice. If you're curious why the first argument of `assert_eq!` does not have an -ampersand for a reference since the second argument is areference, take a look +ampersand for a reference since the second argument is a reference, take a look at the coercion chapter of the nomicon: https://doc.rust-lang.org/nomicon/coercions.html""" From 11f0fd7fd9673996d8d2381ade1a371f945f1875 Mon Sep 17 00:00:00 2001 From: Kyle VanderBeek Date: Sat, 9 Mar 2024 19:45:50 +0000 Subject: [PATCH 1184/1293] Convert to lightweight dev container; simplify. Instead of running `rustup` on a multi-gigabyte general-purpose Linux base, use the premade devcontainers/rust:1 which closely tracks the rust toolchain releases. Rip out excess setup steps since devcontainers come with the repo checked out; just compile/update the binary. --- .devcontainer/devcontainer.json | 8 +------- .devcontainer/setup.sh | 7 ------- 2 files changed, 1 insertion(+), 14 deletions(-) delete mode 100755 .devcontainer/setup.sh diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e1b2cec1..59f9571a 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,12 +1,6 @@ { - "image": "mcr.microsoft.com/devcontainers/universal:2-linux", - "waitFor": "onCreateCommand", - "onCreateCommand": ".devcontainer/setup.sh", + "image": "mcr.microsoft.com/devcontainers/rust:1", "updateContentCommand": "cargo build", - "postCreateCommand": "", - "postAttachCommand": { - "server": "rustlings watch" - }, "customizations": { "vscode": { "extensions": [ diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh deleted file mode 100755 index 0e090a86..00000000 --- a/.devcontainer/setup.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -curl https://sh.rustup.rs -sSf | sh -s -- -y - -# Update current shell environment variables after install to find rustup -. "$HOME/.cargo/env" -rustup install stable -bash install.sh From e424e9f6c78ec54c5a91b942398f7012f46f6c90 Mon Sep 17 00:00:00 2001 From: Kyle VanderBeek Date: Sat, 9 Mar 2024 20:07:51 +0000 Subject: [PATCH 1185/1293] Add target directory to $PATH Makes the pre-built command work in the shell right away. --- .devcontainer/devcontainer.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 59f9571a..643021aa 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "image": "mcr.microsoft.com/devcontainers/rust:1", "updateContentCommand": "cargo build", + "remoteEnv": { + "PATH": "${containerEnv:PATH}:${containerWorkspaceFolder}/target/debug" + }, "customizations": { "vscode": { "extensions": [ From 77903200a0c19ef4ad2de7b2abec06e301d0dccc Mon Sep 17 00:00:00 2001 From: Kyle VanderBeek Date: Sat, 9 Mar 2024 20:20:14 +0000 Subject: [PATCH 1186/1293] Remove duplicate vscode extension list. It's already in the vendor-specific .vscode files. --- .devcontainer/devcontainer.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 643021aa..a7f4f78f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,12 +3,5 @@ "updateContentCommand": "cargo build", "remoteEnv": { "PATH": "${containerEnv:PATH}:${containerWorkspaceFolder}/target/debug" - }, - "customizations": { - "vscode": { - "extensions": [ - "rust-lang.rust-analyzer" - ] - } } } From 2fb135026cd3b072a54fdd211405090afca6f75e Mon Sep 17 00:00:00 2001 From: Kyle VanderBeek Date: Sat, 9 Mar 2024 23:18:31 +0000 Subject: [PATCH 1187/1293] Add back the post-attach watch. --- .devcontainer/devcontainer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a7f4f78f..f25e8bd8 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,7 @@ { "image": "mcr.microsoft.com/devcontainers/rust:1", - "updateContentCommand": "cargo build", + "updateContentCommand": ["cargo", "build"], + "postAttachCommand": ["rustlings", "watch"], "remoteEnv": { "PATH": "${containerEnv:PATH}:${containerWorkspaceFolder}/target/debug" } From 36db08340d4503ac363e9f6499fc534a479b7491 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sun, 10 Mar 2024 23:57:35 +0100 Subject: [PATCH 1188/1293] Update dependencies --- Cargo.lock | 334 ++++++++++++++++++++++++++--------------------------- Cargo.toml | 22 ++-- 2 files changed, 174 insertions(+), 182 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 93489eb0..3950c476 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] [[package]] name = "anstream" -version = "0.5.0" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", @@ -27,43 +27,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.3" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "2.1.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "assert_cmd" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88903cb14723e4d4003335bb7f8a14f27691649105346a0f0957466c096adfe6" +checksum = "ed72493ac66d5804837f480ab3766c72bdfab91a65e565fc54fa9e42db0073a8" dependencies = [ "anstyle", "bstr", @@ -88,15 +88,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "bstr" -version = "1.6.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2f7349907b712260e64b0afe2f84692af14a454be26187d9df565c7f69266a" +checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" dependencies = [ "memchr", "regex-automata", @@ -111,9 +111,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.4.3" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84ed82781cea27b43c9b106a979fe450a13a31aab0500595fb3fc06616de08e6" +checksum = "b230ab84b0ffdf890d5a10abdbc8b83ae1c4918275daea1ab8801f71536b2651" dependencies = [ "clap_builder", "clap_derive", @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.2" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", @@ -133,9 +133,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.2" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck", "proc-macro2", @@ -145,9 +145,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "colorchoice" @@ -157,35 +157,31 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "console" -version = "0.15.5" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", - "windows-sys 0.42.0", + "windows-sys 0.52.0", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "difflib" @@ -199,12 +195,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - [[package]] name = "encode_unicode" version = "0.3.6" @@ -219,14 +209,14 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", "redox_syscall", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -255,9 +245,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" @@ -267,18 +257,18 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "home" -version = "0.5.4" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] name = "indexmap" -version = "2.0.0" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", "hashbrown", @@ -286,9 +276,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.6" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b297dc40733f23a0e52728a58fa9489a5b7638a324932de16b41adc3ef80730" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" dependencies = [ "console", "instant", @@ -326,20 +316,11 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "kqueue" @@ -369,30 +350,27 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "log" -version = "0.4.17" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" -version = "2.6.3" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mio" -version = "0.8.9" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", @@ -412,7 +390,7 @@ version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "crossbeam-channel", "filetime", "fsevent-sys", @@ -438,9 +416,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -453,20 +431,19 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "portable-atomic" -version = "1.4.3" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "predicates" -version = "3.0.3" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9" +checksum = "68b87bfd4605926cdfefc1c3b5f8fe560e3feca9d5552cf68c466d3d8236c7e8" dependencies = [ "anstyle", "difflib", "float-cmp", - "itertools", "normalize-line-endings", "predicates-core", "regex", @@ -490,53 +467,59 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.53" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.7.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce168fea28d3e05f158bda4576cf0c844d5045bc2cc3620fa0292ed5bb5814c" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] -[[package]] -name = "regex-automata" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" - [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rustlings" @@ -558,9 +541,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -573,18 +556,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.158" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.158" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", @@ -593,9 +576,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.94" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -604,24 +587,24 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" [[package]] name = "syn" -version = "2.0.8" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc02725fd69ab9f26eab07fad303e2497fad6fb9eba4f96c4d1687bdf704ad9" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", @@ -636,9 +619,9 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "toml" -version = "0.7.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" dependencies = [ "serde", "serde_spanned", @@ -648,18 +631,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" dependencies = [ "indexmap", "serde", @@ -670,15 +653,15 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "utf8parse" @@ -697,9 +680,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.3.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -729,9 +712,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -742,28 +725,22 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", ] [[package]] @@ -782,10 +759,19 @@ dependencies = [ ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" +name = "windows-targets" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", +] [[package]] name = "windows_aarch64_gnullvm" @@ -794,10 +780,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" +name = "windows_aarch64_gnullvm" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -806,10 +792,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] -name = "windows_i686_gnu" -version = "0.42.2" +name = "windows_aarch64_msvc" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -818,10 +804,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] -name = "windows_i686_msvc" -version = "0.42.2" +name = "windows_i686_gnu" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -830,10 +816,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" +name = "windows_i686_msvc" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -842,10 +828,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" +name = "windows_x86_64_gnu" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -854,10 +840,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" +name = "windows_x86_64_gnullvm" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -866,10 +852,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] -name = "winnow" -version = "0.5.15" +name = "windows_x86_64_msvc" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + +[[package]] +name = "winnow" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 24bee7cf..218b7990 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,22 +9,22 @@ authors = [ edition = "2021" [dependencies] -indicatif = "0.17.6" -console = "0.15" -notify-debouncer-mini = "0.4.1" -toml = "0.7.6" -regex = "1.5" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.81" -home = "0.5.3" +clap = { version = "4.5.2", features = ["derive"] } +console = "0.15.8" glob = "0.3.0" -clap = { version = "4.4.0", features = ["derive"] } +home = "0.5.9" +indicatif = "0.17.8" +notify-debouncer-mini = "0.4.1" +regex = "1.10.3" +serde_json = "1.0.114" +serde = { version = "1.0.197", features = ["derive"] } +toml = "0.8.10" [[bin]] name = "rustlings" path = "src/main.rs" [dev-dependencies] -assert_cmd = "2.0.12" -predicates = "3.0.3" +assert_cmd = "2.0.14" glob = "0.3.0" +predicates = "3.1.0" From f5e9db90ccb5b84fbcb0ccff8aaade50588d534c Mon Sep 17 00:00:00 2001 From: pavedroad Date: Tue, 12 Mar 2024 14:35:48 +0800 Subject: [PATCH 1189/1293] chore: fix typo Signed-off-by: pavedroad --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7226a47..a199e4de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -167,7 +167,7 @@ - **structs3**: Clarifed the hint - **quiz2, as_ref_mut, options1, traits1, traits2**: Clarified hints - **traits1, traits2, cli**: Tidied up unmatching backticks -- **enums2**: Removed unneccessary indirection of self +- **enums2**: Removed unnecessary indirection of self - **enums3**: Added an extra tuple comment #### Housekeeping From 098ff228d73d9f359e948712acb346240e85af05 Mon Sep 17 00:00:00 2001 From: Ahmed <111569638+0Ahmed-0@users.noreply.github.com> Date: Mon, 4 Dec 2023 22:35:53 +0200 Subject: [PATCH 1190/1293] chore: fix a minor typo --- exercises/09_strings/strings3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/09_strings/strings3.rs b/exercises/09_strings/strings3.rs index b29f9325..384e7ce3 100644 --- a/exercises/09_strings/strings3.rs +++ b/exercises/09_strings/strings3.rs @@ -11,7 +11,7 @@ fn trim_me(input: &str) -> String { } fn compose_me(input: &str) -> String { - // TODO: Add " world!" to the string! There's multiple ways to do this! + // TODO: Add " world!" to the string! There are multiple ways to do this! ??? } From c46a7115265406330dc95fc7ab8e500cd8d24859 Mon Sep 17 00:00:00 2001 From: liv Date: Fri, 15 Mar 2024 13:48:57 +0100 Subject: [PATCH 1191/1293] fix: revert from_into test change --- exercises/23_conversions/from_into.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/exercises/23_conversions/from_into.rs b/exercises/23_conversions/from_into.rs index 60911f3e..da1a9a5f 100644 --- a/exercises/23_conversions/from_into.rs +++ b/exercises/23_conversions/from_into.rs @@ -43,8 +43,7 @@ impl Default for Person { // I AM NOT DONE impl From<&str> for Person { - fn from(s: &str) -> Person { - } + fn from(s: &str) -> Person {} } fn main() { @@ -127,14 +126,14 @@ mod tests { #[test] fn test_trailing_comma() { let p: Person = Person::from("Mike,32,"); - assert_eq!(p.name, "Mike"); - assert_eq!(p.age, 32); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 30); } #[test] fn test_trailing_comma_and_some_string() { - let p: Person = Person::from("Mike,32,man"); - assert_eq!(p.name, "Mike"); - assert_eq!(p.age, 32); + let p: Person = Person::from("Mike,32,dog"); + assert_eq!(p.name, "John"); + assert_eq!(p.age, 30); } } From 17ee0e3c7a47054baf5e66c5525541e4153c03b7 Mon Sep 17 00:00:00 2001 From: Luca Plian <98339220+AnonimAnonim2245@users.noreply.github.com> Date: Fri, 15 Mar 2024 14:51:24 +0200 Subject: [PATCH 1192/1293] optimized the UI code (#1830) --- src/ui.rs | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/ui.rs b/src/ui.rs index 1ee46316..74835e13 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,33 +1,28 @@ -macro_rules! warn { - ($fmt:literal, $ex:expr) => {{ +macro_rules! print_emoji { + ($emoji:expr, $sign:expr, $color: ident ,$fmt:literal, $ex:expr) => {{ use console::{style, Emoji}; use std::env; let formatstr = format!($fmt, $ex); if env::var("NO_EMOJI").is_ok() { - println!("{} {}", style("!").red(), style(formatstr).red()); + println!("{} {}", style($sign).$color(), style(formatstr).$color()); } else { println!( "{} {}", - style(Emoji("⚠️ ", "!")).red(), - style(formatstr).red() + style(Emoji($emoji, $sign)).$color(), + style(formatstr).$color() ); } }}; } -macro_rules! success { +macro_rules! warn { ($fmt:literal, $ex:expr) => {{ - use console::{style, Emoji}; - use std::env; - let formatstr = format!($fmt, $ex); - if env::var("NO_EMOJI").is_ok() { - println!("{} {}", style("βœ“").green(), style(formatstr).green()); - } else { - println!( - "{} {}", - style(Emoji("βœ…", "βœ“")).green(), - style(formatstr).green() - ); - } + print_emoji!("⚠️ ", "!", red, $fmt, $ex); + }}; +} + +macro_rules! success { + ($fmt:literal, $ex:expr) => {{ + print_emoji!("βœ… ", "βœ“", green, $fmt, $ex); }}; } From 2b97faa1d391ab473b542dd02e70cca27356a04a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:51:43 +0000 Subject: [PATCH 1193/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 5466c9cf..ca834ad6 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -362,6 +362,7 @@ authors. gerases
gerases

πŸ–‹ + Luca Plian
Luca Plian

πŸ’» From 3c6c29e19e2f46434fb8c9c0df3d1950053213c1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:51:44 +0000 Subject: [PATCH 1194/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index cc268765..c16d2c5e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2559,6 +2559,15 @@ "contributions": [ "content" ] + }, + { + "login": "AnonimAnonim2245", + "name": "Luca Plian", + "avatar_url": "https://avatars.githubusercontent.com/u/98339220?v=4", + "profile": "https://github.com/AnonimAnonim2245", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 557bbe2b85235da28774fb136ed505f1fd4ddf6d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:52:53 +0000 Subject: [PATCH 1195/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index ca834ad6..4685d256 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -363,6 +363,7 @@ authors. gerases
gerases

πŸ–‹ Luca Plian
Luca Plian

πŸ’» + RenΓ© Reifenrath
RenΓ© Reifenrath

πŸ–‹ From 6f88dd437e44e775d0fbb1b976eb032548d1ecfc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:52:54 +0000 Subject: [PATCH 1196/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c16d2c5e..8a248ecb 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2568,6 +2568,15 @@ "contributions": [ "code" ] + }, + { + "login": "reifenrath-dev", + "name": "RenΓ© Reifenrath", + "avatar_url": "https://avatars.githubusercontent.com/u/18126097?v=4", + "profile": "https://reifenrath.dev/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From fe698d90967a57729560322e39bf3e95c2e97ac5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:56:52 +0000 Subject: [PATCH 1197/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4685d256..ba08a15b 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -364,6 +364,7 @@ authors. gerases
gerases

πŸ–‹ Luca Plian
Luca Plian

πŸ’» RenΓ© Reifenrath
RenΓ© Reifenrath

πŸ–‹ + Peter Neave
Peter Neave

πŸš‡ From 0d5c105c15fe85900ee39f4aa8cfe1ffc3d5d63c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:56:53 +0000 Subject: [PATCH 1198/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8a248ecb..9c35721d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2577,6 +2577,15 @@ "contributions": [ "content" ] + }, + { + "login": "peterneave", + "name": "Peter Neave", + "avatar_url": "https://avatars.githubusercontent.com/u/7982708?v=4", + "profile": "https://github.com/peterneave", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 8, From 032e3c9f3017f392e627dd99daae83b5f0fa09ff Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:02:09 +0000 Subject: [PATCH 1199/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index ba08a15b..ae29b64d 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -365,6 +365,7 @@ authors. Luca Plian
Luca Plian

πŸ’» RenΓ© Reifenrath
RenΓ© Reifenrath

πŸ–‹ Peter Neave
Peter Neave

πŸš‡ + Jan
Jan

πŸ–‹ From 4c51cb09092717855486286ddc5462fbd0a45b29 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:02:10 +0000 Subject: [PATCH 1200/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9c35721d..29eea970 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2586,6 +2586,15 @@ "contributions": [ "infra" ] + }, + { + "login": "JanB1", + "name": "Jan", + "avatar_url": "https://avatars.githubusercontent.com/u/5552248?v=4", + "profile": "http://www.janb1.com", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From fe28feba1e164267a16210fd5dd80b701fa38c1d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:17:17 +0000 Subject: [PATCH 1201/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index ae29b64d..cf66d7f6 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -366,6 +366,7 @@ authors. RenΓ© Reifenrath
RenΓ© Reifenrath

πŸ–‹ Peter Neave
Peter Neave

πŸš‡ Jan
Jan

πŸ–‹ + Kyle VanderBeek
Kyle VanderBeek

πŸš‡ From 62b435a309c154a610c428cf57825b287a9c26e9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:17:18 +0000 Subject: [PATCH 1202/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 29eea970..80ca245a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2595,6 +2595,15 @@ "contributions": [ "content" ] + }, + { + "login": "kylev", + "name": "Kyle VanderBeek", + "avatar_url": "https://avatars.githubusercontent.com/u/46888?v=4", + "profile": "http://www.kylev.com/", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 8, From 3f0dc81a9c065dd44f41ce1a462e2998173f3eb0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:19:33 +0000 Subject: [PATCH 1203/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index cf66d7f6..e150ffe0 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -367,6 +367,7 @@ authors. Peter Neave
Peter Neave

πŸš‡ Jan
Jan

πŸ–‹ Kyle VanderBeek
Kyle VanderBeek

πŸš‡ + pavedroad
pavedroad

πŸ–‹ From 1ac392a551201c073bb22a76075e987218b583a6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:19:34 +0000 Subject: [PATCH 1204/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 80ca245a..f2d04b2b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2604,6 +2604,15 @@ "contributions": [ "infra" ] + }, + { + "login": "pavedroad", + "name": "pavedroad", + "avatar_url": "https://avatars.githubusercontent.com/u/138004431?v=4", + "profile": "https://github.com/pavedroad", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 3d6b5e81020729e3c684f767d2ca6e7789c66cf3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:22:13 +0000 Subject: [PATCH 1205/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index e150ffe0..854b6b6a 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -368,6 +368,7 @@ authors. Jan
Jan

πŸ–‹ Kyle VanderBeek
Kyle VanderBeek

πŸš‡ pavedroad
pavedroad

πŸ–‹ + luna
luna

πŸ–‹ From 9cf5a2f83f44a0f43b66810d2dfcc71d4d53e712 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:22:14 +0000 Subject: [PATCH 1206/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index f2d04b2b..c5424b3c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2613,6 +2613,15 @@ "contributions": [ "content" ] + }, + { + "login": "hyphena", + "name": "luna", + "avatar_url": "https://avatars.githubusercontent.com/u/26529488?v=4", + "profile": "https://github.com/hyphena", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 4304b3981e353b1fe55eea1f07f3b2ec172fdcb8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:32:30 +0000 Subject: [PATCH 1207/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 854b6b6a..aabfb9dc 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -370,6 +370,9 @@ authors. pavedroad
pavedroad

πŸ–‹ luna
luna

πŸ–‹ + + Evan Miller
Evan Miller

πŸ–‹ + From 8d1258f26abed7bc8c222974b5430e51fc8628e5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:32:31 +0000 Subject: [PATCH 1208/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c5424b3c..431c3cd5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2622,6 +2622,15 @@ "contributions": [ "content" ] + }, + { + "login": "evanmiller2112", + "name": "Evan Miller", + "avatar_url": "https://avatars.githubusercontent.com/u/28488957?v=4", + "profile": "https://github.com/evanmiller2112", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From f8f627b6f76bfae3fb23cb0c06aecfa644a27d87 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:35:16 +0000 Subject: [PATCH 1209/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index aabfb9dc..39a3b6bf 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -372,6 +372,7 @@ authors. Evan Miller
Evan Miller

πŸ–‹ + luvchurchill
luvchurchill

πŸ’» From c01ddbc7477dc062dd7fac06ba5cb9e5eeaa15e9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:35:17 +0000 Subject: [PATCH 1210/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 431c3cd5..7d26d4cb 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2631,6 +2631,15 @@ "contributions": [ "content" ] + }, + { + "login": "luvchurchill", + "name": "luvchurchill", + "avatar_url": "https://avatars.githubusercontent.com/u/46406654?v=4", + "profile": "https://github.com/luvchurchill", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From b7add6a1a81c77c09971cc2330fb9d016c7c8cac Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:37:01 +0000 Subject: [PATCH 1211/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 39a3b6bf..bf97ce7f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -373,6 +373,7 @@ authors. Evan Miller
Evan Miller

πŸ–‹ luvchurchill
luvchurchill

πŸ’» + Ze-en Xiong
Ze-en Xiong

πŸ–‹ From b7b74910d8fe8aed81df5fe120bc2f4c272877de Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:37:02 +0000 Subject: [PATCH 1212/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7d26d4cb..b093b480 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2640,6 +2640,15 @@ "contributions": [ "code" ] + }, + { + "login": "LeverImmy", + "name": "Ze-en Xiong", + "avatar_url": "https://avatars.githubusercontent.com/u/47663913?v=4", + "profile": "https://leverimmy.top/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 1c3b129a532d7d99bf81a232ae76c49892c6ff82 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:39:18 +0000 Subject: [PATCH 1213/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index bf97ce7f..a037a647 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -374,6 +374,7 @@ authors. Evan Miller
Evan Miller

πŸ–‹ luvchurchill
luvchurchill

πŸ’» Ze-en Xiong
Ze-en Xiong

πŸ–‹ + Parnav Harinathan
Parnav Harinathan

πŸ–‹ From 1e69e6799778ce54d64227a05dd60e4e89753bbd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:39:19 +0000 Subject: [PATCH 1214/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b093b480..60f034ef 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2649,6 +2649,15 @@ "contributions": [ "content" ] + }, + { + "login": "parnavh", + "name": "Parnav Harinathan", + "avatar_url": "https://avatars.githubusercontent.com/u/45985534?v=4", + "profile": "https://github.com/parnavh", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 0d37f9011c818112c2c9ff1792c3b8a55a6c3160 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:40:36 +0000 Subject: [PATCH 1215/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index a037a647..a74e77f5 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -375,6 +375,7 @@ authors. luvchurchill
luvchurchill

πŸ’» Ze-en Xiong
Ze-en Xiong

πŸ–‹ Parnav Harinathan
Parnav Harinathan

πŸ–‹ + 0Ahmed-0
0Ahmed-0

πŸ–‹ From d53ae18918a0e2f65f981938326cc8c03a862595 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:40:37 +0000 Subject: [PATCH 1216/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 60f034ef..0328a51c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2658,6 +2658,15 @@ "contributions": [ "content" ] + }, + { + "login": "0Ahmed-0", + "name": "0Ahmed-0", + "avatar_url": "https://avatars.githubusercontent.com/u/111569638?v=4", + "profile": "https://github.com/0Ahmed-0", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From d8ecf4bc2d34a10149999a7974d5ba71625fab90 Mon Sep 17 00:00:00 2001 From: liv Date: Fri, 15 Mar 2024 15:01:32 +0100 Subject: [PATCH 1217/1293] fix: clean up "return" wording in iterators4 --- exercises/18_iterators/iterators4.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/18_iterators/iterators4.rs b/exercises/18_iterators/iterators4.rs index 79e1692b..3c0724e9 100644 --- a/exercises/18_iterators/iterators4.rs +++ b/exercises/18_iterators/iterators4.rs @@ -8,7 +8,7 @@ pub fn factorial(num: u64) -> u64 { // Complete this function to return the factorial of num // Do not use: - // - return + // - early returns (using the `return` keyword explicitly) // Try not to use: // - imperative style loops (for, while) // - additional variables From ae69f423cd3a3cb795e0864316dfaf6198fd511c Mon Sep 17 00:00:00 2001 From: guizo792 <95940388+guizo792@users.noreply.github.com> Date: Fri, 15 Mar 2024 17:36:28 +0000 Subject: [PATCH 1218/1293] Update exercises/03_if/if1.rs Co-authored-by: liv --- exercises/03_if/if1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/03_if/if1.rs b/exercises/03_if/if1.rs index 38d283c2..d2afccf8 100644 --- a/exercises/03_if/if1.rs +++ b/exercises/03_if/if1.rs @@ -6,7 +6,7 @@ pub fn bigger(a: i32, b: i32) -> i32 { // Complete this function to return the bigger number! - // If both numbers are equal, any of them is returned. + // If both numbers are equal, any of them can be returned. // Do not use: // - another function call // - additional variables From 60f44cc5097471d76e54761e36a7bddfdbcfb4fd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 19:56:54 +0000 Subject: [PATCH 1219/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index a74e77f5..5515745f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -376,6 +376,7 @@ authors. Ze-en Xiong
Ze-en Xiong

πŸ–‹ Parnav Harinathan
Parnav Harinathan

πŸ–‹ 0Ahmed-0
0Ahmed-0

πŸ–‹ + guizo792
guizo792

πŸ–‹ From d4233f816674a98bc603bb551d6729eb92f5e75e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 19:56:55 +0000 Subject: [PATCH 1220/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0328a51c..2f6cd732 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2667,6 +2667,15 @@ "contributions": [ "content" ] + }, + { + "login": "guizo792", + "name": "guizo792", + "avatar_url": "https://avatars.githubusercontent.com/u/95940388?v=4", + "profile": "https://github.com/guizo792", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 80388c042bd1c0048fccf1cf739486642969b8a7 Mon Sep 17 00:00:00 2001 From: Kazuki Matsuo Date: Sat, 16 Mar 2024 13:56:34 +0900 Subject: [PATCH 1221/1293] fix(verify): show stdout of the last line --- src/verify.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/verify.rs b/src/verify.rs index 8a2ad49f..aee2afa3 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -38,6 +38,15 @@ pub fn verify<'a>( percentage += 100.0 / total as f32; bar.inc(1); bar.set_message(format!("({:.1} %)", percentage)); + if bar.position() == total as u64 { + println!( + "Progress: You completed {} / {} exercises ({:.1} %).", + bar.position(), + total, + percentage + ); + bar.finish(); + } } Ok(()) } From a07172a069ea0a70e70256bf981d33c5b03acfb0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 12:19:36 +0000 Subject: [PATCH 1222/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 5515745f..00122e07 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -377,6 +377,7 @@ authors. Parnav Harinathan
Parnav Harinathan

πŸ–‹ 0Ahmed-0
0Ahmed-0

πŸ–‹ guizo792
guizo792

πŸ–‹ + Kazuki Matsuo
Kazuki Matsuo

πŸ’» From e1fa6cf30bfa82ce3cf3882a146f9fd7c434692d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 12:19:37 +0000 Subject: [PATCH 1223/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2f6cd732..f2446f1f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2676,6 +2676,15 @@ "contributions": [ "content" ] + }, + { + "login": "kazu728", + "name": "Kazuki Matsuo", + "avatar_url": "https://avatars.githubusercontent.com/u/34614358?v=4", + "profile": "https://github.com/kazu728", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From 71700c506c34af636fc9d4098b5bebc21dfe9a3c Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 18 Mar 2024 01:12:37 +0100 Subject: [PATCH 1224/1293] Remove unneeded Arc --- exercises/20_threads/threads3.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/exercises/20_threads/threads3.rs b/exercises/20_threads/threads3.rs index 91006bbc..acb97b4b 100644 --- a/exercises/20_threads/threads3.rs +++ b/exercises/20_threads/threads3.rs @@ -27,22 +27,18 @@ impl Queue { } fn send_tx(q: Queue, tx: mpsc::Sender) -> () { - let qc = Arc::new(q); - let qc1 = Arc::clone(&qc); - let qc2 = Arc::clone(&qc); - thread::spawn(move || { - for val in &qc1.first_half { + for val in q.first_half { println!("sending {:?}", val); - tx.send(*val).unwrap(); + tx.send(val).unwrap(); thread::sleep(Duration::from_secs(1)); } }); thread::spawn(move || { - for val in &qc2.second_half { + for val in q.second_half { println!("sending {:?}", val); - tx.send(*val).unwrap(); + tx.send(val).unwrap(); thread::sleep(Duration::from_secs(1)); } }); From 1fe32a7ff2250ae893fdd54b394e6521d32dd024 Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 18 Mar 2024 01:44:25 +0100 Subject: [PATCH 1225/1293] Fix the sysroot path when it contains whitespaces --- src/project.rs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/project.rs b/src/project.rs index bcbd7ada..00fc304d 100644 --- a/src/project.rs +++ b/src/project.rs @@ -2,7 +2,7 @@ use glob::glob; use serde::{Deserialize, Serialize}; use std::env; use std::error::Error; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use std::process::Command; /// Contains the structure of resulting rust-project.json file @@ -79,21 +79,24 @@ impl RustAnalyzerProject { .output()? .stdout; - let toolchain = String::from_utf8_lossy(&toolchain); - let mut whitespace_iter = toolchain.split_whitespace(); + let toolchain = String::from_utf8(toolchain)?; + let toolchain = toolchain.trim_end(); - let toolchain = whitespace_iter.next().unwrap_or(&toolchain); + println!("Determined toolchain: {toolchain}\n"); - println!("Determined toolchain: {}\n", &toolchain); - - self.sysroot_src = (std::path::Path::new(toolchain) + let Ok(path) = Path::new(toolchain) .join("lib") .join("rustlib") .join("src") .join("rust") .join("library") - .to_string_lossy()) - .to_string(); + .into_os_string() + .into_string() + else { + return Err("The sysroot path is invalid UTF8".into()); + }; + self.sysroot_src = path; + Ok(()) } } From f2833c5279a139ee5ab747b3dc573946a524349f Mon Sep 17 00:00:00 2001 From: Dan Bond Date: Mon, 18 Mar 2024 16:47:15 -0700 Subject: [PATCH 1226/1293] options1: Update wording & fix grammar Signed-off-by: Dan Bond --- exercises/12_options/options1.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/exercises/12_options/options1.rs b/exercises/12_options/options1.rs index e131b48b..3cbfecd6 100644 --- a/exercises/12_options/options1.rs +++ b/exercises/12_options/options1.rs @@ -6,11 +6,11 @@ // I AM NOT DONE // This function returns how much icecream there is left in the fridge. -// If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them +// If it's before 10PM, there's 5 scoops left. At 10PM, someone eats it // all, so there'll be no more left :( fn maybe_icecream(time_of_day: u16) -> Option { // We use the 24-hour system here, so 10PM is a value of 22 and 12AM is a - // value of 0 The Option output should gracefully handle cases where + // value of 0. The Option output should gracefully handle cases where // time_of_day > 23. // TODO: Complete the function body - remember to return an Option! ??? @@ -22,10 +22,11 @@ mod tests { #[test] fn check_icecream() { + assert_eq!(maybe_icecream(0), Some(5)); assert_eq!(maybe_icecream(9), Some(5)); - assert_eq!(maybe_icecream(10), Some(5)); - assert_eq!(maybe_icecream(23), Some(0)); + assert_eq!(maybe_icecream(18), Some(5)); assert_eq!(maybe_icecream(22), Some(0)); + assert_eq!(maybe_icecream(23), Some(0)); assert_eq!(maybe_icecream(25), None); } From eb952a480d2dabcafa8b55e1a89872c9b5e4194b Mon Sep 17 00:00:00 2001 From: Dan Bond Date: Mon, 18 Mar 2024 16:47:54 -0700 Subject: [PATCH 1227/1293] verify: fix success message spacing Signed-off-by: Dan Bond --- src/verify.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/verify.rs b/src/verify.rs index aee2afa3..cafecab0 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -195,7 +195,7 @@ fn prompt_for_completion( if no_emoji { println!("~*~ {success_msg} ~*~") } else { - println!("πŸŽ‰ πŸŽ‰ {success_msg} πŸŽ‰ πŸŽ‰") + println!("πŸŽ‰ πŸŽ‰ {success_msg} πŸŽ‰ πŸŽ‰") } println!(); From e276c1219279e14b267a36e99fb3908427bc67ff Mon Sep 17 00:00:00 2001 From: honeywest Date: Thu, 21 Mar 2024 15:18:50 +0800 Subject: [PATCH 1228/1293] feat: ui format --- src/ui.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui.rs b/src/ui.rs index 74835e13..d8177b9f 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,5 +1,5 @@ macro_rules! print_emoji { - ($emoji:expr, $sign:expr, $color: ident ,$fmt:literal, $ex:expr) => {{ + ($emoji:expr, $sign:expr, $color: ident, $fmt:literal, $ex:expr) => {{ use console::{style, Emoji}; use std::env; let formatstr = format!($fmt, $ex); From 3dce7e56961a40748f428d10c50540a075839f8d Mon Sep 17 00:00:00 2001 From: mo8it Date: Sat, 23 Mar 2024 18:51:25 +0100 Subject: [PATCH 1229/1293] Improvements to watch mode --- Cargo.lock | 7 +++++ Cargo.toml | 1 + src/main.rs | 87 ++++++++++++++++++++++++++++++----------------------- 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3950c476..e86f9fa4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -536,6 +536,7 @@ dependencies = [ "regex", "serde", "serde_json", + "shlex", "toml", ] @@ -594,6 +595,12 @@ dependencies = [ "serde", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "strsim" version = "0.11.0" diff --git a/Cargo.toml b/Cargo.toml index 218b7990..2cf8bc39 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ notify-debouncer-mini = "0.4.1" regex = "1.10.3" serde_json = "1.0.114" serde = { version = "1.0.197", features = ["derive"] } +shlex = "1.3.0" toml = "0.8.10" [[bin]] diff --git a/src/main.rs b/src/main.rs index a06f0c56..7c469d5c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ use clap::{Parser, Subcommand}; use console::Emoji; use notify_debouncer_mini::notify::{self, RecursiveMode}; use notify_debouncer_mini::{new_debouncer, DebouncedEventKind}; +use shlex::Shlex; use std::ffi::OsStr; use std::fs; use std::io::{self, prelude::*}; @@ -25,6 +26,16 @@ mod project; mod run; mod verify; +const WATCH_MODE_HELP_MESSAGE: &str = "Commands available to you in watch mode: + hint - prints the current exercise's hint + clear - clears the screen + quit - quits watch mode + ! - executes a command, like `!rustc --explain E0381` + help - displays this help message + +Watch mode automatically re-evaluates the current exercise +when you edit a file's contents."; + /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code #[derive(Parser)] #[command(version)] @@ -246,47 +257,49 @@ fn main() { } fn spawn_watch_shell( - failed_exercise_hint: &Arc>>, + failed_exercise_hint: Arc>>, should_quit: Arc, ) { - let failed_exercise_hint = Arc::clone(failed_exercise_hint); println!("Welcome to watch mode! You can type 'help' to get an overview of the commands you can use here."); - thread::spawn(move || loop { + + thread::spawn(move || { let mut input = String::new(); - match io::stdin().read_line(&mut input) { - Ok(_) => { - let input = input.trim(); - if input == "hint" { - if let Some(hint) = &*failed_exercise_hint.lock().unwrap() { - println!("{hint}"); - } - } else if input == "clear" { - println!("\x1B[2J\x1B[1;1H"); - } else if input.eq("quit") { - should_quit.store(true, Ordering::SeqCst); - println!("Bye!"); - } else if input.eq("help") { - println!("Commands available to you in watch mode:"); - println!(" hint - prints the current exercise's hint"); - println!(" clear - clears the screen"); - println!(" quit - quits watch mode"); - println!(" ! - executes a command, like `!rustc --explain E0381`"); - println!(" help - displays this help message"); - println!(); - println!("Watch mode automatically re-evaluates the current exercise"); - println!("when you edit a file's contents.") - } else if let Some(cmd) = input.strip_prefix('!') { - let parts: Vec<&str> = cmd.split_whitespace().collect(); - if parts.is_empty() { - println!("no command provided"); - } else if let Err(e) = Command::new(parts[0]).args(&parts[1..]).status() { - println!("failed to execute command `{}`: {}", cmd, e); - } - } else { - println!("unknown command: {input}"); - } + let mut stdin = io::stdin().lock(); + + loop { + // Recycle input buffer. + input.clear(); + + if let Err(e) = stdin.read_line(&mut input) { + println!("error reading command: {e}"); + } + + let input = input.trim(); + if input == "hint" { + if let Some(hint) = &*failed_exercise_hint.lock().unwrap() { + println!("{hint}"); + } + } else if input == "clear" { + println!("\x1B[2J\x1B[1;1H"); + } else if input == "quit" { + should_quit.store(true, Ordering::SeqCst); + println!("Bye!"); + } else if input == "help" { + println!("{WATCH_MODE_HELP_MESSAGE}"); + } else if let Some(cmd) = input.strip_prefix('!') { + let mut parts = Shlex::new(cmd); + + let Some(program) = parts.next() else { + println!("no command provided"); + continue; + }; + + if let Err(e) = Command::new(program).args(parts).status() { + println!("failed to execute command `{cmd}`: {e}"); + } + } else { + println!("unknown command: {input}\n{WATCH_MODE_HELP_MESSAGE}"); } - Err(error) => println!("error reading command: {error}"), } }); } @@ -348,7 +361,7 @@ fn watch( Ok(_) => return Ok(WatchStatus::Finished), Err(exercise) => Arc::new(Mutex::new(Some(to_owned_hint(exercise)))), }; - spawn_watch_shell(&failed_exercise_hint, Arc::clone(&should_quit)); + spawn_watch_shell(Arc::clone(&failed_exercise_hint), Arc::clone(&should_quit)); loop { match rx.recv_timeout(Duration::from_secs(1)) { Ok(event) => match event { From 0d93266462f56d28501f068a764405a0cd0bf41a Mon Sep 17 00:00:00 2001 From: mo8it Date: Sat, 23 Mar 2024 18:56:30 +0100 Subject: [PATCH 1230/1293] Initialize the input buffer with some capacity --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 7c469d5c..2b6a48cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -263,7 +263,7 @@ fn spawn_watch_shell( println!("Welcome to watch mode! You can type 'help' to get an overview of the commands you can use here."); thread::spawn(move || { - let mut input = String::new(); + let mut input = String::with_capacity(32); let mut stdin = io::stdin().lock(); loop { From 27fa7c3e4a5bb58b21359e9d6246f66b5f20a978 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sat, 23 Mar 2024 19:00:15 +0100 Subject: [PATCH 1231/1293] Move the const string to the bottom like others --- src/main.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main.rs b/src/main.rs index 2b6a48cf..d2614df6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,16 +26,6 @@ mod project; mod run; mod verify; -const WATCH_MODE_HELP_MESSAGE: &str = "Commands available to you in watch mode: - hint - prints the current exercise's hint - clear - clears the screen - quit - quits watch mode - ! - executes a command, like `!rustc --explain E0381` - help - displays this help message - -Watch mode automatically re-evaluates the current exercise -when you edit a file's contents."; - /// Rustlings is a collection of small exercises to get you used to writing and reading Rust code #[derive(Parser)] #[command(version)] @@ -490,3 +480,13 @@ const WELCOME: &str = r" welcome to... | | | |_| \__ \ |_| | | | | | (_| \__ \ |_| \__,_|___/\__|_|_|_| |_|\__, |___/ |___/"; + +const WATCH_MODE_HELP_MESSAGE: &str = "Commands available to you in watch mode: + hint - prints the current exercise's hint + clear - clears the screen + quit - quits watch mode + ! - executes a command, like `!rustc --explain E0381` + help - displays this help message + +Watch mode automatically re-evaluates the current exercise +when you edit a file's contents."; From a325df55d1077c8613905bb82709cd8c80341641 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sat, 23 Mar 2024 21:56:40 +0100 Subject: [PATCH 1232/1293] Cache filters --- src/main.rs | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index a06f0c56..9bf58668 100644 --- a/src/main.rs +++ b/src/main.rs @@ -128,31 +128,45 @@ fn main() { println!("{:<17}\t{:<46}\t{:<7}", "Name", "Path", "Status"); } let mut exercises_done: u16 = 0; - let filters = filter.clone().unwrap_or_default().to_lowercase(); - exercises.iter().for_each(|e| { - let fname = format!("{}", e.path.display()); + let lowercase_filter = filter + .as_ref() + .map(|s| s.to_lowercase()) + .unwrap_or_default(); + let filters = lowercase_filter + .split(',') + .filter_map(|f| { + let f = f.trim(); + if f.is_empty() { + None + } else { + Some(f) + } + }) + .collect::>(); + + for exercise in &exercises { + let fname = format!("{}", exercise.path.display()); let filter_cond = filters - .split(',') - .filter(|f| !f.trim().is_empty()) - .any(|f| e.name.contains(f) || fname.contains(f)); - let status = if e.looks_done() { + .iter() + .any(|f| exercise.name.contains(f) || fname.contains(f)); + let status = if exercise.looks_done() { exercises_done += 1; "Done" } else { "Pending" }; let solve_cond = { - (e.looks_done() && solved) - || (!e.looks_done() && unsolved) + (exercise.looks_done() && solved) + || (!exercise.looks_done() && unsolved) || (!solved && !unsolved) }; if solve_cond && (filter_cond || filter.is_none()) { let line = if paths { format!("{fname}\n") } else if names { - format!("{}\n", e.name) + format!("{}\n", exercise.name) } else { - format!("{:<17}\t{fname:<46}\t{status:<7}\n", e.name) + format!("{:<17}\t{fname:<46}\t{status:<7}\n", exercise.name) }; // Somehow using println! leads to the binary panicking // when its output is piped. @@ -168,7 +182,8 @@ fn main() { }); } } - }); + } + let percentage_progress = exercises_done as f32 / exercises.len() as f32 * 100.0; println!( "Progress: You completed {} / {} exercises ({:.1} %).", From 01b7d6334c44d55f11d7f09c45e76b2db7fef948 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sat, 23 Mar 2024 22:08:25 +0100 Subject: [PATCH 1233/1293] Remove unneeded to_string call --- src/verify.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/verify.rs b/src/verify.rs index aee2afa3..e3a8e887 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -224,7 +224,7 @@ fn prompt_for_completion( let formatted_line = if context_line.important { format!("{}", style(context_line.line).bold()) } else { - context_line.line.to_string() + context_line.line }; println!( From 0aeaccc3a50b5b60b6005161847641bade75effa Mon Sep 17 00:00:00 2001 From: mo8it Date: Sun, 24 Mar 2024 18:34:46 +0100 Subject: [PATCH 1234/1293] Optimize state --- src/exercise.rs | 112 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 75 insertions(+), 37 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 664b362b..b112fe8a 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -1,16 +1,16 @@ use regex::Regex; use serde::Deserialize; -use std::env; use std::fmt::{self, Display, Formatter}; use std::fs::{self, remove_file, File}; -use std::io::Read; +use std::io::{self, BufRead, BufReader}; use std::path::PathBuf; use std::process::{self, Command}; +use std::{array, env, mem}; const RUSTC_COLOR_ARGS: &[&str] = &["--color", "always"]; const RUSTC_EDITION_ARGS: &[&str] = &["--edition", "2021"]; const RUSTC_NO_DEBUG_ARGS: &[&str] = &["-C", "strip=debuginfo"]; -const I_AM_DONE_REGEX: &str = r"(?m)^\s*///?\s*I\s+AM\s+NOT\s+DONE"; +const I_AM_DONE_REGEX: &str = r"^\s*///?\s*I\s+AM\s+NOT\s+DONE"; const CONTEXT: usize = 2; const CLIPPY_CARGO_TOML_PATH: &str = "./exercises/22_clippy/Cargo.toml"; @@ -205,51 +205,89 @@ path = "{}.rs""#, } pub fn state(&self) -> State { - let mut source_file = File::open(&self.path).unwrap_or_else(|e| { + let source_file = File::open(&self.path).unwrap_or_else(|e| { panic!( "We were unable to open the exercise file {}! {e}", self.path.display() ) }); - - let source = { - let mut s = String::new(); - source_file.read_to_string(&mut s).unwrap_or_else(|e| { - panic!( - "We were unable to read the exercise file {}! {e}", - self.path.display() - ) - }); - s + let mut source_reader = BufReader::new(source_file); + let mut read_line = |buf: &mut String| -> io::Result<_> { + let n = source_reader.read_line(buf)?; + if buf.ends_with('\n') { + buf.pop(); + if buf.ends_with('\r') { + buf.pop(); + } + } + Ok(n) }; let re = Regex::new(I_AM_DONE_REGEX).unwrap(); + let mut matched_line_ind: usize = 0; + let mut prev_lines: [_; CONTEXT] = array::from_fn(|_| String::with_capacity(256)); + let mut line = String::with_capacity(256); - if !re.is_match(&source) { - return State::Done; + loop { + match read_line(&mut line) { + Ok(0) => break, + Ok(_) => { + if re.is_match(&line) { + let mut context = Vec::with_capacity(2 * CONTEXT + 1); + for (ind, prev_line) in prev_lines + .into_iter() + .rev() + .take(matched_line_ind) + .enumerate() + { + context.push(ContextLine { + line: prev_line, + // TODO + number: matched_line_ind - CONTEXT + ind + 1, + important: false, + }); + } + + context.push(ContextLine { + line, + number: matched_line_ind + 1, + important: true, + }); + + for ind in 0..CONTEXT { + let mut next_line = String::with_capacity(256); + let Ok(n) = read_line(&mut next_line) else { + break; + }; + + if n == 0 { + break; + } + + context.push(ContextLine { + line: next_line, + number: matched_line_ind + ind + 2, + important: false, + }); + } + + return State::Pending(context); + } + + matched_line_ind += 1; + for prev_line in &mut prev_lines { + mem::swap(&mut line, prev_line); + } + line.clear(); + } + Err(e) => panic!( + "We were unable to read the exercise file {}! {e}", + self.path.display() + ), + } } - let matched_line_index = source - .lines() - .enumerate() - .find_map(|(i, line)| if re.is_match(line) { Some(i) } else { None }) - .expect("This should not happen at all"); - - let min_line = ((matched_line_index as i32) - (CONTEXT as i32)).max(0) as usize; - let max_line = matched_line_index + CONTEXT; - - let context = source - .lines() - .enumerate() - .filter(|&(i, _)| i >= min_line && i <= max_line) - .map(|(i, line)| ContextLine { - line: line.to_string(), - number: i + 1, - important: i == matched_line_index, - }) - .collect(); - - State::Pending(context) + State::Done } // Check that the exercise looks to be solved using self.state() From e1375ef4319641749611124ae495346d32e04e2d Mon Sep 17 00:00:00 2001 From: mo8it Date: Sun, 24 Mar 2024 18:47:27 +0100 Subject: [PATCH 1235/1293] Use to_string_lossy --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 9bf58668..067c810c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -145,7 +145,7 @@ fn main() { .collect::>(); for exercise in &exercises { - let fname = format!("{}", exercise.path.display()); + let fname = exercise.path.to_string_lossy(); let filter_cond = filters .iter() .any(|f| exercise.name.contains(f) || fname.contains(f)); From f205ee3d4c6f259c82e4f1226acc6a5ae5e70031 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sun, 24 Mar 2024 18:50:46 +0100 Subject: [PATCH 1236/1293] Call looks_done only once --- src/main.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 067c810c..f646fdca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -149,17 +149,15 @@ fn main() { let filter_cond = filters .iter() .any(|f| exercise.name.contains(f) || fname.contains(f)); - let status = if exercise.looks_done() { + let looks_done = exercise.looks_done(); + let status = if looks_done { exercises_done += 1; "Done" } else { "Pending" }; - let solve_cond = { - (exercise.looks_done() && solved) - || (!exercise.looks_done() && unsolved) - || (!solved && !unsolved) - }; + let solve_cond = + (looks_done && solved) || (!looks_done && unsolved) || (!solved && !unsolved); if solve_cond && (filter_cond || filter.is_none()) { let line = if paths { format!("{fname}\n") From c0c112985b531bbcf503a2b1a8c2764030a16c99 Mon Sep 17 00:00:00 2001 From: mo8it Date: Sun, 24 Mar 2024 19:18:19 +0100 Subject: [PATCH 1237/1293] Replace regex with winnow --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/exercise.rs | 44 ++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3950c476..e42b8f40 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -533,10 +533,10 @@ dependencies = [ "indicatif", "notify-debouncer-mini", "predicates", - "regex", "serde", "serde_json", "toml", + "winnow", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 218b7990..dd4c0c30 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,10 +15,10 @@ glob = "0.3.0" home = "0.5.9" indicatif = "0.17.8" notify-debouncer-mini = "0.4.1" -regex = "1.10.3" serde_json = "1.0.114" serde = { version = "1.0.197", features = ["derive"] } toml = "0.8.10" +winnow = "0.6.5" [[bin]] name = "rustlings" diff --git a/src/exercise.rs b/src/exercise.rs index b112fe8a..8f580d30 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -1,4 +1,3 @@ -use regex::Regex; use serde::Deserialize; use std::fmt::{self, Display, Formatter}; use std::fs::{self, remove_file, File}; @@ -6,14 +5,34 @@ use std::io::{self, BufRead, BufReader}; use std::path::PathBuf; use std::process::{self, Command}; use std::{array, env, mem}; +use winnow::ascii::{space0, space1}; +use winnow::combinator::opt; +use winnow::Parser; const RUSTC_COLOR_ARGS: &[&str] = &["--color", "always"]; const RUSTC_EDITION_ARGS: &[&str] = &["--edition", "2021"]; const RUSTC_NO_DEBUG_ARGS: &[&str] = &["-C", "strip=debuginfo"]; -const I_AM_DONE_REGEX: &str = r"^\s*///?\s*I\s+AM\s+NOT\s+DONE"; const CONTEXT: usize = 2; const CLIPPY_CARGO_TOML_PATH: &str = "./exercises/22_clippy/Cargo.toml"; +fn not_done(input: &str) -> bool { + ( + space0::<_, ()>, + "//", + opt('/'), + space0, + 'I', + space1, + "AM", + space1, + "NOT", + space1, + "DONE", + ) + .parse_next(&mut &*input) + .is_ok() +} + // Get a temporary file name that is hopefully unique #[inline] fn temp_file() -> String { @@ -223,7 +242,6 @@ path = "{}.rs""#, Ok(n) }; - let re = Regex::new(I_AM_DONE_REGEX).unwrap(); let mut matched_line_ind: usize = 0; let mut prev_lines: [_; CONTEXT] = array::from_fn(|_| String::with_capacity(256)); let mut line = String::with_capacity(256); @@ -232,7 +250,7 @@ path = "{}.rs""#, match read_line(&mut line) { Ok(0) => break, Ok(_) => { - if re.is_match(&line) { + if not_done(&line) { let mut context = Vec::with_capacity(2 * CONTEXT + 1); for (ind, prev_line) in prev_lines .into_iter() @@ -413,4 +431,22 @@ mod test { let out = exercise.compile().unwrap().run().unwrap(); assert!(out.stdout.contains("THIS TEST TOO SHALL PASS")); } + + #[test] + fn test_not_done() { + assert!(not_done("// I AM NOT DONE")); + assert!(not_done("/// I AM NOT DONE")); + assert!(not_done("// I AM NOT DONE")); + assert!(not_done("/// I AM NOT DONE")); + assert!(not_done("// I AM NOT DONE")); + assert!(not_done("// I AM NOT DONE")); + assert!(not_done("// I AM NOT DONE")); + assert!(not_done("// I AM NOT DONE ")); + assert!(not_done("// I AM NOT DONE!")); + + assert!(!not_done("I AM NOT DONE")); + assert!(!not_done("// NOT DONE")); + assert!(!not_done("DONE")); + assert!(!not_done("// i am not done")); + } } From bdf826a026cfe7f89c31433cfd2b9a32cbe66d2c Mon Sep 17 00:00:00 2001 From: mo8it Date: Sun, 24 Mar 2024 22:22:55 +0100 Subject: [PATCH 1238/1293] Make "I AM NOT DONE" caseless --- src/exercise.rs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 8f580d30..136e9439 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -5,7 +5,7 @@ use std::io::{self, BufRead, BufReader}; use std::path::PathBuf; use std::process::{self, Command}; use std::{array, env, mem}; -use winnow::ascii::{space0, space1}; +use winnow::ascii::{space0, Caseless}; use winnow::combinator::opt; use winnow::Parser; @@ -21,13 +21,7 @@ fn not_done(input: &str) -> bool { "//", opt('/'), space0, - 'I', - space1, - "AM", - space1, - "NOT", - space1, - "DONE", + Caseless("I AM NOT DONE"), ) .parse_next(&mut &*input) .is_ok() @@ -438,15 +432,13 @@ mod test { assert!(not_done("/// I AM NOT DONE")); assert!(not_done("// I AM NOT DONE")); assert!(not_done("/// I AM NOT DONE")); - assert!(not_done("// I AM NOT DONE")); - assert!(not_done("// I AM NOT DONE")); - assert!(not_done("// I AM NOT DONE")); assert!(not_done("// I AM NOT DONE ")); assert!(not_done("// I AM NOT DONE!")); + assert!(not_done("// I am not done")); + assert!(not_done("// i am NOT done")); assert!(!not_done("I AM NOT DONE")); assert!(!not_done("// NOT DONE")); assert!(!not_done("DONE")); - assert!(!not_done("// i am not done")); } } From 51b4c240ed006a8279bd94e9b7ed5df67086c86e Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 00:30:01 +0100 Subject: [PATCH 1239/1293] Use `which` instead of running `rustc --version` --- Cargo.lock | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 16 ++-------------- 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3950c476..1bfd301f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -195,6 +195,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + [[package]] name = "encode_unicode" version = "0.3.6" @@ -207,6 +213,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "filetime" version = "0.2.23" @@ -354,6 +370,12 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + [[package]] name = "log" version = "0.4.21" @@ -521,6 +543,19 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "rustix" +version = "0.38.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +dependencies = [ + "bitflags 2.4.2", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "rustlings" version = "5.6.1" @@ -537,6 +572,7 @@ dependencies = [ "serde", "serde_json", "toml", + "which", ] [[package]] @@ -694,6 +730,18 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "which" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8211e4f58a2b2805adfbefbc07bab82958fc91e3836339b1ab7ae32465dce0d7" +dependencies = [ + "either", + "home", + "rustix", + "winsafe", +] + [[package]] name = "winapi" version = "0.3.9" @@ -865,3 +913,9 @@ checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" dependencies = [ "memchr", ] + +[[package]] +name = "winsafe" +version = "0.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" diff --git a/Cargo.toml b/Cargo.toml index 218b7990..de65fc6e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ regex = "1.10.3" serde_json = "1.0.114" serde = { version = "1.0.197", features = ["derive"] } toml = "0.8.10" +which = "6.0.1" [[bin]] name = "rustlings" diff --git a/src/main.rs b/src/main.rs index a06f0c56..f932631b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,7 @@ use std::ffi::OsStr; use std::fs; use std::io::{self, prelude::*}; use std::path::Path; -use std::process::{Command, Stdio}; +use std::process::Command; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::mpsc::{channel, RecvTimeoutError}; use std::sync::{Arc, Mutex}; @@ -100,7 +100,7 @@ fn main() { std::process::exit(1); } - if !rustc_exists() { + if which::which("rustc").is_err() { println!("We cannot find `rustc`."); println!("Try running `rustc --version` to diagnose your problem."); println!("For instructions on how to install Rust, check the README."); @@ -403,18 +403,6 @@ fn watch( } } -fn rustc_exists() -> bool { - Command::new("rustc") - .args(["--version"]) - .stdout(Stdio::null()) - .stderr(Stdio::null()) - .stdin(Stdio::null()) - .spawn() - .and_then(|mut child| child.wait()) - .map(|status| status.success()) - .unwrap_or(false) -} - const DEFAULT_OUT: &str = r#"Thanks for installing Rustlings! Is this your first time? Don't worry, Rustlings was made for beginners! We are From 83cd91ccca22e36ed94e03cc622a88ef45e6da10 Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 02:35:51 +0100 Subject: [PATCH 1240/1293] Replace toml with toml_edit --- Cargo.lock | 18 +++--------------- Cargo.toml | 2 +- src/main.rs | 6 ++++-- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3950c476..52b27259 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -536,7 +536,7 @@ dependencies = [ "regex", "serde", "serde_json", - "toml", + "toml_edit", ] [[package]] @@ -617,18 +617,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" -[[package]] -name = "toml" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - [[package]] name = "toml_datetime" version = "0.6.5" @@ -640,9 +628,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.6" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" dependencies = [ "indexmap", "serde", diff --git a/Cargo.toml b/Cargo.toml index 218b7990..28614595 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ notify-debouncer-mini = "0.4.1" regex = "1.10.3" serde_json = "1.0.114" serde = { version = "1.0.197", features = ["derive"] } -toml = "0.8.10" +toml_edit = { version = "0.22.9", default-features = false, features = ["parse", "serde"] } [[bin]] name = "rustlings" diff --git a/src/main.rs b/src/main.rs index a06f0c56..8e0029dd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -107,8 +107,10 @@ fn main() { std::process::exit(1); } - let toml_str = &fs::read_to_string("info.toml").unwrap(); - let exercises = toml::from_str::(toml_str).unwrap().exercises; + let info_file = fs::read_to_string("info.toml").unwrap(); + let exercises = toml_edit::de::from_str::(&info_file) + .unwrap() + .exercises; let verbose = args.nocapture; let command = args.command.unwrap_or_else(|| { From e4520602f52935ff310534afc65160bcc5796a97 Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 02:41:45 +0100 Subject: [PATCH 1241/1293] Use the NotFound variant of the IO error --- src/main.rs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main.rs b/src/main.rs index 8e0029dd..d6542aa2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -91,15 +91,6 @@ fn main() { println!("\n{WELCOME}\n"); } - if !Path::new("info.toml").exists() { - println!( - "{} must be run from the rustlings directory", - std::env::current_exe().unwrap().to_str().unwrap() - ); - println!("Try `cd rustlings/`!"); - std::process::exit(1); - } - if !rustc_exists() { println!("We cannot find `rustc`."); println!("Try running `rustc --version` to diagnose your problem."); @@ -107,7 +98,15 @@ fn main() { std::process::exit(1); } - let info_file = fs::read_to_string("info.toml").unwrap(); + let info_file = fs::read_to_string("info.toml").unwrap_or_else(|e| { + match e.kind() { + io::ErrorKind::NotFound => println!( + "The program must be run from the rustlings directory\nTry `cd rustlings/`!", + ), + _ => println!("Failed to read the info.toml file: {e}"), + } + std::process::exit(1); + }); let exercises = toml_edit::de::from_str::(&info_file) .unwrap() .exercises; From b3aef377beacb09d8efff5a59376edc7fae7766c Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 03:33:14 +0100 Subject: [PATCH 1242/1293] Use a custom capacity for the JSON buffer --- src/project.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/project.rs b/src/project.rs index 00fc304d..93f941dd 100644 --- a/src/project.rs +++ b/src/project.rs @@ -31,10 +31,12 @@ impl RustAnalyzerProject { /// Write rust-project.json to disk pub fn write_to_disk(&self) -> Result<(), std::io::Error> { - std::fs::write( - "./rust-project.json", - serde_json::to_vec(&self).expect("Failed to serialize to JSON"), - )?; + // Using the capacity 2^14 = 16384 since the file length in bytes is higher than 2^13. + // The final length is not known exactly because it depends on the user's sysroot path, + // the current number of exercises etc. + let mut buf = Vec::with_capacity(16384); + serde_json::to_writer(&mut buf, &self).expect("Failed to serialize to JSON"); + std::fs::write("rust-project.json", buf)?; Ok(()) } From efa9f5704853acda6874725004b480d720683faf Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 03:46:56 +0100 Subject: [PATCH 1243/1293] Add anyhow --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + src/main.rs | 5 ++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 3950c476..270051ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,6 +59,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "anyhow" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" + [[package]] name = "assert_cmd" version = "2.0.14" @@ -525,6 +531,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" name = "rustlings" version = "5.6.1" dependencies = [ + "anyhow", "assert_cmd", "clap", "console", diff --git a/Cargo.toml b/Cargo.toml index 218b7990..d7b5a096 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ authors = [ edition = "2021" [dependencies] +anyhow = "1.0.81" clap = { version = "4.5.2", features = ["derive"] } console = "0.15.8" glob = "0.3.0" diff --git a/src/main.rs b/src/main.rs index a06f0c56..4a4f2198 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ use crate::exercise::{Exercise, ExerciseList}; use crate::project::RustAnalyzerProject; use crate::run::{reset, run}; use crate::verify::verify; +use anyhow::Result; use clap::{Parser, Subcommand}; use console::Emoji; use notify_debouncer_mini::notify::{self, RecursiveMode}; @@ -84,7 +85,7 @@ enum Subcommands { Lsp, } -fn main() { +fn main() -> Result<()> { let args = Args::parse(); if args.command.is_none() { @@ -243,6 +244,8 @@ fn main() { } }, } + + Ok(()) } fn spawn_watch_shell( From 51712cc19f97972f470c4d8791974f8eaba095d1 Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 03:49:10 +0100 Subject: [PATCH 1244/1293] Merge get_sysroot_src into the constructor --- src/main.rs | 5 +--- src/project.rs | 77 +++++++++++++++++++++++++------------------------- 2 files changed, 39 insertions(+), 43 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4a4f2198..4ce0b30d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -204,10 +204,7 @@ fn main() -> Result<()> { } Subcommands::Lsp => { - let mut project = RustAnalyzerProject::new(); - project - .get_sysroot_src() - .expect("Couldn't find toolchain path, do you have `rustc` installed?"); + let mut project = RustAnalyzerProject::build()?; project .exercises_to_json() .expect("Couldn't parse rustlings exercises files"); diff --git a/src/project.rs b/src/project.rs index 93f941dd..a7414d1f 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,3 +1,4 @@ +use anyhow::{bail, Context, Result}; use glob::glob; use serde::{Deserialize, Serialize}; use std::env; @@ -22,11 +23,44 @@ pub struct Crate { } impl RustAnalyzerProject { - pub fn new() -> RustAnalyzerProject { - RustAnalyzerProject { - sysroot_src: String::new(), - crates: Vec::new(), + pub fn build() -> Result { + // check if RUST_SRC_PATH is set + if let Ok(sysroot_src) = env::var("RUST_SRC_PATH") { + return Ok(Self { + sysroot_src, + crates: Vec::new(), + }); } + + let toolchain = Command::new("rustc") + .arg("--print") + .arg("sysroot") + .output() + .context("Failed to get the sysroot from `rustc`. Do you have `rustc` installed?")? + .stdout; + + let toolchain = + String::from_utf8(toolchain).context("The toolchain path is invalid UTF8")?; + let toolchain = toolchain.trim_end(); + + println!("Determined toolchain: {toolchain}\n"); + + let Ok(sysroot_src) = Path::new(toolchain) + .join("lib") + .join("rustlib") + .join("src") + .join("rust") + .join("library") + .into_os_string() + .into_string() + else { + bail!("The sysroot path is invalid UTF8"); + }; + + Ok(Self { + sysroot_src, + crates: Vec::new(), + }) } /// Write rust-project.json to disk @@ -66,39 +100,4 @@ impl RustAnalyzerProject { } Ok(()) } - - /// Use `rustc` to determine the default toolchain - pub fn get_sysroot_src(&mut self) -> Result<(), Box> { - // check if RUST_SRC_PATH is set - if let Ok(path) = env::var("RUST_SRC_PATH") { - self.sysroot_src = path; - return Ok(()); - } - - let toolchain = Command::new("rustc") - .arg("--print") - .arg("sysroot") - .output()? - .stdout; - - let toolchain = String::from_utf8(toolchain)?; - let toolchain = toolchain.trim_end(); - - println!("Determined toolchain: {toolchain}\n"); - - let Ok(path) = Path::new(toolchain) - .join("lib") - .join("rustlib") - .join("src") - .join("rust") - .join("library") - .into_os_string() - .into_string() - else { - return Err("The sysroot path is invalid UTF8".into()); - }; - self.sysroot_src = path; - - Ok(()) - } } From d095a307ddbdef1f67e89320491c76a1bed1c8eb Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 03:59:21 +0100 Subject: [PATCH 1245/1293] Avoid allocations on every call to Path::join --- src/project.rs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/project.rs b/src/project.rs index a7414d1f..c017aa22 100644 --- a/src/project.rs +++ b/src/project.rs @@ -3,7 +3,7 @@ use glob::glob; use serde::{Deserialize, Serialize}; use std::env; use std::error::Error; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use std::process::Command; /// Contains the structure of resulting rust-project.json file @@ -45,15 +45,9 @@ impl RustAnalyzerProject { println!("Determined toolchain: {toolchain}\n"); - let Ok(sysroot_src) = Path::new(toolchain) - .join("lib") - .join("rustlib") - .join("src") - .join("rust") - .join("library") - .into_os_string() - .into_string() - else { + let mut sysroot_src = PathBuf::with_capacity(256); + sysroot_src.extend([toolchain, "lib", "rustlib", "src", "rust", "library"]); + let Ok(sysroot_src) = sysroot_src.into_os_string().into_string() else { bail!("The sysroot path is invalid UTF8"); }; From dca3ea355ea1809318ea545f23f396405d86aa0a Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 14:10:51 +0100 Subject: [PATCH 1246/1293] Remove the home dependency since it is not used --- Cargo.lock | 10 ---------- Cargo.toml | 1 - 2 files changed, 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3950c476..9d8606ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -255,15 +255,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "indexmap" version = "2.2.5" @@ -529,7 +520,6 @@ dependencies = [ "clap", "console", "glob", - "home", "indicatif", "notify-debouncer-mini", "predicates", diff --git a/Cargo.toml b/Cargo.toml index 218b7990..2e6ab3bd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,6 @@ edition = "2021" clap = { version = "4.5.2", features = ["derive"] } console = "0.15.8" glob = "0.3.0" -home = "0.5.9" indicatif = "0.17.8" notify-debouncer-mini = "0.4.1" regex = "1.10.3" From b932ed1f672532e7dccf6cd23f6b9895c24a4de7 Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 17:14:41 +0100 Subject: [PATCH 1247/1293] Don't capture stderr --- src/project.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/project.rs b/src/project.rs index c017aa22..1f42d4eb 100644 --- a/src/project.rs +++ b/src/project.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use std::env; use std::error::Error; use std::path::PathBuf; -use std::process::Command; +use std::process::{Command, Stdio}; /// Contains the structure of resulting rust-project.json file /// and functions to build the data required to create the file @@ -35,6 +35,7 @@ impl RustAnalyzerProject { let toolchain = Command::new("rustc") .arg("--print") .arg("sysroot") + .stderr(Stdio::inherit()) .output() .context("Failed to get the sysroot from `rustc`. Do you have `rustc` installed?")? .stdout; From d911586788ad411be92e43cdc2f7e88fee7e78a4 Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 17:21:54 +0100 Subject: [PATCH 1248/1293] Pipe the output to null instead of capturing and ignoring it --- src/exercise.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 664b362b..e6a9222c 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -5,7 +5,7 @@ use std::fmt::{self, Display, Formatter}; use std::fs::{self, remove_file, File}; use std::io::Read; use std::path::PathBuf; -use std::process::{self, Command}; +use std::process::{self, Command, Stdio}; const RUSTC_COLOR_ARGS: &[&str] = &["--color", "always"]; const RUSTC_EDITION_ARGS: &[&str] = &["--edition", "2021"]; @@ -148,7 +148,10 @@ path = "{}.rs""#, .args(RUSTC_COLOR_ARGS) .args(RUSTC_EDITION_ARGS) .args(RUSTC_NO_DEBUG_ARGS) - .output() + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status() .expect("Failed to compile!"); // Due to an issue with Clippy, a cargo clean is required to catch all lints. // See https://github.com/rust-lang/rust-clippy/issues/2604 @@ -157,7 +160,10 @@ path = "{}.rs""#, Command::new("cargo") .args(["clean", "--manifest-path", CLIPPY_CARGO_TOML_PATH]) .args(RUSTC_COLOR_ARGS) - .output() + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status() .expect("Failed to run 'cargo clean'"); Command::new("cargo") .args(["clippy", "--manifest-path", CLIPPY_CARGO_TOML_PATH]) From 87e55ccffde51b08be7d90ab53f1bb2462efa85a Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 22:20:00 +0100 Subject: [PATCH 1249/1293] Use the parsed exercises instead of glob --- Cargo.toml | 1 - src/main.rs | 2 +- src/project.rs | 35 +++++++++++++---------------------- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d7b5a096..ef499473 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,6 @@ edition = "2021" anyhow = "1.0.81" clap = { version = "4.5.2", features = ["derive"] } console = "0.15.8" -glob = "0.3.0" home = "0.5.9" indicatif = "0.17.8" notify-debouncer-mini = "0.4.1" diff --git a/src/main.rs b/src/main.rs index 4ce0b30d..803e2f8f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -206,7 +206,7 @@ fn main() -> Result<()> { Subcommands::Lsp => { let mut project = RustAnalyzerProject::build()?; project - .exercises_to_json() + .exercises_to_json(exercises) .expect("Couldn't parse rustlings exercises files"); if project.crates.is_empty() { diff --git a/src/project.rs b/src/project.rs index 1f42d4eb..534aab09 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,11 +1,12 @@ use anyhow::{bail, Context, Result}; -use glob::glob; use serde::{Deserialize, Serialize}; use std::env; use std::error::Error; use std::path::PathBuf; use std::process::{Command, Stdio}; +use crate::exercise::Exercise; + /// Contains the structure of resulting rust-project.json file /// and functions to build the data required to create the file #[derive(Serialize, Deserialize)] @@ -69,30 +70,20 @@ impl RustAnalyzerProject { Ok(()) } - /// If path contains .rs extension, add a crate to `rust-project.json` - fn path_to_json(&mut self, path: PathBuf) -> Result<(), Box> { - if let Some(ext) = path.extension() { - if ext == "rs" { - self.crates.push(Crate { - root_module: path.display().to_string(), - edition: "2021".to_string(), - deps: Vec::new(), - // This allows rust_analyzer to work inside #[test] blocks - cfg: vec!["test".to_string()], - }) - } - } - - Ok(()) - } - /// Parse the exercises folder for .rs files, any matches will create /// a new `crate` in rust-project.json which allows rust-analyzer to /// treat it like a normal binary - pub fn exercises_to_json(&mut self) -> Result<(), Box> { - for path in glob("./exercises/**/*")? { - self.path_to_json(path?)?; - } + pub fn exercises_to_json(&mut self, exercises: Vec) -> Result<(), Box> { + self.crates = exercises + .into_iter() + .map(|exercise| Crate { + root_module: exercise.path.display().to_string(), + edition: "2021".to_string(), + deps: Vec::new(), + // This allows rust_analyzer to work inside #[test] blocks + cfg: vec!["test".to_string()], + }) + .collect(); Ok(()) } } From f5135ae4df96ee018896d667f3dffa187c959193 Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 22:29:33 +0100 Subject: [PATCH 1250/1293] Remove unneeded check if crates is empty --- src/main.rs | 4 +--- src/project.rs | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 803e2f8f..1f260ab7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -209,9 +209,7 @@ fn main() -> Result<()> { .exercises_to_json(exercises) .expect("Couldn't parse rustlings exercises files"); - if project.crates.is_empty() { - println!("Failed find any exercises, make sure you're in the `rustlings` folder"); - } else if project.write_to_disk().is_err() { + if project.write_to_disk().is_err() { println!("Failed to write rust-project.json to disk for rust-analyzer"); } else { println!("Successfully generated rust-project.json"); diff --git a/src/project.rs b/src/project.rs index 534aab09..835a951a 100644 --- a/src/project.rs +++ b/src/project.rs @@ -12,7 +12,7 @@ use crate::exercise::Exercise; #[derive(Serialize, Deserialize)] pub struct RustAnalyzerProject { sysroot_src: String, - pub crates: Vec, + crates: Vec, } #[derive(Serialize, Deserialize)] From a5ba44bd6a939a720cc600e06785bea98baabc37 Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 22:30:16 +0100 Subject: [PATCH 1251/1293] RustAnalyzerProject is not deserialized --- src/project.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/project.rs b/src/project.rs index 835a951a..347ca461 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,5 +1,5 @@ use anyhow::{bail, Context, Result}; -use serde::{Deserialize, Serialize}; +use serde::Serialize; use std::env; use std::error::Error; use std::path::PathBuf; @@ -9,13 +9,13 @@ use crate::exercise::Exercise; /// Contains the structure of resulting rust-project.json file /// and functions to build the data required to create the file -#[derive(Serialize, Deserialize)] +#[derive(Serialize)] pub struct RustAnalyzerProject { sysroot_src: String, crates: Vec, } -#[derive(Serialize, Deserialize)] +#[derive(Serialize)] pub struct Crate { root_module: String, edition: String, From 8d3ec24c11654d668ef1e1638a7770ec8beadfb7 Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 22:41:14 +0100 Subject: [PATCH 1252/1293] Optimize the serialized data types --- src/project.rs | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/project.rs b/src/project.rs index 347ca461..54cffe12 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,4 +1,4 @@ -use anyhow::{bail, Context, Result}; +use anyhow::{Context, Result}; use serde::Serialize; use std::env; use std::error::Error; @@ -11,24 +11,25 @@ use crate::exercise::Exercise; /// and functions to build the data required to create the file #[derive(Serialize)] pub struct RustAnalyzerProject { - sysroot_src: String, + sysroot_src: PathBuf, crates: Vec, } #[derive(Serialize)] -pub struct Crate { - root_module: String, - edition: String, - deps: Vec, - cfg: Vec, +struct Crate { + root_module: PathBuf, + edition: &'static str, + // Not used, but required in the JSON file. + deps: Vec<()>, + cfg: [&'static str; 1], } impl RustAnalyzerProject { pub fn build() -> Result { // check if RUST_SRC_PATH is set - if let Ok(sysroot_src) = env::var("RUST_SRC_PATH") { + if let Some(path) = env::var_os("RUST_SRC_PATH") { return Ok(Self { - sysroot_src, + sysroot_src: PathBuf::from(path), crates: Vec::new(), }); } @@ -49,9 +50,6 @@ impl RustAnalyzerProject { let mut sysroot_src = PathBuf::with_capacity(256); sysroot_src.extend([toolchain, "lib", "rustlib", "src", "rust", "library"]); - let Ok(sysroot_src) = sysroot_src.into_os_string().into_string() else { - bail!("The sysroot path is invalid UTF8"); - }; Ok(Self { sysroot_src, @@ -77,11 +75,11 @@ impl RustAnalyzerProject { self.crates = exercises .into_iter() .map(|exercise| Crate { - root_module: exercise.path.display().to_string(), - edition: "2021".to_string(), + root_module: exercise.path, + edition: "2021", deps: Vec::new(), // This allows rust_analyzer to work inside #[test] blocks - cfg: vec!["test".to_string()], + cfg: ["test"], }) .collect(); Ok(()) From 8ddbf9635d21a4c0306bd31cca5c4077693ca917 Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 23:01:56 +0100 Subject: [PATCH 1253/1293] Add write_project_json --- src/main.rs | 11 +++------ src/project.rs | 63 +++++++++++++++++++++++--------------------------- 2 files changed, 32 insertions(+), 42 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1f260ab7..46aaf1f3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use crate::exercise::{Exercise, ExerciseList}; -use crate::project::RustAnalyzerProject; +use crate::project::write_project_json; use crate::run::{reset, run}; use crate::verify::verify; use anyhow::Result; @@ -204,13 +204,8 @@ fn main() -> Result<()> { } Subcommands::Lsp => { - let mut project = RustAnalyzerProject::build()?; - project - .exercises_to_json(exercises) - .expect("Couldn't parse rustlings exercises files"); - - if project.write_to_disk().is_err() { - println!("Failed to write rust-project.json to disk for rust-analyzer"); + if let Err(e) = write_project_json(exercises) { + println!("Failed to write rust-project.json to disk for rust-analyzer: {e}"); } else { println!("Successfully generated rust-project.json"); println!("rust-analyzer will now parse exercises, restart your language server or editor") diff --git a/src/project.rs b/src/project.rs index 54cffe12..acf011d3 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,7 +1,6 @@ use anyhow::{Context, Result}; use serde::Serialize; use std::env; -use std::error::Error; use std::path::PathBuf; use std::process::{Command, Stdio}; @@ -10,7 +9,7 @@ use crate::exercise::Exercise; /// Contains the structure of resulting rust-project.json file /// and functions to build the data required to create the file #[derive(Serialize)] -pub struct RustAnalyzerProject { +struct RustAnalyzerProject { sysroot_src: PathBuf, crates: Vec, } @@ -25,12 +24,22 @@ struct Crate { } impl RustAnalyzerProject { - pub fn build() -> Result { - // check if RUST_SRC_PATH is set + fn build(exercises: Vec) -> Result { + let crates = exercises + .into_iter() + .map(|exercise| Crate { + root_module: exercise.path, + edition: "2021", + deps: Vec::new(), + // This allows rust_analyzer to work inside #[test] blocks + cfg: ["test"], + }) + .collect(); + if let Some(path) = env::var_os("RUST_SRC_PATH") { return Ok(Self { sysroot_src: PathBuf::from(path), - crates: Vec::new(), + crates, }); } @@ -53,35 +62,21 @@ impl RustAnalyzerProject { Ok(Self { sysroot_src, - crates: Vec::new(), + crates, }) } - - /// Write rust-project.json to disk - pub fn write_to_disk(&self) -> Result<(), std::io::Error> { - // Using the capacity 2^14 = 16384 since the file length in bytes is higher than 2^13. - // The final length is not known exactly because it depends on the user's sysroot path, - // the current number of exercises etc. - let mut buf = Vec::with_capacity(16384); - serde_json::to_writer(&mut buf, &self).expect("Failed to serialize to JSON"); - std::fs::write("rust-project.json", buf)?; - Ok(()) - } - - /// Parse the exercises folder for .rs files, any matches will create - /// a new `crate` in rust-project.json which allows rust-analyzer to - /// treat it like a normal binary - pub fn exercises_to_json(&mut self, exercises: Vec) -> Result<(), Box> { - self.crates = exercises - .into_iter() - .map(|exercise| Crate { - root_module: exercise.path, - edition: "2021", - deps: Vec::new(), - // This allows rust_analyzer to work inside #[test] blocks - cfg: ["test"], - }) - .collect(); - Ok(()) - } +} + +/// Write `rust-project.json` to disk. +pub fn write_project_json(exercises: Vec) -> Result<()> { + let content = RustAnalyzerProject::build(exercises)?; + + // Using the capacity 2^14 since the file length in bytes is higher than 2^13. + // The final length is not known exactly because it depends on the user's sysroot path, + // the current number of exercises etc. + let mut buf = Vec::with_capacity(1 << 14); + serde_json::to_writer(&mut buf, &content)?; + std::fs::write("rust-project.json", buf)?; + + Ok(()) } From a158c77d81f2b2870385f70b63511588ed6912ff Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 25 Mar 2024 23:21:14 +0100 Subject: [PATCH 1254/1293] Add comment --- src/project.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/project.rs b/src/project.rs index acf011d3..0f56de96 100644 --- a/src/project.rs +++ b/src/project.rs @@ -20,6 +20,8 @@ struct Crate { edition: &'static str, // Not used, but required in the JSON file. deps: Vec<()>, + // Only `test` is used for all crates. + // Therefore, an array is used instead of a `Vec`. cfg: [&'static str; 1], } @@ -31,7 +33,7 @@ impl RustAnalyzerProject { root_module: exercise.path, edition: "2021", deps: Vec::new(), - // This allows rust_analyzer to work inside #[test] blocks + // This allows rust_analyzer to work inside `#[test]` blocks cfg: ["test"], }) .collect(); @@ -54,7 +56,6 @@ impl RustAnalyzerProject { let toolchain = String::from_utf8(toolchain).context("The toolchain path is invalid UTF8")?; let toolchain = toolchain.trim_end(); - println!("Determined toolchain: {toolchain}\n"); let mut sysroot_src = PathBuf::with_capacity(256); From 7a6f71f09092e8a521d53456491e7d9d8a159602 Mon Sep 17 00:00:00 2001 From: mo8it Date: Tue, 26 Mar 2024 02:14:25 +0100 Subject: [PATCH 1255/1293] Fix context of previous lines and improve readability --- src/exercise.rs | 154 +++++++++++++++++++++++++----------------------- 1 file changed, 80 insertions(+), 74 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 136e9439..e841aed2 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -3,7 +3,7 @@ use std::fmt::{self, Display, Formatter}; use std::fs::{self, remove_file, File}; use std::io::{self, BufRead, BufReader}; use std::path::PathBuf; -use std::process::{self, Command}; +use std::process::{self, exit, Command}; use std::{array, env, mem}; use winnow::ascii::{space0, Caseless}; use winnow::combinator::opt; @@ -15,7 +15,8 @@ const RUSTC_NO_DEBUG_ARGS: &[&str] = &["-C", "strip=debuginfo"]; const CONTEXT: usize = 2; const CLIPPY_CARGO_TOML_PATH: &str = "./exercises/22_clippy/Cargo.toml"; -fn not_done(input: &str) -> bool { +// Checks if the line contains the "I AM NOT DONE" comment. +fn contains_not_done_comment(input: &str) -> bool { ( space0::<_, ()>, "//", @@ -219,12 +220,15 @@ path = "{}.rs""#, pub fn state(&self) -> State { let source_file = File::open(&self.path).unwrap_or_else(|e| { - panic!( - "We were unable to open the exercise file {}! {e}", - self.path.display() - ) + println!( + "Failed to open the exercise file {}: {e}", + self.path.display(), + ); + exit(1); }); let mut source_reader = BufReader::new(source_file); + + // Read the next line into `buf` without the newline at the end. let mut read_line = |buf: &mut String| -> io::Result<_> { let n = source_reader.read_line(buf)?; if buf.ends_with('\n') { @@ -236,70 +240,72 @@ path = "{}.rs""#, Ok(n) }; - let mut matched_line_ind: usize = 0; + let mut current_line_number: usize = 1; let mut prev_lines: [_; CONTEXT] = array::from_fn(|_| String::with_capacity(256)); let mut line = String::with_capacity(256); loop { - match read_line(&mut line) { - Ok(0) => break, - Ok(_) => { - if not_done(&line) { - let mut context = Vec::with_capacity(2 * CONTEXT + 1); - for (ind, prev_line) in prev_lines - .into_iter() - .rev() - .take(matched_line_ind) - .enumerate() - { - context.push(ContextLine { - line: prev_line, - // TODO - number: matched_line_ind - CONTEXT + ind + 1, - important: false, - }); - } + let n = read_line(&mut line).unwrap_or_else(|e| { + println!( + "Failed to read the exercise file {}: {e}", + self.path.display(), + ); + exit(1); + }); - context.push(ContextLine { - line, - number: matched_line_ind + 1, - important: true, - }); - - for ind in 0..CONTEXT { - let mut next_line = String::with_capacity(256); - let Ok(n) = read_line(&mut next_line) else { - break; - }; - - if n == 0 { - break; - } - - context.push(ContextLine { - line: next_line, - number: matched_line_ind + ind + 2, - important: false, - }); - } - - return State::Pending(context); - } - - matched_line_ind += 1; - for prev_line in &mut prev_lines { - mem::swap(&mut line, prev_line); - } - line.clear(); - } - Err(e) => panic!( - "We were unable to read the exercise file {}! {e}", - self.path.display() - ), + // Reached the end of the file and didn't find the comment. + if n == 0 { + return State::Done; } - } - State::Done + if contains_not_done_comment(&line) { + let mut context = Vec::with_capacity(2 * CONTEXT + 1); + for (ind, prev_line) in prev_lines + .into_iter() + .take(current_line_number - 1) + .enumerate() + .rev() + { + context.push(ContextLine { + line: prev_line, + number: current_line_number - 1 - ind, + important: false, + }); + } + + context.push(ContextLine { + line, + number: current_line_number, + important: true, + }); + + for ind in 0..CONTEXT { + let mut next_line = String::with_capacity(256); + let Ok(n) = read_line(&mut next_line) else { + break; + }; + + if n == 0 { + break; + } + + context.push(ContextLine { + line: next_line, + number: current_line_number + 1 + ind, + important: false, + }); + } + + return State::Pending(context); + } + + current_line_number += 1; + // Recycle the buffers. + for prev_line in &mut prev_lines { + mem::swap(&mut line, prev_line); + } + line.clear(); + } } // Check that the exercise looks to be solved using self.state() @@ -428,17 +434,17 @@ mod test { #[test] fn test_not_done() { - assert!(not_done("// I AM NOT DONE")); - assert!(not_done("/// I AM NOT DONE")); - assert!(not_done("// I AM NOT DONE")); - assert!(not_done("/// I AM NOT DONE")); - assert!(not_done("// I AM NOT DONE ")); - assert!(not_done("// I AM NOT DONE!")); - assert!(not_done("// I am not done")); - assert!(not_done("// i am NOT done")); + assert!(contains_not_done_comment("// I AM NOT DONE")); + assert!(contains_not_done_comment("/// I AM NOT DONE")); + assert!(contains_not_done_comment("// I AM NOT DONE")); + assert!(contains_not_done_comment("/// I AM NOT DONE")); + assert!(contains_not_done_comment("// I AM NOT DONE ")); + assert!(contains_not_done_comment("// I AM NOT DONE!")); + assert!(contains_not_done_comment("// I am not done")); + assert!(contains_not_done_comment("// i am NOT done")); - assert!(!not_done("I AM NOT DONE")); - assert!(!not_done("// NOT DONE")); - assert!(!not_done("DONE")); + assert!(!contains_not_done_comment("I AM NOT DONE")); + assert!(!contains_not_done_comment("// NOT DONE")); + assert!(!contains_not_done_comment("DONE")); } } From 078f6ffc1cf18546079d03bee99f0903c9e14703 Mon Sep 17 00:00:00 2001 From: mo8it Date: Tue, 26 Mar 2024 02:26:26 +0100 Subject: [PATCH 1256/1293] Add comments --- src/exercise.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/exercise.rs b/src/exercise.rs index e841aed2..cdf8d205 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -241,6 +241,7 @@ path = "{}.rs""#, }; let mut current_line_number: usize = 1; + // Keep the last `CONTEXT` lines while iterating over the file lines. let mut prev_lines: [_; CONTEXT] = array::from_fn(|_| String::with_capacity(256)); let mut line = String::with_capacity(256); @@ -260,6 +261,7 @@ path = "{}.rs""#, if contains_not_done_comment(&line) { let mut context = Vec::with_capacity(2 * CONTEXT + 1); + // Previous lines. for (ind, prev_line) in prev_lines .into_iter() .take(current_line_number - 1) @@ -273,18 +275,22 @@ path = "{}.rs""#, }); } + // Current line. context.push(ContextLine { line, number: current_line_number, important: true, }); + // Next lines. for ind in 0..CONTEXT { let mut next_line = String::with_capacity(256); let Ok(n) = read_line(&mut next_line) else { + // If an error occurs, just ignore the next lines. break; }; + // Reached the end of the file. if n == 0 { break; } @@ -300,10 +306,12 @@ path = "{}.rs""#, } current_line_number += 1; - // Recycle the buffers. + // Add the current line as a previous line and shift the older lines by one. for prev_line in &mut prev_lines { mem::swap(&mut line, prev_line); } + // The current line now contains the oldest previous line. + // Recycle it for reading the next line. line.clear(); } } From 853d0593d061119b042a45b602ff52af229dad83 Mon Sep 17 00:00:00 2001 From: mo8it Date: Tue, 26 Mar 2024 17:47:33 +0100 Subject: [PATCH 1257/1293] Derive Eq when PartialEq is derived --- src/exercise.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/exercise.rs b/src/exercise.rs index 664b362b..a13ed2ce 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -58,7 +58,7 @@ pub struct Exercise { // An enum to track of the state of an Exercise. // An Exercise can be either Done or Pending -#[derive(PartialEq, Debug)] +#[derive(PartialEq, Eq, Debug)] pub enum State { // The state of the exercise once it's been completed Done, @@ -67,7 +67,7 @@ pub enum State { } // The context information of a pending exercise -#[derive(PartialEq, Debug)] +#[derive(PartialEq, Eq, Debug)] pub struct ContextLine { // The source code that is still pending completion pub line: String, From f36efae25deee03cb6f98ce7fc1e59efb7e72985 Mon Sep 17 00:00:00 2001 From: mo8it Date: Tue, 26 Mar 2024 17:48:06 +0100 Subject: [PATCH 1258/1293] Only use arg instead of args AND arg --- src/run.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/run.rs b/src/run.rs index e0ada4c5..6dd0388f 100644 --- a/src/run.rs +++ b/src/run.rs @@ -21,7 +21,8 @@ pub fn run(exercise: &Exercise, verbose: bool) -> Result<(), ()> { // Resets the exercise by stashing the changes. pub fn reset(exercise: &Exercise) -> Result<(), ()> { let command = Command::new("git") - .args(["stash", "--"]) + .arg("stash") + .arg("--") .arg(&exercise.path) .spawn(); From ed0fcf8e3d05f5420b55370d4ff4ad8e0ded127b Mon Sep 17 00:00:00 2001 From: mo8it Date: Tue, 26 Mar 2024 17:49:05 +0100 Subject: [PATCH 1259/1293] Formatting --- src/main.rs | 7 ++----- src/verify.rs | 32 +++++++++++++++----------------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/main.rs b/src/main.rs index a06f0c56..a0b3af29 100644 --- a/src/main.rs +++ b/src/main.rs @@ -223,10 +223,7 @@ fn main() { Subcommands::Watch { success_hints } => match watch(&exercises, verbose, success_hints) { Err(e) => { - println!( - "Error: Could not watch your progress. Error message was {:?}.", - e - ); + println!("Error: Could not watch your progress. Error message was {e:?}."); println!("Most likely you've run out of disk space or your 'inotify limit' has been reached."); std::process::exit(1); } @@ -280,7 +277,7 @@ fn spawn_watch_shell( if parts.is_empty() { println!("no command provided"); } else if let Err(e) = Command::new(parts[0]).args(&parts[1..]).status() { - println!("failed to execute command `{}`: {}", cmd, e); + println!("failed to execute command `{cmd}`: {e}"); } } else { println!("unknown command: {input}"); diff --git a/src/verify.rs b/src/verify.rs index aee2afa3..3123e455 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -24,7 +24,7 @@ pub fn verify<'a>( .progress_chars("#>-"), ); bar.set_position(num_done as u64); - bar.set_message(format!("({:.1} %)", percentage)); + bar.set_message(format!("({percentage:.1} %)")); for exercise in exercises { let compile_result = match exercise.mode { @@ -37,7 +37,7 @@ pub fn verify<'a>( } percentage += 100.0 / total as f32; bar.inc(1); - bar.set_message(format!("({:.1} %)", percentage)); + bar.set_message(format!("({percentage:.1} %)")); if bar.position() == total as u64 { println!( "Progress: You completed {} / {} exercises ({:.1} %).", @@ -191,27 +191,25 @@ fn prompt_for_completion( Mode::Test => "The code is compiling, and the tests pass!", Mode::Clippy => clippy_success_msg, }; - println!(); + if no_emoji { - println!("~*~ {success_msg} ~*~") + println!("\n~*~ {success_msg} ~*~\n"); } else { - println!("πŸŽ‰ πŸŽ‰ {success_msg} πŸŽ‰ πŸŽ‰") + println!("\nπŸŽ‰ πŸŽ‰ {success_msg} πŸŽ‰ πŸŽ‰\n"); } - println!(); if let Some(output) = prompt_output { - println!("Output:"); - println!("{}", separator()); - println!("{output}"); - println!("{}", separator()); - println!(); + println!( + "Output:\n{separator}\n{output}\n{separator}\n", + separator = separator(), + ); } if success_hints { - println!("Hints:"); - println!("{}", separator()); - println!("{}", exercise.hint); - println!("{}", separator()); - println!(); + println!( + "Hints:\n{separator}\n{}\n{separator}\n", + exercise.hint, + separator = separator(), + ); } println!("You can keep working on this exercise,"); @@ -231,7 +229,7 @@ fn prompt_for_completion( "{:>2} {} {}", style(context_line.number).blue().bold(), style("|").blue(), - formatted_line + formatted_line, ); } From 1f2029ae5503024f71203893fe1eab7b90aa80af Mon Sep 17 00:00:00 2001 From: mo8it Date: Tue, 26 Mar 2024 17:49:25 +0100 Subject: [PATCH 1260/1293] Add missing semicolon --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index a0b3af29..6884a0e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -217,7 +217,7 @@ fn main() { println!("Failed to write rust-project.json to disk for rust-analyzer"); } else { println!("Successfully generated rust-project.json"); - println!("rust-analyzer will now parse exercises, restart your language server or editor") + println!("rust-analyzer will now parse exercises, restart your language server or editor"); } } From 980ffa2a2bb791992ef05ca9b05aadba62ec6abc Mon Sep 17 00:00:00 2001 From: mo8it Date: Tue, 26 Mar 2024 17:49:48 +0100 Subject: [PATCH 1261/1293] Use == on simple enums --- src/verify.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/verify.rs b/src/verify.rs index 3123e455..e2fa98f2 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -51,6 +51,7 @@ pub fn verify<'a>( Ok(()) } +#[derive(PartialEq, Eq)] enum RunMode { Interactive, NonInteractive, @@ -124,7 +125,7 @@ fn compile_and_test( if verbose { println!("{}", output.stdout); } - if let RunMode::Interactive = run_mode { + if run_mode == RunMode::Interactive { Ok(prompt_for_completion(exercise, None, success_hints)) } else { Ok(true) From e89028581cd03c02cb0971a2772fa382667019a3 Mon Sep 17 00:00:00 2001 From: mo8it Date: Tue, 26 Mar 2024 17:49:55 +0100 Subject: [PATCH 1262/1293] Use == instead of eq --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 6884a0e5..559be698 100644 --- a/src/main.rs +++ b/src/main.rs @@ -289,7 +289,7 @@ fn spawn_watch_shell( } fn find_exercise<'a>(name: &str, exercises: &'a [Exercise]) -> &'a Exercise { - if name.eq("next") { + if name == "next" { exercises .iter() .find(|e| !e.looks_done()) From a610fc1bc21a04017542208ef70a8010ee00c04c Mon Sep 17 00:00:00 2001 From: mo8it Date: Tue, 26 Mar 2024 17:50:10 +0100 Subject: [PATCH 1263/1293] Remove unneeded closure --- src/main.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index 559be698..eca73fa0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -335,7 +335,6 @@ fn watch( clear_screen(); - let to_owned_hint = |t: &Exercise| t.hint.to_owned(); let failed_exercise_hint = match verify( exercises.iter(), (0, exercises.len()), @@ -343,7 +342,7 @@ fn watch( success_hints, ) { Ok(_) => return Ok(WatchStatus::Finished), - Err(exercise) => Arc::new(Mutex::new(Some(to_owned_hint(exercise)))), + Err(exercise) => Arc::new(Mutex::new(Some(exercise.hint.clone()))), }; spawn_watch_shell(&failed_exercise_hint, Arc::clone(&should_quit)); loop { @@ -380,7 +379,7 @@ fn watch( Err(exercise) => { let mut failed_exercise_hint = failed_exercise_hint.lock().unwrap(); - *failed_exercise_hint = Some(to_owned_hint(exercise)); + *failed_exercise_hint = Some(exercise.hint.clone()); } } } From 87001a68c0cc6b3498a253d0923e9c609355c4ee Mon Sep 17 00:00:00 2001 From: mo8it Date: Tue, 26 Mar 2024 17:50:29 +0100 Subject: [PATCH 1264/1293] The string doesn't have to be a raw string --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index eca73fa0..141549c6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -411,7 +411,7 @@ fn rustc_exists() -> bool { .unwrap_or(false) } -const DEFAULT_OUT: &str = r#"Thanks for installing Rustlings! +const DEFAULT_OUT: &str = "Thanks for installing Rustlings! Is this your first time? Don't worry, Rustlings was made for beginners! We are going to teach you a lot of things about Rust, but before we can get @@ -437,7 +437,7 @@ started, here's a couple of notes about how Rustlings operates: autocompletion, run the command `rustlings lsp`. Got all that? Great! To get started, run `rustlings watch` in order to get the first -exercise. Make sure to have your editor open!"#; +exercise. Make sure to have your editor open!"; const FENISH_LINE: &str = "+----------------------------------------------------+ | You made it to the Fe-nish line! | From 76764633b46ee570e2b7d2b8564d37b7292fa337 Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 27 Mar 2024 15:16:42 +0100 Subject: [PATCH 1265/1293] Update deps --- Cargo.lock | 56 +++++++++++++++++++++++++++--------------------------- Cargo.toml | 4 ++-- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 11880b7f..f4853d0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -82,9 +82,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "bitflags" @@ -94,9 +94,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bstr" @@ -117,9 +117,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.5.2" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b230ab84b0ffdf890d5a10abdbc8b83ae1c4918275daea1ab8801f71536b2651" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", @@ -139,9 +139,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.0" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ "heck", "proc-macro2", @@ -273,9 +273,9 @@ checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "home" @@ -288,9 +288,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown", @@ -340,9 +340,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "kqueue" @@ -418,7 +418,7 @@ version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "crossbeam-channel", "filetime", "fsevent-sys", @@ -495,9 +495,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -522,9 +522,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", @@ -545,9 +545,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rustix" @@ -555,7 +555,7 @@ version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", @@ -619,9 +619,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -651,9 +651,9 @@ checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" [[package]] name = "syn" -version = "2.0.52" +version = "2.0.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 36e11235..2d152cfc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,11 +10,11 @@ edition = "2021" [dependencies] anyhow = "1.0.81" -clap = { version = "4.5.2", features = ["derive"] } +clap = { version = "4.5.4", features = ["derive"] } console = "0.15.8" indicatif = "0.17.8" notify-debouncer-mini = "0.4.1" -serde_json = "1.0.114" +serde_json = "1.0.115" serde = { version = "1.0.197", features = ["derive"] } shlex = "1.3.0" toml_edit = { version = "0.22.9", default-features = false, features = ["parse", "serde"] } From e7bb832bf3e651f88fa3318df7e6b04b56fb9dee Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 27 Mar 2024 17:03:53 +0100 Subject: [PATCH 1266/1293] Remove outdated info about the command line parser --- CONTRIBUTING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cc8ac923..d66e3de5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,6 @@ _implement a new feature! ➑️ [open an Issue to discuss it first, then a Pull `rustlings` is basically a glorified `rustc` wrapper. Therefore the source code isn't really that complicated since the bulk of the work is done by `rustc`. -`src/main.rs` contains a simple `argh` CLI that connects to most of the other source files. ### Adding an exercise From 92183a74c4c7b91459c1371bb7a68b5e4c1c23bd Mon Sep 17 00:00:00 2001 From: wznmickey Date: Thu, 28 Mar 2024 00:06:16 +0800 Subject: [PATCH 1267/1293] chore: update the chapter of macros --- exercises/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/README.md b/exercises/README.md index c7effa95..4cb966e5 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -22,6 +22,6 @@ | iterators | Β§13.2-4 | | threads | Β§16.1-3 | | smart_pointers | Β§15, Β§16.3 | -| macros | Β§19.6 | +| macros | Β§19.5 | | clippy | Β§21.4 | | conversions | n/a | From 971e7f94dc58b6846e3b4e7f3d5df5b4ea72790b Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 27 Mar 2024 17:08:38 +0100 Subject: [PATCH 1268/1293] Update the link to conventionalcommits.org --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d66e3de5..4fc7fb79 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,7 +65,7 @@ changes. There's a couple of things to watch out for: #### Write correct commit messages -We follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0-beta.4/) +We follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification. This means that you have to format your commit messages in a specific way. Say you're working on adding a new exercise called `foobar1.rs`. You could write From 669adbeb604b66631040f9322549f3e6afaeef3d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:21:13 +0000 Subject: [PATCH 1269/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 00122e07..0f229dbb 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -378,6 +378,7 @@ authors. 0Ahmed-0
0Ahmed-0

πŸ–‹ guizo792
guizo792

πŸ–‹ Kazuki Matsuo
Kazuki Matsuo

πŸ’» + Paul Leydier
Paul Leydier

πŸ“– From fb8dd57d1f2aa1e3865266f08d91e128f6207c64 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:21:14 +0000 Subject: [PATCH 1270/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index f2446f1f..e5b319cc 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2685,6 +2685,15 @@ "contributions": [ "code" ] + }, + { + "login": "paul-leydier", + "name": "Paul Leydier", + "avatar_url": "https://avatars.githubusercontent.com/u/75126792?v=4", + "profile": "https://github.com/paul-leydier", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From 7b20ca9d0415ef94902c897242e3c6fbd154b6a6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:23:45 +0000 Subject: [PATCH 1271/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 0f229dbb..f229173a 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -380,6 +380,9 @@ authors. Kazuki Matsuo
Kazuki Matsuo

πŸ’» Paul Leydier
Paul Leydier

πŸ“– + + wznmickey
wznmickey

πŸ“– + From 4937cb5b7c38dbecf232641c0864d5d9b261aebd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:23:46 +0000 Subject: [PATCH 1272/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e5b319cc..2eae5878 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2694,6 +2694,15 @@ "contributions": [ "doc" ] + }, + { + "login": "wznmickey", + "name": "wznmickey", + "avatar_url": "https://avatars.githubusercontent.com/u/44784663?v=4", + "profile": "http://wznmickey.com", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From 4e7f9ca1b3741fccc28b1f71118b0ffb5cf39aa4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:29:03 +0000 Subject: [PATCH 1273/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index f229173a..4a98bb9b 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -382,6 +382,7 @@ authors. wznmickey
wznmickey

πŸ“– + NicolasRoelandt
NicolasRoelandt

πŸ“– From 9895c1f9bda4d9bf85c4a10157ff4714f57c52fc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:29:04 +0000 Subject: [PATCH 1274/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2eae5878..3095896d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2703,6 +2703,15 @@ "contributions": [ "doc" ] + }, + { + "login": "NicolasRoelandt", + "name": "NicolasRoelandt", + "avatar_url": "https://avatars.githubusercontent.com/u/8594193?v=4", + "profile": "https://github.com/NicolasRoelandt", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 8, From 3df59379de1b3333b911c60b867216690d6c5e1b Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 27 Mar 2024 20:28:31 +0100 Subject: [PATCH 1275/1293] Remove the reference to v1 --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 8fac7a28..6b9c9833 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,6 @@ Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages! -_...looking for the old, web-based version of Rustlings? Try [here](https://github.com/rust-lang/rustlings/tree/rustlings-1)_ - Alternatively, for a first-time Rust learner, there are several other resources: - [The Book](https://doc.rust-lang.org/book/index.html) - The most comprehensive resource for learning Rust, but a bit theoretical sometimes. You will be using this along with Rustlings! From 842e341895690aa8d59aab42d6294994ef99d10f Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 27 Mar 2024 21:24:36 +0100 Subject: [PATCH 1276/1293] threads2: simplify threads2 --- exercises/20_threads/threads2.rs | 11 +++++++---- info.toml | 20 ++++++-------------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/exercises/20_threads/threads2.rs b/exercises/20_threads/threads2.rs index 62dad80d..60d68241 100644 --- a/exercises/20_threads/threads2.rs +++ b/exercises/20_threads/threads2.rs @@ -18,7 +18,9 @@ struct JobStatus { } fn main() { + // TODO: `Arc` isn't enough if you want a **mutable** shared state let status = Arc::new(JobStatus { jobs_completed: 0 }); + let mut handles = vec![]; for _ in 0..10 { let status_shared = Arc::clone(&status); @@ -29,11 +31,12 @@ fn main() { }); handles.push(handle); } + + // Waiting for all jobs to complete for handle in handles { handle.join().unwrap(); - // TODO: Print the value of the JobStatus.jobs_completed. Did you notice - // anything interesting in the output? Do you have to 'join' on all the - // handles? - println!("jobs completed {}", ???); } + + // TODO: Print the value of `JobStatus.jobs_completed` + println!("Jobs completed: {}", ???); } diff --git a/info.toml b/info.toml index b1cd64cc..36629b38 100644 --- a/info.toml +++ b/info.toml @@ -1136,25 +1136,17 @@ to **immutable** data. But we want to *change* the number of `jobs_completed` so we'll need to also use another type that will only allow one thread to mutate the data at a time. Take a look at this section of the book: https://doc.rust-lang.org/book/ch16-03-shared-state.html#atomic-reference-counting-with-arct -and keep reading if you'd like more hints :) -Do you now have an `Arc` `Mutex` `JobStatus` at the beginning of main? Like: +Keep reading if you'd like more hints :) + +Do you now have an `Arc>` at the beginning of `main`? Like: ``` let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 })); ``` -Similar to the code in the example in the book that happens after the text -that says 'Sharing a Mutex Between Multiple Threads'. If not, give that a -try! If you do and would like more hints, keep reading!! - -Make sure neither of your threads are holding onto the lock of the mutex -while they are sleeping, since this will prevent the other thread from -being allowed to get the lock. Locks are automatically released when -they go out of scope. - -If you've learned from the sample solutions, I encourage you to come -back to this exercise and try it again in a few days to reinforce -what you've learned :)""" +Similar to the code in the following example in the book: +https://doc.rust-lang.org/book/ch16-03-shared-state.html#sharing-a-mutext-between-multiple-threads +""" [[exercises]] name = "threads3" From 0888952cb95946885f364a6218346200fb8f0bb4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 01:10:05 +0000 Subject: [PATCH 1277/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4a98bb9b..42c7dbfe 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -383,6 +383,7 @@ authors. wznmickey
wznmickey

πŸ“– NicolasRoelandt
NicolasRoelandt

πŸ“– + Josh Bouganim
Josh Bouganim

πŸ’» From 24cb4a3bc973fa97fb40cda2e46a2a73d1aeda48 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 01:10:06 +0000 Subject: [PATCH 1278/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3095896d..be95fe9f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2712,6 +2712,15 @@ "contributions": [ "doc" ] + }, + { + "login": "jbouganim-parallel", + "name": "Josh Bouganim", + "avatar_url": "https://avatars.githubusercontent.com/u/150748285?v=4", + "profile": "https://github.com/jbouganim-parallel", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From c6597d0010b869109e4504069d3e1aaa6b6834e6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 19:03:57 +0000 Subject: [PATCH 1279/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 42c7dbfe..d82a5cab 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -384,6 +384,7 @@ authors. wznmickey
wznmickey

πŸ“– NicolasRoelandt
NicolasRoelandt

πŸ“– Josh Bouganim
Josh Bouganim

πŸ’» + Dan
Dan

πŸ’» From c2b7f458060e65f7ae041b0b6eb9eaba58eaea1b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 19:03:58 +0000 Subject: [PATCH 1280/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index be95fe9f..36952f7e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2721,6 +2721,15 @@ "contributions": [ "code" ] + }, + { + "login": "loshz", + "name": "Dan", + "avatar_url": "https://avatars.githubusercontent.com/u/3449337?v=4", + "profile": "https://loshz.com", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8, From f7145343937acfd9039ee7f4f562731a44bdf33a Mon Sep 17 00:00:00 2001 From: YunShu Date: Mon, 8 Apr 2024 22:07:26 +0800 Subject: [PATCH 1281/1293] docs: add more info in threads info.toml: ```toml [[exercises]] name = "threads3" path = "exercises/threads/threads3.rs" mode = "test" hint = """ An alternate way to handle concurrency between threads is to use a mpsc (multiple producer, single consumer) channel to communicate. With both a sending end and a receiving end, it's possible to send values in one thread and receive them in another. Multiple producers are possible by using clone() to create a duplicate of the original sending end. See https://doc.rust-lang.org/book/ch16-02-message-passing.html for more info. """ ``` threads3'hint contains this link, so it should be placed in Further Information --- exercises/20_threads/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/20_threads/README.md b/exercises/20_threads/README.md index dbe66643..0b32fb1d 100644 --- a/exercises/20_threads/README.md +++ b/exercises/20_threads/README.md @@ -7,3 +7,4 @@ Within your program, you can also have independent parts that run simultaneously - [Dining Philosophers example](https://doc.rust-lang.org/1.4.0/book/dining-philosophers.html) - [Using Threads to Run Code Simultaneously](https://doc.rust-lang.org/book/ch16-01-threads.html) +- [Using Message Passing to Transfer Data Between Threads](https://doc.rust-lang.org/book/ch16-02-message-passing.html) From 501861e43589ab8a47b0c072098ecf36779e8db2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 20:49:02 +0000 Subject: [PATCH 1282/1293] docs: update AUTHORS.md [skip ci] --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index d82a5cab..341ba42e 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -385,6 +385,7 @@ authors. NicolasRoelandt
NicolasRoelandt

πŸ“– Josh Bouganim
Josh Bouganim

πŸ’» Dan
Dan

πŸ’» + YunShu
YunShu

πŸ–‹ From 95a3fe17fa61144101ab7a9cae3acd75e58948b0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 20:49:03 +0000 Subject: [PATCH 1283/1293] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 36952f7e..3f3f3ec9 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2730,6 +2730,15 @@ "contributions": [ "code" ] + }, + { + "login": "Selflocking", + "name": "YunShu", + "avatar_url": "https://avatars.githubusercontent.com/u/53544726?v=4", + "profile": "https://yunshu.site", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 8, From 67a15ef27f73f83d4a29b955e970846fe42026fc Mon Sep 17 00:00:00 2001 From: liv Date: Tue, 16 Apr 2024 15:23:08 +0200 Subject: [PATCH 1284/1293] fix: remove bad hint in functions4 Technically it's correct, but playing around with this will very quickly throw you into having to handle `Option`s and futzing around with `try_into`. Not really something we want to throw upon the user here. Closes #1948. --- info.toml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/info.toml b/info.toml index 36629b38..5690701d 100644 --- a/info.toml +++ b/info.toml @@ -142,10 +142,7 @@ mode = "compile" hint = """ The error message points to the function `sale_price` and says it expects a type after the `->`. This is where the function's return type should be -- take a -look at the `is_even` function for an example! - -Also: Did you figure out that, technically, `u32` would be the more fitting type -for the inputs of the functions here, since the original prices shouldn't be negative? If so, kudos!""" +look at the `is_even` function for an example!""" [[exercises]] name = "functions5" From 9a13bccd6305a83635993b9e2f80422a35566ee3 Mon Sep 17 00:00:00 2001 From: Hamir Mahal Date: Wed, 17 Apr 2024 01:35:29 -0700 Subject: [PATCH 1285/1293] chore: changes from formatting on save --- .github/workflows/rust.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 226d4137..515dc50e 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -2,9 +2,9 @@ name: Rustlings Tests on: push: - branches: [ main ] + branches: [main] pull_request: - branches: [ main ] + branches: [main] env: CARGO_TERM_COLOR: always From 4eec81a1131a3159bce2131266a8d62d98212741 Mon Sep 17 00:00:00 2001 From: Hamir Mahal Date: Wed, 17 Apr 2024 01:35:53 -0700 Subject: [PATCH 1286/1293] ci: add `clippy` job to `rust.yml` workflow --- .github/workflows/rust.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 515dc50e..689d05e1 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -10,6 +10,11 @@ env: CARGO_TERM_COLOR: always jobs: + clippy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cargo clippy -- --deny warnings fmt: runs-on: ubuntu-latest steps: From ea504e6bf11a23bb010b7b98a58a97ec2dcd0489 Mon Sep 17 00:00:00 2001 From: mo8it Date: Fri, 19 Apr 2024 12:41:13 +0200 Subject: [PATCH 1287/1293] Update deps --- Cargo.lock | 103 ++++++++++++++++++++++++++++------------------------- Cargo.toml | 10 +++--- 2 files changed, 60 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f4853d0c..0988dbcd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,9 +61,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.81" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" [[package]] name = "assert_cmd" @@ -203,9 +203,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "either" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "encode_unicode" @@ -390,9 +390,9 @@ checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "mio" @@ -495,18 +495,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -599,18 +599,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" dependencies = [ "proc-macro2", "quote", @@ -619,9 +619,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", @@ -645,15 +645,15 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.55" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -677,9 +677,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.9" +version = "0.22.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +checksum = "fb686a972ccef8537b39eead3968b0e8616cb5040dbb9bba93007c8e07c9215f" dependencies = [ "indexmap", "serde", @@ -789,7 +789,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -809,17 +809,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -830,9 +831,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -842,9 +843,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -854,9 +855,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -866,9 +873,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -878,9 +885,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -890,9 +897,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -902,15 +909,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" +checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 2d152cfc..6f523abf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,17 +9,17 @@ authors = [ edition = "2021" [dependencies] -anyhow = "1.0.81" +anyhow = "1.0.82" clap = { version = "4.5.4", features = ["derive"] } console = "0.15.8" indicatif = "0.17.8" notify-debouncer-mini = "0.4.1" -serde_json = "1.0.115" -serde = { version = "1.0.197", features = ["derive"] } +serde_json = "1.0.116" +serde = { version = "1.0.198", features = ["derive"] } shlex = "1.3.0" -toml_edit = { version = "0.22.9", default-features = false, features = ["parse", "serde"] } +toml_edit = { version = "0.22.11", default-features = false, features = ["parse", "serde"] } which = "6.0.1" -winnow = "0.6.5" +winnow = "0.6.6" [[bin]] name = "rustlings" From 71053101c32d0fd374f8e122880b3d682519bac6 Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 24 Apr 2024 13:28:25 +0200 Subject: [PATCH 1288/1293] Add --locked --- README.md | 4 ++-- install.ps1 | 2 +- install.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6b9c9833..821d76cd 100644 --- a/README.md +++ b/README.md @@ -74,13 +74,13 @@ If you get a permission denied message, you might have to exclude the directory ## Manually -Basically: Clone the repository at the latest tag, run `cargo install --path .`. +Basically: Clone the repository at the latest tag, run `cargo install --locked --path .`. ```bash # find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.1) git clone -b 5.6.1 --depth 1 https://github.com/rust-lang/rustlings cd rustlings -cargo install --force --path . +cargo install --locked --force --path . ``` If there are installation errors, ensure that your toolchain is up to date. For the latest, run: diff --git a/install.ps1 b/install.ps1 index 844b0134..8ab5b88e 100644 --- a/install.ps1 +++ b/install.ps1 @@ -78,7 +78,7 @@ Set-Location $path git checkout -q tags/$version Write-Host "Installing the 'rustlings' executable..." -cargo install --force --path . +cargo install --locked --force --path . if (!(Get-Command rustlings -ErrorAction SilentlyContinue)) { Write-Host "WARNING: Please check that you have '~/.cargo/bin' in your PATH environment variable!" } diff --git a/install.sh b/install.sh index fdbe8d43..f6031cf8 100755 --- a/install.sh +++ b/install.sh @@ -165,7 +165,7 @@ echo "Checking out version $Version..." git checkout -q ${Version} echo "Installing the 'rustlings' executable..." -cargo install --force --path . +cargo install --locked --force --path . if ! [ -x "$(command -v rustlings)" ] then From 881d3e9441507a4f615699d1cd77f4d989d20872 Mon Sep 17 00:00:00 2001 From: allupeng Date: Sun, 28 Apr 2024 18:03:22 +0800 Subject: [PATCH 1289/1293] doc : add a dot in structs3.rs file --- exercises/07_structs/structs3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/07_structs/structs3.rs b/exercises/07_structs/structs3.rs index 7cda5af1..2d55dd7e 100644 --- a/exercises/07_structs/structs3.rs +++ b/exercises/07_structs/structs3.rs @@ -1,7 +1,7 @@ // structs3.rs // // Structs contain data, but can also have logic. In this exercise we have -// defined the Package struct and we want to test some logic attached to it. +// defined the Package struct, and we want to test some logic attached to it. // Make the code compile and the tests pass! // // Execute `rustlings hint structs3` or use the `hint` watch subcommand for a From 8c3b8dcec47ae1ab08d88eaa4df522b4c30e14cc Mon Sep 17 00:00:00 2001 From: allupeng Date: Mon, 29 Apr 2024 14:18:04 +0800 Subject: [PATCH 1290/1293] doc : add a dot in hashmaps1.rs file to fill e.g. --- exercises/11_hashmaps/hashmaps1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/11_hashmaps/hashmaps1.rs b/exercises/11_hashmaps/hashmaps1.rs index 80829eaa..02f4725e 100644 --- a/exercises/11_hashmaps/hashmaps1.rs +++ b/exercises/11_hashmaps/hashmaps1.rs @@ -3,7 +3,7 @@ // A basket of fruits in the form of a hash map needs to be defined. The key // represents the name of the fruit and the value represents how many of that // particular fruit is in the basket. You have to put at least three different -// types of fruits (e.g apple, banana, mango) in the basket and the total count +// types of fruits (e.g. apple, banana, mango) in the basket and the total count // of all the fruits should be at least five. // // Make me compile and pass the tests! From baca8c96672e3fe414eadfb8c19f2ac38e7cac2b Mon Sep 17 00:00:00 2001 From: iamcult <101368650+iamcult@users.noreply.github.com> Date: Sun, 12 May 2024 14:48:06 -0400 Subject: [PATCH 1291/1293] chore: update flake.lock --- flake.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/flake.lock b/flake.lock index 15238981..6592dd89 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", "owner": "edolstra", "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", "type": "github" }, "original": { @@ -21,11 +21,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1692799911, - "narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -36,11 +36,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1694183432, - "narHash": "sha256-YyPGNapgZNNj51ylQMw9lAgvxtM2ai1HZVUu3GS8Fng=", + "lastModified": 1715447595, + "narHash": "sha256-VsVAUQOj/cS1LCOmMjAGeRksXIAdPnFIjCQ0XLkCsT0=", "owner": "nixos", "repo": "nixpkgs", - "rev": "db9208ab987cdeeedf78ad9b4cf3c55f5ebd269b", + "rev": "062ca2a9370a27a35c524dc82d540e6e9824b652", "type": "github" }, "original": { From 01509a2a84498e2814505e650994ac03062ffd0c Mon Sep 17 00:00:00 2001 From: mo8it Date: Sun, 12 May 2024 22:44:46 +0200 Subject: [PATCH 1292/1293] Remove comma --- exercises/07_structs/structs3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/07_structs/structs3.rs b/exercises/07_structs/structs3.rs index 2d55dd7e..7cda5af1 100644 --- a/exercises/07_structs/structs3.rs +++ b/exercises/07_structs/structs3.rs @@ -1,7 +1,7 @@ // structs3.rs // // Structs contain data, but can also have logic. In this exercise we have -// defined the Package struct, and we want to test some logic attached to it. +// defined the Package struct and we want to test some logic attached to it. // Make the code compile and the tests pass! // // Execute `rustlings hint structs3` or use the `hint` watch subcommand for a From 01a78531ad40982d25a70c0a2393e39e21f666f2 Mon Sep 17 00:00:00 2001 From: Hamir Mahal Date: Sun, 12 May 2024 15:10:50 -0700 Subject: [PATCH 1293/1293] refactor: remove `referent` to improve readability --- info.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.toml b/info.toml index 5690701d..9fdc9a4f 100644 --- a/info.toml +++ b/info.toml @@ -378,7 +378,7 @@ path = "exercises/06_move_semantics/move_semantics5.rs" mode = "test" hint = """ Carefully reason about the range in which each mutable reference is in -scope. Does it help to update the value of referent (`x`) immediately after +scope. Does it help to update the value of `x` immediately after the mutable reference is taken? Read more about 'Mutable References' in the book's section 'References and Borrowing': https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references.