From 5ff23a286185daef544c72b00f90567183898929 Mon Sep 17 00:00:00 2001 From: Mikael Frosthage Date: Tue, 26 Jul 2022 22:02:50 +0200 Subject: [PATCH 001/393] 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 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 002/393] 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 be0b7e084ed5713d74c7f1bacdfd563fb2145a95 Mon Sep 17 00:00:00 2001 From: TK Buristrakul Date: Thu, 24 Nov 2022 19:20:59 +0000 Subject: [PATCH 003/393] 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 004/393] 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 005/393] 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 006/393] 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 007/393] 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 008/393] 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 009/393] 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 010/393] 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 011/393] 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 012/393] 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 013/393] 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 014/393] 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 015/393] 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 016/393] 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 017/393] 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 018/393] 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 019/393] 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 020/393] 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 021/393] 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 022/393] 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 023/393] 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 024/393] 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 025/393] 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 026/393] 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 027/393] 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 028/393] 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 029/393] 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 030/393] 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 031/393] 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 032/393] 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 033/393] 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 034/393] 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 035/393] 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 036/393] 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 037/393] 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 038/393] 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 039/393] 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 040/393] 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 041/393] 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 042/393] 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 043/393] 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 044/393] 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 045/393] 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 046/393] 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 047/393] 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 048/393] 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 049/393] 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 050/393] 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 051/393] 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 052/393] 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 053/393] 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 054/393] 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 055/393] 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 056/393] 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 057/393] 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 058/393] 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 059/393] 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 060/393] 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 061/393] 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 062/393] 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 063/393] 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 064/393] 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 065/393] 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 066/393] 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 067/393] 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 068/393] 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 069/393] 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 070/393] 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 071/393] 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 072/393] 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 073/393] 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 074/393] 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 075/393] 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 076/393] 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 077/393] 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 078/393] 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 079/393] 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 080/393] 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 081/393] 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 082/393] 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 083/393] 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 084/393] 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 085/393] 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 086/393] 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 087/393] 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 088/393] 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 089/393] 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 090/393] 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 091/393] 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 092/393] 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 093/393] 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 094/393] 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 095/393] 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 096/393] 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 097/393] 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 098/393] 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 099/393] 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 100/393] 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 101/393] 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 102/393] 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 103/393] 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 104/393] 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 105/393] 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 106/393] 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 107/393] 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 108/393] 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 109/393] 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 110/393] 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 111/393] 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 112/393] 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 113/393] 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 114/393] 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 115/393] 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 116/393] 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 117/393] 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 118/393] 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 119/393] 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 120/393] 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 121/393] 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 122/393] 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 123/393] 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 124/393] 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 125/393] 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 126/393] 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 127/393] 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 128/393] 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 129/393] 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 130/393] 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 131/393] 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 132/393] 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 133/393] 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 134/393] 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 135/393] 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 136/393] 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 137/393] 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 138/393] 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 139/393] 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 140/393] 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 141/393] 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 142/393] 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 143/393] 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 144/393] 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 145/393] 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 146/393] 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 147/393] 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 148/393] 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 149/393] 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 150/393] 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 151/393] 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 152/393] 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 153/393] 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 154/393] 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 155/393] 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 156/393] 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 157/393] 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 158/393] 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 159/393] 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 160/393] 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 161/393] 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 162/393] 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 163/393] 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 164/393] 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 165/393] 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 166/393] 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 167/393] 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 168/393] 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 169/393] 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 170/393] 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 171/393] 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 172/393] 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 173/393] 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 174/393] 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 175/393] 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 176/393] 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 177/393] 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 178/393] 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 179/393] 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 180/393] 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 181/393] 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 182/393] 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 183/393] 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 184/393] 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 185/393] 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 186/393] 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 187/393] 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 188/393] 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 189/393] 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 190/393] 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 191/393] 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 192/393] 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 193/393] 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 194/393] 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 195/393] 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 196/393] 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 197/393] 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 198/393] 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 199/393] 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 200/393] 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 201/393] 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 202/393] 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 203/393] 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 204/393] 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 205/393] 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 206/393] 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 207/393] 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 208/393] 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 209/393] 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 210/393] 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 211/393] 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 212/393] 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 213/393] 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 214/393] 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 215/393] 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 216/393] 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 217/393] 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 218/393] 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 219/393] 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 220/393] 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 221/393] 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 222/393] 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 223/393] 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 224/393] 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 225/393] 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 226/393] 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 227/393] 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 228/393] 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 229/393] 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 230/393] 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 231/393] 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 232/393] 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 233/393] 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 234/393] 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 235/393] 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 236/393] 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 237/393] 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 238/393] 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 239/393] 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 240/393] 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 241/393] 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 242/393] 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 243/393] 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 244/393] 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 245/393] 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 246/393] 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 247/393] 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 248/393] 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 249/393] 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 250/393] 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 251/393] 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 252/393] 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 253/393] 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 254/393] 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 255/393] 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 256/393] 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 257/393] 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 258/393] 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 259/393] 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 260/393] 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 261/393] 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 262/393] 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 263/393] 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 264/393] 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 265/393] 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 266/393] 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 267/393] 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 268/393] 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 269/393] 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 270/393] 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 271/393] 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 272/393] 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 273/393] 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 274/393] 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 275/393] 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 276/393] 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 277/393] 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 278/393] 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 279/393] 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 280/393] 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 281/393] 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 282/393] 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 283/393] 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 284/393] 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 285/393] 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 286/393] 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 287/393] 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 288/393] 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 289/393] 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 290/393] 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 291/393] 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 292/393] 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 293/393] 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 294/393] 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 295/393] 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 296/393] 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 297/393] 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 298/393] 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 299/393] 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 300/393] 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 301/393] 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 302/393] 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 303/393] 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 304/393] 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 305/393] 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 306/393] 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 307/393] 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 308/393] 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 309/393] 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 310/393] 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 311/393] 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 312/393] 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 313/393] 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 314/393] 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 315/393] 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 316/393] 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 317/393] 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 318/393] 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 319/393] 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 320/393] 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 321/393] 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 322/393] 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 323/393] 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 324/393] 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 325/393] 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 326/393] 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 327/393] 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 328/393] 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 329/393] 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 330/393] 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 331/393] 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 332/393] 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 333/393] 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 334/393] 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 335/393] 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 336/393] 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 337/393] 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 338/393] 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 339/393] 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 340/393] 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 341/393] 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 342/393] 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 343/393] 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 344/393] 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 345/393] 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 346/393] 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 347/393] 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 348/393] 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 349/393] 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 350/393] 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 351/393] 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 352/393] 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 353/393] 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 354/393] 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 355/393] 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 356/393] 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 357/393] 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 358/393] 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 359/393] 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 360/393] 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 361/393] 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 362/393] 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 363/393] 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 364/393] 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 365/393] 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 366/393] 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 367/393] 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 368/393] 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 369/393] 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 370/393] 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 371/393] 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 372/393] 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 373/393] 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 374/393] 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 375/393] 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 376/393] 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 377/393] 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 378/393] 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 379/393] 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 380/393] 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 4d6cd0ebb4791be37bc50ac6eddb57981eab0b23 Mon Sep 17 00:00:00 2001 From: Adwait Kumar Singh Date: Sat, 11 Nov 2023 16:39:44 -0800 Subject: [PATCH 381/393] 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 382/393] 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 383/393] 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 70f472484f0e43566d146e3184c39dc650f27a74 Mon Sep 17 00:00:00 2001 From: liv Date: Tue, 14 Nov 2023 15:49:52 +0100 Subject: [PATCH 384/393] 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 385/393] 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 386/393] 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 387/393] 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 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 388/393] 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 389/393] 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 390/393] 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 391/393] 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 392/393] 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 393/393] 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,