From b9cb4c290a6a3733ccbc847c552c419a360d1e57 Mon Sep 17 00:00:00 2001 From: Phani Pavan K Date: Wed, 19 Feb 2025 10:34:15 +0530 Subject: [PATCH] initial commit --- .github/workflows/ci.yml | 170 + .gitignore | 2 + .wr.toml | 0 Cargo.lock | 2785 +++++++++++++++++ Cargo.toml | 14 + README.md | 41 + book/.gitignore | 1 + book/assets/back.pdf | Bin 0 -> 121907 bytes book/assets/cover.pdf | Bin 0 -> 1016162 bytes book/book.toml | 132 + book/custom.theme | 211 ++ book/link2alias.json | 196 ++ book/metadata.yml | 4 + book/src/01_intro/00_welcome.md | 110 + book/src/01_intro/01_syntax.md | 115 + book/src/02_basic_calculator/00_intro.md | 16 + book/src/02_basic_calculator/01_integers.md | 134 + book/src/02_basic_calculator/02_variables.md | 100 + book/src/02_basic_calculator/03_if_else.md | 133 + book/src/02_basic_calculator/04_panics.md | 54 + book/src/02_basic_calculator/05_factorial.md | 11 + book/src/02_basic_calculator/06_while.md | 85 + book/src/02_basic_calculator/07_for.md | 64 + book/src/02_basic_calculator/08_overflow.md | 110 + book/src/02_basic_calculator/09_saturating.md | 39 + book/src/02_basic_calculator/10_as_casting.md | 102 + book/src/03_ticket_v1/00_intro.md | 18 + book/src/03_ticket_v1/01_struct.md | 139 + book/src/03_ticket_v1/02_validation.md | 21 + book/src/03_ticket_v1/03_modules.md | 124 + book/src/03_ticket_v1/04_visibility.md | 45 + book/src/03_ticket_v1/05_encapsulation.md | 59 + book/src/03_ticket_v1/06_ownership.md | 239 ++ book/src/03_ticket_v1/07_setters.md | 116 + book/src/03_ticket_v1/08_stack.md | 72 + book/src/03_ticket_v1/09_heap.md | 142 + .../03_ticket_v1/10_references_in_memory.md | 50 + book/src/03_ticket_v1/11_destructor.md | 169 + book/src/03_ticket_v1/12_outro.md | 5 + book/src/04_traits/00_intro.md | 20 + book/src/04_traits/01_trait.md | 127 + book/src/04_traits/02_orphan_rule.md | 112 + book/src/04_traits/03_operator_overloading.md | 98 + book/src/04_traits/04_derive.md | 104 + book/src/04_traits/05_trait_bounds.md | 176 ++ book/src/04_traits/06_str_slice.md | 117 + book/src/04_traits/07_deref.md | 91 + book/src/04_traits/08_sized.md | 80 + book/src/04_traits/09_from.md | 148 + book/src/04_traits/10_assoc_vs_generic.md | 146 + book/src/04_traits/11_clone.md | 107 + book/src/04_traits/12_copy.md | 113 + book/src/04_traits/13_drop.md | 53 + book/src/04_traits/14_outro.md | 27 + book/src/05_ticket_v2/00_intro.md | 15 + book/src/05_ticket_v2/01_enum.md | 47 + book/src/05_ticket_v2/02_match.md | 78 + .../src/05_ticket_v2/03_variants_with_data.md | 88 + book/src/05_ticket_v2/04_if_let.md | 73 + book/src/05_ticket_v2/05_nullability.md | 74 + book/src/05_ticket_v2/06_fallibility.md | 88 + book/src/05_ticket_v2/07_unwrap.md | 40 + book/src/05_ticket_v2/08_error_enums.md | 38 + book/src/05_ticket_v2/09_error_trait.md | 52 + book/src/05_ticket_v2/10_packages.md | 48 + book/src/05_ticket_v2/11_dependencies.md | 54 + book/src/05_ticket_v2/12_thiserror.md | 41 + book/src/05_ticket_v2/13_try_from.md | 40 + book/src/05_ticket_v2/14_source.md | 150 + book/src/05_ticket_v2/15_outro.md | 18 + book/src/06_ticket_management/00_intro.md | 18 + book/src/06_ticket_management/01_arrays.md | 90 + book/src/06_ticket_management/02_vec.md | 112 + book/src/06_ticket_management/03_resizing.md | 25 + book/src/06_ticket_management/04_iterators.md | 107 + book/src/06_ticket_management/05_iter.md | 42 + book/src/06_ticket_management/06_lifetimes.md | 84 + .../06_ticket_management/07_combinators.md | 107 + .../src/06_ticket_management/08_impl_trait.md | 69 + .../06_ticket_management/09_impl_trait_2.md | 32 + book/src/06_ticket_management/10_slices.md | 106 + .../06_ticket_management/11_mutable_slices.md | 41 + .../src/06_ticket_management/12_two_states.md | 67 + book/src/06_ticket_management/13_index.md | 37 + book/src/06_ticket_management/14_index_mut.md | 20 + book/src/06_ticket_management/15_hashmap.md | 116 + book/src/06_ticket_management/16_btreemap.md | 82 + book/src/07_threads/00_intro.md | 15 + book/src/07_threads/01_threads.md | 115 + book/src/07_threads/02_static.md | 114 + book/src/07_threads/03_leak.md | 46 + book/src/07_threads/04_scoped_threads.md | 73 + book/src/07_threads/05_channels.md | 73 + book/src/07_threads/06_interior_mutability.md | 114 + book/src/07_threads/07_ack.md | 16 + book/src/07_threads/08_client.md | 8 + book/src/07_threads/09_bounded.md | 43 + book/src/07_threads/10_patch.md | 39 + book/src/07_threads/11_locks.md | 226 ++ book/src/07_threads/12_rw_lock.md | 45 + book/src/07_threads/13_without_channels.md | 54 + book/src/07_threads/14_sync.md | 28 + book/src/08_futures/00_intro.md | 11 + book/src/08_futures/01_async_fn.md | 144 + book/src/08_futures/02_spawn.md | 122 + book/src/08_futures/03_runtime.md | 88 + book/src/08_futures/04_future.md | 170 + book/src/08_futures/05_blocking.md | 79 + .../08_futures/06_async_aware_primitives.md | 129 + book/src/08_futures/07_cancellation.md | 109 + book/src/08_futures/08_outro.md | 34 + book/src/SUMMARY.md | 109 + book/src/going_further.md | 52 + dprint.json | 11 + exercises/01_intro/00_welcome/Cargo.toml | 10 + exercises/01_intro/00_welcome/src/lib.rs | 46 + exercises/01_intro/01_syntax/Cargo.toml | 10 + exercises/01_intro/01_syntax/src/lib.rs | 19 + .../02_basic_calculator/00_intro/Cargo.toml | 10 + .../02_basic_calculator/00_intro/src/lib.rs | 14 + .../01_integers/Cargo.toml | 10 + .../01_integers/src/lib.rs | 15 + .../02_variables/Cargo.toml | 10 + .../02_variables/src/lib.rs | 34 + .../02_basic_calculator/03_if_else/Cargo.toml | 10 + .../02_basic_calculator/03_if_else/src/lib.rs | 36 + .../02_basic_calculator/04_panics/Cargo.toml | 10 + .../02_basic_calculator/04_panics/src/lib.rs | 26 + .../05_factorial/Cargo.toml | 10 + .../05_factorial/src/lib.rs | 36 + .../02_basic_calculator/06_while/Cargo.toml | 10 + .../02_basic_calculator/06_while/src/lib.rs | 33 + .../02_basic_calculator/07_for/Cargo.toml | 10 + .../02_basic_calculator/07_for/src/lib.rs | 29 + .../08_overflow/Cargo.toml | 10 + .../08_overflow/src/lib.rs | 49 + .../09_saturating/Cargo.toml | 10 + .../09_saturating/src/lib.rs | 39 + .../10_as_casting/Cargo.toml | 10 + .../10_as_casting/src/lib.rs | 37 + exercises/03_ticket_v1/00_intro/Cargo.toml | 10 + exercises/03_ticket_v1/00_intro/src/lib.rs | 14 + exercises/03_ticket_v1/01_struct/Cargo.toml | 10 + exercises/03_ticket_v1/01_struct/src/lib.rs | 29 + .../03_ticket_v1/02_validation/Cargo.toml | 13 + .../03_ticket_v1/02_validation/src/lib.rs | 74 + exercises/03_ticket_v1/03_modules/Cargo.toml | 10 + exercises/03_ticket_v1/03_modules/src/lib.rs | 40 + .../03_ticket_v1/04_visibility/Cargo.toml | 4 + .../03_ticket_v1/04_visibility/src/lib.rs | 77 + .../03_ticket_v1/05_encapsulation/Cargo.toml | 4 + .../03_ticket_v1/05_encapsulation/src/lib.rs | 61 + .../03_ticket_v1/06_ownership/Cargo.toml | 4 + .../03_ticket_v1/06_ownership/src/lib.rs | 64 + exercises/03_ticket_v1/07_setters/Cargo.toml | 7 + exercises/03_ticket_v1/07_setters/src/lib.rs | 98 + exercises/03_ticket_v1/08_stack/Cargo.toml | 4 + exercises/03_ticket_v1/08_stack/src/lib.rs | 21 + exercises/03_ticket_v1/09_heap/Cargo.toml | 4 + exercises/03_ticket_v1/09_heap/src/lib.rs | 28 + .../10_references_in_memory/Cargo.toml | 4 + .../10_references_in_memory/src/lib.rs | 28 + .../03_ticket_v1/11_destructor/Cargo.toml | 4 + .../03_ticket_v1/11_destructor/src/lib.rs | 16 + exercises/03_ticket_v1/12_outro/Cargo.toml | 4 + exercises/03_ticket_v1/12_outro/src/lib.rs | 13 + .../12_outro/tests/integration.rs | 49 + exercises/04_traits/00_intro/Cargo.toml | 4 + exercises/04_traits/00_intro/src/lib.rs | 14 + exercises/04_traits/01_trait/Cargo.toml | 4 + exercises/04_traits/01_trait/src/lib.rs | 23 + exercises/04_traits/02_orphan_rule/Cargo.toml | 4 + exercises/04_traits/02_orphan_rule/src/lib.rs | 11 + .../03_operator_overloading/Cargo.toml | 4 + .../03_operator_overloading/src/lib.rs | 85 + exercises/04_traits/04_derive/Cargo.toml | 4 + exercises/04_traits/04_derive/src/lib.rs | 90 + .../04_traits/05_trait_bounds/Cargo.toml | 4 + .../04_traits/05_trait_bounds/src/lib.rs | 15 + exercises/04_traits/06_str_slice/Cargo.toml | 7 + exercises/04_traits/06_str_slice/src/lib.rs | 61 + exercises/04_traits/07_deref/Cargo.toml | 4 + exercises/04_traits/07_deref/src/lib.rs | 38 + exercises/04_traits/08_sized/Cargo.toml | 4 + exercises/04_traits/08_sized/src/lib.rs | 7 + exercises/04_traits/09_from/Cargo.toml | 4 + exercises/04_traits/09_from/src/lib.rs | 10 + .../04_traits/10_assoc_vs_generic/Cargo.toml | 4 + .../04_traits/10_assoc_vs_generic/src/lib.rs | 37 + exercises/04_traits/11_clone/Cargo.toml | 4 + exercises/04_traits/11_clone/src/lib.rs | 26 + exercises/04_traits/12_copy/Cargo.toml | 4 + exercises/04_traits/12_copy/src/lib.rs | 25 + exercises/04_traits/13_drop/Cargo.toml | 4 + exercises/04_traits/13_drop/src/lib.rs | 23 + exercises/04_traits/14_outro/Cargo.toml | 4 + exercises/04_traits/14_outro/src/lib.rs | 10 + .../04_traits/14_outro/tests/integration.rs | 17 + exercises/05_ticket_v2/00_intro/Cargo.toml | 4 + exercises/05_ticket_v2/00_intro/src/lib.rs | 14 + exercises/05_ticket_v2/01_enum/Cargo.toml | 7 + exercises/05_ticket_v2/01_enum/src/lib.rs | 127 + exercises/05_ticket_v2/02_match/Cargo.toml | 4 + exercises/05_ticket_v2/02_match/src/lib.rs | 44 + .../03_variants_with_data/Cargo.toml | 7 + .../03_variants_with_data/src/lib.rs | 75 + exercises/05_ticket_v2/04_if_let/Cargo.toml | 4 + exercises/05_ticket_v2/04_if_let/src/lib.rs | 39 + .../05_ticket_v2/05_nullability/Cargo.toml | 7 + .../05_ticket_v2/05_nullability/src/lib.rs | 71 + .../05_ticket_v2/06_fallibility/Cargo.toml | 7 + .../05_ticket_v2/06_fallibility/src/lib.rs | 71 + exercises/05_ticket_v2/07_unwrap/Cargo.toml | 7 + exercises/05_ticket_v2/07_unwrap/src/lib.rs | 73 + .../05_ticket_v2/08_error_enums/Cargo.toml | 7 + .../05_ticket_v2/08_error_enums/src/lib.rs | 83 + .../05_ticket_v2/09_error_trait/Cargo.toml | 8 + .../05_ticket_v2/09_error_trait/src/lib.rs | 105 + exercises/05_ticket_v2/10_packages/Cargo.toml | 4 + .../05_ticket_v2/10_packages/src/main.rs | 11 + .../05_ticket_v2/11_dependencies/Cargo.toml | 4 + .../05_ticket_v2/11_dependencies/src/lib.rs | 6 + .../05_ticket_v2/12_thiserror/Cargo.toml | 9 + .../05_ticket_v2/12_thiserror/src/lib.rs | 85 + exercises/05_ticket_v2/13_try_from/Cargo.toml | 6 + exercises/05_ticket_v2/13_try_from/src/lib.rs | 39 + exercises/05_ticket_v2/14_source/Cargo.toml | 10 + exercises/05_ticket_v2/14_source/src/lib.rs | 76 + .../05_ticket_v2/14_source/src/status.rs | 46 + exercises/05_ticket_v2/15_outro/Cargo.toml | 4 + .../05_ticket_v2/15_outro/src/description.rs | 39 + exercises/05_ticket_v2/15_outro/src/lib.rs | 28 + exercises/05_ticket_v2/15_outro/src/status.rs | 44 + exercises/05_ticket_v2/15_outro/src/title.rs | 38 + .../06_ticket_management/00_intro/Cargo.toml | 4 + .../06_ticket_management/00_intro/src/lib.rs | 14 + .../06_ticket_management/01_arrays/Cargo.toml | 4 + .../06_ticket_management/01_arrays/src/lib.rs | 80 + .../06_ticket_management/02_vec/Cargo.toml | 4 + .../06_ticket_management/02_vec/src/lib.rs | 49 + .../03_resizing/Cargo.toml | 4 + .../03_resizing/src/lib.rs | 17 + .../04_iterators/Cargo.toml | 7 + .../04_iterators/src/lib.rs | 68 + .../06_ticket_management/05_iter/Cargo.toml | 7 + .../06_ticket_management/05_iter/src/lib.rs | 66 + .../06_lifetimes/Cargo.toml | 7 + .../06_lifetimes/src/lib.rs | 66 + .../07_combinators/Cargo.toml | 7 + .../07_combinators/src/lib.rs | 63 + .../08_impl_trait/Cargo.toml | 7 + .../08_impl_trait/src/lib.rs | 63 + .../09_impl_trait_2/Cargo.toml | 7 + .../09_impl_trait_2/src/lib.rs | 70 + .../06_ticket_management/10_slices/Cargo.toml | 4 + .../06_ticket_management/10_slices/src/lib.rs | 31 + .../11_mutable_slices/Cargo.toml | 4 + .../11_mutable_slices/src/lib.rs | 28 + .../12_two_states/Cargo.toml | 7 + .../12_two_states/src/lib.rs | 80 + .../06_ticket_management/13_index/Cargo.toml | 7 + .../06_ticket_management/13_index/src/lib.rs | 89 + .../14_index_mut/Cargo.toml | 7 + .../14_index_mut/src/lib.rs | 109 + .../15_hashmap/Cargo.toml | 7 + .../15_hashmap/src/lib.rs | 121 + .../16_btreemap/Cargo.toml | 7 + .../16_btreemap/src/lib.rs | 135 + exercises/07_threads/00_intro/Cargo.toml | 4 + exercises/07_threads/00_intro/src/lib.rs | 17 + exercises/07_threads/01_threads/Cargo.toml | 4 + exercises/07_threads/01_threads/src/lib.rs | 49 + exercises/07_threads/02_static/Cargo.toml | 4 + exercises/07_threads/02_static/src/lib.rs | 43 + exercises/07_threads/03_leak/Cargo.toml | 4 + exercises/07_threads/03_leak/src/lib.rs | 40 + .../07_threads/04_scoped_threads/Cargo.toml | 4 + .../07_threads/04_scoped_threads/src/lib.rs | 37 + exercises/07_threads/05_channels/Cargo.toml | 7 + exercises/07_threads/05_channels/src/data.rs | 23 + exercises/07_threads/05_channels/src/lib.rs | 23 + exercises/07_threads/05_channels/src/store.rs | 33 + .../07_threads/05_channels/tests/insert.rs | 32 + .../06_interior_mutability/Cargo.toml | 4 + .../06_interior_mutability/src/lib.rs | 46 + exercises/07_threads/07_ack/Cargo.toml | 7 + exercises/07_threads/07_ack/src/data.rs | 23 + exercises/07_threads/07_ack/src/lib.rs | 39 + exercises/07_threads/07_ack/src/store.rs | 37 + exercises/07_threads/07_ack/tests/insert.rs | 45 + exercises/07_threads/08_client/Cargo.toml | 7 + exercises/07_threads/08_client/src/data.rs | 23 + exercises/07_threads/08_client/src/lib.rs | 66 + exercises/07_threads/08_client/src/store.rs | 37 + .../07_threads/08_client/tests/insert.rs | 21 + exercises/07_threads/09_bounded/Cargo.toml | 7 + exercises/07_threads/09_bounded/src/data.rs | 23 + exercises/07_threads/09_bounded/src/lib.rs | 66 + exercises/07_threads/09_bounded/src/store.rs | 37 + .../07_threads/09_bounded/tests/insert.rs | 20 + exercises/07_threads/10_patch/Cargo.toml | 8 + exercises/07_threads/10_patch/src/data.rs | 31 + exercises/07_threads/10_patch/src/lib.rs | 97 + exercises/07_threads/10_patch/src/store.rs | 41 + exercises/07_threads/10_patch/tests/check.rs | 31 + exercises/07_threads/11_locks/Cargo.toml | 8 + exercises/07_threads/11_locks/src/data.rs | 23 + exercises/07_threads/11_locks/src/lib.rs | 88 + exercises/07_threads/11_locks/src/store.rs | 40 + exercises/07_threads/11_locks/tests/check.rs | 31 + exercises/07_threads/12_rw_lock/Cargo.toml | 8 + exercises/07_threads/12_rw_lock/src/data.rs | 23 + exercises/07_threads/12_rw_lock/src/lib.rs | 87 + exercises/07_threads/12_rw_lock/src/store.rs | 41 + .../07_threads/12_rw_lock/tests/check.rs | 31 + .../07_threads/13_without_channels/Cargo.toml | 7 + .../13_without_channels/src/data.rs | 23 + .../07_threads/13_without_channels/src/lib.rs | 7 + .../13_without_channels/src/store.rs | 40 + .../13_without_channels/tests/check.rs | 40 + exercises/07_threads/14_sync/Cargo.toml | 4 + exercises/07_threads/14_sync/src/lib.rs | 14 + exercises/08_futures/00_intro/Cargo.toml | 4 + exercises/08_futures/00_intro/src/lib.rs | 14 + exercises/08_futures/01_async_fn/Cargo.toml | 8 + exercises/08_futures/01_async_fn/src/lib.rs | 45 + exercises/08_futures/02_spawn/Cargo.toml | 8 + exercises/08_futures/02_spawn/src/lib.rs | 60 + exercises/08_futures/03_runtime/Cargo.toml | 8 + exercises/08_futures/03_runtime/src/lib.rs | 61 + exercises/08_futures/04_future/Cargo.toml | 7 + exercises/08_futures/04_future/src/lib.rs | 16 + exercises/08_futures/05_blocking/Cargo.toml | 8 + exercises/08_futures/05_blocking/src/lib.rs | 71 + .../06_async_aware_primitives/Cargo.toml | 7 + .../06_async_aware_primitives/src/lib.rs | 53 + .../08_futures/07_cancellation/Cargo.toml | 7 + .../08_futures/07_cancellation/src/lib.rs | 51 + exercises/08_futures/08_outro/Cargo.toml | 7 + exercises/08_futures/08_outro/src/lib.rs | 10 + helpers/common/Cargo.toml | 6 + helpers/common/src/lib.rs | 15 + helpers/json2redirects.sh | 12 + helpers/mdbook-exercise-linker/Cargo.toml | 11 + helpers/mdbook-exercise-linker/src/lib.rs | 75 + helpers/mdbook-exercise-linker/src/main.rs | 67 + helpers/mdbook-link-shortener/Cargo.toml | 15 + helpers/mdbook-link-shortener/src/lib.rs | 224 ++ helpers/mdbook-link-shortener/src/main.rs | 66 + helpers/ticket_fields/Cargo.toml | 8 + helpers/ticket_fields/src/description.rs | 73 + helpers/ticket_fields/src/lib.rs | 6 + helpers/ticket_fields/src/test_helpers.rs | 14 + helpers/ticket_fields/src/title.rs | 72 + site/_redirects | 194 ++ 355 files changed, 18626 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 .wr.toml create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 book/.gitignore create mode 100644 book/assets/back.pdf create mode 100644 book/assets/cover.pdf create mode 100644 book/book.toml create mode 100644 book/custom.theme create mode 100644 book/link2alias.json create mode 100644 book/metadata.yml create mode 100644 book/src/01_intro/00_welcome.md create mode 100644 book/src/01_intro/01_syntax.md create mode 100644 book/src/02_basic_calculator/00_intro.md create mode 100644 book/src/02_basic_calculator/01_integers.md create mode 100644 book/src/02_basic_calculator/02_variables.md create mode 100644 book/src/02_basic_calculator/03_if_else.md create mode 100644 book/src/02_basic_calculator/04_panics.md create mode 100644 book/src/02_basic_calculator/05_factorial.md create mode 100644 book/src/02_basic_calculator/06_while.md create mode 100644 book/src/02_basic_calculator/07_for.md create mode 100644 book/src/02_basic_calculator/08_overflow.md create mode 100644 book/src/02_basic_calculator/09_saturating.md create mode 100644 book/src/02_basic_calculator/10_as_casting.md create mode 100644 book/src/03_ticket_v1/00_intro.md create mode 100644 book/src/03_ticket_v1/01_struct.md create mode 100644 book/src/03_ticket_v1/02_validation.md create mode 100644 book/src/03_ticket_v1/03_modules.md create mode 100644 book/src/03_ticket_v1/04_visibility.md create mode 100644 book/src/03_ticket_v1/05_encapsulation.md create mode 100644 book/src/03_ticket_v1/06_ownership.md create mode 100644 book/src/03_ticket_v1/07_setters.md create mode 100644 book/src/03_ticket_v1/08_stack.md create mode 100644 book/src/03_ticket_v1/09_heap.md create mode 100644 book/src/03_ticket_v1/10_references_in_memory.md create mode 100644 book/src/03_ticket_v1/11_destructor.md create mode 100644 book/src/03_ticket_v1/12_outro.md create mode 100644 book/src/04_traits/00_intro.md create mode 100644 book/src/04_traits/01_trait.md create mode 100644 book/src/04_traits/02_orphan_rule.md create mode 100644 book/src/04_traits/03_operator_overloading.md create mode 100644 book/src/04_traits/04_derive.md create mode 100644 book/src/04_traits/05_trait_bounds.md create mode 100644 book/src/04_traits/06_str_slice.md create mode 100644 book/src/04_traits/07_deref.md create mode 100644 book/src/04_traits/08_sized.md create mode 100644 book/src/04_traits/09_from.md create mode 100644 book/src/04_traits/10_assoc_vs_generic.md create mode 100644 book/src/04_traits/11_clone.md create mode 100644 book/src/04_traits/12_copy.md create mode 100644 book/src/04_traits/13_drop.md create mode 100644 book/src/04_traits/14_outro.md create mode 100644 book/src/05_ticket_v2/00_intro.md create mode 100644 book/src/05_ticket_v2/01_enum.md create mode 100644 book/src/05_ticket_v2/02_match.md create mode 100644 book/src/05_ticket_v2/03_variants_with_data.md create mode 100644 book/src/05_ticket_v2/04_if_let.md create mode 100644 book/src/05_ticket_v2/05_nullability.md create mode 100644 book/src/05_ticket_v2/06_fallibility.md create mode 100644 book/src/05_ticket_v2/07_unwrap.md create mode 100644 book/src/05_ticket_v2/08_error_enums.md create mode 100644 book/src/05_ticket_v2/09_error_trait.md create mode 100644 book/src/05_ticket_v2/10_packages.md create mode 100644 book/src/05_ticket_v2/11_dependencies.md create mode 100644 book/src/05_ticket_v2/12_thiserror.md create mode 100644 book/src/05_ticket_v2/13_try_from.md create mode 100644 book/src/05_ticket_v2/14_source.md create mode 100644 book/src/05_ticket_v2/15_outro.md create mode 100644 book/src/06_ticket_management/00_intro.md create mode 100644 book/src/06_ticket_management/01_arrays.md create mode 100644 book/src/06_ticket_management/02_vec.md create mode 100644 book/src/06_ticket_management/03_resizing.md create mode 100644 book/src/06_ticket_management/04_iterators.md create mode 100644 book/src/06_ticket_management/05_iter.md create mode 100644 book/src/06_ticket_management/06_lifetimes.md create mode 100644 book/src/06_ticket_management/07_combinators.md create mode 100644 book/src/06_ticket_management/08_impl_trait.md create mode 100644 book/src/06_ticket_management/09_impl_trait_2.md create mode 100644 book/src/06_ticket_management/10_slices.md create mode 100644 book/src/06_ticket_management/11_mutable_slices.md create mode 100644 book/src/06_ticket_management/12_two_states.md create mode 100644 book/src/06_ticket_management/13_index.md create mode 100644 book/src/06_ticket_management/14_index_mut.md create mode 100644 book/src/06_ticket_management/15_hashmap.md create mode 100644 book/src/06_ticket_management/16_btreemap.md create mode 100644 book/src/07_threads/00_intro.md create mode 100644 book/src/07_threads/01_threads.md create mode 100644 book/src/07_threads/02_static.md create mode 100644 book/src/07_threads/03_leak.md create mode 100644 book/src/07_threads/04_scoped_threads.md create mode 100644 book/src/07_threads/05_channels.md create mode 100644 book/src/07_threads/06_interior_mutability.md create mode 100644 book/src/07_threads/07_ack.md create mode 100644 book/src/07_threads/08_client.md create mode 100644 book/src/07_threads/09_bounded.md create mode 100644 book/src/07_threads/10_patch.md create mode 100644 book/src/07_threads/11_locks.md create mode 100644 book/src/07_threads/12_rw_lock.md create mode 100644 book/src/07_threads/13_without_channels.md create mode 100644 book/src/07_threads/14_sync.md create mode 100644 book/src/08_futures/00_intro.md create mode 100644 book/src/08_futures/01_async_fn.md create mode 100644 book/src/08_futures/02_spawn.md create mode 100644 book/src/08_futures/03_runtime.md create mode 100644 book/src/08_futures/04_future.md create mode 100644 book/src/08_futures/05_blocking.md create mode 100644 book/src/08_futures/06_async_aware_primitives.md create mode 100644 book/src/08_futures/07_cancellation.md create mode 100644 book/src/08_futures/08_outro.md create mode 100644 book/src/SUMMARY.md create mode 100644 book/src/going_further.md create mode 100644 dprint.json create mode 100644 exercises/01_intro/00_welcome/Cargo.toml create mode 100644 exercises/01_intro/00_welcome/src/lib.rs create mode 100644 exercises/01_intro/01_syntax/Cargo.toml create mode 100644 exercises/01_intro/01_syntax/src/lib.rs create mode 100644 exercises/02_basic_calculator/00_intro/Cargo.toml create mode 100644 exercises/02_basic_calculator/00_intro/src/lib.rs create mode 100644 exercises/02_basic_calculator/01_integers/Cargo.toml create mode 100644 exercises/02_basic_calculator/01_integers/src/lib.rs create mode 100644 exercises/02_basic_calculator/02_variables/Cargo.toml create mode 100644 exercises/02_basic_calculator/02_variables/src/lib.rs create mode 100644 exercises/02_basic_calculator/03_if_else/Cargo.toml create mode 100644 exercises/02_basic_calculator/03_if_else/src/lib.rs create mode 100644 exercises/02_basic_calculator/04_panics/Cargo.toml create mode 100644 exercises/02_basic_calculator/04_panics/src/lib.rs create mode 100644 exercises/02_basic_calculator/05_factorial/Cargo.toml create mode 100644 exercises/02_basic_calculator/05_factorial/src/lib.rs create mode 100644 exercises/02_basic_calculator/06_while/Cargo.toml create mode 100644 exercises/02_basic_calculator/06_while/src/lib.rs create mode 100644 exercises/02_basic_calculator/07_for/Cargo.toml create mode 100644 exercises/02_basic_calculator/07_for/src/lib.rs create mode 100644 exercises/02_basic_calculator/08_overflow/Cargo.toml create mode 100644 exercises/02_basic_calculator/08_overflow/src/lib.rs create mode 100644 exercises/02_basic_calculator/09_saturating/Cargo.toml create mode 100644 exercises/02_basic_calculator/09_saturating/src/lib.rs create mode 100644 exercises/02_basic_calculator/10_as_casting/Cargo.toml create mode 100644 exercises/02_basic_calculator/10_as_casting/src/lib.rs create mode 100644 exercises/03_ticket_v1/00_intro/Cargo.toml create mode 100644 exercises/03_ticket_v1/00_intro/src/lib.rs create mode 100644 exercises/03_ticket_v1/01_struct/Cargo.toml create mode 100644 exercises/03_ticket_v1/01_struct/src/lib.rs create mode 100644 exercises/03_ticket_v1/02_validation/Cargo.toml create mode 100644 exercises/03_ticket_v1/02_validation/src/lib.rs create mode 100644 exercises/03_ticket_v1/03_modules/Cargo.toml create mode 100644 exercises/03_ticket_v1/03_modules/src/lib.rs create mode 100644 exercises/03_ticket_v1/04_visibility/Cargo.toml create mode 100644 exercises/03_ticket_v1/04_visibility/src/lib.rs create mode 100644 exercises/03_ticket_v1/05_encapsulation/Cargo.toml create mode 100644 exercises/03_ticket_v1/05_encapsulation/src/lib.rs create mode 100644 exercises/03_ticket_v1/06_ownership/Cargo.toml create mode 100644 exercises/03_ticket_v1/06_ownership/src/lib.rs create mode 100644 exercises/03_ticket_v1/07_setters/Cargo.toml create mode 100644 exercises/03_ticket_v1/07_setters/src/lib.rs create mode 100644 exercises/03_ticket_v1/08_stack/Cargo.toml create mode 100644 exercises/03_ticket_v1/08_stack/src/lib.rs create mode 100644 exercises/03_ticket_v1/09_heap/Cargo.toml create mode 100644 exercises/03_ticket_v1/09_heap/src/lib.rs create mode 100644 exercises/03_ticket_v1/10_references_in_memory/Cargo.toml create mode 100644 exercises/03_ticket_v1/10_references_in_memory/src/lib.rs create mode 100644 exercises/03_ticket_v1/11_destructor/Cargo.toml create mode 100644 exercises/03_ticket_v1/11_destructor/src/lib.rs create mode 100644 exercises/03_ticket_v1/12_outro/Cargo.toml create mode 100644 exercises/03_ticket_v1/12_outro/src/lib.rs create mode 100644 exercises/03_ticket_v1/12_outro/tests/integration.rs create mode 100644 exercises/04_traits/00_intro/Cargo.toml create mode 100644 exercises/04_traits/00_intro/src/lib.rs create mode 100644 exercises/04_traits/01_trait/Cargo.toml create mode 100644 exercises/04_traits/01_trait/src/lib.rs create mode 100644 exercises/04_traits/02_orphan_rule/Cargo.toml create mode 100644 exercises/04_traits/02_orphan_rule/src/lib.rs create mode 100644 exercises/04_traits/03_operator_overloading/Cargo.toml create mode 100644 exercises/04_traits/03_operator_overloading/src/lib.rs create mode 100644 exercises/04_traits/04_derive/Cargo.toml create mode 100644 exercises/04_traits/04_derive/src/lib.rs create mode 100644 exercises/04_traits/05_trait_bounds/Cargo.toml create mode 100644 exercises/04_traits/05_trait_bounds/src/lib.rs create mode 100644 exercises/04_traits/06_str_slice/Cargo.toml create mode 100644 exercises/04_traits/06_str_slice/src/lib.rs create mode 100644 exercises/04_traits/07_deref/Cargo.toml create mode 100644 exercises/04_traits/07_deref/src/lib.rs create mode 100644 exercises/04_traits/08_sized/Cargo.toml create mode 100644 exercises/04_traits/08_sized/src/lib.rs create mode 100644 exercises/04_traits/09_from/Cargo.toml create mode 100644 exercises/04_traits/09_from/src/lib.rs create mode 100644 exercises/04_traits/10_assoc_vs_generic/Cargo.toml create mode 100644 exercises/04_traits/10_assoc_vs_generic/src/lib.rs create mode 100644 exercises/04_traits/11_clone/Cargo.toml create mode 100644 exercises/04_traits/11_clone/src/lib.rs create mode 100644 exercises/04_traits/12_copy/Cargo.toml create mode 100644 exercises/04_traits/12_copy/src/lib.rs create mode 100644 exercises/04_traits/13_drop/Cargo.toml create mode 100644 exercises/04_traits/13_drop/src/lib.rs create mode 100644 exercises/04_traits/14_outro/Cargo.toml create mode 100644 exercises/04_traits/14_outro/src/lib.rs create mode 100644 exercises/04_traits/14_outro/tests/integration.rs create mode 100644 exercises/05_ticket_v2/00_intro/Cargo.toml create mode 100644 exercises/05_ticket_v2/00_intro/src/lib.rs create mode 100644 exercises/05_ticket_v2/01_enum/Cargo.toml create mode 100644 exercises/05_ticket_v2/01_enum/src/lib.rs create mode 100644 exercises/05_ticket_v2/02_match/Cargo.toml create mode 100644 exercises/05_ticket_v2/02_match/src/lib.rs create mode 100644 exercises/05_ticket_v2/03_variants_with_data/Cargo.toml create mode 100644 exercises/05_ticket_v2/03_variants_with_data/src/lib.rs create mode 100644 exercises/05_ticket_v2/04_if_let/Cargo.toml create mode 100644 exercises/05_ticket_v2/04_if_let/src/lib.rs create mode 100644 exercises/05_ticket_v2/05_nullability/Cargo.toml create mode 100644 exercises/05_ticket_v2/05_nullability/src/lib.rs create mode 100644 exercises/05_ticket_v2/06_fallibility/Cargo.toml create mode 100644 exercises/05_ticket_v2/06_fallibility/src/lib.rs create mode 100644 exercises/05_ticket_v2/07_unwrap/Cargo.toml create mode 100644 exercises/05_ticket_v2/07_unwrap/src/lib.rs create mode 100644 exercises/05_ticket_v2/08_error_enums/Cargo.toml create mode 100644 exercises/05_ticket_v2/08_error_enums/src/lib.rs create mode 100644 exercises/05_ticket_v2/09_error_trait/Cargo.toml create mode 100644 exercises/05_ticket_v2/09_error_trait/src/lib.rs create mode 100644 exercises/05_ticket_v2/10_packages/Cargo.toml create mode 100644 exercises/05_ticket_v2/10_packages/src/main.rs create mode 100644 exercises/05_ticket_v2/11_dependencies/Cargo.toml create mode 100644 exercises/05_ticket_v2/11_dependencies/src/lib.rs create mode 100644 exercises/05_ticket_v2/12_thiserror/Cargo.toml create mode 100644 exercises/05_ticket_v2/12_thiserror/src/lib.rs create mode 100644 exercises/05_ticket_v2/13_try_from/Cargo.toml create mode 100644 exercises/05_ticket_v2/13_try_from/src/lib.rs create mode 100644 exercises/05_ticket_v2/14_source/Cargo.toml create mode 100644 exercises/05_ticket_v2/14_source/src/lib.rs create mode 100644 exercises/05_ticket_v2/14_source/src/status.rs create mode 100644 exercises/05_ticket_v2/15_outro/Cargo.toml create mode 100644 exercises/05_ticket_v2/15_outro/src/description.rs create mode 100644 exercises/05_ticket_v2/15_outro/src/lib.rs create mode 100644 exercises/05_ticket_v2/15_outro/src/status.rs create mode 100644 exercises/05_ticket_v2/15_outro/src/title.rs create mode 100644 exercises/06_ticket_management/00_intro/Cargo.toml create mode 100644 exercises/06_ticket_management/00_intro/src/lib.rs create mode 100644 exercises/06_ticket_management/01_arrays/Cargo.toml create mode 100644 exercises/06_ticket_management/01_arrays/src/lib.rs create mode 100644 exercises/06_ticket_management/02_vec/Cargo.toml create mode 100644 exercises/06_ticket_management/02_vec/src/lib.rs create mode 100644 exercises/06_ticket_management/03_resizing/Cargo.toml create mode 100644 exercises/06_ticket_management/03_resizing/src/lib.rs create mode 100644 exercises/06_ticket_management/04_iterators/Cargo.toml create mode 100644 exercises/06_ticket_management/04_iterators/src/lib.rs create mode 100644 exercises/06_ticket_management/05_iter/Cargo.toml create mode 100644 exercises/06_ticket_management/05_iter/src/lib.rs create mode 100644 exercises/06_ticket_management/06_lifetimes/Cargo.toml create mode 100644 exercises/06_ticket_management/06_lifetimes/src/lib.rs create mode 100644 exercises/06_ticket_management/07_combinators/Cargo.toml create mode 100644 exercises/06_ticket_management/07_combinators/src/lib.rs create mode 100644 exercises/06_ticket_management/08_impl_trait/Cargo.toml create mode 100644 exercises/06_ticket_management/08_impl_trait/src/lib.rs create mode 100644 exercises/06_ticket_management/09_impl_trait_2/Cargo.toml create mode 100644 exercises/06_ticket_management/09_impl_trait_2/src/lib.rs create mode 100644 exercises/06_ticket_management/10_slices/Cargo.toml create mode 100644 exercises/06_ticket_management/10_slices/src/lib.rs create mode 100644 exercises/06_ticket_management/11_mutable_slices/Cargo.toml create mode 100644 exercises/06_ticket_management/11_mutable_slices/src/lib.rs create mode 100644 exercises/06_ticket_management/12_two_states/Cargo.toml create mode 100644 exercises/06_ticket_management/12_two_states/src/lib.rs create mode 100644 exercises/06_ticket_management/13_index/Cargo.toml create mode 100644 exercises/06_ticket_management/13_index/src/lib.rs create mode 100644 exercises/06_ticket_management/14_index_mut/Cargo.toml create mode 100644 exercises/06_ticket_management/14_index_mut/src/lib.rs create mode 100644 exercises/06_ticket_management/15_hashmap/Cargo.toml create mode 100644 exercises/06_ticket_management/15_hashmap/src/lib.rs create mode 100644 exercises/06_ticket_management/16_btreemap/Cargo.toml create mode 100644 exercises/06_ticket_management/16_btreemap/src/lib.rs create mode 100644 exercises/07_threads/00_intro/Cargo.toml create mode 100644 exercises/07_threads/00_intro/src/lib.rs create mode 100644 exercises/07_threads/01_threads/Cargo.toml create mode 100644 exercises/07_threads/01_threads/src/lib.rs create mode 100644 exercises/07_threads/02_static/Cargo.toml create mode 100644 exercises/07_threads/02_static/src/lib.rs create mode 100644 exercises/07_threads/03_leak/Cargo.toml create mode 100644 exercises/07_threads/03_leak/src/lib.rs create mode 100644 exercises/07_threads/04_scoped_threads/Cargo.toml create mode 100644 exercises/07_threads/04_scoped_threads/src/lib.rs create mode 100644 exercises/07_threads/05_channels/Cargo.toml create mode 100644 exercises/07_threads/05_channels/src/data.rs create mode 100644 exercises/07_threads/05_channels/src/lib.rs create mode 100644 exercises/07_threads/05_channels/src/store.rs create mode 100644 exercises/07_threads/05_channels/tests/insert.rs create mode 100644 exercises/07_threads/06_interior_mutability/Cargo.toml create mode 100644 exercises/07_threads/06_interior_mutability/src/lib.rs create mode 100644 exercises/07_threads/07_ack/Cargo.toml create mode 100644 exercises/07_threads/07_ack/src/data.rs create mode 100644 exercises/07_threads/07_ack/src/lib.rs create mode 100644 exercises/07_threads/07_ack/src/store.rs create mode 100644 exercises/07_threads/07_ack/tests/insert.rs create mode 100644 exercises/07_threads/08_client/Cargo.toml create mode 100644 exercises/07_threads/08_client/src/data.rs create mode 100644 exercises/07_threads/08_client/src/lib.rs create mode 100644 exercises/07_threads/08_client/src/store.rs create mode 100644 exercises/07_threads/08_client/tests/insert.rs create mode 100644 exercises/07_threads/09_bounded/Cargo.toml create mode 100644 exercises/07_threads/09_bounded/src/data.rs create mode 100644 exercises/07_threads/09_bounded/src/lib.rs create mode 100644 exercises/07_threads/09_bounded/src/store.rs create mode 100644 exercises/07_threads/09_bounded/tests/insert.rs create mode 100644 exercises/07_threads/10_patch/Cargo.toml create mode 100644 exercises/07_threads/10_patch/src/data.rs create mode 100644 exercises/07_threads/10_patch/src/lib.rs create mode 100644 exercises/07_threads/10_patch/src/store.rs create mode 100644 exercises/07_threads/10_patch/tests/check.rs create mode 100644 exercises/07_threads/11_locks/Cargo.toml create mode 100644 exercises/07_threads/11_locks/src/data.rs create mode 100644 exercises/07_threads/11_locks/src/lib.rs create mode 100644 exercises/07_threads/11_locks/src/store.rs create mode 100644 exercises/07_threads/11_locks/tests/check.rs create mode 100644 exercises/07_threads/12_rw_lock/Cargo.toml create mode 100644 exercises/07_threads/12_rw_lock/src/data.rs create mode 100644 exercises/07_threads/12_rw_lock/src/lib.rs create mode 100644 exercises/07_threads/12_rw_lock/src/store.rs create mode 100644 exercises/07_threads/12_rw_lock/tests/check.rs create mode 100644 exercises/07_threads/13_without_channels/Cargo.toml create mode 100644 exercises/07_threads/13_without_channels/src/data.rs create mode 100644 exercises/07_threads/13_without_channels/src/lib.rs create mode 100644 exercises/07_threads/13_without_channels/src/store.rs create mode 100644 exercises/07_threads/13_without_channels/tests/check.rs create mode 100644 exercises/07_threads/14_sync/Cargo.toml create mode 100644 exercises/07_threads/14_sync/src/lib.rs create mode 100644 exercises/08_futures/00_intro/Cargo.toml create mode 100644 exercises/08_futures/00_intro/src/lib.rs create mode 100644 exercises/08_futures/01_async_fn/Cargo.toml create mode 100644 exercises/08_futures/01_async_fn/src/lib.rs create mode 100644 exercises/08_futures/02_spawn/Cargo.toml create mode 100644 exercises/08_futures/02_spawn/src/lib.rs create mode 100644 exercises/08_futures/03_runtime/Cargo.toml create mode 100644 exercises/08_futures/03_runtime/src/lib.rs create mode 100644 exercises/08_futures/04_future/Cargo.toml create mode 100644 exercises/08_futures/04_future/src/lib.rs create mode 100644 exercises/08_futures/05_blocking/Cargo.toml create mode 100644 exercises/08_futures/05_blocking/src/lib.rs create mode 100644 exercises/08_futures/06_async_aware_primitives/Cargo.toml create mode 100644 exercises/08_futures/06_async_aware_primitives/src/lib.rs create mode 100644 exercises/08_futures/07_cancellation/Cargo.toml create mode 100644 exercises/08_futures/07_cancellation/src/lib.rs create mode 100644 exercises/08_futures/08_outro/Cargo.toml create mode 100644 exercises/08_futures/08_outro/src/lib.rs create mode 100644 helpers/common/Cargo.toml create mode 100644 helpers/common/src/lib.rs create mode 100755 helpers/json2redirects.sh create mode 100644 helpers/mdbook-exercise-linker/Cargo.toml create mode 100644 helpers/mdbook-exercise-linker/src/lib.rs create mode 100644 helpers/mdbook-exercise-linker/src/main.rs create mode 100644 helpers/mdbook-link-shortener/Cargo.toml create mode 100644 helpers/mdbook-link-shortener/src/lib.rs create mode 100644 helpers/mdbook-link-shortener/src/main.rs create mode 100644 helpers/ticket_fields/Cargo.toml create mode 100644 helpers/ticket_fields/src/description.rs create mode 100644 helpers/ticket_fields/src/lib.rs create mode 100644 helpers/ticket_fields/src/test_helpers.rs create mode 100644 helpers/ticket_fields/src/title.rs create mode 100644 site/_redirects diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..14c8d05 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,170 @@ +name: "CI" + +on: + push: + branches: + - main + pull_request: + branches: + - main + workflow_dispatch: + schedule: + # First day of a month + - cron: '0 0 1 * *' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Get Core Sans + uses: actions/checkout@v4 + if: "!github.event.pull_request.head.repo.fork" + with: + fetch-depth: 0 + repository: mainmatter/core-sans-a-fonts + ssh-key: ${{ secrets.SSH_PRIVATE_KEY }} + path: core-sans-a-fonts + - name: Install Core Sans Font + if: "!github.event.pull_request.head.repo.fork" + run: | + sudo cp -r core-sans-a-fonts/* /usr/local/share/fonts/ + sudo fc-cache -f -v + fc-list | grep "Core Sans" + - name: Use Fallback font for fork PRs + if: "github.event.pull_request.head.repo.fork" + run: | + sed -i 's/"BoldFont=CoreSansA65.ttf",//g' book/book.toml + sed -i 's/"ItalicFont=CoreSansA45It.ttf",//g' book/book.toml + sed -i 's/"BoldItalicFont=CoreSansA65It.ttf",//g' book/book.toml + sed -i 's/CoreSansA45.ttf/Open Sans:style=Regular/g' book/book.toml + - uses: actions-rust-lang/setup-rust-toolchain@v1 + - name: Install exercise plugin + run: cargo install --path helpers/mdbook-exercise-linker + - name: Install link shortener plugin + run: cargo install --path helpers/mdbook-link-shortener + - name: Install mdbook-pandoc, calibre, pdftk and related dependencies + run: | + cargo install mdbook-pandoc --locked --version 0.7.1 + sudo apt-get update + sudo apt-get install -y fonts-noto fonts-open-sans calibre pdftk + sudo fc-cache -f -v + export PANDOC_VERSION=3.3 + curl -LsSf https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-linux-amd64.tar.gz | tar zxf - + echo "$PWD/pandoc-${PANDOC_VERSION}/bin" >> $GITHUB_PATH + shell: bash + - name: Setup TeX Live + uses: teatimeguest/setup-texlive-action@v3 + with: + packages: + scheme-basic + luatex + lualatex-math + luacolor + luatexbase + luaotfload + framed + unicode-math + xcolor + geometry + longtable + booktabs + array + lua-ul + etoolbox + fancyvrb + footnote + selnolig + natbib + csquotes + bookmark + xurl + amsmath + setspace + iftex + - name: Check `tlmgr` version + run: tlmgr --version + - uses: taiki-e/install-action@v2 + with: + tool: mdbook + - name: Build book + env: + LINK_SHORTENER_VERIFY: "true" + run: | + cd book + mdbook build + - name: Add cover and back to downloadable PDF + run: | + pdftk book/assets/cover.pdf book/book/pandoc/pdf/100-exercises-to-learn-rust.pdf book/assets/back.pdf cat output book/book/pandoc/pdf/100-exercises-to-learn-rust-with-cover.pdf + mv book/book/pandoc/pdf/100-exercises-to-learn-rust-with-cover.pdf book/book/pandoc/pdf/100-exercises-to-learn-rust.pdf + - name: Convert HTML to ePUB + run: | + cd book/book/pandoc/html + sed -i 's|\\newpage{=latex}||g' 100-exercises-to-learn-rust.html + ebook-convert 100-exercises-to-learn-rust.html 100-exercises-to-learn-rust.epub \ + --embed-all-fonts \ + --subset-embedded-fonts + - name: Link Checker + uses: lycheeverse/lychee-action@v1 + with: + fail: true + args: | + --exclude-loopback + --require-https + --no-progress + book/book/html/ + # Upload the HTML book as an artifact + - uses: actions/upload-artifact@v4 + with: + name: book + # When you support multiple formats, the output directory changes + # to include the format in its path. + path: book/book/html + - uses: actions/upload-artifact@v4 + with: + name: online-pdf + path: book/book/pandoc/pdf/100-exercises-to-learn-rust.pdf + - uses: actions/upload-artifact@v4 + with: + name: paperback + path: book/book/pandoc/paperback/100-exercises-to-learn-rust.pdf + - uses: actions/upload-artifact@v4 + with: + name: ePUB + path: book/book/pandoc/html/100-exercises-to-learn-rust.epub + + is_fresh: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: sudo apt-get update && sudo apt-get install -y jq + - run: | + ./helpers/json2redirects.sh book/link2alias.json > site/_redirects + # Verify nothing has changed, meaning that the redirect file is up-to-date + - run: | + git diff --exit-code site/_redirects + + gravity: + runs-on: ubuntu-latest + needs: [build] + steps: + - uses: actions/download-artifact@v4 + with: + path: book + pattern: online-pdf + - uses: pnpm/action-setup@v4 + with: + version: 9 + - run: ls -las ./book + - name: Run Gravity + run: pnpm dlx @gravityci/cli "./book/**/*" + env: + GRAVITY_TOKEN: ${{ secrets.GRAVITY_TOKEN }} + + formatter: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: dprint/check@v2.2 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ca5c83 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target/ +exercises/progress.db diff --git a/.wr.toml b/.wr.toml new file mode 100644 index 0000000..e69de29 diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..d560369 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2785 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "ammonia" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab99eae5ee58501ab236beb6f20f6ca39be615267b014899c89b2f0bc18a459" +dependencies = [ + "html5ever", + "maplit", + "once_cell", + "tendril", + "url", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + +[[package]] +name = "anstyle-parse" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "arrays" +version = "0.1.0" + +[[package]] +name = "as_cast" +version = "0.1.0" + +[[package]] +name = "assoc_vs_generic" +version = "0.1.0" + +[[package]] +name = "async_fn" +version = "0.1.0" +dependencies = [ + "anyhow", + "tokio", +] + +[[package]] +name = "async_locks" +version = "0.1.0" +dependencies = [ + "tokio", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "0.1.0" +dependencies = [ + "anyhow", + "tokio", +] + +[[package]] +name = "bounded" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "bstr" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + +[[package]] +name = "btreemap" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" + +[[package]] +name = "cancellation" +version = "0.1.0" +dependencies = [ + "tokio", +] + +[[package]] +name = "cc" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "channels" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "windows-targets 0.52.6", +] + +[[package]] +name = "clap" +version = "4.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", + "terminal_size", +] + +[[package]] +name = "clap_complete" +version = "4.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8670053e87c316345e384ca1f3eba3006fc6355ed8b8a1140d104e109e3df34" +dependencies = [ + "clap", +] + +[[package]] +name = "clap_derive" +version = "4.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "client" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "clone" +version = "0.1.0" + +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "combinators" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "common" +version = "0.1.0" + +[[package]] +name = "copy" +version = "0.1.0" + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "dbus" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" +dependencies = [ + "libc", + "libdbus-sys", + "winapi", +] + +[[package]] +name = "deps" +version = "0.1.0" + +[[package]] +name = "deref" +version = "0.1.0" + +[[package]] +name = "derives" +version = "0.1.0" + +[[package]] +name = "destructor" +version = "0.1.0" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "drop" +version = "0.1.0" + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "elasticlunr-rs" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41e83863a500656dfa214fee6682de9c5b9f03de6860fec531235ed2ae9f6571" +dependencies = [ + "regex", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "encapsulation" +version = "0.1.0" + +[[package]] +name = "enum_" +version = "0.1.0" +dependencies = [ + "common", +] + +[[package]] +name = "env_filter" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "error_enums" +version = "0.1.0" +dependencies = [ + "common", +] + +[[package]] +name = "error_trait" +version = "0.1.0" +dependencies = [ + "common", + "static_assertions", +] + +[[package]] +name = "factorial" +version = "0.1.0" + +[[package]] +name = "fallibility" +version = "0.1.0" +dependencies = [ + "common", +] + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "for_" +version = "0.1.0" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "from" +version = "0.1.0" + +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "future" +version = "0.1.0" +dependencies = [ + "tokio", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-macro", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getopts" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "globset" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "handlebars" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b" +dependencies = [ + "log", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashmap" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "headers" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" +dependencies = [ + "base64", + "bytes", + "headers-core", + "http 0.2.12", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http 0.2.12", +] + +[[package]] +name = "heap" +version = "0.1.0" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "html5ever" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "if_else" +version = "0.1.0" + +[[package]] +name = "if_let" +version = "0.1.0" + +[[package]] +name = "ignore" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "impl_trait" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "impl_trait_2" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "index" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "index_mut" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "indexmap" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inotify" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "integers" +version = "0.1.0" + +[[package]] +name = "interior_mutability" +version = "0.1.0" + +[[package]] +name = "intro_01" +version = "0.1.0" + +[[package]] +name = "intro_02" +version = "0.1.0" + +[[package]] +name = "intro_03" +version = "0.1.0" + +[[package]] +name = "intro_04" +version = "0.1.0" + +[[package]] +name = "intro_05" +version = "0.1.0" + +[[package]] +name = "intro_07" +version = "0.1.0" + +[[package]] +name = "intro_08" +version = "0.1.0" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "iter" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "iterators" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kqueue" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +dependencies = [ + "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]] +name = "leaking" +version = "0.1.0" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libdbus-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "lifetime" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "locks" +version = "0.1.0" +dependencies = [ + "thiserror", + "ticket_fields", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "markup5ever" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" +dependencies = [ + "log", + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "match_" +version = "0.1.0" + +[[package]] +name = "mdbook" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45a38e19bd200220ef07c892b0157ad3d2365e5b5a267ca01ad12182491eea5" +dependencies = [ + "ammonia", + "anyhow", + "chrono", + "clap", + "clap_complete", + "elasticlunr-rs", + "env_logger", + "futures-util", + "handlebars", + "ignore", + "log", + "memchr", + "notify", + "notify-debouncer-mini", + "once_cell", + "opener", + "pathdiff", + "pulldown-cmark 0.10.3", + "regex", + "serde", + "serde_json", + "shlex", + "tempfile", + "tokio", + "toml", + "topological-sort", + "walkdir", + "warp", +] + +[[package]] +name = "mdbook-exercise-linker" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "mdbook", + "semver", + "serde_json", +] + +[[package]] +name = "mdbook-link-shortener" +version = "0.1.0" +dependencies = [ + "anyhow", + "bimap", + "clap", + "itertools", + "mdbook", + "pulldown-cmark 0.11.0", + "pulldown-cmark-to-cmark", + "semver", + "serde_json", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "mio" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +dependencies = [ + "hermit-abi", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "modules" +version = "0.1.0" + +[[package]] +name = "mut_slice" +version = "0.1.0" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "normpath" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "notify" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" +dependencies = [ + "bitflags 2.6.0", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio 0.8.11", + "walkdir", + "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]] +name = "nullability" +version = "0.1.0" +dependencies = [ + "common", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opener" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8df34be653210fbe9ffaff41d3b92721c56ce82dfee58ee684f9afb5e3a90c0" +dependencies = [ + "bstr", + "dbus", + "normpath", + "windows-sys 0.52.0", +] + +[[package]] +name = "orphan" +version = "0.1.0" + +[[package]] +name = "outro_02" +version = "0.1.0" + +[[package]] +name = "outro_03" +version = "0.1.0" + +[[package]] +name = "outro_04" +version = "0.1.0" + +[[package]] +name = "outro_08" +version = "0.1.0" +dependencies = [ + "tokio", +] + +[[package]] +name = "overflow" +version = "0.1.0" + +[[package]] +name = "overloading" +version = "0.1.0" + +[[package]] +name = "ownership" +version = "0.1.0" + +[[package]] +name = "packages" +version = "0.1.0" + +[[package]] +name = "panics" +version = "0.1.0" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.3", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "patch" +version = "0.1.0" +dependencies = [ + "thiserror", + "ticket_fields", +] + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pulldown-cmark" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76979bea66e7875e7509c4ec5300112b316af87fa7a252ca91c448b32dfe3993" +dependencies = [ + "bitflags 2.6.0", + "memchr", + "pulldown-cmark-escape 0.10.1", + "unicase", +] + +[[package]] +name = "pulldown-cmark" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8746739f11d39ce5ad5c2520a9b75285310dbfe78c541ccf832d38615765aec0" +dependencies = [ + "bitflags 2.6.0", + "getopts", + "memchr", + "pulldown-cmark-escape 0.11.0", + "unicase", +] + +[[package]] +name = "pulldown-cmark-escape" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd348ff538bc9caeda7ee8cad2d1d48236a1f443c1fa3913c6a02fe0043b1dd3" + +[[package]] +name = "pulldown-cmark-escape" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" + +[[package]] +name = "pulldown-cmark-to-cmark" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c77db841443d89a57ae94f22d29c022f6d9f41b00bddbf1f4024dbaf4bdce1" +dependencies = [ + "pulldown-cmark 0.11.0", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "references_in_memory" +version = "0.1.0" + +[[package]] +name = "regex" +version = "1.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "resizing" +version = "0.1.0" + +[[package]] +name = "response" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "runtime" +version = "0.1.0" +dependencies = [ + "anyhow", + "tokio", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rwlock" +version = "0.1.0" +dependencies = [ + "thiserror", + "ticket_fields", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "saturating" +version = "0.1.0" + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scoped_threads" +version = "0.1.0" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "setters" +version = "0.1.0" +dependencies = [ + "common", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "sized" +version = "0.1.0" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slice" +version = "0.1.0" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "source" +version = "0.1.0" +dependencies = [ + "common", + "thiserror", +] + +[[package]] +name = "spawn" +version = "0.1.0" +dependencies = [ + "anyhow", + "tokio", +] + +[[package]] +name = "stack" +version = "0.1.0" + +[[package]] +name = "static" +version = "0.1.0" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "str_slice" +version = "0.1.0" +dependencies = [ + "common", +] + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "struct_" +version = "0.1.0" + +[[package]] +name = "syn" +version = "2.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync" +version = "0.1.0" + +[[package]] +name = "syntax" +version = "0.1.0" + +[[package]] +name = "tempfile" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "terminal_size" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" +dependencies = [ + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "thiserror" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror_" +version = "0.1.0" +dependencies = [ + "common", +] + +[[package]] +name = "threads" +version = "0.1.0" + +[[package]] +name = "ticket_fields" +version = "0.1.0" +dependencies = [ + "common", + "thiserror", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio 1.0.1", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "topological-sort" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "trait_" +version = "0.1.0" + +[[package]] +name = "trait_bounds" +version = "0.1.0" + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tryfrom" +version = "0.1.0" + +[[package]] +name = "tungstenite" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 1.1.0", + "httparse", + "log", + "rand", + "sha1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "two_states" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + +[[package]] +name = "unwrap" +version = "0.1.0" +dependencies = [ + "common", +] + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "validation" +version = "0.1.0" +dependencies = [ + "common", +] + +[[package]] +name = "variables" +version = "0.1.0" + +[[package]] +name = "variants_with_data" +version = "0.1.0" +dependencies = [ + "common", +] + +[[package]] +name = "vec" +version = "0.1.0" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "visibility" +version = "0.1.0" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "warp" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4378d202ff965b011c64817db11d5829506d3404edeadb61f190d111da3f231c" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "headers", + "http 0.2.12", + "hyper", + "log", + "mime", + "mime_guess", + "percent-encoding", + "pin-project", + "scoped-tls", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-tungstenite", + "tokio-util", + "tower-service", + "tracing", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "welcome_00" +version = "0.1.0" + +[[package]] +name = "while_" +version = "0.1.0" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "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]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "without_channels" +version = "0.1.0" +dependencies = [ + "ticket_fields", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..52e8a87 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "exercises/*/*", + "helpers/common", + "helpers/mdbook-exercise-linker", + "helpers/mdbook-link-shortener", + "helpers/ticket_fields", +] +resolver = "2" + +# This is needed to guarantee the expected behaviour on that specific exercise, +# regardless of the "global" setting for `overflow-checks` on the `dev` profile. +[profile.dev.package.copy] +overflow-checks = true diff --git a/README.md b/README.md new file mode 100644 index 0000000..69bff86 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# Learn Rust, one exercise at a time + +You've heard about Rust, but you never had the chance to try it out?\ +This course is for you! + +You'll learn Rust by solving 100 exercises.\ +You'll go from knowing nothing about Rust to being able to start +writing your own programs, one exercise at a time. + +> [!NOTE] +> This course has been written by [Mainmatter](https://mainmatter.com/rust-consulting/).\ +> It's one of the trainings in [our portfolio of Rust workshops](https://mainmatter.com/services/workshops/rust/).\ +> Check out our [landing page](https://mainmatter.com/rust-consulting/) if you're looking for Rust consulting or +> training! + +## Getting started + +Go to [rust-exercises.com](https://rust-exercises.com) and follow the instructions there +to get started with the course. + +## Requirements + +- **Rust** (follow instructions [here](https://www.rust-lang.org/tools/install)).\ + If `rustup` is already installed on your system, run `rustup update` (or another appropriate command depending on how + you installed Rust on your system) + to make sure you're running on the latest stable version. +- _(Optional but recommended)_ An IDE with Rust autocompletion support. + We recommend one of the following: + - [RustRover](https://www.jetbrains.com/rust/); + - [Visual Studio Code](https://code.visualstudio.com) with + the [`rust-analyzer`](https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer) extension. + +## Solutions + +You can find the solutions to the exercises in +the [`solutions` branch](https://github.com/mainmatter/100-exercises-to-learn-rust/tree/solutions) of this repository. + +# License + +Copyright © 2024- Mainmatter GmbH (https://mainmatter.com), released under the +[Creative Commons Attribution-NonCommercial 4.0 International license](https://creativecommons.org/licenses/by-nc/4.0/). diff --git a/book/.gitignore b/book/.gitignore new file mode 100644 index 0000000..7585238 --- /dev/null +++ b/book/.gitignore @@ -0,0 +1 @@ +book diff --git a/book/assets/back.pdf b/book/assets/back.pdf new file mode 100644 index 0000000000000000000000000000000000000000..df01cccb4e2cfdd301c06018eac6c8e57dc37fed GIT binary patch literal 121907 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 od}C^hxW^5DI)&-zQ7zpBHTbGW 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 CT1q4U literal 0 HcmV?d00001 diff --git a/book/assets/cover.pdf b/book/assets/cover.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dd35a08d5a24b4037b65a5cbece50db4e3184cdc GIT binary patch literal 1016162 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≺Vlo%RH)M8@N? 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

oTYMunh+Z7hMe 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

Vb{0{p- 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
0j!5WZB4eFB;XrN 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

E*9ogMkazZi@<8s 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�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�i{ye7>w?f*ab` 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�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 literal 0 HcmV?d00001 diff --git a/book/book.toml b/book/book.toml new file mode 100644 index 0000000..6b3114d --- /dev/null +++ b/book/book.toml @@ -0,0 +1,132 @@ +[book] +authors = ["Luca Palmieri"] +language = "en" +multilingual = false +src = "src" +title = "100 Exercises To Learn Rust" + +[preprocessor.exercise-linker] +exercise_root_url = "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises" + +[preprocessor.link-shortener] +base_url = "https://ruex.io" +renderers = ["pandoc"] +mapping = "link2alias.json" +verify = false +after = ["exercise-linker"] + +[output.html] +git-repository-url = "https://github.com/mainmatter/100-exercises-to-learn-rust" + +[output.html.playground] +runnable = false + +[output.pandoc] +optional = true +hosted-html = "https://rust-exercises.com/100-exercises/" + +[output.pandoc.code] +show-hidden-lines = true + +[output.pandoc.profile.pdf] # options to pass to Pandoc (see https://pandoc.org/MANUAL.html) +output-file = "100-exercises-to-learn-rust.pdf" +to = "latex" +highlight-style = "./custom.theme" +# We use `lualatext` because, right now, it's the only engine +# that supports fallback fonts, which we need for emojis. +pdf-engine = "lualatex" +metadata-file = "metadata.yml" + +[output.pandoc.profile.pdf.variables] +mainfont = "CoreSansA45.ttf" +mainfontoptions = [ + "BoldFont=CoreSansA65.ttf", + "ItalicFont=CoreSansA45It.ttf", + "BoldItalicFont=CoreSansA65It.ttf", +] +sansfont = "CoreSansA45.ttf" +sansfontoptions = [ + "BoldFont=CoreSansA65.ttf", + "ItalicFont=CoreSansA45It.ttf", + "BoldItalicFont=CoreSansA65It.ttf", +] +# You can get these fonts here: https://fonts.google.com/selection?query=noto+color+ +monofont = "Noto Sans Mono" +mainfontfallback = ["Open Sans:style=Regular"] +sansfontfallback = ["Open Sans:style=Regular"] +monofontfallback = [ + "Noto Color Emoji:mode=harf", +] +linkcolor = "Links" +urlcolor = "Links" +urlstyle = "rm" +documentclass = "book" +fontsize = "10pt" +geometry = "papersize={8in,10in},top=2cm,bottom=2cm,left=2.4cm,right=2.4cm" +header-includes = [ + "\\definecolor{Links}{HTML}{6200EE}", + # Reduce font size of code blocks + "\\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\\\\{\\},fontsize=\\small}", +] + +[output.pandoc.profile.paperback] +output-file = "100-exercises-to-learn-rust.pdf" +to = "latex" +highlight-style = "monochrome" +metadata-file = "metadata.yml" +# We use `lualatext` because, right now, it's the only engine +# that supports fallback fonts, which we need for emojis. +pdf-engine = "lualatex" + +[output.pandoc.profile.paperback.variables] +mainfont = "CoreSansA45.ttf" +mainfontoptions = [ + "BoldFont=CoreSansA65.ttf", + "ItalicFont=CoreSansA45It.ttf", + "BoldItalicFont=CoreSansA65It.ttf", +] +sansfont = "CoreSansA45.ttf" +sansfontoptions = [ + "BoldFont=CoreSansA65.ttf", + "ItalicFont=CoreSansA45It.ttf", + "BoldItalicFont=CoreSansA65It.ttf", +] +# You can get these fonts here: https://fonts.google.com/selection?query=noto+color+ +monofont = "Noto Sans Mono" +mainfontfallback = ["Open Sans:style=Regular"] +sansfontfallback = ["Open Sans:style=Regular"] +monofontfallback = [ + "Noto Color Emoji:mode=harf", +] +linkcolor = "Links" +urlcolor = "Links" +urlstyle = "rm" +documentclass = "book" +fontsize = "10pt" +geometry = "papersize={8in,10in},top=2cm,bottom=2cm,left=2.8cm,right=2.5cm" +header-includes = [ + "\\definecolor{Links}{HTML}{6200EE}", + # Reduce font size of code blocks + "\\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\\\\{\\},fontsize=\\small}", +] +links-as-notes = true + +# We go through HTML, rather than directly to ePUB, since routing +# Pandoc's HTML through Calibre's ePUB converter gives us better results. +[output.pandoc.profile.html] +output-file = "100-exercises-to-learn-rust.html" +to = "html" +highlight-style = "monochrome" +embed-resources = true +standalone = true +metadata-file = "metadata.yml" + +[output.pandoc.profile.html.variables] +# You can get these fonts here: https://fonts.google.com/selection?query=noto+color+ +monofont = "Noto Sans Mono" +mainfontfallback = ["Open Sans:style=Regular"] +sansfontfallback = ["Open Sans:style=Regular"] +monofontfallback = [ + "Noto Color Emoji:mode=harf", +] +urlstyle = "rm" diff --git a/book/custom.theme b/book/custom.theme new file mode 100644 index 0000000..b839db3 --- /dev/null +++ b/book/custom.theme @@ -0,0 +1,211 @@ +{ + "text-color": "#c9d1d9", + "background-color": "#343942", + "line-number-color": null, + "line-number-background-color": null, + "text-styles": { + "Alert": { + "text-color": "#ff0000", + "background-color": null, + "bold": true, + "italic": false, + "underline": false + }, + "Annotation": { + "text-color": "#8b949e", + "background-color": null, + "bold": true, + "italic": true, + "underline": false + }, + "Attribute": { + "text-color": "#03DAC5", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "BaseN": { + "text-color": "#a5d6ff", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "BuiltIn": { + "text-color": "#03DAC5", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "Char": { + "text-color": "#a5d6ff", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "Comment": { + "text-color": "#8b949e", + "background-color": null, + "bold": false, + "italic": true, + "underline": false + }, + "CommentVar": { + "text-color": "#8b949e", + "background-color": null, + "bold": true, + "italic": true, + "underline": false + }, + "Constant": { + "text-color": "#79c0ff", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "ControlFlow": { + "text-color": "#03DAC5", + "background-color": null, + "bold": true, + "italic": false, + "underline": false + }, + "DataType": { + "text-color": "#8b949e", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "DecVal": { + "text-color": "#79c0ff", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "Documentation": { + "text-color": "#8b949e", + "background-color": null, + "bold": false, + "italic": true, + "underline": false + }, + "Error": { + "text-color": "#ff0000", + "background-color": null, + "bold": true, + "italic": false, + "underline": false + }, + "Extension": { + "text-color": null, + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "Float": { + "text-color": "#79c0ff", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "Function": { + "text-color": "#d2a8ff", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "Import": { + "text-color": "#8b949e", + "background-color": null, + "bold": true, + "italic": false, + "underline": false + }, + "Information": { + "text-color": "#8b949e", + "background-color": null, + "bold": true, + "italic": true, + "underline": false + }, + "Keyword": { + "text-color": "#03DAC5", + "background-color": null, + "bold": true, + "italic": false, + "underline": false + }, + "Operator": { + "text-color": "#03DAC5", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "Other": { + "text-color": "#007020", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "Preprocessor": { + "text-color": "#03DAC5", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "SpecialChar": { + "text-color": "#03DAC5", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "SpecialString": { + "text-color": "#03DAC5", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "String": { + "text-color": "#a5d6ff", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "Variable": { + "text-color": "#a8daff", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "VerbatimString": { + "text-color": "#a5d6ff", + "background-color": null, + "bold": false, + "italic": false, + "underline": false + }, + "Warning": { + "text-color": "#60a0b0", + "background-color": null, + "bold": true, + "italic": true, + "underline": false + } + } +} diff --git a/book/link2alias.json b/book/link2alias.json new file mode 100644 index 0000000..ecb8eaf --- /dev/null +++ b/book/link2alias.json @@ -0,0 +1,196 @@ +{ + "https://code.visualstudio.com": "f6c", + "https://crates.io": "f4q", + "https://crates.io/crates/cargo-modules": "f2n", + "https://doc.rust-lang.org/book/ch03-02-data-types.html#integer-types": "ffr", + "https://doc.rust-lang.org/book/title-page.html": "f6t", + "https://doc.rust-lang.org/cargo/reference/cargo-targets.html#cargo-targets": "f4m", + "https://doc.rust-lang.org/cargo/reference/profiles.html": "ffc", + "https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html": "f45", + "https://doc.rust-lang.org/nomicon/": "f6u", + "https://doc.rust-lang.org/reference/expressions/operator-expr.html#numeric-cast": "f2z", + "https://doc.rust-lang.org/reference/items/implementations.html#trait-implementation-coherence": "fzf", + "https://doc.rust-lang.org/reference/lifetime-elision.html": "f4c", + "https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html": "fxy", + "https://doc.rust-lang.org/std/cmp/index.html": "fzm", + "https://doc.rust-lang.org/std/cmp/trait.PartialEq.html": "fzz", + "https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html": "fzb", + "https://doc.rust-lang.org/std/convert/trait.From.html#implementors": "fzp", + "https://doc.rust-lang.org/std/convert/trait.Into.html#implementors": "fzl", + "https://doc.rust-lang.org/std/iter/trait.FusedIterator.html": "f4s", + "https://doc.rust-lang.org/std/iter/trait.Iterator.html": "fxf", + "https://doc.rust-lang.org/std/keyword.for.html": "ffj", + "https://doc.rust-lang.org/std/keyword.while.html": "ffh", + "https://doc.rust-lang.org/std/macro.panic.html": "ffl", + "https://doc.rust-lang.org/std/mem/fn.size_of.html": "f27", + "https://doc.rust-lang.org/std/ops/index.html": "fzn", + "https://doc.rust-lang.org/std/ops/trait.Add.html": "fz4", + "https://doc.rust-lang.org/std/ops/trait.Deref.html#deref-coercion": "fzt", + "https://doc.rust-lang.org/std/ops/trait.Div.html": "fzv", + "https://doc.rust-lang.org/std/ops/trait.Mul.html": "fz6", + "https://doc.rust-lang.org/std/ops/trait.Rem.html": "fz8", + "https://doc.rust-lang.org/std/ops/trait.Sub.html": "fzx", + "https://doc.rust-lang.org/std/prelude/index.html": "f2c", + "https://doc.rust-lang.org/std/primitive.i32.html#associatedconstant.MAX": "ffe", + "https://doc.rust-lang.org/std/primitive.i32.html#associatedconstant.MIN": "ff7", + "https://doc.rust-lang.org/std/primitive.u32.html#associatedconstant.MAX": "ffw", + "https://doc.rust-lang.org/std/slice/struct.Iter.html": "f4d", + "https://doc.rust-lang.org/std/string/struct.String.html": "f26", + "https://doc.rust-lang.org/std/sync/atomic/index.html": "fxh", + "https://doc.rust-lang.org/std/vec/struct.Vec.html#method.iter": "f4j", + "https://docs.rs/dhat/latest/dhat/": "f2y", + "https://docs.rs/itertools/": "fx2", + "https://docs.rs/thiserror/latest/thiserror/": "f4n", + "https://docs.rs/tokio-stream/latest/tokio_stream/": "f65", + "https://docs.rs/tokio-stream/latest/tokio_stream/trait.StreamExt.html#method.merge": "f6m", + "https://docs.rs/tokio-util/latest/tokio_util/sync/struct.CancellationToken.html": "f63", + "https://docs.rs/tokio/latest/tokio/task/struct.JoinError.html": "f6z", + "https://docs.rust-embedded.org/book/": "f6k", + "https://en.wikipedia.org/wiki/Dangling_pointer": "f2h", + "https://en.wikipedia.org/wiki/Data_segment": "fx7", + "https://en.wikipedia.org/wiki/Memory_address": "f2r", + "https://en.wikipedia.org/wiki/Stack_overflow": "f2e", + "https://en.wikipedia.org/wiki/Two%27s_complement": "ff9", + "https://en.wikipedia.org/wiki/UTF-8": "f2v", + "https://exercism.io": "f6r", + "https://github.com/LukeMathWalker/cargo-chef": "ffb", + "https://github.com/LukeMathWalker/wiremock-rs": "ffm", + "https://github.com/dtolnay/cargo-expand": "fzq", + "https://github.com/dtolnay/proc-macro-workshop": "fzw", + "https://github.com/mainmatter/100-exercises-to-learn-rust": "ff6", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/01_intro/00_welcome": "ff3", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/01_intro/01_syntax": "ffq", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/00_intro": "ff5", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/01_integers": "fft", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/02_variables": "ffy", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/03_if_else": "ffu", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/04_panics": "ffk", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/05_factorial": "ffs", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/06_while": "ffg", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/07_for": "ffd", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/08_overflow": "f2f", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/09_saturating": "f22", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/10_as_casting": "f24", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/00_intro": "f2x", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/01_struct": "f28", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/02_validation": "f2b", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/03_modules": "f2m", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/04_visibility": "f23", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/05_encapsulation": "f2q", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/06_ownership": "f25", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/07_setters": "f2w", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/08_stack": "f29", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/09_heap": "f2p", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/10_references_in_memory": "f2l", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/11_destructor": "f2g", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/12_outro": "f2j", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/00_intro": "f2d", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/01_trait": "f2a", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/02_orphan_rule": "fz2", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/03_operator_overloading": "fz3", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/04_derive": "fz7", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/05_trait_bounds": "fz9", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/06_str_slice": "fzr", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/07_deref": "fzy", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/08_sized": "fzu", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/09_from": "fzk", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/10_assoc_vs_generic": "fzs", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/11_clone": "fzh", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/12_copy": "fzg", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/13_drop": "fzj", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/14_outro": "fzc", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/00_intro": "fza", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/01_enum": "f4f", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/02_match": "f42", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/03_variants_with_data": "f4z", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/04_if_let": "f44", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/05_nullability": "f4x", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/06_fallibility": "f46", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/07_unwrap": "f4v", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/08_error_enums": "f48", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/09_error_trait": "f4b", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/10_packages": "f43", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/11_dependencies": "f4w", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/12_thiserror": "f47", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/13_try_from": "f4e", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/14_source": "f49", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/15_outro": "f4y", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/00_intro": "f4u", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/01_arrays": "f4p", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/02_vec": "f4l", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/03_resizing": "f4k", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/04_iterators": "f4h", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/05_iter": "f4g", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/06_lifetimes": "f4a", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/07_combinators": "fxz", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/08_impl_trait": "fx4", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/09_impl_trait_2": "fxx", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/10_slices": "fx6", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/11_mutable_slices": "fxv", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/12_two_states": "fx8", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/13_index": "fxb", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/14_index_mut": "fxn", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/15_hashmap": "fxm", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/16_btreemap": "fx3", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/00_intro": "fxq", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/01_threads": "fxw", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/02_static": "fxe", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/03_leak": "fx9", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/04_scoped_threads": "fxr", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/05_channels": "fxt", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/06_interior_mutability": "fxu", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/07_ack": "fxp", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/08_client": "fxl", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/09_bounded": "fxk", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/10_patch": "fxs", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/11_locks": "fxj", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/12_rw_lock": "fxd", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/13_without_channels": "fxc", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/14_sync": "fxa", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/00_intro": "f6f", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/01_async_fn": "f62", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/02_spawn": "f64", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/03_runtime": "f6x", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/04_future": "f66", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/05_blocking": "f68", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/06_async_aware_primitives": "f6b", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/07_cancellation": "f6q", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/08_outro": "f6e", + "https://github.com/mainmatter/100-exercises-to-learn-rust/tree/solutions": "ffz", + "https://github.com/mainmatter/rust-advanced-testing-workshop": "fzd", + "https://github.com/rust-lang/rustlings": "f69", + "https://huonw.github.io/blog/2016/04/myths-and-legends-about-integer-overflow-in-rust/": "ffa", + "https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/": "f4r", + "https://mainmatter.com/contact/": "ff2", + "https://mainmatter.com/rust-consulting/": "fff", + "https://mainmatter.github.io/rust-workshop-runner/": "fv2", + "https://marabos.nl/atomics/": "fxg", + "https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer": "f6a", + "https://nostarch.com/rust-rustaceans": "f6p", + "https://owasp.org/www-community/vulnerabilities/Doubly_freeing_memory": "f2k", + "https://owasp.org/www-community/vulnerabilities/Using_freed_memory": "f2s", + "https://pavex.dev": "ffn", + "https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=36e5ddbe3b3f741dfa9f74c956622bac": "ffp", + "https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=afedf7062298ca8f5a248bc551062eaa": "fx5", + "https://rust-exercises.com/100-exercises-to-learn-rust.pdf": "ffx", + "https://rust-exercises.com/100-exercises/": "ff4", + "https://rust-exercises.com/advanced-testing/": "f6s", + "https://rust-exercises.com/telemetry/": "f6h", + "https://rust-lang.github.io/api-guidelines/naming.html#casing-conforms-to-rfc-430-c-case": "fze", + "https://rust-lang.github.io/wg-async/vision/submitted_stories/status_quo/barbara_battles_buffered_streams.html": "f6w", + "https://ryhl.io/blog/async-what-is-blocking/": "f6v", + "https://ti.to/mainmatter/rust-from-scratch-jan-2025": "fvf", + "https://tokio.rs/tokio/tutorial/select": "f6n", + "https://valgrind.org/docs/manual/dh-manual.html": "f2t", + "https://veykril.github.io/tlborm/": "fz5", + "https://web.archive.org/web/20240517051950/https://blog.acolyer.org/2019/05/28/cheri-abi/": "f2u", + "https://without.boats/blog/the-scoped-task-trilemma/": "f67", + "https://www.amazon.com/dp/B0DJ14KQQG/": "f6g", + "https://www.jetbrains.com/rust/": "f6d", + "https://www.lpalmieri.com/": "ffv", + "https://www.lpalmieri.com/posts/2020-12-11-zero-to-production-6-domain-modelling/": "f4t", + "https://www.oreilly.com/library/view/programming-rust-2nd/9781492052586/": "f6y", + "https://www.rust-lang.org/tools/install": "f6j", + "https://www.youtube.com/playlist?list=PLqbS7AVVErFirH9armw8yXlE6dacF-A6z": "f6l", + "https://zero2prod.com": "ff8" +} \ No newline at end of file diff --git a/book/metadata.yml b/book/metadata.yml new file mode 100644 index 0000000..0ab8aaf --- /dev/null +++ b/book/metadata.yml @@ -0,0 +1,4 @@ +title: "100 Exercises To Learn Rust" +subtitle: "A hands-on course by Mainmatter" +author: "Luca Palmieri" +keywords: ["Rust", "Programming"] \ No newline at end of file diff --git a/book/src/01_intro/00_welcome.md b/book/src/01_intro/00_welcome.md new file mode 100644 index 0000000..db3134a --- /dev/null +++ b/book/src/01_intro/00_welcome.md @@ -0,0 +1,110 @@ +# Welcome + +Welcome to **"100 Exercises To Learn Rust"**! + +This course will teach you Rust's core concepts, one exercise at a time.\ +You'll learn about Rust's syntax, its type system, its standard library, and its ecosystem. + +We don't assume any prior knowledge of Rust, but we assume you know at least +another programming language. +We also don't assume any prior knowledge of systems programming or memory management. Those +topics will be covered in the course. + +In other words, we'll be starting from scratch!\ +You'll build up your Rust knowledge in small, manageable steps. +By the end of the course, you will have solved ~100 exercises, enough to +feel comfortable working on small to medium-sized Rust projects. + +## Methodology + +This course is based on the "learn by doing" principle.\ +It has been designed to be interactive and hands-on. + +[Mainmatter](https://mainmatter.com/rust-consulting/) developed this course +to be delivered in a classroom setting, over 4 days: each attendee advances +through the lessons at their own pace, with an experienced instructor providing +guidance, answering questions and diving deeper into the topics as needed.\ +You can sign up for the next tutored session on [our website](https://ti.to/mainmatter/rust-from-scratch-jan-2025). +If you'd like to organise a private session for your company, please [get in touch](https://mainmatter.com/contact/). + +You can also take the courses on your own, but we recommend you find a friend or +a mentor to help you along the way should you get stuck. You can +find solutions for all exercises in the +[`solutions` branch of the GitHub repository](https://github.com/mainmatter/100-exercises-to-learn-rust/tree/solutions). + +## Formats + +You can go through the course material [in the browser](https://rust-exercises.com/100-exercises/) or [download it as a PDF file](https://rust-exercises.com/100-exercises-to-learn-rust.pdf), for offline reading.\ +If you prefer to have the course material printed out, [buy a paperback copy on Amazon](https://www.amazon.com/dp/B0DJ14KQQG/). + +## Structure + +On the left side of the screen, you can see that the course is divided into sections. +Each section introduces a new concept or feature of the Rust language.\ +To verify your understanding, each section is paired with an exercise that you need to solve. + +You can find the exercises in the +[companion GitHub repository](https://github.com/mainmatter/100-exercises-to-learn-rust).\ +Before starting the course, make sure to clone the repository to your local machine: + +```bash +# If you have an SSH key set up with GitHub +git clone git@github.com:mainmatter/100-exercises-to-learn-rust.git +# Otherwise, use the HTTPS URL: +# https://github.com/mainmatter/100-exercises-to-learn-rust.git +``` + +We also recommend you work on a branch, so you can easily track your progress and pull +in updates from the main repository, if needed: + +```bash +cd 100-exercises-to-learn-rust +git checkout -b my-solutions +``` + +All exercises are located in the `exercises` folder. +Each exercise is structured as a Rust package. +The package contains the exercise itself, instructions on what to do (in `src/lib.rs`), and a test suite to +automatically verify your solution. + +### Tools + +To work through this course, you'll need: + +- [**Rust**](https://www.rust-lang.org/tools/install). + If `rustup` is already installed on your system, run `rustup update` (or another appropriate command depending on how you installed Rust on your system) to ensure you're running on the latest stable version. +- _(Optional but recommended)_ An IDE with Rust autocompletion support. + We recommend one of the following: + - [RustRover](https://www.jetbrains.com/rust/); + - [Visual Studio Code](https://code.visualstudio.com) with the [`rust-analyzer`](https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer) extension. + +### Workshop runner, `wr` + +To verify your solutions, we've also provided a tool to guide you through the course: the `wr` CLI, short for "workshop runner". +Install `wr` by following the instructions on [its website](https://mainmatter.github.io/rust-workshop-runner/). + +Once you have `wr` installed, open a new terminal and navigate to the top-level folder of the repository. +Run the `wr` command to start the course: + +```bash +wr +``` + +`wr` will verify the solution to the current exercise.\ +Don't move on to the next section until you've solved the exercise for the current one. + +> We recommend committing your solutions to Git as you progress through the course, +> so you can easily track your progress and "restart" from a known point if needed. + +Enjoy the course! + +## Author + +This course was written by [Luca Palmieri](https://www.lpalmieri.com/), Principal Engineering +Consultant at [Mainmatter](https://mainmatter.com/rust-consulting/).\ +Luca has been working with Rust since 2018, initially at TrueLayer and then at AWS.\ +Luca is the author of ["Zero to Production in Rust"](https://zero2prod.com), +the go-to resource for learning how to build backend applications in Rust.\ +He is also the author and maintainer of a variety of open-source Rust projects, including +[`cargo-chef`](https://github.com/LukeMathWalker/cargo-chef), +[Pavex](https://pavex.dev) and [`wiremock`](https://github.com/LukeMathWalker/wiremock-rs). diff --git a/book/src/01_intro/01_syntax.md b/book/src/01_intro/01_syntax.md new file mode 100644 index 0000000..ae75733 --- /dev/null +++ b/book/src/01_intro/01_syntax.md @@ -0,0 +1,115 @@ +# Syntax + +

+ +The previous task doesn't even qualify as an exercise, but it already exposed you to quite a bit of Rust **syntax**. +We won't cover every single detail of Rust's syntax used in the previous exercise. +Instead, we'll cover _just enough_ to keep going without getting stuck in the details.\ +One step at a time! + +## Comments + +You can use `//` for single-line comments: + +```rust +// This is a single-line comment +// Followed by another single-line comment +``` + +## Functions + +Functions in Rust are defined using the `fn` keyword, followed by the function's name, its input parameters, and its +return type. +The function's body is enclosed in curly braces `{}`. + +In previous exercise, you saw the `greeting` function: + +```rust +// `fn` ( ) -> { } +fn greeting() -> &'static str { + // TODO: fix me 👇 + "I'm ready to __!" +} +``` + +`greeting` has no input parameters and returns a reference to a string slice (`&'static str`). + +### Return type + +The return type can be omitted from the signature if the function doesn't return anything (i.e. if it returns `()`, +Rust's unit type). +That's what happened with the `test_welcome` function: + +```rust +fn test_welcome() { + assert_eq!(greeting(), "I'm ready to learn Rust!"); +} +``` + +The above is equivalent to: + +```rust +// Spelling out the unit return type explicitly +// 👇 +fn test_welcome() -> () { + assert_eq!(greeting(), "I'm ready to learn Rust!"); +} +``` + +### Returning values + +The last expression in a function is implicitly returned: + +```rust +fn greeting() -> &'static str { + // This is the last expression in the function + // Therefore its value is returned by `greeting` + "I'm ready to learn Rust!" +} +``` + +You can also use the `return` keyword to return a value early: + +```rust +fn greeting() -> &'static str { + // Notice the semicolon at the end of the line! + return "I'm ready to learn Rust!"; +} +``` + +It is considered idiomatic to omit the `return` keyword when possible. + +### Input parameters + +Input parameters are declared inside the parentheses `()` that follow the function's name.\ +Each parameter is declared with its name, followed by a colon `:`, followed by its type. + +For example, the `greet` function below takes a `name` parameter of type `&str` (a "string slice"): + +```rust +// An input parameter +// 👇 +fn greet(name: &str) -> String { + format!("Hello, {}!", name) +} +``` + +If there are multiple input parameters, they must be separated with commas. + +### Type annotations + +Since we've been mentioned "types" a few times, let's state it clearly: Rust is a **statically typed language**.\ +Every single value in Rust has a type and that type must be known to the compiler at compile-time. + +Types are a form of **static analysis**.\ +You can think of a type as a **tag** that the compiler attaches to every value in your program. Depending on the +tag, the compiler can enforce different rules—e.g. you can't add a string to a number, but you can add two numbers +together. +If leveraged correctly, types can prevent whole classes of runtime bugs. diff --git a/book/src/02_basic_calculator/00_intro.md b/book/src/02_basic_calculator/00_intro.md new file mode 100644 index 0000000..ebd5ff0 --- /dev/null +++ b/book/src/02_basic_calculator/00_intro.md @@ -0,0 +1,16 @@ +# A Basic Calculator + +In this chapter we'll learn how to use Rust as a **calculator**.\ +It might not sound like much, but it'll give us a chance to cover a lot of Rust's basics, such as: + +- How to define and call functions +- How to declare and use variables +- Primitive types (integers and booleans) +- Arithmetic operators (including overflow and underflow behavior) +- Comparison operators +- Control flow +- Panics + +Nailing the basics with a few exercises will get the language flowing under your fingers. +When we move on to more complex topics, such as traits and ownership, you'll be able to focus on the new concepts +without getting bogged down by the syntax or other trivial details. diff --git a/book/src/02_basic_calculator/01_integers.md b/book/src/02_basic_calculator/01_integers.md new file mode 100644 index 0000000..765b7b4 --- /dev/null +++ b/book/src/02_basic_calculator/01_integers.md @@ -0,0 +1,134 @@ +# Types, part 1 + +In the ["Syntax" section](../01_intro/01_syntax.md) `compute`'s input parameters were of type `u32`.\ +Let's unpack what that _means_. + +## Primitive types + +`u32` is one of Rust's **primitive types**. Primitive types are the most basic building blocks of a language. +They're built into the language itself—i.e. they are not defined in terms of other types. + +You can combine these primitive types to create more complex types. We'll see how soon enough. + +## Integers + +`u32`, in particular, is an **unsigned 32-bit integer**. + +An integer is a number that can be written without a fractional component. E.g. `1` is an integer, while `1.2` is not. + +### Signed vs. unsigned + +An integer can be **signed** or **unsigned**.\ +An unsigned integer can only represent non-negative numbers (i.e. `0` or greater). +A signed integer can represent both positive and negative numbers (e.g. `-1`, `12`, etc.). + +The `u` in `u32` stands for **unsigned**.\ +The equivalent type for signed integer is `i32`, where the `i` stands for integer (i.e. any integer, positive or +negative). + +### Bit width + +The `32` in `u32` refers to the **number of bits[^bit]** used to represent the number in memory.\ +The more bits, the larger the range of numbers that can be represented. + +Rust supports multiple bit widths for integers: `8`, `16`, `32`, `64`, `128`. + +With 32 bits, `u32` can represent numbers from `0` to `2^32 - 1` (a.k.a. [`u32::MAX`](https://doc.rust-lang.org/std/primitive.u32.html#associatedconstant.MAX)).\ +With the same number of bits, a signed integer (`i32`) can represent numbers from `-2^31` to `2^31 - 1` +(i.e. from [`i32::MIN`](https://doc.rust-lang.org/std/primitive.i32.html#associatedconstant.MIN) +to [`i32::MAX`](https://doc.rust-lang.org/std/primitive.i32.html#associatedconstant.MAX)).\ +The maximum value for `i32` is smaller than the maximum value for `u32` because one bit is used to represent +the sign of the number. Check out the [two's complement](https://en.wikipedia.org/wiki/Two%27s_complement) +representation for more details on how signed integers are represented in memory. + +### Summary + +Combining the two variables (signed/unsigned and bit width), we get the following integer types: + +| Bit width | Signed | Unsigned | +| --------- | ------ | -------- | +| 8-bit | `i8` | `u8` | +| 16-bit | `i16` | `u16` | +| 32-bit | `i32` | `u32` | +| 64-bit | `i64` | `u64` | +| 128-bit | `i128` | `u128` | + +## Literals + +A **literal** is a notation for representing a fixed value in source code.\ +For example, `42` is a Rust literal for the number forty-two. + +### Type annotations for literals + +But all values in Rust have a type, so... what's the type of `42`? + +The Rust compiler will try to infer the type of a literal based on how it's used.\ +If you don't provide any context, the compiler will default to `i32` for integer literals.\ +If you want to use a different type, you can add the desired integer type as a suffix—e.g. `2u64` is a 2 that's +explicitly typed as a `u64`. + +### Underscores in literals + +You can use underscores `_` to improve the readability of large numbers.\ +For example, `1_000_000` is the same as `1000000`. + +## Arithmetic operators + +Rust supports the following arithmetic operators[^traits] for integers: + +- `+` for addition +- `-` for subtraction +- `*` for multiplication +- `/` for division +- `%` for remainder + +Precedence and associativity rules for these operators are the same as in mathematics.\ +You can use parentheses to override the default precedence. E.g. `2 * (3 + 4)`. + +> ⚠️ **Warning** +> +> The division operator `/` performs integer division when used with integer types. +> I.e. the result is truncated towards zero. For example, `5 / 2` is `2`, not `2.5`. + +## No automatic type coercion + +As we discussed in the previous exercise, Rust is a statically typed language.\ +In particular, Rust is quite strict about type coercion. It won't automatically convert a value from one type to +another[^coercion], +even if the conversion is lossless. You have to do it explicitly. + +For example, you can't assign a `u8` value to a variable with type `u32`, even though all `u8` values are valid `u32` +values: + +```rust +let b: u8 = 100; +let a: u32 = b; +``` + +It'll throw a compilation error: + +```text +error[E0308]: mismatched types + | +3 | let a: u32 = b; + | --- ^ expected `u32`, found `u8` + | | + | expected due to this + | +``` + +We'll see how to convert between types [later in this course](../04_traits/09_from.md). + +## Further reading + +- [The integer types section](https://doc.rust-lang.org/book/ch03-02-data-types.html#integer-types) in the official Rust book + +[^bit]: A bit is the smallest unit of data in a computer. It can only have two values: `0` or `1`. + +[^traits]: Rust doesn't let you define custom operators, but it puts you in control of how the built-in operators +behave. +We'll talk about operator overloading [later in the course](../04_traits/03_operator_overloading.md), after we've covered traits. + +[^coercion]: There are some exceptions to this rule, mostly related to references, smart pointers and ergonomics. We'll +cover those [later on](../04_traits/07_deref.md). +A mental model of "all conversions are explicit" will serve you well in the meantime. diff --git a/book/src/02_basic_calculator/02_variables.md b/book/src/02_basic_calculator/02_variables.md new file mode 100644 index 0000000..2c5b21a --- /dev/null +++ b/book/src/02_basic_calculator/02_variables.md @@ -0,0 +1,100 @@ +# Variables + +In Rust, you can use the `let` keyword to declare **variables**.\ +For example: + +```rust +let x = 42; +``` + +Above we defined a variable `x` and assigned it the value `42`. + +## Type + +Every variable in Rust must have a type. It can either be inferred by the compiler or explicitly specified by the +developer. + +### Explicit type annotation + +You can specify the variable type by adding a colon `:` followed by the type after the variable name. For example: + +```rust +// let : = ; +let x: u32 = 42; +``` + +In the example above, we explicitly constrained the type of `x` to be `u32`. + +### Type inference + +If we don't specify the type of a variable, the compiler will try to infer it based on the context in which the variable +is used. + +```rust +let x = 42; +let y: u32 = x; +``` + +In the example above, we didn't specify the type of `x`.\ +`x` is later assigned to `y`, which is explicitly typed as `u32`. Since Rust doesn't perform automatic type coercion, +the compiler infers the type of `x` to be `u32`—the same as `y` and the only type that will allow the program to compile +without errors. + +### Inference limitations + +The compiler sometimes needs a little help to infer the correct variable type based on its usage.\ +In those cases you'll get a compilation error and the compiler will ask you to provide an explicit type hint to +disambiguate the situation. + +## Function arguments are variables + +Not all heroes wear capes, not all variables are declared with `let`.\ +Function arguments are variables too! + +```rust +fn add_one(x: u32) -> u32 { + x + 1 +} +``` + +In the example above, `x` is a variable of type `u32`.\ +The only difference between `x` and a variable declared with `let` is that functions arguments **must** have their type +explicitly declared. The compiler won't infer it for you.\ +This constraint allows the Rust compiler (and us humans!) to understand the function's signature without having to look +at its implementation. That's a big boost for compilation speed[^speed]! + +## Initialization + +You don't have to initialize a variable when you declare it.\ +For example + +```rust +let x: u32; +``` + +is a valid variable declaration.\ +However, you must initialize the variable before using it. The compiler will throw an error if you don't: + +```rust +let x: u32; +let y = x + 1; +``` + +will throw a compilation error: + +```text +error[E0381]: used binding `x` isn't initialized + --> src/main.rs:3:9 + | +2 | let x: u32; + | - binding declared here but left uninitialized +3 | let y = x + 1; + | ^ `x` used here but it isn't initialized + | +help: consider assigning a value + | +2 | let x: u32 = 0; + | +++ +``` + +[^speed]: The Rust compiler needs all the help it can get when it comes to compilation speed. diff --git a/book/src/02_basic_calculator/03_if_else.md b/book/src/02_basic_calculator/03_if_else.md new file mode 100644 index 0000000..44a1270 --- /dev/null +++ b/book/src/02_basic_calculator/03_if_else.md @@ -0,0 +1,133 @@ +# Control flow, part 1 + +All our programs so far have been pretty straightforward.\ +A sequence of instructions is executed from top to bottom, and that's it. + +It's time to introduce some **branching**. + +## `if` clauses + +The `if` keyword is used to execute a block of code only if a condition is true. + +Here's a simple example: + +```rust +let number = 3; +if number < 5 { + println!("`number` is smaller than 5"); +} +``` + +This program will print `number is smaller than 5` because the condition `number < 5` is true. + +### `else` clauses + +Like most programming languages, Rust supports an optional `else` branch to execute a block of code when the condition in an +`if` expression is false.\ +For example: + +```rust +let number = 3; + +if number < 5 { + println!("`number` is smaller than 5"); +} else { + println!("`number` is greater than or equal to 5"); +} +``` + +### `else if` clauses + +Your code drifts more and more to the right when you have multiple `if` expressions, one nested inside the other. + +```rust +let number = 3; + +if number < 5 { + println!("`number` is smaller than 5"); +} else { + if number >= 3 { + println!("`number` is greater than or equal to 3, but smaller than 5"); + } else { + println!("`number` is smaller than 3"); + } +} +``` + +You can use the `else if` keyword to combine multiple `if` expressions into a single one: + +```rust +let number = 3; + +if number < 5 { + println!("`number` is smaller than 5"); +} else if number >= 3 { + println!("`number` is greater than or equal to 3, but smaller than 5"); +} else { + println!("`number` is smaller than 3"); +} +``` + +## Booleans + +The condition in an `if` expression must be of type `bool`, a **boolean**.\ +Booleans, just like integers, are a primitive type in Rust. + +A boolean can have one of two values: `true` or `false`. + +### No truthy or falsy values + +If the condition in an `if` expression is not a boolean, you'll get a compilation error. + +For example, the following code will not compile: + +```rust +let number = 3; +if number { + println!("`number` is not zero"); +} +``` + +You'll get the following compilation error: + +```text +error[E0308]: mismatched types + --> src/main.rs:3:8 + | +3 | if number { + | ^^^^^^ expected `bool`, found integer +``` + +This follows from Rust's philosophy around type coercion: there's no automatic conversion from non-boolean types to booleans. +Rust doesn't have the concept of **truthy** or **falsy** values, like JavaScript or Python.\ +You have to be explicit about the condition you want to check. + +### Comparison operators + +It's quite common to use comparison operators to build conditions for `if` expressions.\ +Here are the comparison operators available in Rust when working with integers: + +- `==`: equal to +- `!=`: not equal to +- `<`: less than +- `>`: greater than +- `<=`: less than or equal to +- `>=`: greater than or equal to + +## `if/else` is an expression + +In Rust, `if` expressions are **expressions**, not statements: they return a value.\ +That value can be assigned to a variable or used in other expressions. For example: + +```rust +let number = 3; +let message = if number < 5 { + "smaller than 5" +} else { + "greater than or equal to 5" +}; +``` + +In the example above, each branch of the `if` evaluates to a string literal, +which is then assigned to the `message` variable.\ +The only requirement is that both `if` branches return the same type. diff --git a/book/src/02_basic_calculator/04_panics.md b/book/src/02_basic_calculator/04_panics.md new file mode 100644 index 0000000..f7115aa --- /dev/null +++ b/book/src/02_basic_calculator/04_panics.md @@ -0,0 +1,54 @@ +# Panics + +Let's go back to the `speed` function you wrote for the ["Variables" section](02_variables.md). +It probably looked something like this: + +```rust +fn speed(start: u32, end: u32, time_elapsed: u32) -> u32 { + let distance = end - start; + distance / time_elapsed +} +``` + +If you have a keen eye, you might have spotted one issue[^one]: what happens if `time_elapsed` is zero? + +You can try it +out [on the Rust playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=36e5ddbe3b3f741dfa9f74c956622bac)!\ +The program will exit with the following error message: + +```text +thread 'main' panicked at src/main.rs:3:5: +attempt to divide by zero +``` + +This is known as a **panic**.\ +A panic is Rust's way to signal that something went so wrong that +the program can't continue executing, it's an **unrecoverable error**[^catching]. Division by zero classifies as such an +error. + +## The panic! macro + +You can intentionally trigger a panic by calling the `panic!` macro[^macro]: + +```rust +fn main() { + panic!("This is a panic!"); + // The line below will never be executed + let x = 1 + 2; +} +``` + +There are other mechanisms to work with recoverable errors in Rust, which [we'll cover later](../05_ticket_v2/06_fallibility.md). +For the time being we'll stick with panics as a brutal but simple stopgap solution. + +## Further reading + +- [The panic! macro documentation](https://doc.rust-lang.org/std/macro.panic.html) + +[^one]: There's another issue with `speed` that we'll address soon enough. Can you spot it? + +[^catching]: You can try to catch a panic, but it should be a last resort attempt reserved for very specific +circumstances. + +[^macro]: If it's followed by a `!`, it's a macro invocation. Think of macros as spicy functions for now. We'll +cover them in more detail later in the course. diff --git a/book/src/02_basic_calculator/05_factorial.md b/book/src/02_basic_calculator/05_factorial.md new file mode 100644 index 0000000..d31672a --- /dev/null +++ b/book/src/02_basic_calculator/05_factorial.md @@ -0,0 +1,11 @@ +# Factorial + +So far you've learned: + +- How to define a function +- How to call a function +- Which integer types are available in Rust +- Which arithmetic operators are available for integers +- How to execute conditional logic via comparisons and `if`/`else` expressions + +It looks like you're ready to tackle factorials! diff --git a/book/src/02_basic_calculator/06_while.md b/book/src/02_basic_calculator/06_while.md new file mode 100644 index 0000000..150d887 --- /dev/null +++ b/book/src/02_basic_calculator/06_while.md @@ -0,0 +1,85 @@ +# Loops, part 1: `while` + +Your implementation of `factorial` has been forced to use recursion.\ +This may feel natural to you, especially if you're coming from a functional programming background. +Or it may feel strange, if you're used to more imperative languages like C or Python. + +Let's see how you can implement the same functionality using a **loop** instead. + +## The `while` loop + +A `while` loop is a way to execute a block of code as long as a **condition** is true.\ +Here's the general syntax: + +```rust +while { + // code to execute +} +``` + +For example, we might want to sum the numbers from 1 to 5: + +```rust +let sum = 0; +let i = 1; +// "while i is less than or equal to 5" +while i <= 5 { + // `+=` is a shorthand for `sum = sum + i` + sum += i; + i += 1; +} +``` + +This will keep adding 1 to `i` and `i` to `sum` until `i` is no longer less than or equal to 5. + +## The `mut` keyword + +The example above won't compile as is. You'll get an error like: + +```text +error[E0384]: cannot assign twice to immutable variable `sum` + --> src/main.rs:7:9 + | +2 | let sum = 0; + | --- + | | + | first assignment to `sum` + | help: consider making this binding mutable: `mut sum` +... +7 | sum += i; + | ^^^^^^^^ cannot assign twice to immutable variable + +error[E0384]: cannot assign twice to immutable variable `i` + --> src/main.rs:8:9 + | +3 | let i = 1; + | - + | | + | first assignment to `i` + | help: consider making this binding mutable: `mut i` +... +8 | i += 1; + | ^^^^^^ cannot assign twice to immutable variable +``` + +This is because variables in Rust are **immutable** by default.\ +You can't change their value once it has been assigned. + +If you want to allow modifications, you have to declare the variable as **mutable** using the `mut` keyword: + +```rust +// `sum` and `i` are mutable now! +let mut sum = 0; +let mut i = 1; + +while i <= 5 { + sum += i; + i += 1; +} +``` + +This will compile and run without errors. + +## Further reading + +- [`while` loop documentation](https://doc.rust-lang.org/std/keyword.while.html) diff --git a/book/src/02_basic_calculator/07_for.md b/book/src/02_basic_calculator/07_for.md new file mode 100644 index 0000000..896ffe4 --- /dev/null +++ b/book/src/02_basic_calculator/07_for.md @@ -0,0 +1,64 @@ +# Loops, part 2: `for` + +Having to manually increment a counter variable is somewhat tedious. The pattern is also extremely common!\ +To make this easier, Rust provides a more concise way to iterate over a range of values: the `for` loop. + +## The `for` loop + +A `for` loop is a way to execute a block of code for each element in an iterator[^iterator]. + +Here's the general syntax: + +```rust +for in { + // code to execute +} +``` + +## Ranges + +Rust's standard library provides **range** type that can be used to iterate over a sequence of numbers[^weird-ranges]. + +For example, if we want to sum the numbers from 1 to 5: + +```rust +let mut sum = 0; +for i in 1..=5 { + sum += i; +} +``` + +Every time the loop runs, `i` will be assigned the next value in the range before executing the block of code. + +There are five kinds of ranges in Rust: + +- `1..5`: A (half-open) range. It includes all numbers from 1 to 4. It doesn't include the last value, 5. +- `1..=5`: An inclusive range. It includes all numbers from 1 to 5. It includes the last value, 5. +- `1..`: An open-ended range. It includes all numbers from 1 to infinity (well, until the maximum value of the integer type). +- `..5`: A range that starts at the minimum value for the integer type and ends at 4. It doesn't include the last value, 5. +- `..=5`: A range that starts at the minimum value for the integer type and ends at 5. It includes the last value, 5. + +You can use a `for` loop with the first three kinds of ranges, where the starting point +is explicitly specified. The last two range types are used in other contexts, that we'll cover later. + +The extreme values of a range don't have to be integer literals—they can be variables or expressions too! + +For example: + +```rust +let end = 5; +let mut sum = 0; + +for i in 1..(end + 1) { + sum += i; +} +``` + +## Further reading + +- [`for` loop documentation](https://doc.rust-lang.org/std/keyword.for.html) + +[^iterator]: Later in the course we'll give a precise definition of what counts as an "iterator". +For now, think of it as a sequence of values that you can loop over. +[^weird-ranges]: You can use ranges with other types too (e.g. characters and IP addresses), +but integers are definitely the most common case in day-to-day Rust programming. diff --git a/book/src/02_basic_calculator/08_overflow.md b/book/src/02_basic_calculator/08_overflow.md new file mode 100644 index 0000000..864d096 --- /dev/null +++ b/book/src/02_basic_calculator/08_overflow.md @@ -0,0 +1,110 @@ +# Overflow + +The factorial of a number grows quite fast.\ +For example, the factorial of 20 is 2,432,902,008,176,640,000. That's already bigger than the maximum value for a +32-bit integer, 2,147,483,647. + +When the result of an arithmetic operation is bigger than the maximum value for a given integer type, +we are talking about **an integer overflow**. + +Integer overflows are an issue because they violate the contract for arithmetic operations.\ +The result of an arithmetic operation between two integers of a given type should be another integer of the same type. +But the _mathematically correct result_ doesn't fit into that integer type! + +> If the result is smaller than the minimum value for a given integer type, we refer to the event as **an integer +> underflow**.\ +> For brevity, we'll only talk about integer overflows for the rest of this section, but keep in mind that +> everything we say applies to integer underflows as well. +> +> The `speed` function you wrote in the ["Variables" section](02_variables.md) underflowed for some input +> combinations. +> E.g. if `end` is smaller than `start`, `end - start` will underflow the `u32` type since the result is supposed +> to be negative but `u32` can't represent negative numbers. + +## No automatic promotion + +One possible approach would be automatically promote the result to a bigger integer type. +E.g. if you're summing two `u8` integers and the result is 256 (`u8::MAX + 1`), Rust could choose to interpret the +result as `u16`, the next integer type that's big enough to hold 256. + +But, as we've discussed before, Rust is quite picky about type conversions. Automatic integer promotion +is not Rust's solution to the integer overflow problem. + +## Alternatives + +Since we ruled out automatic promotion, what can we do when an integer overflow occurs?\ +It boils down to two different approaches: + +- Reject the operation +- Come up with a "sensible" result that fits into the expected integer type + +### Reject the operation + +This is the most conservative approach: we stop the program when an integer overflow occurs.\ +That's done via a panic, the mechanism we've already seen in the ["Panics" section](04_panics.md). + +### Come up with a "sensible" result + +When the result of an arithmetic operation is bigger than the maximum value for a given integer type, you can +choose to **wrap around**.\ +If you think of all the possible values for a given integer type as a circle, wrapping around means that when you +reach the maximum value, you start again from the minimum value. + +For example, if you do a **wrapping addition** between 1 and 255 (=`u8::MAX`), the result is 0 (=`u8::MIN`). +If you're working with signed integers, the same principle applies. E.g. adding 1 to 127 (=`i8::MAX`) with wrapping +will give you -128 (=`i8::MIN`). + +## `overflow-checks` + +Rust lets you, the developer, choose which approach to use when an integer overflow occurs. +The behaviour is controlled by the `overflow-checks` profile setting. + +If `overflow-checks` is set to `true`, Rust will **panic at runtime** when an integer operation overflows. +If `overflow-checks` is set to `false`, Rust will **wrap around** when an integer operation overflows. + +You may be wondering—what is a profile setting? Let's get into that! + +## Profiles + +A [**profile**](https://doc.rust-lang.org/cargo/reference/profiles.html) is a set of configuration options that can be +used to customize the way Rust code is compiled. + +Cargo provides 4 built-in profiles: `dev`, `release`, `test`, and `bench`.\ +The `dev` profile is used every time you run `cargo build`, `cargo run` or `cargo test`. It's aimed at local +development, +therefore it sacrifices runtime performance in favor of faster compilation times and a better debugging experience.\ +The `release` profile, instead, is optimized for runtime performance but incurs longer compilation times. You need +to explicitly request via the `--release` flag—e.g. `cargo build --release` or `cargo run --release`. +The `test` profile is the default profile used by `cargo test`. The `test` profile inherits the settings form the `dev` profile. +The `bench` profile is the default profile used by `cargo bench`. The `bench` profile inherits from the `release` profile. +Use `dev` for iterative development and debugging, `release` for optimized production builds,\ +`test` for correctness testing, and `bench` for performance benchmarking. + +> "Have you built your project in release mode?" is almost a meme in the Rust community.\ +> It refers to developers who are not familiar with Rust and complain about its performance on +> social media (e.g. Reddit, Twitter, etc.) before realizing they haven't built their project in +> release mode. + +You can also define custom profiles or customize the built-in ones. + +### `overflow-check` + +By default, `overflow-checks` is set to: + +- `true` for the `dev` profile +- `false` for the `release` profile + +This is in line with the goals of the two profiles.\ +`dev` is aimed at local development, so it panics in order to highlight potential issues as early as possible.\ +`release`, instead, is tuned for runtime performance: checking for overflows would slow down the program, so it +prefers to wrap around. + +At the same time, having different behaviours for the two profiles can lead to subtle bugs.\ +Our recommendation is to enable `overflow-checks` for both profiles: it's better to crash than to silently produce +incorrect results. The runtime performance hit is negligible in most cases; if you're working on a performance-critical +application, you can run benchmarks to decide if it's something you can afford. + +## Further reading + +- Check out ["Myths and legends about integer overflow in Rust"](https://huonw.github.io/blog/2016/04/myths-and-legends-about-integer-overflow-in-rust/) + for an in-depth discussion about integer overflow in Rust. diff --git a/book/src/02_basic_calculator/09_saturating.md b/book/src/02_basic_calculator/09_saturating.md new file mode 100644 index 0000000..a33b6c2 --- /dev/null +++ b/book/src/02_basic_calculator/09_saturating.md @@ -0,0 +1,39 @@ +# Case-by-case behavior + +`overflow-checks` is a blunt tool: it's a global setting that affects the whole program.\ +It often happens that you want to handle integer overflows differently depending on the context: sometimes +wrapping is the right choice, other times panicking is preferable. + +## `wrapping_` methods + +You can opt into wrapping arithmetic on a per-operation basis by using the `wrapping_` methods[^method].\ +For example, you can use `wrapping_add` to add two integers with wrapping: + +```rust +let x = 255u8; +let y = 1u8; +let sum = x.wrapping_add(y); +assert_eq!(sum, 0); +``` + +## `saturating_` methods + +Alternatively, you can opt into **saturating arithmetic** by using the `saturating_` methods.\ +Instead of wrapping around, saturating arithmetic will return the maximum or minimum value for the integer type. +For example: + +```rust +let x = 255u8; +let y = 1u8; +let sum = x.saturating_add(y); +assert_eq!(sum, 255); +``` + +Since `255 + 1` is `256`, which is bigger than `u8::MAX`, the result is `u8::MAX` (255).\ +The opposite happens for underflows: `0 - 1` is `-1`, which is smaller than `u8::MIN`, so the result is `u8::MIN` (0). + +You can't get saturating arithmetic via the `overflow-checks` profile setting—you have to explicitly opt into it +when performing the arithmetic operation. + +[^method]: You can think of methods as functions that are "attached" to a specific type. +We'll cover methods (and how to define them) in the next chapter. diff --git a/book/src/02_basic_calculator/10_as_casting.md b/book/src/02_basic_calculator/10_as_casting.md new file mode 100644 index 0000000..477f735 --- /dev/null +++ b/book/src/02_basic_calculator/10_as_casting.md @@ -0,0 +1,102 @@ +# Conversions, pt. 1 + +We've repeated over and over again that Rust won't perform +implicit type conversions for integers.\ +How do you perform _explicit_ conversions then? + +## `as` + +You can use the `as` operator to convert between integer types.\ +`as` conversions are **infallible**. + +For example: + +```rust +let a: u32 = 10; + +// Cast `a` into the `u64` type +let b = a as u64; + +// You can use `_` as the target type +// if it can be correctly inferred +// by the compiler. For example: +let c: u64 = a as _; +``` + +The semantics of this conversion are what you expect: all `u32` values are valid `u64` +values. + +### Truncation + +Things get more interesting if we go in the opposite direction: + +```rust +// A number that's too big +// to fit into a `u8` +let a: u16 = 255 + 1; +let b = a as u8; +``` + +This program will run without issues, because `as` conversions are infallible. +But what is the value of `b`? +When going from a larger integer type to a smaller, the Rust compiler will perform +a **truncation**. + +To understand what happens, let's start by looking at how `256u16` is +represented in memory, as a sequence of bits: + +```text + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 +| | | ++---------------+---------------+ + First 8 bits Last 8 bits +``` + +When converting to a `u8`, the Rust compiler will keep the last 8 bits of a `u16` +memory representation: + +```text + 0 0 0 0 0 0 0 0 +| | ++---------------+ + Last 8 bits +``` + +Hence `256 as u8` is equal to `0`. That's... not ideal, in most scenarios.\ +In fact, the Rust compiler will actively try to stop you if it sees you trying +to cast a literal value which will result in a truncation: + +```text +error: literal out of range for `i8` + | +4 | let a = 255 as i8; + | ^^^ + | + = note: the literal `255` does not fit into the type `i8` + whose range is `-128..=127` + = help: consider using the type `u8` instead + = note: `#[deny(overflowing_literals)]` on by default +``` + +### Recommendation + +As a rule of thumb, be quite careful with `as` casting.\ +Use it _exclusively_ for going from a smaller type to a larger type. +To convert from a larger to smaller integer type, rely on the +[_fallible_ conversion machinery](../05_ticket_v2/13_try_from.md) that we'll +explore later in the course. + +### Limitations + +Surprising behaviour is not the only downside of `as` casting. +It is also fairly limited: you can only rely on `as` casting +for primitive types and a few other special cases.\ +When working with composite types, you'll have to rely on +different conversion mechanisms ([fallible](../05_ticket_v2/13_try_from.md) +and [infallible](../04_traits/09_from.md)), which we'll explore later on. + +## Further reading + +- Check out [Rust's official reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html#numeric-cast) + to learn the precise behaviour of `as` casting for each source/target combination, + as well as the exhaustive list of allowed conversions. diff --git a/book/src/03_ticket_v1/00_intro.md b/book/src/03_ticket_v1/00_intro.md new file mode 100644 index 0000000..8850e03 --- /dev/null +++ b/book/src/03_ticket_v1/00_intro.md @@ -0,0 +1,18 @@ +# Modelling A Ticket + +The first chapter should have given you a good grasp over some of Rust's primitive types, operators and +basic control flow constructs.\ +In this chapter we'll go one step further and cover what makes Rust truly unique: **ownership**.\ +Ownership is what enables Rust to be both memory-safe and performant, with no garbage collector. + +As our running example, we'll use a (JIRA-like) ticket, the kind you'd use to track bugs, features, or tasks in +a software project.\ +We'll take a stab at modeling it in Rust. It'll be the first iteration—it won't be perfect nor very idiomatic +by the end of the chapter. It'll be enough of a challenge though!\ +To move forward you'll have to pick up several new Rust concepts, such as: + +- `struct`s, one of Rust's ways to define custom types +- Ownership, references and borrowing +- Memory management: stack, heap, pointers, data layout, destructors +- Modules and visibility +- Strings diff --git a/book/src/03_ticket_v1/01_struct.md b/book/src/03_ticket_v1/01_struct.md new file mode 100644 index 0000000..1045867 --- /dev/null +++ b/book/src/03_ticket_v1/01_struct.md @@ -0,0 +1,139 @@ +# Structs + +We need to keep track of three pieces of information for each ticket: + +- A title +- A description +- A status + +We can start by using a [`String`](https://doc.rust-lang.org/std/string/struct.String.html) +to represent them. `String` is the type defined in Rust's standard library to represent +[UTF-8 encoded](https://en.wikipedia.org/wiki/UTF-8) text. + +But how do we **combine** these three pieces of information into a single entity? + +## Defining a `struct` + +A `struct` defines a **new Rust type**. + +```rust +struct Ticket { + title: String, + description: String, + status: String +} +``` + +A struct is quite similar to what you would call a class or an object in other programming languages. + +## Defining fields + +The new type is built by combining other types as **fields**.\ +Each field must have a name and a type, separated by a colon, `:`. If there are multiple fields, they are separated by a comma, `,`. + +Fields don't have to be of the same type, as you can see in the `Configuration` struct below: + +```rust +struct Configuration { + version: u32, + active: bool +} +``` + +## Instantiation + +You can create an instance of a struct by specifying the values for each field: + +```rust +// Syntax: { : , ... } +let ticket = Ticket { + title: "Build a ticket system".into(), + description: "A Kanban board".into(), + status: "Open".into() +}; +``` + +## Accessing fields + +You can access the fields of a struct using the `.` operator: + +```rust +// Field access +let x = ticket.description; +``` + +## Methods + +We can attach behaviour to our structs by defining **methods**.\ +Using the `Ticket` struct as an example: + +```rust +impl Ticket { + fn is_open(self) -> bool { + self.status == "Open" + } +} + +// Syntax: +// impl { +// fn () -> { +// // Method body +// } +// } +``` + +Methods are pretty similar to functions, with two key differences: + +1. methods must be defined inside an **`impl` block** +2. methods may use `self` as their first parameter. + `self` is a keyword and represents the instance of the struct the method is being called on. + +### `self` + +If a method takes `self` as its first parameter, it can be called using the **method call syntax**: + +```rust +// Method call syntax: .() +let is_open = ticket.is_open(); +``` + +This is the same calling syntax you used to perform saturating arithmetic operations on `u32` values +in [the previous chapter](../02_basic_calculator/09_saturating.md). + +### Static methods + +If a method doesn't take `self` as its first parameter, it's a **static method**. + +```rust +struct Configuration { + version: u32, + active: bool +} + +impl Configuration { + // `default` is a static method on `Configuration` + fn default() -> Configuration { + Configuration { version: 0, active: false } + } +} +``` + +The only way to call a static method is by using the **function call syntax**: + +```rust +// Function call syntax: ::() +let default_config = Configuration::default(); +``` + +### Equivalence + +You can use the function call syntax even for methods that take `self` as their first parameter: + +```rust +// Function call syntax: +// ::(, ) +let is_open = Ticket::is_open(ticket); +``` + +The function call syntax makes it quite clear that `ticket` is being used as `self`, the first parameter of the method, +but it's definitely more verbose. Prefer the method call syntax when possible. diff --git a/book/src/03_ticket_v1/02_validation.md b/book/src/03_ticket_v1/02_validation.md new file mode 100644 index 0000000..2d8caf1 --- /dev/null +++ b/book/src/03_ticket_v1/02_validation.md @@ -0,0 +1,21 @@ +# Validation + +Let's go back to our ticket definition: + +```rust +struct Ticket { + title: String, + description: String, + status: String, +} +``` + +We are using "raw" types for the fields of our `Ticket` struct. +This means that users can create a ticket with an empty title, a suuuuuuuper long description or +a nonsensical status (e.g. "Funny").\ +We can do better than that! + +## Further reading + +- Check out [`String`'s documentation](https://doc.rust-lang.org/std/string/struct.String.html) + for a thorough overview of the methods it provides. You'll need it for the exercise! diff --git a/book/src/03_ticket_v1/03_modules.md b/book/src/03_ticket_v1/03_modules.md new file mode 100644 index 0000000..c6645ea --- /dev/null +++ b/book/src/03_ticket_v1/03_modules.md @@ -0,0 +1,124 @@ +# Modules + +The `new` method you've just defined is trying to enforce some **constraints** on the field values for `Ticket`. +But are those invariants really enforced? What prevents a developer from creating a `Ticket` +without going through `Ticket::new`? + +To get proper **encapsulation** you need to become familiar with two new concepts: **visibility** and **modules**. +Let's start with modules. + +## What is a module? + +In Rust a **module** is a way to group related code together, under a common namespace (i.e. the module's name).\ +You've already seen modules in action: the unit tests that verify the correctness of your code are defined in a +different module, named `tests`. + +```rust +#[cfg(test)] +mod tests { + // [...] +} +``` + +## Inline modules + +The `tests` module above is an example of an **inline module**: the module declaration (`mod tests`) and the module +contents (the stuff inside `{ ... }`) are next to each other. + +## Module tree + +Modules can be nested, forming a **tree** structure.\ +The root of the tree is the **crate** itself, which is the top-level module that contains all the other modules. +For a library crate, the root module is usually `src/lib.rs` (unless its location has been customized). +The root module is also known as the **crate root**. + +The crate root can have submodules, which in turn can have their own submodules, and so on. + +## External modules and the filesystem + +Inline modules are useful for small pieces of code, but as your project grows you'll want to split your code into +multiple files. In the parent module, you declare the existence of a submodule using the `mod` keyword. + +```rust +mod dog; +``` + +`cargo`, Rust's build tool, is then in charge of finding the file that contains +the module implementation.\ +If your module is declared in the root of your crate (e.g. `src/lib.rs` or `src/main.rs`), +`cargo` expects the file to be named either: + +- `src/.rs` +- `src//mod.rs` + +If your module is a submodule of another module, the file should be named: + +- `[..]//.rs` +- `[..]///mod.rs` + +E.g. `src/animals/dog.rs` or `src/animals/dog/mod.rs` if `dog` is a submodule of `animals`. + +Your IDE might help you create these files automatically when you declare a new module using the `mod` keyword. + +## Item paths and `use` statements + +You can access items defined in the same module without any special syntax. You just use their name. + +```rust +struct Ticket { + // [...] +} + +// No need to qualify `Ticket` in any way here +// because we're in the same module +fn mark_ticket_as_done(ticket: Ticket) { + // [...] +} +``` + +That's not the case if you want to access an entity from a different module.\ +You have to use a **path** pointing to the entity you want to access. + +You can compose the path in various ways: + +- starting from the root of the current crate, e.g. `crate::module_1::MyStruct` +- starting from the parent module, e.g. `super::my_function` +- starting from the current module, e.g. `sub_module_1::MyStruct` + +Both `crate` and `super` are **keywords**.\ +`crate` refers to the root of the current crate, while `super` refers to the parent of the current module. + +Having to write the full path every time you want to refer to a type can be cumbersome. +To make your life easier, you can introduce a `use` statement to bring the entity into scope. + +```rust +// Bring `MyStruct` into scope +use crate::module_1::module_2::MyStruct; + +// Now you can refer to `MyStruct` directly +fn a_function(s: MyStruct) { + // [...] +} +``` + +### Star imports + +You can also import all the items from a module with a single `use` statement. + +```rust +use crate::module_1::module_2::*; +``` + +This is known as a **star import**.\ +It is generally discouraged because it can pollute the current namespace, making it hard to understand +where each name comes from and potentially introducing name conflicts.\ +Nonetheless, it can be useful in some cases, like when writing unit tests. You might have noticed +that most of our test modules start with a `use super::*;` statement to bring all the items from the parent module +(the one being tested) into scope. + +## Visualizing the module tree + +If you're struggling to picture the module tree of your project, you can try using +[`cargo-modules`](https://crates.io/crates/cargo-modules) to visualize it! + +Refer to their documentation for installation instructions and usage examples. diff --git a/book/src/03_ticket_v1/04_visibility.md b/book/src/03_ticket_v1/04_visibility.md new file mode 100644 index 0000000..29b53c7 --- /dev/null +++ b/book/src/03_ticket_v1/04_visibility.md @@ -0,0 +1,45 @@ +# Visibility + +When you start breaking down your code into multiple modules, you need to start thinking about **visibility**. +Visibility determines which regions of your code (or other people's code) can access a given entity, +be it a struct, a function, a field, etc. + +## Private by default + +By default, everything in Rust is **private**.\ +A private entity can only be accessed: + +1. within the same module where it's defined, or +2. by one of its submodules + +We've used this extensively in the previous exercises: + +- `create_todo_ticket` worked (once you added a `use` statement) because `helpers` is a submodule of the crate root, + where `Ticket` is defined. Therefore, `create_todo_ticket` can access `Ticket` without any issues even + though `Ticket` is private. +- All our unit tests are defined in a submodule of the code they're testing, so they can access everything without + restrictions. + +## Visibility modifiers + +You can modify the default visibility of an entity using a **visibility modifier**.\ +Some common visibility modifiers are: + +- `pub`: makes the entity **public**, i.e. accessible from outside the module where it's defined, potentially from + other crates. +- `pub(crate)`: makes the entity public within the same **crate**, but not outside of it. +- `pub(super)`: makes the entity public within the parent module. +- `pub(in path::to::module)`: makes the entity public within the specified module. + +You can use these modifiers on modules, structs, functions, fields, etc. +For example: + +```rust +pub struct Configuration { + pub(crate) version: u32, + active: bool, +} +``` + +`Configuration` is public, but you can only access the `version` field from within the same crate. +The `active` field, instead, is private and can only be accessed from within the same module or one of its submodules. diff --git a/book/src/03_ticket_v1/05_encapsulation.md b/book/src/03_ticket_v1/05_encapsulation.md new file mode 100644 index 0000000..d3930c5 --- /dev/null +++ b/book/src/03_ticket_v1/05_encapsulation.md @@ -0,0 +1,59 @@ +# Encapsulation + +Now that we have a basic understanding of modules and visibility, let's circle back to **encapsulation**.\ +Encapsulation is the practice of hiding the internal representation of an object. It is most commonly +used to enforce some **invariants** on the object's state. + +Going back to our `Ticket` struct: + +```rust +struct Ticket { + title: String, + description: String, + status: String, +} +``` + +If all fields are made public, there is no encapsulation.\ +You must assume that the fields can be modified at any time, set to any value that's allowed by +their type. You can't rule out that a ticket might have an empty title or a status +that doesn't make sense. + +To enforce stricter rules, we must keep the fields private[^newtype]. +We can then provide public methods to interact with a `Ticket` instance. +Those public methods will have the responsibility of upholding our invariants (e.g. a title must not be empty). + +If at least one field is private it is no longer possible to create a `Ticket` instance directly using the struct +instantiation syntax: + +```rust +// This won't work! +let ticket = Ticket { + title: "Build a ticket system".into(), + description: "A Kanban board".into(), + status: "Open".into() +}; +``` + +You've seen this in action in the previous exercise on visibility.\ +We now need to provide one or more public **constructors**—i.e. static methods or functions that can be used +from outside the module to create a new instance of the struct.\ +Luckily enough we already have one: `Ticket::new`, as implemented in [a previous exercise](02_validation.md). + +## Accessor methods + +In summary: + +- All `Ticket` fields are private +- We provide a public constructor, `Ticket::new`, that enforces our validation rules on creation + +That's a good start, but it's not enough: apart from creating a `Ticket`, we also need to interact with it. +But how can we access the fields if they're private? + +We need to provide **accessor methods**.\ +Accessor methods are public methods that allow you to read the value of a private field (or fields) of a struct. + +Rust doesn't have a built-in way to generate accessor methods for you, like some other languages do. +You have to write them yourself—they're just regular methods. + +[^newtype]: Or refine their type, a technique we'll explore [later on](../05_ticket_v2/15_outro.md). diff --git a/book/src/03_ticket_v1/06_ownership.md b/book/src/03_ticket_v1/06_ownership.md new file mode 100644 index 0000000..df9baff --- /dev/null +++ b/book/src/03_ticket_v1/06_ownership.md @@ -0,0 +1,239 @@ +# Ownership + +If you solved the previous exercise using what this course has taught you so far, +your accessor methods probably look like this: + +```rust +impl Ticket { + pub fn title(self) -> String { + self.title + } + + pub fn description(self) -> String { + self.description + } + + pub fn status(self) -> String { + self.status + } +} +``` + +Those methods compile and are enough to get tests to pass, but in a real-world scenario they won't get you very far. +Consider this snippet: + +```rust +if ticket.status() == "To-Do" { + // We haven't covered the `println!` macro yet, + // but for now it's enough to know that it prints + // a (templated) message to the console + println!("Your next task is: {}", ticket.title()); +} +``` + +If you try to compile it, you'll get an error: + +```text +error[E0382]: use of moved value: `ticket` + --> src/main.rs:30:43 + | +25 | let ticket = Ticket::new(/* */); + | ------ move occurs because `ticket` has type `Ticket`, + | which does not implement the `Copy` trait +26 | if ticket.status() == "To-Do" { + | -------- `ticket` moved due to this method call +... +30 | println!("Your next task is: {}", ticket.title()); + | ^^^^^^ + | value used here after move + | +note: `Ticket::status` takes ownership of the receiver `self`, + which moves `ticket` + --> src/main.rs:12:23 + | +12 | pub fn status(self) -> String { + | ^^^^ +``` + +Congrats, this is your first borrow-checker error! + +## The perks of Rust's ownership system + +Rust's ownership system is designed to ensure that: + +- Data is never mutated while it's being read +- Data is never read while it's being mutated +- Data is never accessed after it has been destroyed + +These constraints are enforced by the **borrow checker**, a subsystem of the Rust compiler, +often the subject of jokes and memes in the Rust community. + +Ownership is a key concept in Rust, and it's what makes the language unique. +Ownership enables Rust to provide **memory safety without compromising performance**. +All these things are true at the same time for Rust: + +1. There is no runtime garbage collector +2. As a developer, you rarely have to manage memory directly +3. You can't cause dangling pointers, double frees, and other memory-related bugs + +Languages like Python, JavaScript, and Java give you 2. and 3., but not 1.\ +Language like C or C++ give you 1., but neither 2. nor 3. + +Depending on your background, 3. might sound a bit arcane: what is a "dangling pointer"? +What is a "double free"? Why are they dangerous?\ +Don't worry: we'll cover these concepts in more details during the rest of the course. + +For now, though, let's focus on learning how to work within Rust's ownership system. + +## The owner + +In Rust, each value has an **owner**, statically determined at compile-time. +There is only one owner for each value at any given time. + +## Move semantics + +Ownership can be transferred. + +If you own a value, for example, you can transfer ownership to another variable: + +```rust +let a = "hello, world".to_string(); // <- `a` is the owner of the String +let b = a; // <- `b` is now the owner of the String +``` + +Rust's ownership system is baked into the type system: each function has to declare in its signature +_how_ it wants to interact with its arguments. + +So far, all our methods and functions have **consumed** their arguments: they've taken ownership of them. +For example: + +```rust +impl Ticket { + pub fn description(self) -> String { + self.description + } +} +``` + +`Ticket::description` takes ownership of the `Ticket` instance it's called on.\ +This is known as **move semantics**: ownership of the value (`self`) is **moved** from the caller to +the callee, and the caller can't use it anymore. + +That's exactly the language used by the compiler in the error message we saw earlier: + +```text +error[E0382]: use of moved value: `ticket` + --> src/main.rs:30:43 + | +25 | let ticket = Ticket::new(/* */); + | ------ move occurs because `ticket` has type `Ticket`, + | which does not implement the `Copy` trait +26 | if ticket.status() == "To-Do" { + | -------- `ticket` moved due to this method call +... +30 | println!("Your next task is: {}", ticket.title()); + | ^^^^^^ + | value used here after move + | +note: `Ticket::status` takes ownership of the receiver `self`, + which moves `ticket` + --> src/main.rs:12:23 + | +12 | pub fn status(self) -> String { + | ^^^^ +``` + +In particular, this is the sequence of events that unfold when we call `ticket.status()`: + +- `Ticket::status` takes ownership of the `Ticket` instance +- `Ticket::status` extracts `status` from `self` and transfers ownership of `status` back to the caller +- The rest of the `Ticket` instance is discarded (`title` and `description`) + +When we try to use `ticket` again via `ticket.title()`, the compiler complains: the `ticket` value is gone now, +we no longer own it, therefore we can't use it anymore. + +To build _useful_ accessor methods we need to start working with **references**. + +## Borrowing + +It is desirable to have methods that can read the value of a variable without taking ownership of it.\ +Programming would be quite limited otherwise. In Rust, that's done via **borrowing**. + +Whenever you borrow a value, you get a **reference** to it.\ +References are tagged with their privileges[^refine]: + +- Immutable references (`&`) allow you to read the value, but not to mutate it +- Mutable references (`&mut`) allow you to read and mutate the value + +Going back to the goals of Rust's ownership system: + +- Data is never mutated while it's being read +- Data is never read while it's being mutated + +To ensure these two properties, Rust has to introduce some restrictions on references: + +- You can't have a mutable reference and an immutable reference to the same value at the same time +- You can't have more than one mutable reference to the same value at the same time +- The owner can't mutate the value while it's being borrowed +- You can have as many immutable references as you want, as long as there are no mutable references + +In a way, you can think of an immutable reference as a "read-only" lock on the value, +while a mutable reference is like a "read-write" lock. + +All these restrictions are enforced at compile-time by the borrow checker. + +### Syntax + +How do you borrow a value, in practice?\ +By adding `&` or `&mut` **in front a variable**, you're borrowing its value. +Careful though! The same symbols (`&` and `&mut`) in **front of a type** have a different meaning: +they denote a different type, a reference to the original type. + +For example: + +```rust +struct Configuration { + version: u32, + active: bool, +} + +fn main() { + let config = Configuration { + version: 1, + active: true, + }; + // `b` is a reference to the `version` field of `config`. + // The type of `b` is `&u32`, since it contains a reference to + // a `u32` value. + // We create a reference by borrowing `config.version`, using + // the `&` operator. + // Same symbol (`&`), different meaning depending on the context! + let b: &u32 = &config.version; + // ^ The type annotation is not necessary, + // it's just there to clarify what's going on +} +``` + +The same concept applies to function arguments and return types: + +```rust +// `f` takes a mutable reference to a `u32` as an argument, +// bound to the name `number` +fn f(number: &mut u32) -> &u32 { + // [...] +} +``` + +## Breathe in, breathe out + +Rust's ownership system can be a bit overwhelming at first.\ +But don't worry: it'll become second nature with practice.\ +And you're going to get a lot of practice over the rest of this chapter, as well as the rest of the course! +We'll revisit each concept multiple times to make sure you get familiar with them +and truly understand how they work. + +Towards the end of this chapter we'll explain _why_ Rust's ownership system is designed the way it is. +For the time being, focus on understanding the _how_. Take each compiler error as a learning opportunity! + +[^refine]: This is a great mental model to start out, but it doesn't capture the _full_ picture. +We'll refine our understanding of references [later in the course](../07_threads/06_interior_mutability.md). diff --git a/book/src/03_ticket_v1/07_setters.md b/book/src/03_ticket_v1/07_setters.md new file mode 100644 index 0000000..caaf92f --- /dev/null +++ b/book/src/03_ticket_v1/07_setters.md @@ -0,0 +1,116 @@ +# Mutable references + +Your accessor methods should look like this now: + +```rust +impl Ticket { + pub fn title(&self) -> &String { + &self.title + } + + pub fn description(&self) -> &String { + &self.description + } + + pub fn status(&self) -> &String { + &self.status + } +} +``` + +A sprinkle of `&` here and there did the trick!\ +We now have a way to access the fields of a `Ticket` instance without consuming it in the process. +Let's see how we can enhance our `Ticket` struct with **setter methods** next. + +## Setters + +Setter methods allow users to change the values of `Ticket`'s private fields while making sure that its invariants +are respected (i.e. you can't set a `Ticket`'s title to an empty string). + +There are two common ways to implement setters in Rust: + +- Taking `self` as input. +- Taking `&mut self` as input. + +### Taking `self` as input + +The first approach looks like this: + +```rust +impl Ticket { + pub fn set_title(mut self, new_title: String) -> Self { + // Validate the new title [...] + self.title = new_title; + self + } +} +``` + +It takes ownership of `self`, changes the title, and returns the modified `Ticket` instance.\ +This is how you'd use it: + +```rust +let ticket = Ticket::new( + "Title".into(), + "Description".into(), + "To-Do".into() +); +let ticket = ticket.set_title("New title".into()); +``` + +Since `set_title` takes ownership of `self` (i.e. it **consumes it**), we need to reassign the result to a variable. +In the example above we take advantage of **variable shadowing** to reuse the same variable name: when +you declare a new variable with the same name as an existing one, the new variable **shadows** the old one. This +is a common pattern in Rust code. + +`self`-setters work quite nicely when you need to change multiple fields at once: you can chain multiple calls together! + +```rust +let ticket = ticket + .set_title("New title".into()) + .set_description("New description".into()) + .set_status("In Progress".into()); +``` + +### Taking `&mut self` as input + +The second approach to setters, using `&mut self`, looks like this instead: + +```rust +impl Ticket { + pub fn set_title(&mut self, new_title: String) { + // Validate the new title [...] + + self.title = new_title; + } +} +``` + +This time the method takes a mutable reference to `self` as input, changes the title, and that's it. +Nothing is returned. + +You'd use it like this: + +```rust +let mut ticket = Ticket::new( + "Title".into(), + "Description".into(), + "To-Do".into() +); +ticket.set_title("New title".into()); + +// Use the modified ticket +``` + +Ownership stays with the caller, so the original `ticket` variable is still valid. We don't need to reassign the result. +We need to mark `ticket` as mutable though, because we're taking a mutable reference to it. + +`&mut`-setters have a downside: you can't chain multiple calls together. +Since they don't return the modified `Ticket` instance, you can't call another setter on the result of the first one. +You have to call each setter separately: + +```rust +ticket.set_title("New title".into()); +ticket.set_description("New description".into()); +ticket.set_status("In Progress".into()); +``` diff --git a/book/src/03_ticket_v1/08_stack.md b/book/src/03_ticket_v1/08_stack.md new file mode 100644 index 0000000..b95dd6d --- /dev/null +++ b/book/src/03_ticket_v1/08_stack.md @@ -0,0 +1,72 @@ +# Memory layout + +We've looked at ownership and references from an operational point of view—what you can and can't do with them. +Now it's a good time to take a look under the hood: let's talk about **memory**. + +## Stack and heap + +When discussing memory, you'll often hear people talk about the **stack** and the **heap**.\ +These are two different memory regions used by programs to store data. + +Let's start with the stack. + +## Stack + +The **stack** is a **LIFO** (Last In, First Out) data structure.\ +When you call a function, a new **stack frame** is added on top of the stack. That stack frame stores +the function's arguments, local variables and a few "bookkeeping" values.\ +When the function returns, the stack frame is popped off the stack[^stack-overflow]. + +```text ++-----------------+ +| frame for func1 | ++-----------------+ + | + | func2 is + | called + v ++-----------------+ +| frame for func2 | ++-----------------+ +| frame for func1 | ++-----------------+ + | + | func2 + | returns + v ++-----------------+ +| frame for func1 | ++-----------------+ +``` + +From an operational point of view, stack allocation/de-allocation is **very fast**.\ +We are always pushing and popping data from the top of the stack, so we don't need to search for free memory. +We also don't have to worry about fragmentation: the stack is a single contiguous block of memory. + +### Rust + +Rust will often allocate data on the stack.\ +You have a `u32` input argument in a function? Those 32 bits will be on the stack.\ +You define a local variable of type `i64`? Those 64 bits will be on the stack.\ +It all works quite nicely because the size of those integers is known at compile time, therefore +the compiled program knows how much space it needs to reserve on the stack for them. + +### `std::mem::size_of` + +You can verify how much space a type would take on the stack +using the [`std::mem::size_of`](https://doc.rust-lang.org/std/mem/fn.size_of.html) function. + +For a `u8`, for example: + +```rust +// We'll explain this funny-looking syntax (`::`) later on. +// Ignore it for now. +assert_eq!(std::mem::size_of::(), 1); +``` + +1 makes sense, because a `u8` is 8 bits long, or 1 byte. + +[^stack-overflow]: If you have nested function calls, each function pushes its data onto the stack when it's called but +it doesn't pop it off until the innermost function returns. +If you have too many nested function calls, you can run out of stack space—the stack is not infinite! +That's called a [**stack overflow**](https://en.wikipedia.org/wiki/Stack_overflow). diff --git a/book/src/03_ticket_v1/09_heap.md b/book/src/03_ticket_v1/09_heap.md new file mode 100644 index 0000000..4c37321 --- /dev/null +++ b/book/src/03_ticket_v1/09_heap.md @@ -0,0 +1,142 @@ +# Heap + +The stack is great, but it can't solve all our problems. What about data whose size is not known at compile time? +Collections, strings, and other dynamically-sized data cannot be (entirely) stack-allocated. +That's where the **heap** comes in. + +## Heap allocations + +You can visualize the heap as a big chunk of memory—a huge array, if you will.\ +Whenever you need to store data on the heap, you ask a special program, the **allocator**, to reserve for you +a subset of the heap. We call this interaction (and the memory you reserved) a **heap allocation**. +If the allocation succeeds, the allocator will give you a **pointer** to the start of the reserved block. + +## No automatic de-allocation + +The heap is structured quite differently from the stack.\ +Heap allocations are not contiguous, they can be located anywhere inside the heap. + +``` ++---+---+---+---+---+---+-...-+-...-+---+---+---+---+---+---+---+ +| Allocation 1 | Free | ... | ... | Allocation N | Free | ++---+---+---+---+---+---+ ... + ... +---+---+---+---+---+---+---+ +``` + +It's the allocator's job to keep track of which parts of the heap are in use and which are free. +The allocator won't automatically free the memory you allocated, though: you need to be deliberate about it, +calling the allocator again to **free** the memory you no longer need. + +## Performance + +The heap's flexibility comes at a cost: heap allocations are **slower** than stack allocations. +There's a lot more bookkeeping involved!\ +If you read articles about performance optimization you'll often be advised to minimize heap allocations +and prefer stack-allocated data whenever possible. + +## `String`'s memory layout + +When you create a local variable of type `String`, +Rust is forced to allocate on the heap[^empty]: it doesn't know in advance how much text you're going to put in it, +so it can't reserve the right amount of space on the stack.\ +But a `String` is not _entirely_ heap-allocated, it also keeps some data on the stack. In particular: + +- The **pointer** to the heap region you reserved. +- The **length** of the string, i.e. how many bytes are in the string. +- The **capacity** of the string, i.e. how many bytes have been reserved on the heap. + +Let's look at an example to understand this better: + +```rust +let mut s = String::with_capacity(5); +``` + +If you run this code, memory will be laid out like this: + +``` + +---------+--------+----------+ +Stack | pointer | length | capacity | + | | | 0 | 5 | + +--|------+--------+----------+ + | + | + v + +---+---+---+---+---+ +Heap: | ? | ? | ? | ? | ? | + +---+---+---+---+---+ +``` + +We asked for a `String` that can hold up to 5 bytes of text.\ +`String::with_capacity` goes to the allocator and asks for 5 bytes of heap memory. The allocator returns +a pointer to the start of that memory block.\ +The `String` is empty, though. On the stack, we keep track of this information by distinguishing between +the length and the capacity: this `String` can hold up to 5 bytes, but it currently holds 0 bytes of +actual text. + +If you push some text into the `String`, the situation will change: + +```rust +s.push_str("Hey"); +``` + +``` + +---------+--------+----------+ +Stack | pointer | length | capacity | + | | | 3 | 5 | + +--| ----+--------+----------+ + | + | + v + +---+---+---+---+---+ +Heap: | H | e | y | ? | ? | + +---+---+---+---+---+ +``` + +`s` now holds 3 bytes of text. Its length is updated to 3, but capacity remains 5. +Three of the five bytes on the heap are used to store the characters `H`, `e`, and `y`. + +### `usize` + +How much space do we need to store pointer, length and capacity on the stack?\ +It depends on the **architecture** of the machine you're running on. + +Every memory location on your machine has an [**address**](https://en.wikipedia.org/wiki/Memory_address), commonly +represented as an unsigned integer. +Depending on the maximum size of the address space (i.e. how much memory your machine can address), +this integer can have a different size. Most modern machines use either a 32-bit or a 64-bit address space. + +Rust abstracts away these architecture-specific details by providing the `usize` type: +an unsigned integer that's as big as the number of bytes needed to address memory on your machine. +On a 32-bit machine, `usize` is equivalent to `u32`. On a 64-bit machine, it matches `u64`. + +Capacity, length and pointers are all represented as `usize`s in Rust[^equivalence]. + +### No `std::mem::size_of` for the heap + +`std::mem::size_of` returns the amount of space a type would take on the stack, +which is also known as the **size of the type**. + +> What about the memory buffer that `String` is managing on the heap? Isn't that +> part of the size of `String`? + +No!\ +That heap allocation is a **resource** that `String` is managing. +It's not considered to be part of the `String` type by the compiler. + +`std::mem::size_of` doesn't know (or care) about additional heap-allocated data +that a type might manage or refer to via pointers, as is the case with `String`, +therefore it doesn't track its size. + +Unfortunately there is no equivalent of `std::mem::size_of` to measure the amount of +heap memory that a certain value is allocating at runtime. Some types might +provide methods to inspect their heap usage (e.g. `String`'s `capacity` method), +but there is no general-purpose "API" to retrieve runtime heap usage in Rust.\ +You can, however, use a memory profiler tool (e.g. [DHAT](https://valgrind.org/docs/manual/dh-manual.html) +or [a custom allocator](https://docs.rs/dhat/latest/dhat/)) to inspect the heap usage of your program. + +[^empty]: `std` doesn't allocate if you create an **empty** `String` (i.e. `String::new()`). +Heap memory will be reserved when you push data into it for the first time. + +[^equivalence]: The size of a pointer depends on the operating system too. +In certain environments, a pointer is **larger** than a memory address (e.g. [CHERI](https://web.archive.org/web/20240517051950/https://blog.acolyer.org/2019/05/28/cheri-abi/)). +Rust makes the simplifying assumption that pointers are the same size as memory addresses, +which is true for most modern systems you're likely to encounter. diff --git a/book/src/03_ticket_v1/10_references_in_memory.md b/book/src/03_ticket_v1/10_references_in_memory.md new file mode 100644 index 0000000..bca87a1 --- /dev/null +++ b/book/src/03_ticket_v1/10_references_in_memory.md @@ -0,0 +1,50 @@ +# References + +What about references, like `&String` or `&mut String`? How are they represented in memory? + +Most references[^fat] in Rust are represented, in memory, as a pointer to a memory location.\ +It follows that their size is the same as the size of a pointer, a `usize`. + +You can verify this using `std::mem::size_of`: + +```rust +assert_eq!(std::mem::size_of::<&String>(), 8); +assert_eq!(std::mem::size_of::<&mut String>(), 8); +``` + +A `&String`, in particular, is a pointer to the memory location where the `String`'s metadata is stored.\ +If you run this snippet: + +```rust +let s = String::from("Hey"); +let r = &s; +``` + +you'll get something like this in memory: + +``` + -------------------------------------- + | | + +----v----+--------+----------+ +----|----+ +Stack | pointer | length | capacity | | pointer | + | | | 3 | 5 | | | + +--| ----+--------+----------+ +---------+ + | s r + | + v + +---+---+---+---+---+ +Heap | H | e | y | ? | ? | + +---+---+---+---+---+ +``` + +It's a pointer to a pointer to the heap-allocated data, if you will. +The same goes for `&mut String`. + +## Not all pointers point to the heap + +The example above should clarify one thing: not all pointers point to the heap.\ +They just point to a memory location, which _may_ be on the heap, but doesn't have to be. + +[^fat]: [Later in the course](../04_traits/06_str_slice.md) we'll talk about **fat pointers**, +i.e. pointers with additional metadata. As the name implies, they are larger than +the pointers we discussed in this chapter, also known as **thin pointers**. diff --git a/book/src/03_ticket_v1/11_destructor.md b/book/src/03_ticket_v1/11_destructor.md new file mode 100644 index 0000000..aebc1bd --- /dev/null +++ b/book/src/03_ticket_v1/11_destructor.md @@ -0,0 +1,169 @@ +# Destructors + +When introducing the heap, we mentioned that you're responsible for freeing the memory you allocate.\ +When introducing the borrow-checker, we also stated that you rarely have to manage memory directly in Rust. + +These two statements might seem contradictory at first. +Let's see how they fit together by introducing **scopes** and **destructors**. + +## Scopes + +The **scope** of a variable is the region of Rust code where that variable is valid, or **alive**. + +The scope of a variable starts with its declaration. +It ends when one of the following happens: + +1. the block (i.e. the code between `{}`) where the variable was declared ends + ```rust + fn main() { + // `x` is not yet in scope here + let y = "Hello".to_string(); + let x = "World".to_string(); // <-- x's scope starts here... + let h = "!".to_string(); // | + } // <-------------- ...and ends here + ``` +2. ownership of the variable is transferred to someone else (e.g. a function or another variable) + ```rust + fn compute(t: String) { + // Do something [...] + } + + fn main() { + let s = "Hello".to_string(); // <-- s's scope starts here... + // | + compute(s); // <------------------- ..and ends here + // because `s` is moved into `compute` + } + ``` + +## Destructors + +When the owner of a value goes out of scope, Rust invokes its **destructor**.\ +The destructor tries to clean up the resources used by that value—in particular, whatever memory it allocated. + +You can manually invoke the destructor of a value by passing it to `std::mem::drop`.\ +That's why you'll often hear Rust developers saying "that value has been **dropped**" as a way to state that a value +has gone out of scope and its destructor has been invoked. + +### Visualizing drop points + +We can insert explicit calls to `drop` to "spell out" what the compiler does for us. Going back to the previous example: + +```rust +fn main() { + let y = "Hello".to_string(); + let x = "World".to_string(); + let h = "!".to_string(); +} +``` + +It's equivalent to: + +```rust +fn main() { + let y = "Hello".to_string(); + let x = "World".to_string(); + let h = "!".to_string(); + // Variables are dropped in reverse order of declaration + drop(h); + drop(x); + drop(y); +} +``` + +Let's look at the second example instead, where `s`'s ownership is transferred to `compute`: + +```rust +fn compute(s: String) { + // Do something [...] +} + +fn main() { + let s = "Hello".to_string(); + compute(s); +} +``` + +It's equivalent to this: + +```rust +fn compute(t: String) { + // Do something [...] + drop(t); // <-- Assuming `t` wasn't dropped or moved + // before this point, the compiler will call + // `drop` here, when it goes out of scope +} + +fn main() { + let s = "Hello".to_string(); + compute(s); +} +``` + +Notice the difference: even though `s` is no longer valid after `compute` is called in `main`, there is no `drop(s)` +in `main`. +When you transfer ownership of a value to a function, you're also **transferring the responsibility of cleaning it up**. + +This ensures that the destructor for a value is called **at most[^leak] once**, preventing +[double free bugs](https://owasp.org/www-community/vulnerabilities/Doubly_freeing_memory) by design. + +### Use after drop + +What happens if you try to use a value after it's been dropped? + +```rust +let x = "Hello".to_string(); +drop(x); +println!("{}", x); +``` + +If you try to compile this code, you'll get an error: + +```rust +error[E0382]: use of moved value: `x` + --> src/main.rs:4:20 + | +3 | drop(x); + | - value moved here +4 | println!("{}", x); + | ^ value used here after move +``` + +Drop **consumes** the value it's called on, meaning that the value is no longer valid after the call.\ +The compiler will therefore prevent you from using it, avoiding [use-after-free bugs](https://owasp.org/www-community/vulnerabilities/Using_freed_memory). + +### Dropping references + +What if a variable contains a reference?\ +For example: + +```rust +let x = 42i32; +let y = &x; +drop(y); +``` + +When you call `drop(y)`... nothing happens.\ +If you actually try to compile this code, you'll get a warning: + +```text +warning: calls to `std::mem::drop` with a reference + instead of an owned value does nothing + --> src/main.rs:4:5 + | +4 | drop(y); + | ^^^^^-^ + | | + | argument has type `&i32` + | +``` + +It goes back to what we said earlier: we only want to call the destructor once.\ +You can have multiple references to the same value—if we called the destructor for the value they point at +when one of them goes out of scope, what would happen to the others? +They would refer to a memory location that's no longer valid: a so-called [**dangling pointer**](https://en.wikipedia.org/wiki/Dangling_pointer), +a close relative of [**use-after-free bugs**](https://owasp.org/www-community/vulnerabilities/Using_freed_memory). +Rust's ownership system rules out these kinds of bugs by design. + +[^leak]: Rust doesn't guarantee that destructors will run. They won't, for example, if +you explicitly choose to [leak memory](../07_threads/03_leak.md). diff --git a/book/src/03_ticket_v1/12_outro.md b/book/src/03_ticket_v1/12_outro.md new file mode 100644 index 0000000..52dd64c --- /dev/null +++ b/book/src/03_ticket_v1/12_outro.md @@ -0,0 +1,5 @@ +# Wrapping up + +We've covered a lot of foundational Rust concepts in this chapter.\ +Before moving on, let's go through one last exercise to consolidate what we've learned. +You'll have minimal guidance this time—just the exercise description and the tests to guide you. diff --git a/book/src/04_traits/00_intro.md b/book/src/04_traits/00_intro.md new file mode 100644 index 0000000..47ec5c8 --- /dev/null +++ b/book/src/04_traits/00_intro.md @@ -0,0 +1,20 @@ +# Traits + +In the previous chapter we covered the basics of Rust's type and ownership system.\ +It's time to dig deeper: we'll explore **traits**, Rust's take on interfaces. + +Once you learn about traits, you'll start seeing their fingerprints all over the place.\ +In fact, you've already seen traits in action throughout the previous chapter, e.g. `.into()` invocations as well +as operators like `==` and `+`. + +On top of traits as a concept, we'll also cover some of the key traits that are defined in Rust's standard library: + +- Operator traits (e.g. `Add`, `Sub`, `PartialEq`, etc.) +- `From` and `Into`, for infallible conversions +- `Clone` and `Copy`, for copying values +- `Deref` and deref coercion +- `Sized`, to mark types with a known size +- `Drop`, for custom cleanup logic + +Since we'll be talking about conversions, we'll seize the opportunity to plug some of the "knowledge gaps" +from the previous chapter—e.g. what is `"A title"`, exactly? Time to learn more about slices too! diff --git a/book/src/04_traits/01_trait.md b/book/src/04_traits/01_trait.md new file mode 100644 index 0000000..210eab4 --- /dev/null +++ b/book/src/04_traits/01_trait.md @@ -0,0 +1,127 @@ +# Traits + +Let's look again at our `Ticket` type: + +```rust +pub struct Ticket { + title: String, + description: String, + status: String, +} +``` + +All our tests, so far, have been making assertions using `Ticket`'s fields. + +```rust +assert_eq!(ticket.title(), "A new title"); +``` + +What if we wanted to compare two `Ticket` instances directly? + +```rust +let ticket1 = Ticket::new(/* ... */); +let ticket2 = Ticket::new(/* ... */); +ticket1 == ticket2 +``` + +The compiler will stop us: + +```text +error[E0369]: binary operation `==` cannot be applied to type `Ticket` + --> src/main.rs:18:13 + | +18 | ticket1 == ticket2 + | ------- ^^ ------- Ticket + | | + | Ticket + | +note: an implementation of `PartialEq` might be missing for `Ticket` +``` + +`Ticket` is a new type. Out of the box, there is **no behavior attached to it**.\ +Rust doesn't magically infer how to compare two `Ticket` instances just because they contain `String`s. + +The Rust compiler is nudging us in the right direction though: it's suggesting that we might be missing an implementation +of `PartialEq`. `PartialEq` is a **trait**! + +## What are traits? + +Traits are Rust's way of defining **interfaces**.\ +A trait defines a set of methods that a type must implement to satisfy the trait's contract. + +### Defining a trait + +The syntax for a trait definition goes like this: + +```rust +trait { + fn () -> ; +} +``` + +We might, for example, define a trait named `MaybeZero` that requires its implementors to define an `is_zero` method: + +```rust +trait MaybeZero { + fn is_zero(self) -> bool; +} +``` + +### Implementing a trait + +To implement a trait for a type we use the `impl` keyword, just like we do for regular[^inherent] methods, +but the syntax is a bit different: + +```rust +impl for { + fn () -> { + // Method body + } +} +``` + +For example, to implement the `MaybeZero` trait for a custom number type, `WrappingU32`: + +```rust +pub struct WrappingU32 { + inner: u32, +} + +impl MaybeZero for WrappingU32 { + fn is_zero(self) -> bool { + self.inner == 0 + } +} +``` + +### Invoking a trait method + +To invoke a trait method, we use the `.` operator, just like we do with regular methods: + +```rust +let x = WrappingU32 { inner: 5 }; +assert!(!x.is_zero()); +``` + +To invoke a trait method, two things must be true: + +- The type must implement the trait. +- The trait must be in scope. + +To satisfy the latter, you may have to add a `use` statement for the trait: + +```rust +use crate::MaybeZero; +``` + +This is not necessary if: + +- The trait is defined in the same module where the invocation occurs. +- The trait is defined in the standard library's **prelude**. + The prelude is a set of traits and types that are automatically imported into every Rust program. + It's as if `use std::prelude::*;` was added at the beginning of every Rust module. + +You can find the list of traits and types in the prelude in the +[Rust documentation](https://doc.rust-lang.org/std/prelude/index.html). + +[^inherent]: A method defined directly on a type, without using a trait, is also known as an **inherent method**. diff --git a/book/src/04_traits/02_orphan_rule.md b/book/src/04_traits/02_orphan_rule.md new file mode 100644 index 0000000..5bd47c4 --- /dev/null +++ b/book/src/04_traits/02_orphan_rule.md @@ -0,0 +1,112 @@ +# Implementing traits + +When a type is defined in another crate (e.g. `u32`, from Rust's standard library), you +can't directly define new methods for it. If you try: + +```rust +impl u32 { + fn is_even(&self) -> bool { + self % 2 == 0 + } +} +``` + +the compiler will complain: + +```text +error[E0390]: cannot define inherent `impl` for primitive types + | +1 | impl u32 { + | ^^^^^^^^ + | + = help: consider using an extension trait instead +``` + +## Extension trait + +An **extension trait** is a trait whose primary purpose is to attach new methods +to foreign types, such as `u32`. +That's exactly the pattern you deployed in the previous exercise, by defining +the `IsEven` trait and then implementing it for `i32` and `u32`. You are then +free to call `is_even` on those types as long as `IsEven` is in scope. + +```rust +// Bring the trait in scope +use my_library::IsEven; + +fn main() { + // Invoke its method on a type that implements it + if 4.is_even() { + // [...] + } +} +``` + +## One implementation + +There are limitations to the trait implementations you can write.\ +The simplest and most straight-forward one: you can't implement the same trait twice, +in a crate, for the same type. + +For example: + +```rust +trait IsEven { + fn is_even(&self) -> bool; +} + +impl IsEven for u32 { + fn is_even(&self) -> bool { + true + } +} + +impl IsEven for u32 { + fn is_even(&self) -> bool { + false + } +} +``` + +The compiler will reject it: + +```text +error[E0119]: conflicting implementations of trait `IsEven` for type `u32` + | +5 | impl IsEven for u32 { + | ------------------- first implementation here +... +11 | impl IsEven for u32 { + | ^^^^^^^^^^^^^^^^^^^ conflicting implementation for `u32` +``` + +There can be no ambiguity as to what trait implementation should be used when `IsEven::is_even` +is invoked on a `u32` value, therefore there can only be one. + +## Orphan rule + +Things get more nuanced when multiple crates are involved. +In particular, at least one of the following must be true: + +- The trait is defined in the current crate +- The implementor type is defined in the current crate + +This is known as Rust's **orphan rule**. Its goal is to make the method resolution +process unambiguous. + +Imagine the following situation: + +- Crate `A` defines the `IsEven` trait +- Crate `B` implements `IsEven` for `u32` +- Crate `C` provides a (different) implementation of the `IsEven` trait for `u32` +- Crate `D` depends on both `B` and `C` and calls `1.is_even()` + +Which implementation should be used? The one defined in `B`? Or the one defined in `C`?\ +There's no good answer, therefore the orphan rule was defined to prevent this scenario. +Thanks to the orphan rule, neither crate `B` nor crate `C` would compile. + +## Further reading + +- There are some caveats and exceptions to the orphan rule as stated above. + Check out [the reference](https://doc.rust-lang.org/reference/items/implementations.html#trait-implementation-coherence) + if you want to get familiar with its nuances. diff --git a/book/src/04_traits/03_operator_overloading.md b/book/src/04_traits/03_operator_overloading.md new file mode 100644 index 0000000..d963de1 --- /dev/null +++ b/book/src/04_traits/03_operator_overloading.md @@ -0,0 +1,98 @@ +# Operator overloading + +Now that we have a basic understanding of what traits are, let's circle back to **operator overloading**. +Operator overloading is the ability to define custom behavior for operators like `+`, `-`, `*`, `/`, `==`, `!=`, etc. + +## Operators are traits + +In Rust, operators are traits.\ +For each operator, there is a corresponding trait that defines the behavior of that operator. +By implementing that trait for your type, you **unlock** the usage of the corresponding operators. + +For example, the [`PartialEq` trait](https://doc.rust-lang.org/std/cmp/trait.PartialEq.html) defines the behavior of +the `==` and `!=` operators: + +```rust +// The `PartialEq` trait definition, from Rust's standard library +// (It is *slightly* simplified, for now) +pub trait PartialEq { + // Required method + // + // `Self` is a Rust keyword that stands for + // "the type that is implementing the trait" + fn eq(&self, other: &Self) -> bool; + + // Provided method + fn ne(&self, other: &Self) -> bool { ... } +} +``` + +When you write `x == y` the compiler will look for an implementation of the `PartialEq` trait for the types of `x` and `y` +and replace `x == y` with `x.eq(y)`. It's syntactic sugar! + +This is the correspondence for the main operators: + +| Operator | Trait | +| ------------------------ | ----------------------------------------------------------------------- | +| `+` | [`Add`](https://doc.rust-lang.org/std/ops/trait.Add.html) | +| `-` | [`Sub`](https://doc.rust-lang.org/std/ops/trait.Sub.html) | +| `*` | [`Mul`](https://doc.rust-lang.org/std/ops/trait.Mul.html) | +| `/` | [`Div`](https://doc.rust-lang.org/std/ops/trait.Div.html) | +| `%` | [`Rem`](https://doc.rust-lang.org/std/ops/trait.Rem.html) | +| `==` and `!=` | [`PartialEq`](https://doc.rust-lang.org/std/cmp/trait.PartialEq.html) | +| `<`, `>`, `<=`, and `>=` | [`PartialOrd`](https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html) | + +Arithmetic operators live in the [`std::ops`](https://doc.rust-lang.org/std/ops/index.html) module, +while comparison ones live in the [`std::cmp`](https://doc.rust-lang.org/std/cmp/index.html) module. + +## Default implementations + +The comment on `PartialEq::ne` states that "`ne` is a provided method".\ +It means that `PartialEq` provides a **default implementation** for `ne` in the trait definition—the `{ ... }` elided +block in the definition snippet.\ +If we expand the elided block, it looks like this: + +```rust +pub trait PartialEq { + fn eq(&self, other: &Self) -> bool; + + fn ne(&self, other: &Self) -> bool { + !self.eq(other) + } +} +``` + +It's what you expect: `ne` is the negation of `eq`.\ +Since a default implementation is provided, you can skip implementing `ne` when you implement `PartialEq` for your type. +It's enough to implement `eq`: + +```rust +struct WrappingU8 { + inner: u8, +} + +impl PartialEq for WrappingU8 { + fn eq(&self, other: &WrappingU8) -> bool { + self.inner == other.inner + } + + // No `ne` implementation here +} +``` + +You are not forced to use the default implementation though. +You can choose to override it when you implement the trait: + +```rust +struct MyType; + +impl PartialEq for MyType { + fn eq(&self, other: &MyType) -> bool { + // Custom implementation + } + + fn ne(&self, other: &MyType) -> bool { + // Custom implementation + } +} +``` diff --git a/book/src/04_traits/04_derive.md b/book/src/04_traits/04_derive.md new file mode 100644 index 0000000..a24c332 --- /dev/null +++ b/book/src/04_traits/04_derive.md @@ -0,0 +1,104 @@ +# Derive macros + +Implementing `PartialEq` for `Ticket` was a bit tedious, wasn't it? +You had to manually compare each field of the struct. + +## Destructuring syntax + +Furthermore, the implementation is brittle: if the struct definition changes +(e.g. a new field is added), you have to remember to update the `PartialEq` implementation. + +You can mitigate the risk by **destructuring** the struct into its fields: + +```rust +impl PartialEq for Ticket { + fn eq(&self, other: &Self) -> bool { + let Ticket { + title, + description, + status, + } = self; + // [...] + } +} +``` + +If the definition of `Ticket` changes, the compiler will error out, complaining that your +destructuring is no longer exhaustive.\ +You can also rename struct fields, to avoid variable shadowing: + +```rust +impl PartialEq for Ticket { + fn eq(&self, other: &Self) -> bool { + let Ticket { + title, + description, + status, + } = self; + let Ticket { + title: other_title, + description: other_description, + status: other_status, + } = other; + // [...] + } +} +``` + +Destructuring is a useful pattern to have in your toolkit, but +there's an even more convenient way to do this: **derive macros**. + +## Macros + +You've already encountered a few macros in past exercises: + +- `assert_eq!` and `assert!`, in the test cases +- `println!`, to print to the console + +Rust macros are **code generators**.\ +They generate new Rust code based on the input you provide, and that generated code is then compiled alongside +the rest of your program. Some macros are built into Rust's standard library, but you can also +write your own. We won't be creating our own macro in this course, but you can find some useful +pointers in the ["Further reading" section](#further-reading). + +### Inspection + +Some IDEs let you expand a macro to inspect the generated code. If that's not possible, you can use +[`cargo-expand`](https://github.com/dtolnay/cargo-expand). + +### Derive macros + +A **derive macro** is a particular flavour of Rust macro. It is specified as an **attribute** on top of a struct. + +```rust +#[derive(PartialEq)] +struct Ticket { + title: String, + description: String, + status: String +} +``` + +Derive macros are used to automate the implementation of common (and "obvious") traits for custom types. +In the example above, the `PartialEq` trait is automatically implemented for `Ticket`. +If you expand the macro, you'll see that the generated code is functionally equivalent to the one you wrote manually, +although a bit more cumbersome to read: + +```rust +#[automatically_derived] +impl ::core::cmp::PartialEq for Ticket { + #[inline] + fn eq(&self, other: &Ticket) -> bool { + self.title == other.title + && self.description == other.description + && self.status == other.status + } +} +``` + +The compiler will nudge you to derive traits when possible. + +## Further reading + +- [The little book of Rust macros](https://veykril.github.io/tlborm/) +- [Proc macro workshop](https://github.com/dtolnay/proc-macro-workshop) diff --git a/book/src/04_traits/05_trait_bounds.md b/book/src/04_traits/05_trait_bounds.md new file mode 100644 index 0000000..06eb34c --- /dev/null +++ b/book/src/04_traits/05_trait_bounds.md @@ -0,0 +1,176 @@ +# Trait bounds + +We've seen two use cases for traits so far: + +- Unlocking "built-in" behaviour (e.g. operator overloading) +- Adding new behaviour to existing types (i.e. extension traits) + +There's a third use case: **generic programming**. + +## The problem + +All our functions and methods, so far, have been working with **concrete types**.\ +Code that operates on concrete types is usually straightforward to write and understand. But it's also +limited in its reusability.\ +Let's imagine, for example, that we want to write a function that returns `true` if an integer is even. +Working with concrete types, we'd have to write a separate function for each integer type we want to +support: + +```rust +fn is_even_i32(n: i32) -> bool { + n % 2 == 0 +} + +fn is_even_i64(n: i64) -> bool { + n % 2 == 0 +} + +// Etc. +``` + +Alternatively, we could write a single extension trait and then different implementations for each integer type: + +```rust +trait IsEven { + fn is_even(&self) -> bool; +} + +impl IsEven for i32 { + fn is_even(&self) -> bool { + self % 2 == 0 + } +} + +impl IsEven for i64 { + fn is_even(&self) -> bool { + self % 2 == 0 + } +} + +// Etc. +``` + +The duplication remains. + +## Generic programming + +We can do better using **generics**.\ +Generics allow us to write code that works with a **type parameter** instead of a concrete type: + +```rust +fn print_if_even(n: T) +where + T: IsEven + Debug +{ + if n.is_even() { + println!("{n:?} is even"); + } +} +``` + +`print_if_even` is a **generic function**.\ +It isn't tied to a specific input type. Instead, it works with any type `T` that: + +- Implements the `IsEven` trait. +- Implements the `Debug` trait. + +This contract is expressed with a **trait bound**: `T: IsEven + Debug`.\ +The `+` symbol is used to require that `T` implements multiple traits. `T: IsEven + Debug` is equivalent to +"where `T` implements `IsEven` **and** `Debug`". + +## Trait bounds + +What purpose do trait bounds serve in `print_if_even`?\ +To find out, let's try to remove them: + +```rust +fn print_if_even(n: T) { + if n.is_even() { + println!("{n:?} is even"); + } +} +``` + +This code won't compile: + +```text +error[E0599]: no method named `is_even` found for type parameter `T` + in the current scope + --> src/lib.rs:2:10 + | +1 | fn print_if_even(n: T) { + | - method `is_even` not found + | for this type parameter +2 | if n.is_even() { + | ^^^^^^^ method not found in `T` + +error[E0277]: `T` doesn't implement `Debug` + --> src/lib.rs:3:19 + | +3 | println!("{n:?} is even"); + | ^^^^^ + | `T` cannot be formatted using `{:?}` because + | it doesn't implement `Debug` + | +help: consider restricting type parameter `T` + | +1 | fn print_if_even(n: T) { + | +++++++++++++++++ +``` + +Without trait bounds, the compiler doesn't know what `T` **can do**.\ +It doesn't know that `T` has an `is_even` method, and it doesn't know how to format `T` for printing. +From the compiler point of view, a bare `T` has no behaviour at all.\ +Trait bounds restrict the set of types that can be used by ensuring that the behaviour required by the function +body is present. + +## Syntax: inlining trait bounds + +All the examples above used a **`where` clause** to specify trait bounds: + +```rust +fn print_if_even(n: T) +where + T: IsEven + Debug +// ^^^^^^^^^^^^^^^^^ +// This is a `where` clause +{ + // [...] +} +``` + +If the trait bounds are simple, you can **inline** them directly next to the type parameter: + +```rust +fn print_if_even(n: T) { + // ^^^^^^^^^^^^^^^^^ + // This is an inline trait bound + // [...] +} +``` + +## Syntax: meaningful names + +In the examples above, we used `T` as the type parameter name. This is a common convention when a function has +only one type parameter.\ +Nothing stops you from using a more meaningful name, though: + +```rust +fn print_if_even(n: Number) { + // [...] +} +``` + +It is actually **desirable** to use meaningful names when there are multiple type parameters at play or when the name +`T` doesn't convey enough information about the type's role in the function. +Maximize clarity and readability when naming type parameters, just as you would with variables or function parameters. +Follow Rust's conventions, though: use [upper camel case for type parameter names](https://rust-lang.github.io/api-guidelines/naming.html#casing-conforms-to-rfc-430-c-case). + +## The function signature is king + +You may wonder why we need trait bounds at all. Can't the compiler infer the required traits from the function's body?\ +It could, but it won't.\ +The rationale is the same as for [explicit type annotations on function parameters](../02_basic_calculator/02_variables.md#function-arguments-are-variables): +each function signature is a contract between the caller and the callee, and the terms must be explicitly stated. +This allows for better error messages, better documentation, less unintentional breakages across versions, +and faster compilation times. diff --git a/book/src/04_traits/06_str_slice.md b/book/src/04_traits/06_str_slice.md new file mode 100644 index 0000000..cae9a55 --- /dev/null +++ b/book/src/04_traits/06_str_slice.md @@ -0,0 +1,117 @@ +# String slices + +Throughout the previous chapters you've seen quite a few **string literals** being used in the code, +like `"To-Do"` or `"A ticket description"`. +They were always followed by a call to `.to_string()` or `.into()`. It's time to understand why! + +## String literals + +You define a string literal by enclosing the raw text in double quotes: + +```rust +let s = "Hello, world!"; +``` + +The type of `s` is `&str`, a **reference to a string slice**. + +## Memory layout + +`&str` and `String` are different types—they're not interchangeable.\ +Let's recall the memory layout of a `String` from our +[previous exploration](../03_ticket_v1/09_heap.md). +If we run: + +```rust +let mut s = String::with_capacity(5); +s.push_str("Hello"); +``` + +we'll get this scenario in memory: + +```text + +---------+--------+----------+ +Stack | pointer | length | capacity | + | | | 5 | 5 | + +--|------+--------+----------+ + | + | + v + +---+---+---+---+---+ +Heap: | H | e | l | l | o | + +---+---+---+---+---+ +``` + +If you remember, we've [also examined](../03_ticket_v1/10_references_in_memory.md) +how a `&String` is laid out in memory: + +```text + -------------------------------------- + | | ++----v----+--------+----------+ +----|----+ +| pointer | length | capacity | | pointer | +| | | 5 | 5 | | | ++----|----+--------+----------+ +---------+ + | s &s + | + v + +---+---+---+---+---+ + | H | e | l | l | o | + +---+---+---+---+---+ +``` + +`&String` points to the memory location where the `String`'s metadata is stored.\ +If we follow the pointer, we get to the heap-allocated data. In particular, we get to the first byte of the string, `H`. + +What if we wanted a type that represents a **substring** of `s`? E.g. `ello` in `Hello`? + +## String slices + +A `&str` is a **view** into a string, a **reference** to a sequence of UTF-8 bytes stored elsewhere. +You can, for example, create a `&str` from a `String` like this: + +```rust +let mut s = String::with_capacity(5); +s.push_str("Hello"); +// Create a string slice reference from the `String`, +// skipping the first byte. +let slice: &str = &s[1..]; +``` + +In memory, it'd look like this: + +```text + s slice + +---------+--------+----------+ +---------+--------+ +Stack | pointer | length | capacity | | pointer | length | + | | | 5 | 5 | | | | 4 | + +----|----+--------+----------+ +----|----+--------+ + | s | + | | + v | + +---+---+---+---+---+ | +Heap: | H | e | l | l | o | | + +---+---+---+---+---+ | + ^ | + | | + +--------------------------------+ +``` + +`slice` stores two pieces of information on the stack: + +- A pointer to the first byte of the slice. +- The length of the slice. + +`slice` doesn't own the data, it just points to it: it's a **reference** to the `String`'s heap-allocated data.\ +When `slice` is dropped, the heap-allocated data won't be deallocated, because it's still owned by `s`. +That's why `slice` doesn't have a `capacity` field: it doesn't own the data, so it doesn't need to know how much +space it was allocated for it; it only cares about the data it references. + +## `&str` vs `&String` + +As a rule of thumb, use `&str` rather than `&String` whenever you need a reference to textual data.\ +`&str` is more flexible and generally considered more idiomatic in Rust code. + +If a method returns a `&String`, you're promising that there is heap-allocated UTF-8 text somewhere that +**matches exactly** the one you're returning a reference to.\ +If a method returns a `&str`, instead, you have a lot more freedom: you're just saying that _somewhere_ there's a +bunch of text data and that a subset of it matches what you need, therefore you're returning a reference to it. diff --git a/book/src/04_traits/07_deref.md b/book/src/04_traits/07_deref.md new file mode 100644 index 0000000..9b65664 --- /dev/null +++ b/book/src/04_traits/07_deref.md @@ -0,0 +1,91 @@ +# `Deref` trait + +In the previous exercise you didn't have to do much, did you? + +Changing + +```rust +impl Ticket { + pub fn title(&self) -> &String { + &self.title + } +} +``` + +to + +```rust +impl Ticket { + pub fn title(&self) -> &str { + &self.title + } +} +``` + +was all you needed to do to get the code to compile and the tests to pass. +Some alarm bells should be ringing in your head though. + +## It shouldn't work, but it does + +Let's review the facts: + +- `self.title` is a `String` +- `&self.title` is, therefore, a `&String` +- The output of the (modified) `title` method is `&str` + +You would expect a compiler error, wouldn't you? `Expected &String, found &str` or something similar. +Instead, it just works. **Why**? + +## `Deref` to the rescue + +The `Deref` trait is the mechanism behind the language feature known as [**deref coercion**](https://doc.rust-lang.org/std/ops/trait.Deref.html#deref-coercion).\ +The trait is defined in the standard library, in the `std::ops` module: + +```rust +// I've slightly simplified the definition for now. +// We'll see the full definition later on. +pub trait Deref { + type Target; + + fn deref(&self) -> &Self::Target; +} +``` + +`type Target` is an **associated type**.\ +It's a placeholder for a concrete type that must be specified when the trait is implemented. + +## Deref coercion + +By implementing `Deref` for a type `T` you're telling the compiler that `&T` and `&U` are +somewhat interchangeable.\ +In particular, you get the following behavior: + +- References to `T` are implicitly converted into references to `U` (i.e. `&T` becomes `&U`) +- You can call on `&T` all the methods defined on `U` that take `&self` as input. + +There is one more thing around the dereference operator, `*`, but we don't need it yet (see `std`'s docs +if you're curious). + +## `String` implements `Deref` + +`String` implements `Deref` with `Target = str`: + +```rust +impl Deref for String { + type Target = str; + + fn deref(&self) -> &str { + // [...] + } +} +``` + +Thanks to this implementation and deref coercion, a `&String` is automatically converted into a `&str` when needed. + +## Don't abuse deref coercion + +Deref coercion is a powerful feature, but it can lead to confusion.\ +Automatically converting types can make the code harder to read and understand. If a method with the same name +is defined on both `T` and `U`, which one will be called? + +We'll examine later in the course the "safest" use cases for deref coercion: smart pointers. diff --git a/book/src/04_traits/08_sized.md b/book/src/04_traits/08_sized.md new file mode 100644 index 0000000..badfebe --- /dev/null +++ b/book/src/04_traits/08_sized.md @@ -0,0 +1,80 @@ +# `Sized` + +There's more to `&str` than meets the eye, even after having +investigated deref coercion.\ +From our previous [discussion on memory layouts](../03_ticket_v1/10_references_in_memory.md), +it would have been reasonable to expect `&str` to be represented as a single `usize` on +the stack, a pointer. That's not the case though. `&str` stores some **metadata** next +to the pointer: the length of the slice it points to. Going back to the example from +[a previous section](06_str_slice.md): + +```rust +let mut s = String::with_capacity(5); +s.push_str("Hello"); +// Create a string slice reference from the `String`, +// skipping the first byte. +let slice: &str = &s[1..]; +``` + +In memory, we get: + +```text + s slice + +---------+--------+----------+ +---------+--------+ +Stack | pointer | length | capacity | | pointer | length | + | | | 5 | 5 | | | | 4 | + +----|----+--------+----------+ +----|----+--------+ + | s | + | | + v | + +---+---+---+---+---+ | +Heap: | H | e | l | l | o | | + +---+---+---+---+---+ | + ^ | + | | + +--------------------------------+ +``` + +What's going on? + +## Dynamically sized types + +`str` is a **dynamically sized type** (DST).\ +A DST is a type whose size is not known at compile time. Whenever you have a +reference to a DST, like `&str`, it has to include additional +information about the data it points to. It is a **fat pointer**.\ +In the case of `&str`, it stores the length of the slice it points to. +We'll see more examples of DSTs in the rest of the course. + +## The `Sized` trait + +Rust's `std` library defines a trait called `Sized`. + +```rust +pub trait Sized { + // This is an empty trait, no methods to implement. +} +``` + +A type is `Sized` if its size is known at compile time. In other words, it's not a DST. + +### Marker traits + +`Sized` is your first example of a **marker trait**.\ +A marker trait is a trait that doesn't require any methods to be implemented. It doesn't define any behavior. +It only serves to **mark** a type as having certain properties. +The mark is then leveraged by the compiler to enable certain behaviors or optimizations. + +### Auto traits + +In particular, `Sized` is also an **auto trait**.\ +You don't need to implement it explicitly; the compiler implements it automatically for you +based on the type's definition. + +### Examples + +All the types we've seen so far are `Sized`: `u32`, `String`, `bool`, etc. + +`str`, as we just saw, is not `Sized`.\ +`&str` is `Sized` though! We know its size at compile time: two `usize`s, one for the pointer +and one for the length. diff --git a/book/src/04_traits/09_from.md b/book/src/04_traits/09_from.md new file mode 100644 index 0000000..3fa6193 --- /dev/null +++ b/book/src/04_traits/09_from.md @@ -0,0 +1,148 @@ +# `From` and `Into` + +Let's go back to where our string journey started: + +```rust +let ticket = Ticket::new( + "A title".into(), + "A description".into(), + "To-Do".into() +); +``` + +We now know enough to start unpacking what `.into()` is doing here. + +## The problem + +This is the signature of the `new` method: + +```rust +impl Ticket { + pub fn new( + title: String, + description: String, + status: String + ) -> Self { + // [...] + } +} +``` + +We've also seen that string literals (such as `"A title"`) are of type `&str`.\ +We have a type mismatch here: a `String` is expected, but we have a `&str`. +No magical coercion will come to save us this time; we need **to perform a conversion**. + +## `From` and `Into` + +The Rust standard library defines two traits for **infallible conversions**: `From` and `Into`, +in the `std::convert` module. + +```rust +pub trait From: Sized { + fn from(value: T) -> Self; +} + +pub trait Into: Sized { + fn into(self) -> T; +} +``` + +These trait definitions showcase a few concepts that we haven't seen before: **supertraits** and **implicit trait bounds**. +Let's unpack those first. + +### Supertrait / Subtrait + +The `From: Sized` syntax implies that `From` is a **subtrait** of `Sized`: any type that +implements `From` must also implement `Sized`. +Alternatively, you could say that `Sized` is a **supertrait** of `From`. + +### Implicit trait bounds + +Every time you have a generic type parameter, the compiler implicitly assumes that it's `Sized`. + +For example: + +```rust +pub struct Foo { + inner: T, +} +``` + +is actually equivalent to: + +```rust +pub struct Foo +{ + inner: T, +} +``` + +In the case of `From`, the trait definition is equivalent to: + +```rust +pub trait From: Sized { + fn from(value: T) -> Self; +} +``` + +In other words, _both_ `T` and the type implementing `From` must be `Sized`, even +though the former bound is implicit. + +### Negative trait bounds + +You can opt out of the implicit `Sized` bound with a **negative trait bound**: + +```rust +pub struct Foo { + // ^^^^^^^ + // This is a negative trait bound + inner: T, +} +``` + +This syntax reads as "`T` may or may not be `Sized`", and it allows you to +bind `T` to a DST (e.g. `Foo`). It is a special case, though: negative trait bounds are exclusive to `Sized`, +you can't use them with other traits. + +## `&str` to `String` + +In [`std`'s documentation](https://doc.rust-lang.org/std/convert/trait.From.html#implementors) +you can see which `std` types implement the `From` trait.\ +You'll find that `String` implements `From<&str> for String`. Thus, we can write: + +```rust +let title = String::from("A title"); +``` + +We've been primarily using `.into()`, though.\ +If you check out the [implementors of `Into`](https://doc.rust-lang.org/std/convert/trait.Into.html#implementors) +you won't find `Into for &str`. What's going on? + +`From` and `Into` are **dual traits**.\ +In particular, `Into` is implemented for any type that implements `From` using a **blanket implementation**: + +```rust +impl Into for T +where + U: From, +{ + fn into(self) -> U { + U::from(self) + } +} +``` + +If a type `U` implements `From`, then `Into for T` is automatically implemented. That's why +we can write `let title = "A title".into();`. + +## `.into()` + +Every time you see `.into()`, you're witnessing a conversion between types.\ +What's the target type, though? + +In most cases, the target type is either: + +- Specified by the signature of a function/method (e.g. `Ticket::new` in our example above) +- Specified in the variable declaration with a type annotation (e.g. `let title: String = "A title".into();`) + +`.into()` will work out of the box as long as the compiler can infer the target type from the context without ambiguity. diff --git a/book/src/04_traits/10_assoc_vs_generic.md b/book/src/04_traits/10_assoc_vs_generic.md new file mode 100644 index 0000000..f72ccf1 --- /dev/null +++ b/book/src/04_traits/10_assoc_vs_generic.md @@ -0,0 +1,146 @@ +# Generics and associated types + +Let's re-examine the definition for two of the traits we studied so far, `From` and `Deref`: + +```rust +pub trait From { + fn from(value: T) -> Self; +} + +pub trait Deref { + type Target; + + fn deref(&self) -> &Self::Target; +} +``` + +They both feature type parameters.\ +In the case of `From`, it's a generic parameter, `T`.\ +In the case of `Deref`, it's an associated type, `Target`. + +What's the difference? Why use one over the other? + +## At most one implementation + +Due to how deref coercion works, there can only be one "target" type for a given type. E.g. `String` can +only deref to `str`. +It's about avoiding ambiguity: if you could implement `Deref` multiple times for a type, +which `Target` type should the compiler choose when you call a `&self` method? + +That's why `Deref` uses an associated type, `Target`.\ +An associated type is uniquely determined **by the trait implementation**. +Since you can't implement `Deref` more than once, you'll only be able to specify one `Target` for a given type +and there won't be any ambiguity. + +## Generic traits + +On the other hand, you can implement `From` multiple times for a type, **as long as the input type `T` is different**. +For example, you can implement `From` for `WrappingU32` using both `u32` and `u16` as input types: + +```rust +impl From for WrappingU32 { + fn from(value: u32) -> Self { + WrappingU32 { inner: value } + } +} + +impl From for WrappingU32 { + fn from(value: u16) -> Self { + WrappingU32 { inner: value.into() } + } +} +``` + +This works because `From` and `From` are considered **different traits**.\ +There is no ambiguity: the compiler can determine which implementation to use based on type of the value being converted. + +## Case study: `Add` + +As a closing example, consider the `Add` trait from the standard library: + +```rust +pub trait Add { + type Output; + + fn add(self, rhs: RHS) -> Self::Output; +} +``` + +It uses both mechanisms: + +- it has a generic parameter, `RHS` (right-hand side), which defaults to `Self` +- it has an associated type, `Output`, the type of the result of the addition + +### `RHS` + +`RHS` is a generic parameter to allow for different types to be added together.\ +For example, you'll find these two implementations in the standard library: + +```rust +impl Add for u32 { + type Output = u32; + + fn add(self, rhs: u32) -> u32 { + // ^^^ + // This could be written as `Self::Output` instead. + // The compiler doesn't care, as long as the type you + // specify here matches the type you assigned to `Output` + // right above. + // [...] + } +} + +impl Add<&u32> for u32 { + type Output = u32; + + fn add(self, rhs: &u32) -> u32 { + // [...] + } +} +``` + +This allows the following code to compile: + +```rust +let x = 5u32 + &5u32 + 6u32; +``` + +because `u32` implements `Add<&u32>` _as well as_ `Add`. + +### `Output` + +`Output` represents the type of the result of the addition. + +Why do we need `Output` in the first place? Can't we just use `Self` as output, the type implementing `Add`? +We could, but it would limit the flexibility of the trait. In the standard library, for example, you'll find +this implementation: + +```rust +impl Add<&u32> for &u32 { + type Output = u32; + + fn add(self, rhs: &u32) -> u32 { + // [...] + } +} +``` + +The type they're implementing the trait for is `&u32`, but the result of the addition is `u32`.\ +It would be impossible[^flexible] to provide this implementation if `add` had to return `Self`, i.e. `&u32` in this case. +`Output` lets `std` decouple the implementor from the return type, thus supporting this case. + +On the other hand, `Output` can't be a generic parameter. The output type of the operation **must** be uniquely determined +once the types of the operands are known. That's why it's an associated type: for a given combination of implementor +and generic parameters, there is only one `Output` type. + +## Conclusion + +To recap: + +- Use an **associated type** when the type must be uniquely determined for a given trait implementation. +- Use a **generic parameter** when you want to allow multiple implementations of the trait for the same type, + with different input types. + +[^flexible]: Flexibility is rarely free: the trait definition is more complex due to `Output`, and implementors have to reason about +what they want to return. The trade-off is only justified if that flexibility is actually needed. Keep that in mind +when designing your own traits. diff --git a/book/src/04_traits/11_clone.md b/book/src/04_traits/11_clone.md new file mode 100644 index 0000000..dc37e08 --- /dev/null +++ b/book/src/04_traits/11_clone.md @@ -0,0 +1,107 @@ +# Copying values, pt. 1 + +In the previous chapter we introduced ownership and borrowing.\ +We stated, in particular, that: + +- Every value in Rust has a single owner at any given time. +- When a function takes ownership of a value ("it consumes it"), the caller can't use that value anymore. + +These restrictions can be somewhat limiting.\ +Sometimes we might have to call a function that takes ownership of a value, but we still need to use +that value afterward. + +```rust +fn consumer(s: String) { /* */ } + +fn example() { + let mut s = String::from("hello"); + consumer(s); + s.push_str(", world!"); // error: value borrowed here after move +} +``` + +That's where `Clone` comes in. + +## `Clone` + +`Clone` is a trait defined in Rust's standard library: + +```rust +pub trait Clone { + fn clone(&self) -> Self; +} +``` + +Its method, `clone`, takes a reference to `self` and returns a new **owned** instance of the same type. + +## In action + +Going back to the example above, we can use `clone` to create a new `String` instance before calling `consumer`: + +```rust +fn consumer(s: String) { /* */ } + +fn example() { + let mut s = String::from("hello"); + let t = s.clone(); + consumer(t); + s.push_str(", world!"); // no error +} +``` + +Instead of giving ownership of `s` to `consumer`, we create a new `String` (by cloning `s`) and give +that to `consumer` instead.\ +`s` remains valid and usable after the call to `consumer`. + +## In memory + +Let's look at what happened in memory in the example above. +When `let mut s = String::from("hello");` is executed, the memory looks like this: + +```text + s + +---------+--------+----------+ +Stack | pointer | length | capacity | + | | | 5 | 5 | + +--|------+--------+----------+ + | + | + v + +---+---+---+---+---+ +Heap: | H | e | l | l | o | + +---+---+---+---+---+ +``` + +When `let t = s.clone()` is executed, a whole new region is allocated on the heap to store a copy of the data: + +```text + s t + +---------+--------+----------+ +---------+--------+----------+ +Stack | pointer | length | capacity | | pointer | length | capacity | + | | | 5 | 5 | | | | 5 | 5 | + +--|------+--------+----------+ +--|------+--------+----------+ + | | + | | + v v + +---+---+---+---+---+ +---+---+---+---+---+ +Heap: | H | e | l | l | o | | H | e | l | l | o | + +---+---+---+---+---+ +---+---+---+---+---+ +``` + +If you're coming from a language like Java, you can think of `clone` as a way to create a deep copy of an object. + +## Implementing `Clone` + +To make a type `Clone`-able, we have to implement the `Clone` trait for it.\ +You almost always implement `Clone` by deriving it: + +```rust +#[derive(Clone)] +struct MyType { + // fields +} +``` + +The compiler implements `Clone` for `MyType` as you would expect: it clones each field of `MyType` individually and +then constructs a new `MyType` instance using the cloned fields.\ +Remember that you can use `cargo expand` (or your IDE) to explore the code generated by `derive` macros. diff --git a/book/src/04_traits/12_copy.md b/book/src/04_traits/12_copy.md new file mode 100644 index 0000000..f51778e --- /dev/null +++ b/book/src/04_traits/12_copy.md @@ -0,0 +1,113 @@ +# Copying values, pt. 2 + +Let's consider the same example as before, but with a slight twist: using `u32` rather than `String` as a type. + +```rust +fn consumer(s: u32) { /* */ } + +fn example() { + let s: u32 = 5; + consumer(s); + let t = s + 1; +} +``` + +It'll compile without errors! What's going on here? What's the difference between `String` and `u32` +that makes the latter work without `.clone()`? + +## `Copy` + +`Copy` is another trait defined in Rust's standard library: + +```rust +pub trait Copy: Clone { } +``` + +It is a marker trait, just like `Sized`. + +If a type implements `Copy`, there's no need to call `.clone()` to create a new instance of the type: +Rust does it **implicitly** for you.\ +`u32` is an example of a type that implements `Copy`, which is why the example above compiles without errors: +when `consumer(s)` is called, Rust creates a new `u32` instance by performing a **bitwise copy** of `s`, +and then passes that new instance to `consumer`. It all happens behind the scenes, without you having to do anything. + +## What can be `Copy`? + +`Copy` is not equivalent to "automatic cloning", although it implies it.\ +Types must meet a few requirements in order to be allowed to implement `Copy`. + +First of all, it must implement `Clone`, since `Copy` is a subtrait of `Clone`. +This makes sense: if Rust can create a new instance of a type _implicitly_, it should +also be able to create a new instance _explicitly_ by calling `.clone()`. + +That's not all, though. A few more conditions must be met: + +1. The type doesn't manage any _additional_ resources (e.g. heap memory, file handles, etc.) beyond the `std::mem::size_of` + bytes that it occupies in memory. +2. The type is not a mutable reference (`&mut T`). + +If both conditions are met, then Rust can safely create a new instance of the type by performing a **bitwise copy** +of the original instance—this is often referred to as a `memcpy` operation, after the C standard library function +that performs the bitwise copy. + +### Case study 1: `String` + +`String` is a type that doesn't implement `Copy`.\ +Why? Because it manages an additional resource: the heap-allocated memory buffer that stores the string's data. + +Let's imagine that Rust allowed `String` to implement `Copy`.\ +Then, when a new `String` instance is created by performing a bitwise copy of the original instance, both the original +and the new instance would point to the same memory buffer: + +```text + s copied_s ++---------+--------+----------+ +---------+--------+----------+ +| pointer | length | capacity | | pointer | length | capacity | +| | | 5 | 5 | | | | 5 | 5 | ++--|------+--------+----------+ +--|------+--------+----------+ + | | + | | + v | + +---+---+---+---+---+ | + | H | e | l | l | o | | + +---+---+---+---+---+ | + ^ | + | | + +------------------------------------+ +``` + +This is bad! +Both `String` instances would try to free the memory buffer when they go out of scope, +leading to a double-free error. +You could also create two distinct `&mut String` references that point to the same memory buffer, +violating Rust's borrowing rules. + +### Case study 2: `u32` + +`u32` implements `Copy`. All integer types do, in fact.\ +An integer is "just" the bytes that represent the number in memory. There's nothing more! +If you copy those bytes, you get another perfectly valid integer instance. +Nothing bad can happen, so Rust allows it. + +### Case study 3: `&mut u32` + +When we introduced ownership and mutable borrows, we stated one rule quite clearly: there +can only ever be _one_ mutable borrow of a value at any given time.\ +That's why `&mut u32` doesn't implement `Copy`, even though `u32` does. + +If `&mut u32` implemented `Copy`, you could create multiple mutable references to +the same value and modify it in multiple places at the same time. +That'd be a violation of Rust's borrowing rules! +It follows that `&mut T` never implements `Copy`, no matter what `T` is. + +## Implementing `Copy` + +In most cases, you don't need to manually implement `Copy`. +You can just derive it, like this: + +```rust +#[derive(Copy, Clone)] +struct MyStruct { + field: u32, +} +``` diff --git a/book/src/04_traits/13_drop.md b/book/src/04_traits/13_drop.md new file mode 100644 index 0000000..95352a9 --- /dev/null +++ b/book/src/04_traits/13_drop.md @@ -0,0 +1,53 @@ +# The `Drop` trait + +When we introduced [destructors](../03_ticket_v1/11_destructor.md), +we mentioned that the `drop` function: + +1. reclaims the memory occupied by the type (i.e. `std::mem::size_of` bytes) +2. cleans up any additional resources that the value might be managing (e.g. the heap buffer of a `String`) + +Step 2. is where the `Drop` trait comes in. + +```rust +pub trait Drop { + fn drop(&mut self); +} +``` + +The `Drop` trait is a mechanism for you to define _additional_ cleanup logic for your types, +beyond what the compiler does for you automatically.\ +Whatever you put in the `drop` method will be executed when the value goes out of scope. + +## `Drop` and `Copy` + +When talking about the `Copy` trait, we said that a type can't implement `Copy` if it +manages additional resources beyond the `std::mem::size_of` bytes that it occupies in memory. + +You might wonder: how does the compiler know if a type manages additional resources? +That's right: `Drop` trait implementations!\ +If your type has an explicit `Drop` implementation, the compiler will assume +that your type has additional resources attached to it and won't allow you to implement `Copy`. + +```rust +// This is a unit struct, i.e. a struct with no fields. +#[derive(Clone, Copy)] +struct MyType; + +impl Drop for MyType { + fn drop(&mut self) { + // We don't need to do anything here, + // it's enough to have an "empty" Drop implementation + } +} +``` + +The compiler will complain with this error message: + +```text +error[E0184]: the trait `Copy` cannot be implemented for this type; + the type has a destructor + --> src/lib.rs:2:17 + | +2 | #[derive(Clone, Copy)] + | ^^^^ `Copy` not allowed on types with destructors +``` diff --git a/book/src/04_traits/14_outro.md b/book/src/04_traits/14_outro.md new file mode 100644 index 0000000..838ab1e --- /dev/null +++ b/book/src/04_traits/14_outro.md @@ -0,0 +1,27 @@ +# Wrapping up + +We've covered quite a few different traits in this chapter—and we've only scratched the surface! +It may feel like you have a lot to remember, but don't worry: you'll bump into these traits +so often when writing Rust code that they'll soon become second nature. + +## Closing thoughts + +Traits are powerful, but don't overuse them.\ +A few guidelines to keep in mind: + +- Don't make a function generic if it is always invoked with a single type. It introduces indirection in your + codebase, making it harder to understand and maintain. +- Don't create a trait if you only have one implementation. It's a sign that the trait is not needed. +- Implement standard traits for your types (`Debug`, `PartialEq`, etc.) whenever it makes sense. + It will make your types more idiomatic and easier to work with, unlocking a lot of functionality provided + by the standard library and ecosystem crates. +- Implement traits from third-party crates if you need the functionality they unlock within their ecosystem. +- Beware of making code generic solely to use mocks in your tests. The maintainability cost of this approach + can be high, and it's often better to use a different testing strategy. Check out the + [testing masterclass](https://github.com/mainmatter/rust-advanced-testing-workshop) + for details on high-fidelity testing. + +## Testing your knowledge + +Before moving on, let's go through one last exercise to consolidate what we've learned. +You'll have minimal guidance this time—just the exercise description and the tests to guide you. diff --git a/book/src/05_ticket_v2/00_intro.md b/book/src/05_ticket_v2/00_intro.md new file mode 100644 index 0000000..2b06400 --- /dev/null +++ b/book/src/05_ticket_v2/00_intro.md @@ -0,0 +1,15 @@ +# Modelling A Ticket, pt. 2 + +The `Ticket` struct we worked on in the previous chapters is a good start, +but it still screams "I'm a beginner Rustacean!". + +We'll use this chapter to refine our Rust domain modelling skills. +We'll need to introduce a few more concepts along the way: + +- `enum`s, one of Rust's most powerful features for data modeling +- The `Option` type, to model nullable values +- The `Result` type, to model recoverable errors +- The `Debug` and `Display` traits, for printing +- The `Error` trait, to mark error types +- The `TryFrom` and `TryInto` traits, for fallible conversions +- Rust's package system, explaining what's a library, what's a binary, how to use third-party crates diff --git a/book/src/05_ticket_v2/01_enum.md b/book/src/05_ticket_v2/01_enum.md new file mode 100644 index 0000000..79000af --- /dev/null +++ b/book/src/05_ticket_v2/01_enum.md @@ -0,0 +1,47 @@ +# Enumerations + +Based on the validation logic you wrote [in a previous chapter](../03_ticket_v1/02_validation.md), +there are only a few valid statuses for a ticket: `To-Do`, `InProgress` and `Done`.\ +This is not obvious if we look at the `status` field in the `Ticket` struct or at the type of the `status` +parameter in the `new` method: + +```rust +#[derive(Debug, PartialEq)] +pub struct Ticket { + title: String, + description: String, + status: String, +} + +impl Ticket { + pub fn new( + title: String, + description: String, + status: String + ) -> Self { + // [...] + } +} +``` + +In both cases we're using `String` to represent the `status` field. +`String` is a very general type—it doesn't immediately convey the information that the `status` field +has a limited set of possible values. Even worse, the caller of `Ticket::new` will only find out **at runtime** +if the status they provided is valid or not. + +We can do better than that with **enumerations**. + +## `enum` + +An enumeration is a type that can have a fixed set of values, called **variants**.\ +In Rust, you define an enumeration using the `enum` keyword: + +```rust +enum Status { + ToDo, + InProgress, + Done, +} +``` + +`enum`, just like `struct`, defines **a new Rust type**. diff --git a/book/src/05_ticket_v2/02_match.md b/book/src/05_ticket_v2/02_match.md new file mode 100644 index 0000000..12c09a8 --- /dev/null +++ b/book/src/05_ticket_v2/02_match.md @@ -0,0 +1,78 @@ +# `match` + +You may be wondering—what can you actually **do** with an enum?\ +The most common operation is to **match** on it. + +```rust +enum Status { + ToDo, + InProgress, + Done +} + +impl Status { + fn is_done(&self) -> bool { + match self { + Status::Done => true, + // The `|` operator lets you match multiple patterns. + // It reads as "either `Status::ToDo` or `Status::InProgress`". + Status::InProgress | Status::ToDo => false + } + } +} +``` + +A `match` statement that lets you compare a Rust value against a series of **patterns**.\ +You can think of it as a type-level `if`. If `status` is a `Done` variant, execute the first block; +if it's a `InProgress` or `ToDo` variant, execute the second block. + +## Exhaustiveness + +There's one key detail here: `match` is **exhaustive**. You must handle all enum variants.\ +If you forget to handle a variant, Rust will stop you **at compile-time** with an error. + +E.g. if we forget to handle the `ToDo` variant: + +```rust +match self { + Status::Done => true, + Status::InProgress => false, +} +``` + +the compiler will complain: + +```text +error[E0004]: non-exhaustive patterns: `ToDo` not covered + --> src/main.rs:5:9 + | +5 | match status { + | ^^^^^^^^^^^^ pattern `ToDo` not covered +``` + +This is a big deal!\ +Codebases evolve over time—you might add a new status down the line, e.g. `Blocked`. The Rust compiler +will emit an error for every single `match` statement that's missing logic for the new variant. +That's why Rust developers often sing the praises of "compiler-driven refactoring"—the compiler tells you +what to do next, you just have to fix what it reports. + +## Catch-all + +If you don't care about one or more variants, you can use the `_` pattern as a catch-all: + +```rust +match status { + Status::Done => true, + _ => false +} +``` + +The `_` pattern matches anything that wasn't matched by the previous patterns. + +
+By using this catch-all pattern, you _won't_ get the benefits of compiler-driven refactoring.\ +If you add a new enum variant, the compiler _won't_ tell you that you're not handling it. + +If you're keen on correctness, avoid using catch-alls. Leverage the compiler to re-examine all matching sites and determine how new enum variants should be handled. + +
diff --git a/book/src/05_ticket_v2/03_variants_with_data.md b/book/src/05_ticket_v2/03_variants_with_data.md new file mode 100644 index 0000000..ae47e08 --- /dev/null +++ b/book/src/05_ticket_v2/03_variants_with_data.md @@ -0,0 +1,88 @@ +# Variants can hold data + +```rust +enum Status { + ToDo, + InProgress, + Done, +} +``` + +Our `Status` enum is what's usually called a **C-style enum**.\ +Each variant is a simple label, a bit like a named constant. You can find this kind of enum in many programming +languages, like C, C++, Java, C#, Python, etc. + +Rust enums can go further though. We can **attach data to each variant**. + +## Variants + +Let's say that we want to store the name of the person who's currently working on a ticket.\ +We would only have this information if the ticket is in progress. It wouldn't be there for a to-do ticket or +a done ticket. +We can model this by attaching a `String` field to the `InProgress` variant: + +```rust +enum Status { + ToDo, + InProgress { + assigned_to: String, + }, + Done, +} +``` + +`InProgress` is now a **struct-like variant**.\ +The syntax mirrors, in fact, the one we used to define a struct—it's just "inlined" inside the enum, as a variant. + +## Accessing variant data + +If we try to access `assigned_to` on a `Status` instance, + +```rust +let status: Status = /* */; + +// This won't compile +println!("Assigned to: {}", status.assigned_to); +``` + +the compiler will stop us: + +```text +error[E0609]: no field `assigned_to` on type `Status` + --> src/main.rs:5:40 + | +5 | println!("Assigned to: {}", status.assigned_to); + | ^^^^^^^^^^^ unknown field +``` + +`assigned_to` is **variant-specific**, it's not available on all `Status` instances.\ +To access `assigned_to`, we need to use **pattern matching**: + +```rust +match status { + Status::InProgress { assigned_to } => { + println!("Assigned to: {}", assigned_to); + }, + Status::ToDo | Status::Done => { + println!("Done"); + } +} +``` + +## Bindings + +In the match pattern `Status::InProgress { assigned_to }`, `assigned_to` is a **binding**.\ +We're **destructuring** the `Status::InProgress` variant and binding the `assigned_to` field to +a new variable, also named `assigned_to`.\ +If we wanted, we could bind the field to a different variable name: + +```rust +match status { + Status::InProgress { assigned_to: person } => { + println!("Assigned to: {}", person); + }, + Status::ToDo | Status::Done => { + println!("Done"); + } +} +``` diff --git a/book/src/05_ticket_v2/04_if_let.md b/book/src/05_ticket_v2/04_if_let.md new file mode 100644 index 0000000..4fe8be0 --- /dev/null +++ b/book/src/05_ticket_v2/04_if_let.md @@ -0,0 +1,73 @@ +# Concise branching + +Your solution to the previous exercise probably looks like this: + +```rust +impl Ticket { + pub fn assigned_to(&self) -> &str { + match &self.status { + Status::InProgress { assigned_to } => assigned_to, + Status::Done | Status::ToDo => { + panic!( + "Only `In-Progress` tickets can be \ + assigned to someone" + ) + } + } + } +} +``` + +You only care about the `Status::InProgress` variant. +Do you really need to match on all the other variants? + +New constructs to the rescue! + +## `if let` + +The `if let` construct allows you to match on a single variant of an enum, +without having to handle all the other variants. + +Here's how you can use `if let` to simplify the `assigned_to` method: + +```rust +impl Ticket { + pub fn assigned_to(&self) -> &str { + if let Status::InProgress { assigned_to } = &self.status { + assigned_to + } else { + panic!( + "Only `In-Progress` tickets can be assigned to someone" + ); + } + } +} +``` + +## `let/else` + +If the `else` branch is meant to return early (a panic counts as returning early!), +you can use the `let/else` construct: + +```rust +impl Ticket { + pub fn assigned_to(&self) -> &str { + let Status::InProgress { assigned_to } = &self.status else { + panic!( + "Only `In-Progress` tickets can be assigned to someone" + ); + }; + assigned_to + } +} +``` + +It allows you to assign the destructured variable without incurring +any "right drift", i.e. the variable is assigned at the same indentation level +as the code that precedes it. + +## Style + +Both `if let` and `let/else` are idiomatic Rust constructs.\ +Use them as you see fit to improve the readability of your code, +but don't overdo it: `match` is always there when you need it. diff --git a/book/src/05_ticket_v2/05_nullability.md b/book/src/05_ticket_v2/05_nullability.md new file mode 100644 index 0000000..c6e240b --- /dev/null +++ b/book/src/05_ticket_v2/05_nullability.md @@ -0,0 +1,74 @@ +# Nullability + +Our implementation of the `assigned` method is fairly blunt: panicking for to-do and done tickets is far from ideal.\ +We can do better using **Rust's `Option` type**. + +## `Option` + +`Option` is a Rust type that represents **nullable values**.\ +It is an enum, defined in Rust's standard library: + +```rust +enum Option { + Some(T), + None, +} +``` + +`Option` encodes the idea that a value might be present (`Some(T)`) or absent (`None`).\ +It also forces you to **explicitly handle both cases**. You'll get a compiler error if you are working with +a nullable value and you forget to handle the `None` case.\ +This is a significant improvement over "implicit" nullability in other languages, where you can forget to check +for `null` and thus trigger a runtime error. + +## `Option`'s definition + +`Option`'s definition uses a Rust construct that you haven't seen before: **tuple-like variants**. + +### Tuple-like variants + +`Option` has two variants: `Some(T)` and `None`.\ +`Some` is a **tuple-like variant**: it's a variant that holds **unnamed fields**. + +Tuple-like variants are often used when there is a single field to store, especially when we're looking at a +"wrapper" type like `Option`. + +### Tuple-like structs + +They're not specific to enums—you can define tuple-like structs too: + +```rust +struct Point(i32, i32); +``` + +You can then access the two fields of a `Point` instance using their positional index: + +```rust +let point = Point(3, 4); +let x = point.0; +let y = point.1; +``` + +### Tuples + +It's weird to say that something is tuple-like when we haven't seen tuples yet!\ +Tuples are another example of a primitive Rust type. +They group together a fixed number of values with (potentially different) types: + +```rust +// Two values, same type +let first: (i32, i32) = (3, 4); +// Three values, different types +let second: (i32, u32, u8) = (-42, 3, 8); +``` + +The syntax is simple: you list the types of the values between parentheses, separated by commas. +You can access the fields of a tuple using the dot notation and the field index: + +```rust +assert_eq!(second.0, -42); +assert_eq!(second.1, 3); +assert_eq!(second.2, 8); +``` + +Tuples are a convenient way of grouping values together when you can't be bothered to define a dedicated struct type. diff --git a/book/src/05_ticket_v2/06_fallibility.md b/book/src/05_ticket_v2/06_fallibility.md new file mode 100644 index 0000000..213a99d --- /dev/null +++ b/book/src/05_ticket_v2/06_fallibility.md @@ -0,0 +1,88 @@ +# Fallibility + +Let's revisit the `Ticket::new` function from the previous exercise: + +```rust +impl Ticket { + pub fn new( + title: String, + description: String, + status: Status + ) -> Ticket { + if title.is_empty() { + panic!("Title cannot be empty"); + } + if title.len() > 50 { + panic!("Title cannot be longer than 50 bytes"); + } + if description.is_empty() { + panic!("Description cannot be empty"); + } + if description.len() > 500 { + panic!("Description cannot be longer than 500 bytes"); + } + + Ticket { + title, + description, + status, + } + } +} +``` + +As soon as one of the checks fails, the function panics. +This is not ideal, as it doesn't give the caller a chance to **handle the error**. + +It's time to introduce the `Result` type, Rust's primary mechanism for error handling. + +## The `Result` type + +The `Result` type is an enum defined in the standard library: + +```rust +enum Result { + Ok(T), + Err(E), +} +``` + +It has two variants: + +- `Ok(T)`: represents a successful operation. It holds `T`, the output of the operation. +- `Err(E)`: represents a failed operation. It holds `E`, the error that occurred. + +Both `Ok` and `Err` are generic, allowing you to specify your own types for the success and error cases. + +## No exceptions + +Recoverable errors in Rust are **represented as values**.\ +They're just an instance of a type, being passed around and manipulated like any other value. +This is a significant difference from other languages, such as Python or C#, where **exceptions** are used to signal errors. + +Exceptions create a separate control flow path that can be hard to reason about.\ +You don't know, just by looking at a function's signature, if it can throw an exception or not. +You don't know, just by looking at a function's signature, **which** exception types it can throw.\ +You must either read the function's documentation or look at its implementation to find out. + +Exception handling logic has very poor locality: the code that throws the exception is far removed from the code +that catches it, and there's no direct link between the two. + +## Fallibility is encoded in the type system + +Rust, with `Result`, forces you to **encode fallibility in the function's signature**.\ +If a function can fail (and you want the caller to have a shot at handling the error), it must return a `Result`. + +```rust +// Just by looking at the signature, you know that this function +// can fail. You can also inspect `ParseIntError` to see what +// kind of failures to expect. +fn parse_int(s: &str) -> Result { + // ... +} +``` + +That's the big advantage of `Result`: it makes fallibility explicit. + +Keep in mind, though, that panics exist. They aren't tracked by the type system, just like exceptions in other languages. +But they're meant for **unrecoverable errors** and should be used sparingly. diff --git a/book/src/05_ticket_v2/07_unwrap.md b/book/src/05_ticket_v2/07_unwrap.md new file mode 100644 index 0000000..ba67eed --- /dev/null +++ b/book/src/05_ticket_v2/07_unwrap.md @@ -0,0 +1,40 @@ +# Unwrapping + +`Ticket::new` now returns a `Result` instead of panicking on invalid inputs.\ +What does this mean for the caller? + +## Failures can't be (implicitly) ignored + +Unlike exceptions, Rust's `Result` forces you to **handle errors at the call site**.\ +If you call a function that returns a `Result`, Rust won't allow you to implicitly ignore the error case. + +```rust +fn parse_int(s: &str) -> Result { + // ... +} + +// This won't compile: we're not handling the error case. +// We must either use `match` or one of the combinators provided by +// `Result` to "unwrap" the success value or handle the error. +let number = parse_int("42") + 2; +``` + +## You got a `Result`. Now what? + +When you call a function that returns a `Result`, you have two key options: + +- Panic if the operation failed. + This is done using either the `unwrap` or `expect` methods. + ```rust + // Panics if `parse_int` returns an `Err`. + let number = parse_int("42").unwrap(); + // `expect` lets you specify a custom panic message. + let number = parse_int("42").expect("Failed to parse integer"); + ``` +- Destructure the `Result` using a `match` expression to deal with the error case explicitly. + ```rust + match parse_int("42") { + Ok(number) => println!("Parsed number: {}", number), + Err(err) => eprintln!("Error: {}", err), + } + ``` diff --git a/book/src/05_ticket_v2/08_error_enums.md b/book/src/05_ticket_v2/08_error_enums.md new file mode 100644 index 0000000..d9ac83c --- /dev/null +++ b/book/src/05_ticket_v2/08_error_enums.md @@ -0,0 +1,38 @@ +# Error enums + +Your solution to the previous exercise may have felt awkward: matching on strings is not ideal!\ +A colleague might rework the error messages returned by `Ticket::new` (e.g. to improve readability) and, +all of a sudden, your calling code would break. + +You already know the machinery required to fix this: enums! + +## Reacting to errors + +When you want to allow the caller to behave differently based on the specific error that occurred, you can +use an enum to represent the different error cases: + +```rust +// An error enum to represent the different error cases +// that may occur when parsing a `u32` from a string. +enum U32ParseError { + NotANumber, + TooLarge, + Negative, +} +``` + +Using an error enum, you're encoding the different error cases in the type system—they become part of the +signature of the fallible function.\ +This simplifies error handling for the caller, as they can use a `match` expression to react to the different +error cases: + +```rust +match s.parse_u32() { + Ok(n) => n, + Err(U32ParseError::Negative) => 0, + Err(U32ParseError::TooLarge) => u32::MAX, + Err(U32ParseError::NotANumber) => { + panic!("Not a number: {}", s); + } +} +``` diff --git a/book/src/05_ticket_v2/09_error_trait.md b/book/src/05_ticket_v2/09_error_trait.md new file mode 100644 index 0000000..9d903fe --- /dev/null +++ b/book/src/05_ticket_v2/09_error_trait.md @@ -0,0 +1,52 @@ +# Error trait + +## Error reporting + +In the previous exercise you had to destructure the `TitleError` variant to extract the error message and +pass it to the `panic!` macro.\ +This is a (rudimentary) example of **error reporting**: transforming an error type into a representation that can be +shown to a user, a service operator, or a developer. + +It's not practical for each Rust developer to come up with their own error reporting strategy: it'd be a waste of time +and it wouldn't compose well across projects. +That's why Rust provides the `std::error::Error` trait. + +## The `Error` trait + +There are no constraints on the type of the `Err` variant in a `Result`, but it's a good practice to use a type +that implements the `Error` trait. +`Error` is the cornerstone of Rust's error handling story: + +```rust +// Slightly simplified definition of the `Error` trait +pub trait Error: Debug + Display {} +``` + +You might recall the `:` syntax from [the `From` trait](../04_traits/09_from.md#supertrait--subtrait)—it's used to specify **supertraits**. +For `Error`, there are two supertraits: `Debug` and `Display`. If a type wants to implement `Error`, it must also +implement `Debug` and `Display`. + +## `Display` and `Debug` + +We've already encountered the `Debug` trait in [a previous exercise](../04_traits/04_derive.md)—it's the trait used by +`assert_eq!` to display the values of the variables it's comparing when the assertion fails. + +From a "mechanical" perspective, `Display` and `Debug` are identical—they encode how a type should be converted +into a string-like representation: + +```rust +// `Debug` +pub trait Debug { + fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>; +} + +// `Display` +pub trait Display { + fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>; +} +``` + +The difference is in their _purpose_: `Display` returns a representation that's meant for "end-users", +while `Debug` provides a low-level representation that's more suitable to developers and service operators.\ +That's why `Debug` can be automatically implemented using the `#[derive(Debug)]` attribute, while `Display` +**requires** a manual implementation. diff --git a/book/src/05_ticket_v2/10_packages.md b/book/src/05_ticket_v2/10_packages.md new file mode 100644 index 0000000..b62093a --- /dev/null +++ b/book/src/05_ticket_v2/10_packages.md @@ -0,0 +1,48 @@ +# Libraries and binaries + +It took a bit of code to implement the `Error` trait for `TicketNewError`, didn't it?\ +A manual `Display` implementation, plus an `Error` impl block. + +We can remove some of the boilerplate by using [`thiserror`](https://docs.rs/thiserror/latest/thiserror/), +a Rust crate that provides a **procedural macro** to simplify the creation of custom error types.\ +But we're getting ahead of ourselves: `thiserror` is a third-party crate, it'd be our first dependency! + +Let's take a step back to talk about Rust's packaging system before we dive into dependencies. + +## What is a package? + +A Rust package is defined by the `[package]` section in a `Cargo.toml` file, also known as its **manifest**. +Within `[package]` you can set the package's metadata, such as its name and version. + +Go check the `Cargo.toml` file in the directory of this section's exercise! + +## What is a crate? + +Inside a package, you can have one or more **crates**, also known as **targets**.\ +The two most common crate types are **binary crates** and **library crates**. + +### Binaries + +A binary is a program that can be compiled to an **executable file**.\ +It must include a function named `main`—the program's entry point. `main` is invoked when the program is executed. + +### Libraries + +Libraries, on the other hand, are not executable on their own. You can't _run_ a library, +but you can _import its code_ from another package that depends on it.\ +A library groups together code (i.e. functions, types, etc.) that can be leveraged by other packages as a **dependency**. + +All the exercises you've solved so far have been structured as libraries, with a test suite attached to them. + +### Conventions + +There are some conventions around Rust packages that you need to keep in mind: + +- The package's source code is usually located in the `src` directory. +- If there's a `src/lib.rs` file, `cargo` will infer that the package contains a library crate. +- If there's a `src/main.rs` file, `cargo` will infer that the package contains a binary crate. + +You can override these defaults by explicitly declaring your targets in the `Cargo.toml` file—see +[`cargo`'s documentation](https://doc.rust-lang.org/cargo/reference/cargo-targets.html#cargo-targets) for more details. + +Keep in mind that while a package can contain multiple crates, it can only contain one library crate. diff --git a/book/src/05_ticket_v2/11_dependencies.md b/book/src/05_ticket_v2/11_dependencies.md new file mode 100644 index 0000000..b0defb6 --- /dev/null +++ b/book/src/05_ticket_v2/11_dependencies.md @@ -0,0 +1,54 @@ +# Dependencies + +A package can depend on other packages by listing them in the `[dependencies]` section of its `Cargo.toml` file.\ +The most common way to specify a dependency is by providing its name and version: + +```toml +[dependencies] +thiserror = "1" +``` + +This will add `thiserror` as a dependency to your package, with a **minimum** version of `1.0.0`. +`thiserror` will be pulled from [crates.io](https://crates.io), Rust's official package registry. +When you run `cargo build`, `cargo` will go through a few stages: + +- Dependency resolution +- Downloading the dependencies +- Compiling your project (your own code and the dependencies) + +Dependency resolution is skipped if your project has a `Cargo.lock` file and your manifest files are unchanged. +A lockfile is automatically generated by `cargo` after a successful round of dependency resolution: it contains +the exact versions of all dependencies used in your project, and is used to ensure that the same versions are +consistently used across different builds (e.g. in CI). If you're working on a project with multiple developers, +you should commit the `Cargo.lock` file to your version control system. + +You can use `cargo update` to update the `Cargo.lock` file with the latest (compatible) versions of all your dependencies. + +### Path dependencies + +You can also specify a dependency using a **path**. This is useful when you're working on multiple local packages. + +```toml +[dependencies] +my-library = { path = "../my-library" } +``` + +The path is relative to the `Cargo.toml` file of the package that's declaring the dependency. + +### Other sources + +Check out the [Cargo documentation](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html) for more +details on where you can get dependencies from and how to specify them in your `Cargo.toml` file. + +## Dev dependencies + +You can also specify dependencies that are only needed for development—i.e. they only get pulled in when you're +running `cargo test`.\ +They go in the `[dev-dependencies]` section of your `Cargo.toml` file: + +```toml +[dev-dependencies] +static_assertions = "1.1.0" +``` + +We've been using a few of these throughout the book to shorten our tests. diff --git a/book/src/05_ticket_v2/12_thiserror.md b/book/src/05_ticket_v2/12_thiserror.md new file mode 100644 index 0000000..2c3af65 --- /dev/null +++ b/book/src/05_ticket_v2/12_thiserror.md @@ -0,0 +1,41 @@ +# `thiserror` + +That was a bit of detour, wasn't it? But a necessary one!\ +Let's get back on track now: custom error types and `thiserror`. + +## Custom error types + +We've seen how to implement the `Error` trait "manually" for a custom error type.\ +Imagine that you have to do this for most error types in your codebase. That's a lot of boilerplate, isn't it? + +We can remove some of the boilerplate by using [`thiserror`](https://docs.rs/thiserror/latest/thiserror/), +a Rust crate that provides a **procedural macro** to simplify the creation of custom error types. + +```rust +#[derive(thiserror::Error, Debug)] +enum TicketNewError { + #[error("{0}")] + TitleError(String), + #[error("{0}")] + DescriptionError(String), +} +``` + +## You can write your own macros + +All the `derive` macros we've seen so far were provided by the Rust standard library.\ +`thiserror::Error` is the first example of a **third-party** `derive` macro. + +`derive` macros are a subset of **procedural macros**, a way to generate Rust code at compile time. +We won't get into the details of how to write a procedural macro in this course, but it's important +to know that you can write your own!\ +A topic to approach in a more advanced Rust course. + +## Custom syntax + +Each procedural macro can define its own syntax, which is usually explained in the crate's documentation. +In the case of `thiserror`, we have: + +- `#[derive(thiserror::Error)]`: this is the syntax to derive the `Error` trait for a custom error type, helped by `thiserror`. +- `#[error("{0}")]`: this is the syntax to define a `Display` implementation for each variant of the custom error type. + `{0}` is replaced by the zero-th field of the variant (`String`, in this case) when the error is displayed. diff --git a/book/src/05_ticket_v2/13_try_from.md b/book/src/05_ticket_v2/13_try_from.md new file mode 100644 index 0000000..3887eb3 --- /dev/null +++ b/book/src/05_ticket_v2/13_try_from.md @@ -0,0 +1,40 @@ +# `TryFrom` and `TryInto` + +In the previous chapter we looked at the [`From` and `Into` traits](../04_traits/09_from.md), +Rust's idiomatic interfaces for **infallible** type conversions.\ +But what if the conversion is not guaranteed to succeed? + +We now know enough about errors to discuss the **fallible** counterparts of `From` and `Into`: +`TryFrom` and `TryInto`. + +## `TryFrom` and `TryInto` + +Both `TryFrom` and `TryInto` are defined in the `std::convert` module, just like `From` and `Into`. + +```rust +pub trait TryFrom: Sized { + type Error; + fn try_from(value: T) -> Result; +} + +pub trait TryInto: Sized { + type Error; + fn try_into(self) -> Result; +} +``` + +The main difference between `From`/`Into` and `TryFrom`/`TryInto` is that the latter return a `Result` type.\ +This allows the conversion to fail, returning an error instead of panicking. + +## `Self::Error` + +Both `TryFrom` and `TryInto` have an associated `Error` type. +This allows each implementation to specify its own error type, ideally the most appropriate for the conversion +being attempted. + +`Self::Error` is a way to refer to the `Error` associated type defined in the trait itself. + +## Duality + +Just like `From` and `Into`, `TryFrom` and `TryInto` are dual traits.\ +If you implement `TryFrom` for a type, you get `TryInto` for free. diff --git a/book/src/05_ticket_v2/14_source.md b/book/src/05_ticket_v2/14_source.md new file mode 100644 index 0000000..3e8a30f --- /dev/null +++ b/book/src/05_ticket_v2/14_source.md @@ -0,0 +1,150 @@ +# `Error::source` + +There's one more thing we need to talk about to complete our coverage of the `Error` trait: the `source` method. + +```rust +// Full definition this time! +pub trait Error: Debug + Display { + fn source(&self) -> Option<&(dyn Error + 'static)> { + None + } +} +``` + +The `source` method is a way to access the **error cause**, if any.\ +Errors are often chained, meaning that one error is the cause of another: you have a high-level error (e.g. +cannot connect to the database) that is caused by a lower-level error (e.g. can't resolve the database hostname). +The `source` method allows you to "walk" the full chain of errors, often used when capturing error context in logs. + +## Implementing `source` + +The `Error` trait provides a default implementation that always returns `None` (i.e. no underlying cause). That's why +you didn't have to care about `source` in the previous exercises.\ +You can override this default implementation to provide a cause for your error type. + +```rust +use std::error::Error; + +#[derive(Debug)] +struct DatabaseError { + source: std::io::Error +} + +impl std::fmt::Display for DatabaseError { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "Failed to connect to the database") + } +} + +impl std::error::Error for DatabaseError { + fn source(&self) -> Option<&(dyn Error + 'static)> { + Some(&self.source) + } +} +``` + +In this example, `DatabaseError` wraps an `std::io::Error` as its source. +We then override the `source` method to return this source when called. + +## `&(dyn Error + 'static)` + +What's this `&(dyn Error + 'static)` type?\ +Let's unpack it: + +- `dyn Error` is a **trait object**. It's a way to refer to any type that implements the `Error` trait. +- `'static` is a special **lifetime specifier**. + `'static` implies that the reference is valid for "as long as we need it", i.e. the entire program execution. + +Combined: `&(dyn Error + 'static)` is a reference to a trait object that implements the `Error` trait +and is valid for the entire program execution. + +Don't worry too much about either of these concepts for now. We'll cover them in more detail in future chapters. + +## Implementing `source` using `thiserror` + +`thiserror` provides three ways to automatically implement `source` for your error types: + +- A field named `source` will automatically be used as the source of the error. + ```rust + use thiserror::Error; + + #[derive(Error, Debug)] + pub enum MyError { + #[error("Failed to connect to the database")] + DatabaseError { + source: std::io::Error + } + } + ``` +- A field annotated with the `#[source]` attribute will automatically be used as the source of the error. + ```rust + use thiserror::Error; + + #[derive(Error, Debug)] + pub enum MyError { + #[error("Failed to connect to the database")] + DatabaseError { + #[source] + inner: std::io::Error + } + } + ``` +- A field annotated with the `#[from]` attribute will automatically be used as the source of the error **and** + `thiserror` will automatically generate a `From` implementation to convert the annotated type into your error type. + ```rust + use thiserror::Error; + + #[derive(Error, Debug)] + pub enum MyError { + #[error("Failed to connect to the database")] + DatabaseError { + #[from] + inner: std::io::Error + } + } + ``` + +## The `?` operator + +The `?` operator is a shorthand for propagating errors.\ +When used in a function that returns a `Result`, it will return early with an error if the `Result` is `Err`. + +For example: + +```rust +use std::fs::File; + +fn read_file() -> Result { + let mut file = File::open("file.txt")?; + let mut contents = String::new(); + file.read_to_string(&mut contents)?; + Ok(contents) +} +``` + +is equivalent to: + +```rust +use std::fs::File; + +fn read_file() -> Result { + let mut file = match File::open("file.txt") { + Ok(file) => file, + Err(e) => { + return Err(e); + } + }; + let mut contents = String::new(); + match file.read_to_string(&mut contents) { + Ok(_) => (), + Err(e) => { + return Err(e); + } + } + Ok(contents) +} +``` + +You can use the `?` operator to shorten your error handling code significantly.\ +In particular, the `?` operator will automatically convert the error type of the fallible operation into the error type +of the function, if a conversion is possible (i.e. if there is a suitable `From` implementation) diff --git a/book/src/05_ticket_v2/15_outro.md b/book/src/05_ticket_v2/15_outro.md new file mode 100644 index 0000000..a4040e9 --- /dev/null +++ b/book/src/05_ticket_v2/15_outro.md @@ -0,0 +1,18 @@ +# Wrapping up + +When it comes to domain modelling, the devil is in the details.\ +Rust offers a wide range of tools to help you represent the constraints of your domain directly in the type system, +but it takes some practice to get it right and write code that looks idiomatic. + +Let's close the chapter with one final refinement of our `Ticket` model.\ +We'll introduce a new type for each of the fields in `Ticket` to encapsulate the respective constraints.\ +Every time someone accesses a `Ticket` field, they'll get back a value that's guaranteed to be valid—i.e. a +`TicketTitle` instead of a `String`. They won't have to worry about the title being empty elsewhere in the code: +as long as they have a `TicketTitle`, they know it's valid **by construction**. + +This is just an example of how you can use Rust's type system to make your code safer and more expressive. + +## Further reading + +- [Parse, don't validate](https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/) +- [Using types to guarantee domain invariants](https://www.lpalmieri.com/posts/2020-12-11-zero-to-production-6-domain-modelling/) diff --git a/book/src/06_ticket_management/00_intro.md b/book/src/06_ticket_management/00_intro.md new file mode 100644 index 0000000..7af5556 --- /dev/null +++ b/book/src/06_ticket_management/00_intro.md @@ -0,0 +1,18 @@ +# Intro + +In the previous chapter we modelled `Ticket` in a vacuum: we defined its fields and their constraints, we learned +how to best represent them in Rust, but we didn't consider how `Ticket` fits into a larger system. +We'll use this chapter to build a simple workflow around `Ticket`, introducing a (rudimentary) management system to +store and retrieve tickets. + +The task will give us an opportunity to explore new Rust concepts, such as: + +- Stack-allocated arrays +- `Vec`, a growable array type +- `Iterator` and `IntoIterator`, for iterating over collections +- Slices (`&[T]`), to work with parts of a collection +- Lifetimes, to describe how long references are valid +- `HashMap` and `BTreeMap`, two key-value data structures +- `Eq` and `Hash`, to compare keys in a `HashMap` +- `Ord` and `PartialOrd`, to work with a `BTreeMap` +- `Index` and `IndexMut`, to access elements in a collection diff --git a/book/src/06_ticket_management/01_arrays.md b/book/src/06_ticket_management/01_arrays.md new file mode 100644 index 0000000..fb72c28 --- /dev/null +++ b/book/src/06_ticket_management/01_arrays.md @@ -0,0 +1,90 @@ +# Arrays + +As soon as we start talking about "ticket management" we need to think about a way to store _multiple_ tickets. +In turn, this means we need to think about collections. In particular, homogeneous collections: +we want to store multiple instances of the same type. + +What does Rust have to offer in this regard? + +## Arrays + +A first attempt could be to use an **array**.\ +Arrays in Rust are fixed-size collections of elements of the same type. + +Here's how you can define an array: + +```rust +// Array type syntax: [ ; ] +let numbers: [u32; 3] = [1, 2, 3]; +``` + +This creates an array of 3 integers, initialized with the values `1`, `2`, and `3`.\ +The type of the array is `[u32; 3]`, which reads as "an array of `u32`s with a length of 3". + +If all array elements are the same, you can use a shorter syntax to initialize it: + +```rust +// [ ; ] +let numbers: [u32; 3] = [1; 3]; +``` + +`[1; 3]` creates an array of three elements, all equal to `1`. + +### Accessing elements + +You can access elements of an array using square brackets: + +```rust +let first = numbers[0]; +let second = numbers[1]; +let third = numbers[2]; +``` + +The index must be of type `usize`.\ +Arrays are **zero-indexed**, like everything in Rust. You've seen this before with string slices and field indexing in +tuples/tuple-like variants. + +### Out-of-bounds access + +If you try to access an element that's out of bounds, Rust will panic: + +```rust +let numbers: [u32; 3] = [1, 2, 3]; +let fourth = numbers[3]; // This will panic +``` + +This is enforced at runtime using **bounds checking**. It comes with a small performance overhead, but it's how +Rust prevents buffer overflows.\ +In some scenarios the Rust compiler can optimize away bounds checks, especially if iterators are involved—we'll speak +more about this later on. + +If you don't want to panic, you can use the `get` method, which returns an `Option<&T>`: + +```rust +let numbers: [u32; 3] = [1, 2, 3]; +assert_eq!(numbers.get(0), Some(&1)); +// You get a `None` if you try to access an out-of-bounds index +// rather than a panic. +assert_eq!(numbers.get(3), None); +``` + +### Performance + +Since the size of an array is known at compile-time, the compiler can allocate the array on the stack. +If you run the following code: + +```rust +let numbers: [u32; 3] = [1, 2, 3]; +``` + +You'll get the following memory layout: + +```text + +---+---+---+ +Stack: | 1 | 2 | 3 | + +---+---+---+ +``` + +In other words, the size of an array is `std::mem::size_of::() * N`, where `T` is the type of the elements and `N` is +the number of elements.\ +You can access and replace each element in `O(1)` time. diff --git a/book/src/06_ticket_management/02_vec.md b/book/src/06_ticket_management/02_vec.md new file mode 100644 index 0000000..8040eb1 --- /dev/null +++ b/book/src/06_ticket_management/02_vec.md @@ -0,0 +1,112 @@ +# Vectors + +Arrays' strength is also their weakness: their size must be known upfront, at compile-time. +If you try to create an array with a size that's only known at runtime, you'll get a compilation error: + +```rust +let n = 10; +let numbers: [u32; n]; +``` + +```text +error[E0435]: attempt to use a non-constant value in a constant + --> src/main.rs:3:20 + | +2 | let n = 10; +3 | let numbers: [u32; n]; + | ^ non-constant value +``` + +Arrays wouldn't work for our ticket management system—we don't know how many tickets we'll need to store at compile-time. +This is where `Vec` comes in. + +## `Vec` + +`Vec` is a growable array type, provided by the standard library.\ +You can create an empty array using the `Vec::new` function: + +```rust +let mut numbers: Vec = Vec::new(); +``` + +You would then push elements into the vector using the `push` method: + +```rust +numbers.push(1); +numbers.push(2); +numbers.push(3); +``` + +New values are added to the end of the vector.\ +You can also create an initialized vector using the `vec!` macro, if you know the values at creation time: + +```rust +let numbers = vec![1, 2, 3]; +``` + +## Accessing elements + +The syntax for accessing elements is the same as with arrays: + +```rust +let numbers = vec![1, 2, 3]; +let first = numbers[0]; +let second = numbers[1]; +let third = numbers[2]; +``` + +The index must be of type `usize`.\ +You can also use the `get` method, which returns an `Option<&T>`: + +```rust +let numbers = vec![1, 2, 3]; +assert_eq!(numbers.get(0), Some(&1)); +// You get a `None` if you try to access an out-of-bounds index +// rather than a panic. +assert_eq!(numbers.get(3), None); +``` + +Access is bounds-checked, just like element access with arrays. It has O(1) complexity. + +## Memory layout + +`Vec` is a heap-allocated data structure.\ +When you create a `Vec`, it allocates memory on the heap to store the elements. + +If you run the following code: + +```rust +let mut numbers = Vec::with_capacity(3); +numbers.push(1); +numbers.push(2); +``` + +you'll get the following memory layout: + +```text + +---------+--------+----------+ +Stack | pointer | length | capacity | + | | | 2 | 3 | + +--|------+--------+----------+ + | + | + v + +---+---+---+ +Heap: | 1 | 2 | ? | + +---+---+---+ +``` + +`Vec` keeps track of three things: + +- The **pointer** to the heap region you reserved. +- The **length** of the vector, i.e. how many elements are in the vector. +- The **capacity** of the vector, i.e. the number of elements that can fit in the space reserved on the heap. + +This layout should look familiar: it's exactly the same as `String`!\ +That's not a coincidence: `String` is defined as a vector of bytes, `Vec`, under the hood: + +```rust +pub struct String { + vec: Vec, +} +``` diff --git a/book/src/06_ticket_management/03_resizing.md b/book/src/06_ticket_management/03_resizing.md new file mode 100644 index 0000000..e28cde3 --- /dev/null +++ b/book/src/06_ticket_management/03_resizing.md @@ -0,0 +1,25 @@ +# Resizing + +We said that `Vec` is a "growable" vector type, but what does that mean? +What happens if you try to insert an element into a `Vec` that's already at maximum capacity? + +```rust +let mut numbers = Vec::with_capacity(3); +numbers.push(1); +numbers.push(2); +numbers.push(3); // Max capacity reached +numbers.push(4); // What happens here? +``` + +The `Vec` will **resize** itself.\ +It will ask the allocator for a new (larger) chunk of heap memory, copy the elements over, and deallocate the old memory. + +This operation can be expensive, as it involves a new memory allocation and copying all existing elements. + +## `Vec::with_capacity` + +If you have a rough idea of how many elements you'll store in a `Vec`, you can use the `Vec::with_capacity` +method to pre-allocate enough memory upfront.\ +This can avoid a new allocation when the `Vec` grows, but it may waste memory if you overestimate actual usage. + +Evaluate on a case-by-case basis. diff --git a/book/src/06_ticket_management/04_iterators.md b/book/src/06_ticket_management/04_iterators.md new file mode 100644 index 0000000..b2adf03 --- /dev/null +++ b/book/src/06_ticket_management/04_iterators.md @@ -0,0 +1,107 @@ +# Iteration + +During the very first exercises, you learned that Rust lets you iterate over collections using `for` loops. +We were looking at ranges at that point (e.g. `0..5`), but the same holds true for collections like arrays and vectors. + +```rust +// It works for `Vec`s +let v = vec![1, 2, 3]; +for n in v { + println!("{}", n); +} + +// It also works for arrays +let a: [u32; 3] = [1, 2, 3]; +for n in a { + println!("{}", n); +} +``` + +It's time to understand how this works under the hood. + +## `for` desugaring + +Every time you write a `for` loop in Rust, the compiler _desugars_ it into the following code: + +```rust +let mut iter = IntoIterator::into_iter(v); +loop { + match iter.next() { + Some(n) => { + println!("{}", n); + } + None => break, + } +} +``` + +`loop` is another looping construct, on top of `for` and `while`.\ +A `loop` block will run forever, unless you explicitly `break` out of it. + +## `Iterator` trait + +The `next` method in the previous code snippet comes from the `Iterator` trait. +The `Iterator` trait is defined in Rust's standard library and provides a shared interface for +types that can produce a sequence of values: + +```rust +trait Iterator { + type Item; + fn next(&mut self) -> Option; +} +``` + +The `Item` associated type specifies the type of the values produced by the iterator. + +`next` returns the next value in the sequence.\ +It returns `Some(value)` if there's a value to return, and `None` when there isn't. + +Be careful: there is no guarantee that an iterator is exhausted when it returns `None`. That's only +guaranteed if the iterator implements the (more restrictive) +[`FusedIterator`](https://doc.rust-lang.org/std/iter/trait.FusedIterator.html) trait. + +## `IntoIterator` trait + +Not all types implement `Iterator`, but many can be converted into a type that does.\ +That's where the `IntoIterator` trait comes in: + +```rust +trait IntoIterator { + type Item; + type IntoIter: Iterator; + fn into_iter(self) -> Self::IntoIter; +} +``` + +The `into_iter` method consumes the original value and returns an iterator over its elements.\ +A type can only have one implementation of `IntoIterator`: there can be no ambiguity as to what `for` should desugar to. + +One detail: every type that implements `Iterator` automatically implements `IntoIterator` as well. +They just return themselves from `into_iter`! + +## Bounds checks + +Iterating over iterators has a nice side effect: you can't go out of bounds, by design.\ +This allows Rust to remove bounds checks from the generated machine code, making iteration faster. + +In other words, + +```rust +let v = vec![1, 2, 3]; +for n in v { + println!("{}", n); +} +``` + +is usually faster than + +```rust +let v = vec![1, 2, 3]; +for i in 0..v.len() { + println!("{}", v[i]); +} +``` + +There are exceptions to this rule: the compiler can sometimes prove that you're not going out of bounds even +with manual indexing, thus removing the bounds checks anyway. But in general, prefer iteration to indexing +where possible. diff --git a/book/src/06_ticket_management/05_iter.md b/book/src/06_ticket_management/05_iter.md new file mode 100644 index 0000000..379508e --- /dev/null +++ b/book/src/06_ticket_management/05_iter.md @@ -0,0 +1,42 @@ +# `.iter()` + +`IntoIterator` **consumes** `self` to create an iterator. + +This has its benefits: you get **owned** values from the iterator. +For example: if you call `.into_iter()` on a `Vec` you'll get an iterator that returns `Ticket` values. + +That's also its downside: you can no longer use the original collection after calling `.into_iter()` on it. +Quite often you want to iterate over a collection without consuming it, looking at **references** to the values instead. +In the case of `Vec`, you'd want to iterate over `&Ticket` values. + +Most collections expose a method called `.iter()` that returns an iterator over references to the collection's elements. +For example: + +```rust +let numbers: Vec = vec![1, 2]; +// `n` has type `&u32` here +for n in numbers.iter() { + // [...] +} +``` + +This pattern can be simplified by implementing `IntoIterator` for a **reference to the collection**. +In our example above, that would be `&Vec`.\ +The standard library does this, that's why the following code works: + +```rust +let numbers: Vec = vec![1, 2]; +// `n` has type `&u32` here +// We didn't have to call `.iter()` explicitly +// It was enough to use `&numbers` in the `for` loop +for n in &numbers { + // [...] +} +``` + +It's idiomatic to provide both options: + +- An implementation of `IntoIterator` for a reference to the collection. +- An `.iter()` method that returns an iterator over references to the collection's elements. + +The former is convenient in `for` loops, the latter is more explicit and can be used in other contexts. diff --git a/book/src/06_ticket_management/06_lifetimes.md b/book/src/06_ticket_management/06_lifetimes.md new file mode 100644 index 0000000..2c5a72b --- /dev/null +++ b/book/src/06_ticket_management/06_lifetimes.md @@ -0,0 +1,84 @@ +# Lifetimes + +Let's try to complete the previous exercise by adding an implementation of `IntoIterator` for `&TicketStore`, for +maximum convenience in `for` loops. + +Let's start by filling in the most "obvious" parts of the implementation: + +```rust +impl IntoIterator for &TicketStore { + type Item = &Ticket; + type IntoIter = // What goes here? + + fn into_iter(self) -> Self::IntoIter { + self.tickets.iter() + } +} +``` + +What should `type IntoIter` be set to?\ +Intuitively, it should be the type returned by `self.tickets.iter()`, i.e. the type returned by `Vec::iter()`.\ +If you check the standard library documentation, you'll find that `Vec::iter()` returns an `std::slice::Iter`. +The definition of `Iter` is: + +```rust +pub struct Iter<'a, T> { /* fields omitted */ } +``` + +`'a` is a **lifetime parameter**. + +## Lifetime parameters + +Lifetimes are **labels** used by the Rust compiler to keep track of how long a reference (either mutable or +immutable) is valid.\ +The lifetime of a reference is constrained by the scope of the value it refers to. Rust always makes sure, at compile-time, +that references are not used after the value they refer to has been dropped, to avoid dangling pointers and use-after-free bugs. + +This should sound familiar: we've already seen these concepts in action when we discussed ownership and borrowing. +Lifetimes are just a way to **name** how long a specific reference is valid. + +Naming becomes important when you have multiple references and you need to clarify how they **relate to each other**. +Let's look at the signature of `Vec::iter()`: + +```rust +impl Vec { + // Slightly simplified + pub fn iter<'a>(&'a self) -> Iter<'a, T> { + // [...] + } +} +``` + +`Vec::iter()` is generic over a lifetime parameter, named `'a`.\ +`'a` is used to **tie together** the lifetime of the `Vec` and the lifetime of the `Iter` returned by `iter()`. +In plain English: the `Iter` returned by `iter()` cannot outlive the `Vec` reference (`&self`) it was created from. + +This is important because `Vec::iter`, as we discussed, returns an iterator over **references** to the `Vec`'s elements. +If the `Vec` is dropped, the references returned by the iterator would be invalid. Rust must make sure this doesn't happen, +and lifetimes are the tool it uses to enforce this rule. + +## Lifetime elision + +Rust has a set of rules, called **lifetime elision rules**, that allow you to omit explicit lifetime annotations in many cases. +For example, `Vec::iter`'s definition looks like this in `std`'s source code: + +```rust +impl Vec { + pub fn iter(&self) -> Iter<'_, T> { + // [...] + } +} +``` + +No explicit lifetime parameter is present in the signature of `Vec::iter()`. +Elision rules imply that the lifetime of the `Iter` returned by `iter()` is tied to the lifetime of the `&self` reference. +You can think of `'_` as a **placeholder** for the lifetime of the `&self` reference. + +See the [References](#references) section for a link to the official documentation on lifetime elision.\ +In most cases, you can rely on the compiler telling you when you need to add explicit lifetime annotations. + +## References + +- [std::vec::Vec::iter](https://doc.rust-lang.org/std/vec/struct.Vec.html#method.iter) +- [std::slice::Iter](https://doc.rust-lang.org/std/slice/struct.Iter.html) +- [Lifetime elision rules](https://doc.rust-lang.org/reference/lifetime-elision.html) diff --git a/book/src/06_ticket_management/07_combinators.md b/book/src/06_ticket_management/07_combinators.md new file mode 100644 index 0000000..0b9afe5 --- /dev/null +++ b/book/src/06_ticket_management/07_combinators.md @@ -0,0 +1,107 @@ +# Combinators + +Iterators can do so much more than `for` loops!\ +If you look at the documentation for the `Iterator` trait, you'll find a **vast** collection of +methods that you can leverage to transform, filter, and combine iterators in various ways. + +Let's mention the most common ones: + +- `map` applies a function to each element of the iterator. +- `filter` keeps only the elements that satisfy a predicate. +- `filter_map` combines `filter` and `map` in one step. +- `cloned` converts an iterator of references into an iterator of values, cloning each element. +- `enumerate` returns a new iterator that yields `(index, value)` pairs. +- `skip` skips the first `n` elements of the iterator. +- `take` stops the iterator after `n` elements. +- `chain` combines two iterators into one. + +These methods are called **combinators**.\ +They are usually **chained** together to create complex transformations in a concise and readable way: + +```rust +let numbers = vec![1, 2, 3, 4, 5]; +// The sum of the squares of the even numbers +let outcome: u32 = numbers.iter() + .filter(|&n| n % 2 == 0) + .map(|&n| n * n) + .sum(); +``` + +## Closures + +What's going on with the `filter` and `map` methods above?\ +They take **closures** as arguments. + +Closures are **anonymous functions**, i.e. functions that are not defined using the `fn` syntax we are used to.\ +They are defined using the `|args| body` syntax, where `args` are the arguments and `body` is the function body. +`body` can be a block of code or a single expression. +For example: + +```rust +// An anonymous function that adds 1 to its argument +let add_one = |x| x + 1; +// Could be written with a block too: +let add_one = |x| { x + 1 }; +``` + +Closures can take more than one argument: + +```rust +let add = |x, y| x + y; +let sum = add(1, 2); +``` + +They can also capture variables from their environment: + +```rust +let x = 42; +let add_x = |y| x + y; +let sum = add_x(1); +``` + +If necessary, you can specify the types of the arguments and/or the return type: + +```rust +// Just the input type +let add_one = |x: i32| x + 1; +// Or both input and output types, using the `fn` syntax +let add_one: fn(i32) -> i32 = |x| x + 1; +``` + +## `collect` + +What happens when you're done transforming an iterator using combinators?\ +You either iterate over the transformed values using a `for` loop, or you collect them into a collection. + +The latter is done using the `collect` method.\ +`collect` consumes the iterator and collects its elements into a collection of your choice. + +For example, you can collect the squares of the even numbers into a `Vec`: + +```rust +let numbers = vec![1, 2, 3, 4, 5]; +let squares_of_evens: Vec = numbers.iter() + .filter(|&n| n % 2 == 0) + .map(|&n| n * n) + .collect(); +``` + +`collect` is generic over its **return type**.\ +Therefore you usually need to provide a type hint to help the compiler infer the correct type. +In the example above, we annotated the type of `squares_of_evens` to be `Vec`. +Alternatively, you can use the **turbofish syntax** to specify the type: + +```rust +let squares_of_evens = numbers.iter() + .filter(|&n| n % 2 == 0) + .map(|&n| n * n) + // Turbofish syntax: `::()` + // It's called turbofish because `::<>` looks like a fish + .collect::>(); +``` + +## Further reading + +- [`Iterator`'s documentation](https://doc.rust-lang.org/std/iter/trait.Iterator.html) gives you an + overview of the methods available for iterators in `std`. +- [The `itertools` crate](https://docs.rs/itertools/) defines even **more** combinators for iterators. diff --git a/book/src/06_ticket_management/08_impl_trait.md b/book/src/06_ticket_management/08_impl_trait.md new file mode 100644 index 0000000..3388978 --- /dev/null +++ b/book/src/06_ticket_management/08_impl_trait.md @@ -0,0 +1,69 @@ +# `impl Trait` + +`TicketStore::to_dos` returns a `Vec<&Ticket>`.\ +That signature introduces a new heap allocation every time `to_dos` is called, which may be unnecessary depending +on what the caller needs to do with the result. +It'd be better if `to_dos` returned an iterator instead of a `Vec`, thus empowering the caller to decide whether to +collect the results into a `Vec` or just iterate over them. + +That's tricky though! +What's the return type of `to_dos`, as implemented below? + +```rust +impl TicketStore { + pub fn to_dos(&self) -> ??? { + self.tickets.iter().filter(|t| t.status == Status::ToDo) + } +} +``` + +## Unnameable types + +The `filter` method returns an instance of `std::iter::Filter`, which has the following definition: + +```rust +pub struct Filter { /* fields omitted */ } +``` + +where `I` is the type of the iterator being filtered on and `P` is the predicate used to filter the elements.\ +We know that `I` is `std::slice::Iter<'_, Ticket>` in this case, but what about `P`?\ +`P` is a closure, an **anonymous function**. As the name suggests, closures don't have a name, +so we can't write them down in our code. + +Rust has a solution for this: **impl Trait**. + +## `impl Trait` + +`impl Trait` is a feature that allows you to return a type without specifying its name. +You just declare what trait(s) the type implements, and Rust figures out the rest. + +In this case, we want to return an iterator of references to `Ticket`s: + +```rust +impl TicketStore { + pub fn to_dos(&self) -> impl Iterator { + self.tickets.iter().filter(|t| t.status == Status::ToDo) + } +} +``` + +That's it! + +## Generic? + +`impl Trait` in return position is **not** a generic parameter. + +Generics are placeholders for types that are filled in by the caller of the function. +A function with a generic parameter is **polymorphic**: it can be called with different types, and the compiler will generate +a different implementation for each type. + +That's not the case with `impl Trait`. +The return type of a function with `impl Trait` is **fixed** at compile time, and the compiler will generate +a single implementation for it. +This is why `impl Trait` is also called **opaque return type**: the caller doesn't know the exact type of the return value, +only that it implements the specified trait(s). But the compiler knows the exact type, there is no polymorphism involved. + +## RPIT + +If you read RFCs or deep-dives about Rust, you might come across the acronym **RPIT**.\ +It stands for **"Return Position Impl Trait"** and refers to the use of `impl Trait` in return position. diff --git a/book/src/06_ticket_management/09_impl_trait_2.md b/book/src/06_ticket_management/09_impl_trait_2.md new file mode 100644 index 0000000..de63778 --- /dev/null +++ b/book/src/06_ticket_management/09_impl_trait_2.md @@ -0,0 +1,32 @@ +# `impl Trait` in argument position + +In the previous section, we saw how `impl Trait` can be used to return a type without specifying its name.\ +The same syntax can also be used in **argument position**: + +```rust +fn print_iter(iter: impl Iterator) { + for i in iter { + println!("{}", i); + } +} +``` + +`print_iter` takes an iterator of `i32`s and prints each element.\ +When used in **argument position**, `impl Trait` is equivalent to a generic parameter with a trait bound: + +```rust +fn print_iter(iter: T) +where + T: Iterator +{ + for i in iter { + println!("{}", i); + } +} +``` + +## Downsides + +As a rule of thumb, prefer generics over `impl Trait` in argument position.\ +Generics allow the caller to explicitly specify the type of the argument, using the turbofish syntax (`::<>`), +which can be useful for disambiguation. That's not the case with `impl Trait`. diff --git a/book/src/06_ticket_management/10_slices.md b/book/src/06_ticket_management/10_slices.md new file mode 100644 index 0000000..3a9fae5 --- /dev/null +++ b/book/src/06_ticket_management/10_slices.md @@ -0,0 +1,106 @@ +# Slices + +Let's go back to the memory layout of a `Vec`: + +```rust +let mut numbers = Vec::with_capacity(3); +numbers.push(1); +numbers.push(2); +``` + +```text + +---------+--------+----------+ +Stack | pointer | length | capacity | + | | | 2 | 3 | + +--|------+--------+----------+ + | + | + v + +---+---+---+ +Heap: | 1 | 2 | ? | + +---+---+---+ +``` + +We already remarked how `String` is just a `Vec` in disguise.\ +The similarity should prompt you to ask: "What's the equivalent of `&str` for `Vec`?" + +## `&[T]` + +`[T]` is a **slice** of a contiguous sequence of elements of type `T`.\ +It's most commonly used in its borrowed form, `&[T]`. + +There are various ways to create a slice reference from a `Vec`: + +```rust +let numbers = vec![1, 2, 3]; +// Via index syntax +let slice: &[i32] = &numbers[..]; +// Via a method +let slice: &[i32] = numbers.as_slice(); +// Or for a subset of the elements +let slice: &[i32] = &numbers[1..]; +``` + +`Vec` implements the `Deref` trait using `[T]` as the target type, so you can use slice methods on a `Vec` directly +thanks to deref coercion: + +```rust +let numbers = vec![1, 2, 3]; +// Surprise, surprise: `iter` is not a method on `Vec`! +// It's a method on `&[T]`, but you can call it on a `Vec` +// thanks to deref coercion. +let sum: i32 = numbers.iter().sum(); +``` + +### Memory layout + +A `&[T]` is a **fat pointer**, just like `&str`.\ +It consists of a pointer to the first element of the slice and the length of the slice. + +If you have a `Vec` with three elements: + +```rust +let numbers = vec![1, 2, 3]; +``` + +and then create a slice reference: + +```rust +let slice: &[i32] = &numbers[1..]; +``` + +you'll get this memory layout: + +```text + numbers slice + +---------+--------+----------+ +---------+--------+ +Stack | pointer | length | capacity | | pointer | length | + | | | 3 | 4 | | | | 2 | + +----|----+--------+----------+ +----|----+--------+ + | | + | | + v | + +---+---+---+---+ | +Heap: | 1 | 2 | 3 | ? | | + +---+---+---+---+ | + ^ | + | | + +--------------------------------+ +``` + +### `&Vec` vs `&[T]` + +When you need to pass an immutable reference to a `Vec` to a function, prefer `&[T]` over `&Vec`.\ +This allows the function to accept any kind of slice, not necessarily one backed by a `Vec`. + +For example, you can then pass a subset of the elements in a `Vec`. +But it goes further than that—you could also pass a **slice of an array**: + +```rust +let array = [1, 2, 3]; +let slice: &[i32] = &array; +``` + +Array slices and `Vec` slices are the same type: they're fat pointers to a contiguous sequence of elements. +In the case of arrays, the pointer points to the stack rather than the heap, but that doesn't matter +when it comes to using the slice. diff --git a/book/src/06_ticket_management/11_mutable_slices.md b/book/src/06_ticket_management/11_mutable_slices.md new file mode 100644 index 0000000..b3fda11 --- /dev/null +++ b/book/src/06_ticket_management/11_mutable_slices.md @@ -0,0 +1,41 @@ +# Mutable slices + +Every time we've talked about slice types (like `str` and `[T]`), we've used their immutable borrow form (`&str` and `&[T]`).\ +But slices can also be mutable! + +Here's how you create a mutable slice: + +```rust +let mut numbers = vec![1, 2, 3]; +let slice: &mut [i32] = &mut numbers; +``` + +You can then modify the elements in the slice: + +```rust +slice[0] = 42; +``` + +This will change the first element of the `Vec` to `42`. + +## Limitations + +When working with immutable borrows, the recommendation was clear: prefer slice references over references to +the owned type (e.g. `&[T]` over `&Vec`).\ +That's **not** the case with mutable borrows. + +Consider this scenario: + +```rust +let mut numbers = Vec::with_capacity(2); +let mut slice: &mut [i32] = &mut numbers; +slice.push(1); +``` + +It won't compile!\ +`push` is a method on `Vec`, not on slices. This is the manifestation of a more general principle: Rust won't +allow you to add or remove elements from a slice. You will only be able to modify/replace the elements that are +already there. + +In this regard, a `&mut Vec` or a `&mut String` are strictly more powerful than a `&mut [T]` or a `&mut str`.\ +Choose the type that best fits based on the operations you need to perform. diff --git a/book/src/06_ticket_management/12_two_states.md b/book/src/06_ticket_management/12_two_states.md new file mode 100644 index 0000000..83ae745 --- /dev/null +++ b/book/src/06_ticket_management/12_two_states.md @@ -0,0 +1,67 @@ +# Ticket ids + +Let's think again about our ticket management system.\ +Our ticket model right now looks like this: + +```rust +pub struct Ticket { + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status +} +``` + +One thing is missing here: an **identifier** to uniquely identify a ticket.\ +That identifier should be unique for each ticket. That can be guaranteed by generating it automatically when +a new ticket is created. + +## Refining the model + +Where should the id be stored?\ +We could add a new field to the `Ticket` struct: + +```rust +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status +} +``` + +But we don't know the id before creating the ticket. So it can't be there from the get-go.\ +It'd have to be optional: + +```rust +pub struct Ticket { + pub id: Option, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status +} +``` + +That's also not ideal—we'd have to handle the `None` case every single time we retrieve a ticket from the store, +even though we know that the id should always be there once the ticket has been created. + +The best solution is to have two different ticket **states**, represented by two separate types: +a `TicketDraft` and a `Ticket`: + +```rust +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription +} + +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status +} +``` + +A `TicketDraft` is a ticket that hasn't been created yet. It doesn't have an id, and it doesn't have a status.\ +A `Ticket` is a ticket that has been created. It has an id and a status.\ +Since each field in `TicketDraft` and `Ticket` embeds its own constraints, we don't have to duplicate logic +across the two types. diff --git a/book/src/06_ticket_management/13_index.md b/book/src/06_ticket_management/13_index.md new file mode 100644 index 0000000..4b02bf7 --- /dev/null +++ b/book/src/06_ticket_management/13_index.md @@ -0,0 +1,37 @@ +# Indexing + +`TicketStore::get` returns an `Option<&Ticket>` for a given `TicketId`.\ +We've seen before how to access elements of arrays and vectors using Rust's +indexing syntax: + +```rust +let v = vec![0, 1, 2]; +assert_eq!(v[0], 0); +``` + +How can we provide the same experience for `TicketStore`?\ +You guessed right: we need to implement a trait, `Index`! + +## `Index` + +The `Index` trait is defined in Rust's standard library: + +```rust +// Slightly simplified +pub trait Index +{ + type Output; + + // Required method + fn index(&self, index: Idx) -> &Self::Output; +} +``` + +It has: + +- One generic parameter, `Idx`, to represent the index type +- One associated type, `Output`, to represent the type we retrieved using the index + +Notice how the `index` method doesn't return an `Option`. The assumption is that +`index` will panic if you try to access an element that's not there, as it happens +for array and vec indexing. diff --git a/book/src/06_ticket_management/14_index_mut.md b/book/src/06_ticket_management/14_index_mut.md new file mode 100644 index 0000000..3481767 --- /dev/null +++ b/book/src/06_ticket_management/14_index_mut.md @@ -0,0 +1,20 @@ +# Mutable indexing + +`Index` allows read-only access. It doesn't let you mutate the value you +retrieved. + +## `IndexMut` + +If you want to allow mutability, you need to implement the `IndexMut` trait. + +```rust +// Slightly simplified +pub trait IndexMut: Index +{ + // Required method + fn index_mut(&mut self, index: Idx) -> &mut Self::Output; +} +``` + +`IndexMut` can only be implemented if the type already implements `Index`, +since it unlocks an _additional_ capability. diff --git a/book/src/06_ticket_management/15_hashmap.md b/book/src/06_ticket_management/15_hashmap.md new file mode 100644 index 0000000..2d716c3 --- /dev/null +++ b/book/src/06_ticket_management/15_hashmap.md @@ -0,0 +1,116 @@ +# `HashMap` + +Our implementation of `Index`/`IndexMut` is not ideal: we need to iterate over the entire +`Vec` to retrieve a ticket by id; the algorithmic complexity is `O(n)`, where +`n` is the number of tickets in the store. + +We can do better by using a different data structure for storing tickets: a `HashMap`. + +```rust +use std::collections::HashMap; + +// Type inference lets us omit an explicit type signature (which +// would be `HashMap` in this example). +let mut book_reviews = HashMap::new(); + +book_reviews.insert( + "Adventures of Huckleberry Finn".to_string(), + "My favorite book.".to_string(), +); +``` + +`HashMap` works with key-value pairs. It's generic over both: `K` is the generic +parameter for the key type, while `V` is the one for the value type. + +The expected cost of insertions, retrievals and removals is **constant**, `O(1)`. +That sounds perfect for our usecase, doesn't it? + +## Key requirements + +There are no trait bounds on `HashMap`'s struct definition, but you'll find some +on its methods. Let's look at `insert`, for example: + +```rust +// Slightly simplified +impl HashMap +where + K: Eq + Hash, +{ + pub fn insert(&mut self, k: K, v: V) -> Option { + // [...] + } +} +``` + +The key type must implement the `Eq` and `Hash` traits.\ +Let's dig into those two. + +## `Hash` + +A hashing function (or hasher) maps a potentially infinite set of a values (e.g. +all possible strings) to a bounded range (e.g. a `u64` value).\ +There are many different hashing functions around, each with different properties +(speed, collision risk, reversibility, etc.). + +A `HashMap`, as the name suggests, uses a hashing function behind the scene. +It hashes your key and then uses that hash to store/retrieve the associated value. +This strategy requires the key type must be hashable, hence the `Hash` trait bound on `K`. + +You can find the `Hash` trait in the `std::hash` module: + +```rust +pub trait Hash { + // Required method + fn hash(&self, state: &mut H) + where H: Hasher; +} +``` + +You will rarely implement `Hash` manually. Most of the times you'll derive it: + +```rust +#[derive(Hash)] +struct Person { + id: u32, + name: String, +} +``` + +## `Eq` + +`HashMap` must be able to compare keys for equality. This is particularly important +when dealing with hash collisions—i.e. when two different keys hash to the same value. + +You may wonder: isn't that what the `PartialEq` trait is for? Almost!\ +`PartialEq` is not enough for `HashMap` because it doesn't guarantee reflexivity, i.e. `a == a` is always `true`.\ +For example, floating point numbers (`f32` and `f64`) implement `PartialEq`, +but they don't satisfy the reflexivity property: `f32::NAN == f32::NAN` is `false`.\ +Reflexivity is crucial for `HashMap` to work correctly: without it, you wouldn't be able to retrieve a value +from the map using the same key you used to insert it. + +The `Eq` trait extends `PartialEq` with the reflexivity property: + +```rust +pub trait Eq: PartialEq { + // No additional methods +} +``` + +It's a marker trait: it doesn't add any new methods, it's just a way for you to say to the compiler +that the equality logic implemented in `PartialEq` is reflexive. + +You can derive `Eq` automatically when you derive `PartialEq`: + +```rust +#[derive(PartialEq, Eq)] +struct Person { + id: u32, + name: String, +} +``` + +## `Eq` and `Hash` are linked + +There is an implicit contract between `Eq` and `Hash`: if two keys are equal, their hashes must be equal too. +This is crucial for `HashMap` to work correctly. If you break this contract, you'll get nonsensical results +when using `HashMap`. diff --git a/book/src/06_ticket_management/16_btreemap.md b/book/src/06_ticket_management/16_btreemap.md new file mode 100644 index 0000000..4f9e17d --- /dev/null +++ b/book/src/06_ticket_management/16_btreemap.md @@ -0,0 +1,82 @@ +# Ordering + +By moving from a `Vec` to a `HashMap` we have improved the performance of our ticket management system, +and simplified our code in the process.\ +It's not all roses, though. When iterating over a `Vec`-backed store, we could be sure that the tickets +would be returned in the order they were added.\ +That's not the case with a `HashMap`: you can iterate over the tickets, but the order is random. + +We can recover a consistent ordering by switching from a `HashMap` to a `BTreeMap`. + +## `BTreeMap` + +A `BTreeMap` guarantees that entries are sorted by their keys.\ +This is useful when you need to iterate over the entries in a specific order, or if you need to +perform range queries (e.g. "give me all tickets with an id between 10 and 20"). + +Just like `HashMap`, you won't find trait bounds on the definition of `BTreeMap`. +But you'll find trait bounds on its methods. Let's look at `insert`: + +```rust +// `K` and `V` stand for the key and value types, respectively, +// just like in `HashMap`. +impl BTreeMap { + pub fn insert(&mut self, key: K, value: V) -> Option + where + K: Ord, + { + // implementation + } +} +``` + +`Hash` is no longer required. Instead, the key type must implement the `Ord` trait. + +## `Ord` + +The `Ord` trait is used to compare values.\ +While `PartialEq` is used to compare for equality, `Ord` is used to compare for ordering. + +It's defined in `std::cmp`: + +```rust +pub trait Ord: Eq + PartialOrd { + fn cmp(&self, other: &Self) -> Ordering; +} +``` + +The `cmp` method returns an `Ordering` enum, which can be one +of `Less`, `Equal`, or `Greater`.\ +`Ord` requires that two other traits are implemented: `Eq` and `PartialOrd`. + +## `PartialOrd` + +`PartialOrd` is a weaker version of `Ord`, just like `PartialEq` is a weaker version of `Eq`. +You can see why by looking at its definition: + +```rust +pub trait PartialOrd: PartialEq { + fn partial_cmp(&self, other: &Self) -> Option; +} +``` + +`PartialOrd::partial_cmp` returns an `Option`—it is not guaranteed that two values can +be compared.\ +For example, `f32` doesn't implement `Ord` because `NaN` values are not comparable, +the same reason why `f32` doesn't implement `Eq`. + +## Implementing `Ord` and `PartialOrd` + +Both `Ord` and `PartialOrd` can be derived for your types: + +```rust +// You need to add `Eq` and `PartialEq` too, +// since `Ord` requires them. +#[derive(Eq, PartialEq, Ord, PartialOrd)] +struct TicketId(u64); +``` + +If you choose (or need) to implement them manually, be careful: + +- `Ord` and `PartialOrd` must be consistent with `Eq` and `PartialEq`. +- `Ord` and `PartialOrd` must be consistent with each other. diff --git a/book/src/07_threads/00_intro.md b/book/src/07_threads/00_intro.md new file mode 100644 index 0000000..f3c4b1e --- /dev/null +++ b/book/src/07_threads/00_intro.md @@ -0,0 +1,15 @@ +# Intro + +One of Rust's big promises is _fearless concurrency_: making it easier to write safe, concurrent programs. +We haven't seen much of that yet. All the work we've done so far has been single-threaded. +Time to change that! + +In this chapter we'll make our ticket store multithreaded.\ +We'll have the opportunity to touch most of Rust's core concurrency features, including: + +- Threads, using the `std::thread` module +- Message passing, using channels +- Shared state, using `Arc`, `Mutex` and `RwLock` +- `Send` and `Sync`, the traits that encode Rust's concurrency guarantees + +We'll also discuss various design patterns for multithreaded systems and some of their trade-offs. diff --git a/book/src/07_threads/01_threads.md b/book/src/07_threads/01_threads.md new file mode 100644 index 0000000..7bcbea9 --- /dev/null +++ b/book/src/07_threads/01_threads.md @@ -0,0 +1,115 @@ +# Threads + +Before we start writing multithreaded code, let's take a step back and talk about what threads are +and why we might want to use them. + +## What is a thread? + +A **thread** is an execution context managed by the underlying operating system.\ +Each thread has its own stack and instruction pointer. + +A single **process** can manage multiple threads. +These threads share the same memory space, which means they can access the same data. + +Threads are a **logical** construct. In the end, you can only run one set of instructions +at a time on a CPU core, the **physical** execution unit.\ +Since there can be many more threads than there are CPU cores, the operating system's +**scheduler** is in charge of deciding which thread to run at any given time, +partitioning CPU time among them to maximize throughput and responsiveness. + +## `main` + +When a Rust program starts, it runs on a single thread, the **main thread**.\ +This thread is created by the operating system and is responsible for running the `main` +function. + +```rust +use std::thread; +use std::time::Duration; + +fn main() { + loop { + thread::sleep(Duration::from_secs(2)); + println!("Hello from the main thread!"); + } +} +``` + +## `std::thread` + +Rust's standard library provides a module, `std::thread`, that allows you to create +and manage threads. + +### `spawn` + +You can use `std::thread::spawn` to create new threads and execute code on them. + +For example: + +```rust +use std::thread; +use std::time::Duration; + +fn main() { + let handle = thread::spawn(|| { + loop { + thread::sleep(Duration::from_secs(1)); + println!("Hello from a thread!"); + } + }); + + loop { + thread::sleep(Duration::from_secs(2)); + println!("Hello from the main thread!"); + } +} +``` + +If you execute this program on the [Rust playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=afedf7062298ca8f5a248bc551062eaa) +you'll see that the main thread and the spawned thread run concurrently.\ +Each thread makes progress independently of the other. + +### Process termination + +When the main thread finishes, the overall process will exit.\ +A spawned thread will continue running until it finishes or the main thread finishes. + +```rust +use std::thread; +use std::time::Duration; + +fn main() { + let handle = thread::spawn(|| { + loop { + thread::sleep(Duration::from_secs(1)); + println!("Hello from a thread!"); + } + }); + + thread::sleep(Duration::from_secs(5)); +} +``` + +In the example above, you can expect to see the message "Hello from a thread!" printed roughly five times.\ +Then the main thread will finish (when the `sleep` call returns), and the spawned thread will be terminated +since the overall process exits. + +### `join` + +You can also wait for a spawned thread to finish by calling the `join` method on the `JoinHandle` that `spawn` returns. + +```rust +use std::thread; +fn main() { + let handle = thread::spawn(|| { + println!("Hello from a thread!"); + }); + + handle.join().unwrap(); +} +``` + +In this example, the main thread will wait for the spawned thread to finish before exiting.\ +This introduces a form of **synchronization** between the two threads: you're guaranteed to see the message +"Hello from a thread!" printed before the program exits, because the main thread won't exit +until the spawned thread has finished. diff --git a/book/src/07_threads/02_static.md b/book/src/07_threads/02_static.md new file mode 100644 index 0000000..ebc5139 --- /dev/null +++ b/book/src/07_threads/02_static.md @@ -0,0 +1,114 @@ +# `'static` + +If you tried to borrow a slice from the vector in the previous exercise, +you probably got a compiler error that looks something like this: + +```text +error[E0597]: `v` does not live long enough + | +11 | pub fn sum(v: Vec) -> i32 { + | - binding `v` declared here +... +15 | let right = &v[split_point..]; + | ^ borrowed value does not live long enough +16 | let left_handle = spawn(move || left.iter().sum::()); + | -------------------------------- + argument requires that `v` is borrowed for `'static` +19 | } + | - `v` dropped here while still borrowed +``` + +`argument requires that v is borrowed for 'static`, what does that mean? + +The `'static` lifetime is a special lifetime in Rust.\ +It means that the value will be valid for the entire duration of the program. + +## Detached threads + +A thread launched via `thread::spawn` can **outlive** the thread that spawned it.\ +For example: + +```rust +use std::thread; + +fn f() { + thread::spawn(|| { + thread::spawn(|| { + loop { + thread::sleep(std::time::Duration::from_secs(1)); + println!("Hello from the detached thread!"); + } + }); + }); +} +``` + +In this example, the first spawned thread will in turn spawn +a child thread that prints a message every second.\ +The first thread will then finish and exit. When that happens, +its child thread will **continue running** for as long as the +overall process is running.\ +In Rust's lingo, we say that the child thread has **outlived** +its parent. + +## `'static` lifetime + +Since a spawned thread can: + +- outlive the thread that spawned it (its parent thread) +- run until the program exits + +it must not borrow any values that might be dropped before the program exits; +violating this constraint would expose us to a use-after-free bug.\ +That's why `std::thread::spawn`'s signature requires that the closure passed to it +has the `'static` lifetime: + +```rust +pub fn spawn(f: F) -> JoinHandle +where + F: FnOnce() -> T + Send + 'static, + T: Send + 'static +{ + // [..] +} +``` + +## `'static` is not (just) about references + +All values in Rust have a lifetime, not just references. + +In particular, a type that owns its data (like a `Vec` or a `String`) +satisfies the `'static` constraint: if you own it, you can keep working with it +for as long as you want, even after the function that originally created it +has returned. + +You can thus interpret `'static` as a way to say: + +- Give me an owned value +- Give me a reference that's valid for the entire duration of the program + +The first approach is how you solved the issue in the previous exercise: +by allocating new vectors to hold the left and right parts of the original vector, +which were then moved into the spawned threads. + +## `'static` references + +Let's talk about the second case, references that are valid for the entire +duration of the program. + +### Static data + +The most common case is a reference to **static data**, such as string literals: + +```rust +let s: &'static str = "Hello world!"; +``` + +Since string literals are known at compile-time, Rust stores them _inside_ your executable, +in a region known as **read-only data segment**. +All references pointing to that region will therefore be valid for as long as +the program runs; they satisfy the `'static` contract. + +## Further reading + +- [The data segment](https://en.wikipedia.org/wiki/Data_segment) diff --git a/book/src/07_threads/03_leak.md b/book/src/07_threads/03_leak.md new file mode 100644 index 0000000..7f61a30 --- /dev/null +++ b/book/src/07_threads/03_leak.md @@ -0,0 +1,46 @@ +# Leaking data + +The main concern around passing references to spawned threads is use-after-free bugs: +accessing data using a pointer to a memory region that's already been freed/de-allocated.\ +If you're working with heap-allocated data, you can avoid the issue by +telling Rust that you'll never reclaim that memory: you choose to **leak memory**, +intentionally. + +This can be done, for example, using the `Box::leak` method from Rust's standard library: + +```rust +// Allocate a `u32` on the heap, by wrapping it in a `Box`. +let x = Box::new(41u32); +// Tell Rust that you'll never free that heap allocation +// using `Box::leak`. You can thus get back a 'static reference. +let static_ref: &'static mut u32 = Box::leak(x); +``` + +## Data leakage is process-scoped + +Leaking data is dangerous: if you keep leaking memory, you'll eventually +run out and crash with an out-of-memory error. + +```rust +// If you leave this running for a while, +// it'll eventually use all the available memory. +fn oom_trigger() { + loop { + let v: Vec = Vec::with_capacity(1024); + v.leak(); + } +} +``` + +At the same time, memory leaked via `leak` method is not truly forgotten.\ +The operating system can map each memory region to the process responsible for it. +When the process exits, the operating system will reclaim that memory. + +Keeping this in mind, it can be OK to leak memory when: + +- The amount of memory you need to leak is bounded/known upfront, or +- Your process is short-lived and you're confident you won't exhaust + all the available memory before it exits + +"Let the OS deal with it" is a perfectly valid memory management strategy +if your usecase allows for it. diff --git a/book/src/07_threads/04_scoped_threads.md b/book/src/07_threads/04_scoped_threads.md new file mode 100644 index 0000000..ef88cbb --- /dev/null +++ b/book/src/07_threads/04_scoped_threads.md @@ -0,0 +1,73 @@ +# Scoped threads + +All the lifetime issues we discussed so far have a common source: +the spawned thread can outlive its parent.\ +We can sidestep this issue by using **scoped threads**. + +```rust +let v = vec![1, 2, 3]; +let midpoint = v.len() / 2; + +std::thread::scope(|scope| { + scope.spawn(|| { + let first = &v[..midpoint]; + println!("Here's the first half of v: {first:?}"); + }); + scope.spawn(|| { + let second = &v[midpoint..]; + println!("Here's the second half of v: {second:?}"); + }); +}); + +println!("Here's v: {v:?}"); +``` + +Let's unpack what's happening. + +## `scope` + +The `std::thread::scope` function creates a new **scope**.\ +`std::thread::scope` takes a closure as input, with a single argument: a `Scope` instance. + +## Scoped spawns + +`Scope` exposes a `spawn` method.\ +Unlike `std::thread::spawn`, all threads spawned using a `Scope` will be +**automatically joined** when the scope ends. + +If we were to "translate" the previous example to `std::thread::spawn`, +it'd look like this: + +```rust +let v = vec![1, 2, 3]; +let midpoint = v.len() / 2; + +let handle1 = std::thread::spawn(|| { + let first = &v[..midpoint]; + println!("Here's the first half of v: {first:?}"); +}); +let handle2 = std::thread::spawn(|| { + let second = &v[midpoint..]; + println!("Here's the second half of v: {second:?}"); +}); + +handle1.join().unwrap(); +handle2.join().unwrap(); + +println!("Here's v: {v:?}"); +``` + +## Borrowing from the environment + +The translated example wouldn't compile, though: the compiler would complain +that `&v` can't be used from our spawned threads since its lifetime isn't +`'static`. + +That's not an issue with `std::thread::scope`—you can **safely borrow from the environment**. + +In our example, `v` is created before the spawning points. +It will only be dropped _after_ `scope` returns. At the same time, +all threads spawned inside `scope` are guaranteed to finish _before_ `scope` returns, +therefore there is no risk of having dangling references. + +The compiler won't complain! diff --git a/book/src/07_threads/05_channels.md b/book/src/07_threads/05_channels.md new file mode 100644 index 0000000..eb1c00b --- /dev/null +++ b/book/src/07_threads/05_channels.md @@ -0,0 +1,73 @@ +# Channels + +All our spawned threads have been fairly short-lived so far.\ +Get some input, run a computation, return the result, shut down. + +For our ticket management system, we want to do something different: +a client-server architecture. + +We will have **one long-running server thread**, responsible for managing +our state, the stored tickets. + +We will then have **multiple client threads**.\ +Each client will be able to send **commands** and **queries** to +the stateful thread, in order to change its state (e.g. add a new ticket) +or retrieve information (e.g. get the status of a ticket).\ +Client threads will run concurrently. + +## Communication + +So far we've only had very limited parent-child communication: + +- The spawned thread borrowed/consumed data from the parent context +- The spawned thread returned data to the parent when joined + +This isn't enough for a client-server design.\ +Clients need to be able to send and receive data from the server thread +_after_ it has been launched. + +We can solve the issue using **channels**. + +## Channels + +Rust's standard library provides **multi-producer, single-consumer** (mpsc) channels +in its `std::sync::mpsc` module.\ +There are two channel flavours: bounded and unbounded. We'll stick to the unbounded +version for now, but we'll discuss the pros and cons later on. + +Channel creation looks like this: + +```rust +use std::sync::mpsc::channel; + +let (sender, receiver) = channel(); +``` + +You get a sender and a receiver.\ +You call `send` on the sender to push data into the channel.\ +You call `recv` on the receiver to pull data from the channel. + +### Multiple senders + +`Sender` is clonable: we can create multiple senders (e.g. one for +each client thread) and they will all push data into the same channel. + +`Receiver`, instead, is not clonable: there can only be a single receiver +for a given channel. + +That's what **mpsc** (multi-producer single-consumer) stands for! + +### Message type + +Both `Sender` and `Receiver` are generic over a type parameter `T`.\ +That's the type of the _messages_ that can travel on our channel. + +It could be a `u64`, a struct, an enum, etc. + +### Errors + +Both `send` and `recv` can fail.\ +`send` returns an error if the receiver has been dropped.\ +`recv` returns an error if all senders have been dropped and the channel is empty. + +In other words, `send` and `recv` error when the channel is effectively closed. diff --git a/book/src/07_threads/06_interior_mutability.md b/book/src/07_threads/06_interior_mutability.md new file mode 100644 index 0000000..09dd005 --- /dev/null +++ b/book/src/07_threads/06_interior_mutability.md @@ -0,0 +1,114 @@ +# Interior mutability + +Let's take a moment to reason about the signature of `Sender`'s `send`: + +```rust +impl Sender { + pub fn send(&self, t: T) -> Result<(), SendError> { + // [...] + } +} +``` + +`send` takes `&self` as its argument.\ +But it's clearly causing a mutation: it's adding a new message to the channel. +What's even more interesting is that `Sender` is cloneable: we can have multiple instances of `Sender` +trying to modify the channel state **at the same time**, from different threads. + +That's the key property we are using to build this client-server architecture. But why does it work? +Doesn't it violate Rust's rules about borrowing? How are we performing mutations via an _immutable_ reference? + +## Shared rather than immutable references + +When we introduced the borrow-checker, we named the two types of references we can have in Rust: + +- immutable references (`&T`) +- mutable references (`&mut T`) + +It would have been more accurate to name them: + +- shared references (`&T`) +- exclusive references (`&mut T`) + +Immutable/mutable is a mental model that works for the vast majority of cases, and it's a great one to get started +with Rust. But it's not the whole story, as you've just seen: `&T` doesn't actually guarantee that the data it +points to is immutable.\ +Don't worry, though: Rust is still keeping its promises. +It's just that the terms are a bit more nuanced than they might seem at first. + +## `UnsafeCell` + +Whenever a type allows you to mutate data through a shared reference, you're dealing with **interior mutability**. + +By default, the Rust compiler assumes that shared references are immutable. It **optimises your code** based on that assumption.\ +The compiler can reorder operations, cache values, and do all sorts of magic to make your code faster. + +You can tell the compiler "No, this shared reference is actually mutable" by wrapping the data in an `UnsafeCell`.\ +Every time you see a type that allows interior mutability, you can be certain that `UnsafeCell` is involved, +either directly or indirectly.\ +Using `UnsafeCell`, raw pointers and `unsafe` code, you can mutate data through shared references. + +Let's be clear, though: `UnsafeCell` isn't a magic wand that allows you to ignore the borrow-checker!\ +`unsafe` code is still subject to Rust's rules about borrowing and aliasing. +It's an (advanced) tool that you can leverage to build **safe abstractions** whose safety can't be directly expressed +in Rust's type system. Whenever you use the `unsafe` keyword you're telling the compiler: +"I know what I'm doing, I won't violate your invariants, trust me." + +Every time you call an `unsafe` function, there will be documentation explaining its **safety preconditions**: +under what circumstances it's safe to execute its `unsafe` block. You can find the ones for `UnsafeCell` +[in `std`'s documentation](https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html). + +We won't be using `UnsafeCell` directly in this course, nor will we be writing `unsafe` code. +But it's important to know that it's there, why it exists and how it relates to the types you use +every day in Rust. + +## Key examples + +Let's go through a couple of important `std` types that leverage interior mutability.\ +These are types that you'll encounter somewhat often in Rust code, especially if you peek under the hood of +some the libraries you use. + +### Reference counting + +`Rc` is a reference-counted pointer.\ +It wraps around a value and keeps track of how many references to the value exist. +When the last reference is dropped, the value is deallocated.\ +The value wrapped in an `Rc` is immutable: you can only get shared references to it. + +```rust +use std::rc::Rc; + +let a: Rc = Rc::new("My string".to_string()); +// Only one reference to the string data exists. +assert_eq!(Rc::strong_count(&a), 1); + +// When we call `clone`, the string data is not copied! +// Instead, the reference count for `Rc` is incremented. +let b = Rc::clone(&a); +assert_eq!(Rc::strong_count(&a), 2); +assert_eq!(Rc::strong_count(&b), 2); +// ^ Both `a` and `b` point to the same string data +// and share the same reference counter. +``` + +`Rc` uses `UnsafeCell` internally to allow shared references to increment and decrement the reference count. + +### `RefCell` + +`RefCell` is one of the most common examples of interior mutability in Rust. +It allows you to mutate the value wrapped in a `RefCell` even if you only have an +immutable reference to the `RefCell` itself. + +This is done via **runtime borrow checking**. +The `RefCell` keeps track of the number (and type) of references to the value it contains at runtime. +If you try to borrow the value mutably while it's already borrowed immutably, +the program will panic, ensuring that Rust's borrowing rules are always enforced. + +```rust +use std::cell::RefCell; + +let x = RefCell::new(42); + +let y = x.borrow(); // Immutable borrow +let z = x.borrow_mut(); // Panics! There is an active immutable borrow. +``` diff --git a/book/src/07_threads/07_ack.md b/book/src/07_threads/07_ack.md new file mode 100644 index 0000000..d526933 --- /dev/null +++ b/book/src/07_threads/07_ack.md @@ -0,0 +1,16 @@ +# Two-way communication + +In our current client-server implementation, communication flows in one direction: from the client to the server.\ +The client has no way of knowing if the server received the message, executed it successfully, or failed. +That's not ideal. + +To solve this issue, we can introduce a two-way communication system. + +## Response channel + +We need a way for the server to send a response back to the client.\ +There are various ways to do this, but the simplest option is to include a `Sender` channel in +the message that the client sends to the server. After processing the message, the server can use +this channel to send a response back to the client. + +This is a fairly common pattern in Rust applications built on top of message-passing primitives. diff --git a/book/src/07_threads/08_client.md b/book/src/07_threads/08_client.md new file mode 100644 index 0000000..dae9692 --- /dev/null +++ b/book/src/07_threads/08_client.md @@ -0,0 +1,8 @@ +# A dedicated `Client` type + +All the interactions from the client side have been fairly low-level: you have to +manually create a response channel, build the command, send it to the server, and +then call `recv` on the response channel to get the response. + +This is a lot of boilerplate code that could be abstracted away, and that's +exactly what we're going to do in this exercise. diff --git a/book/src/07_threads/09_bounded.md b/book/src/07_threads/09_bounded.md new file mode 100644 index 0000000..af20cc8 --- /dev/null +++ b/book/src/07_threads/09_bounded.md @@ -0,0 +1,43 @@ +# Bounded vs unbounded channels + +So far we've been using unbounded channels.\ +You can send as many messages as you want, and the channel will grow to accommodate them.\ +In a multi-producer single-consumer scenario, this can be problematic: if the producers +enqueue messages at a faster rate than the consumer can process them, the channel will +keep growing, potentially consuming all available memory. + +Our recommendation is to **never** use an unbounded channel in a production system.\ +You should always enforce an upper limit on the number of messages that can be enqueued using a +**bounded channel**. + +## Bounded channels + +A bounded channel has a fixed capacity.\ +You can create one by calling `sync_channel` with a capacity greater than zero: + +```rust +use std::sync::mpsc::sync_channel; + +let (sender, receiver) = sync_channel(10); +``` + +`receiver` has the same type as before, `Receiver`.\ +`sender`, instead, is an instance of `SyncSender`. + +### Sending messages + +You have two different methods to send messages through a `SyncSender`: + +- `send`: if there is space in the channel, it will enqueue the message and return `Ok(())`.\ + If the channel is full, it will block and wait until there is space available. +- `try_send`: if there is space in the channel, it will enqueue the message and return `Ok(())`.\ + If the channel is full, it will return `Err(TrySendError::Full(value))`, where `value` is the message that couldn't be sent. + +Depending on your use case, you might want to use one or the other. + +### Backpressure + +The main advantage of using bounded channels is that they provide a form of **backpressure**.\ +They force the producers to slow down if the consumer can't keep up. +The backpressure can then propagate through the system, potentially affecting the whole architecture and +preventing end users from overwhelming the system with requests. diff --git a/book/src/07_threads/10_patch.md b/book/src/07_threads/10_patch.md new file mode 100644 index 0000000..58257e9 --- /dev/null +++ b/book/src/07_threads/10_patch.md @@ -0,0 +1,39 @@ +# Update operations + +So far we've implemented only insertion and retrieval operations.\ +Let's see how we can expand the system to provide an update operation. + +## Legacy updates + +In the non-threaded version of the system, updates were fairly straightforward: `TicketStore` exposed a +`get_mut` method that allowed the caller to obtain a mutable reference to a ticket, and then modify it. + +## Multithreaded updates + +The same strategy won't work in the current multithreaded version. The borrow checker would +stop us: `SyncSender<&mut Ticket>` isn't `'static` because `&mut Ticket` doesn't satisfy the `'static` lifetime, therefore +they can't be captured by the closure that gets passed to `std::thread::spawn`. + +There are a few ways to work around this limitation. We'll explore a few of them in the following exercises. + +### Patching + +We can't send a `&mut Ticket` over a channel, therefore we can't mutate on the client-side.\ +Can we mutate on the server-side? + +We can, if we tell the server what needs to be changed. In other words, if we send a **patch** to the server: + +```rust +struct TicketPatch { + id: TicketId, + title: Option, + description: Option, + status: Option, +} +``` + +The `id` field is mandatory, since it's required to identify the ticket that needs to be updated.\ +All other fields are optional: + +- If a field is `None`, it means that the field should not be changed. +- If a field is `Some(value)`, it means that the field should be changed to `value`. diff --git a/book/src/07_threads/11_locks.md b/book/src/07_threads/11_locks.md new file mode 100644 index 0000000..e0360d0 --- /dev/null +++ b/book/src/07_threads/11_locks.md @@ -0,0 +1,226 @@ +# Locks, `Send` and `Arc` + +The patching strategy you just implemented has a major drawback: it's racy.\ +If two clients send patches for the same ticket roughly at same time, the server will apply them in an arbitrary order. +Whoever enqueues their patch last will overwrite the changes made by the other client. + +## Version numbers + +We could try to fix this by using a **version number**.\ +Each ticket gets assigned a version number upon creation, set to `0`.\ +Whenever a client sends a patch, they must include the current version number of the ticket alongside the +desired changes. The server will only apply the patch if the version number matches the one it has stored. + +In the scenario described above, the server would reject the second patch, because the version number would +have been incremented by the first patch and thus wouldn't match the one sent by the second client. + +This approach is fairly common in distributed systems (e.g. when client and servers don't share memory), +and it is known as **optimistic concurrency control**.\ +The idea is that most of the time, conflicts won't happen, so we can optimize for the common case. +You know enough about Rust by now to implement this strategy on your own as a bonus exercise, if you want to. + +## Locking + +We can also fix the race condition by introducing a **lock**.\ +Whenever a client wants to update a ticket, they must first acquire a lock on it. While the lock is active, +no other client can modify the ticket. + +Rust's standard library provides two different locking primitives: `Mutex` and `RwLock`.\ +Let's start with `Mutex`. It stands for **mut**ual **ex**clusion, and it's the simplest kind of lock: +it allows only one thread to access the data, no matter if it's for reading or writing. + +`Mutex` wraps the data it protects, and it's therefore generic over the type of the data.\ +You can't access the data directly: the type system forces you to acquire a lock first using either `Mutex::lock` or +`Mutex::try_lock`. The former blocks until the lock is acquired, the latter returns immediately with an error if the lock +can't be acquired.\ +Both methods return a guard object that dereferences to the data, allowing you to modify it. The lock is released when +the guard is dropped. + +```rust +use std::sync::Mutex; + +// An integer protected by a mutex lock +let lock = Mutex::new(0); + +// Acquire a lock on the mutex +let mut guard = lock.lock().unwrap(); + +// Modify the data through the guard, +// leveraging its `Deref` implementation +*guard += 1; + +// The lock is released when `data` goes out of scope +// This can be done explicitly by dropping the guard +// or happen implicitly when the guard goes out of scope +drop(guard) +``` + +## Locking granularity + +What should our `Mutex` wrap?\ +The simplest option would be to wrap the entire `TicketStore` in a single `Mutex`.\ +This would work, but it would severely limit the system's performance: you wouldn't be able to read tickets in parallel, +because every read would have to wait for the lock to be released.\ +This is known as **coarse-grained locking**. + +It would be better to use **fine-grained locking**, where each ticket is protected by its own lock. +This way, clients can keep working with tickets in parallel, as long as they aren't trying to access the same ticket. + +```rust +// The new structure, with a lock for each ticket +struct TicketStore { + tickets: BTreeMap>, +} +``` + +This approach is more efficient, but it has a downside: `TicketStore` has to become **aware** of the multithreaded +nature of the system; up until now, `TicketStore` has been blissfully ignoring the existence of threads.\ +Let's go for it anyway. + +## Who holds the lock? + +For the whole scheme to work, the lock must be passed to the client that wants to modify the ticket.\ +The client can then directly modify the ticket (as if they had a `&mut Ticket`) and release the lock when they're done. + +This is a bit tricky.\ +We can't send a `Mutex` over a channel, because `Mutex` is not `Clone` and +we can't move it out of the `TicketStore`. Could we send the `MutexGuard` instead? + +Let's test the idea with a small example: + +```rust +use std::thread::spawn; +use std::sync::Mutex; +use std::sync::mpsc::sync_channel; + +fn main() { + let lock = Mutex::new(0); + let (sender, receiver) = sync_channel(1); + let guard = lock.lock().unwrap(); + + spawn(move || { + receiver.recv().unwrap(); + }); + + // Try to send the guard over the channel + // to another thread + sender.send(guard); +} +``` + +The compiler is not happy with this code: + +```text +error[E0277]: `MutexGuard<'_, i32>` cannot be sent between + threads safely + --> src/main.rs:10:7 + | +10 | spawn(move || { + | _-----_^ + | | | + | | required by a bound introduced by this call +11 | | receiver.recv().unwrap(); +12 | | }); + | |_^ `MutexGuard<'_, i32>` cannot be sent between threads safely + | + = help: the trait `Send` is not implemented for + `MutexGuard<'_, i32>`, which is required by + `{closure@src/main.rs:10:7: 10:14}: Send` + = note: required for `Receiver>` + to implement `Send` +note: required because it's used within this closure +``` + +`MutexGuard<'_, i32>` is not `Send`: what does it mean? + +## `Send` + +`Send` is a marker trait that indicates that a type can be safely transferred from one thread to another.\ +`Send` is also an auto-trait, just like `Sized`; it's automatically implemented (or not implemented) for your type +by the compiler, based on its definition.\ +You can also implement `Send` manually for your types, but it requires `unsafe` since you have to guarantee that the +type is indeed safe to send between threads for reasons that the compiler can't automatically verify. + +### Channel requirements + +`Sender`, `SyncSender` and `Receiver` are `Send` if and only if `T` is `Send`.\ +That's because they are used to send values between threads, and if the value itself is not `Send`, it would be +unsafe to send it between threads. + +### `MutexGuard` + +`MutexGuard` is not `Send` because the underlying operating system primitives that `Mutex` uses to implement +the lock require (on some platforms) that the lock must be released by the same thread that acquired it.\ +If we were to send a `MutexGuard` to another thread, the lock would be released by a different thread, which would +lead to undefined behavior. + +## Our challenges + +Summing it up: + +- We can't send a `MutexGuard` over a channel. So we can't lock on the server-side and then modify the ticket on the + client-side. +- We can send a `Mutex` over a channel because it's `Send` as long as the data it protects is `Send`, which is the + case for `Ticket`. + At the same time, we can't move the `Mutex` out of the `TicketStore` nor clone it. + +How can we solve this conundrum?\ +We need to look at the problem from a different angle. +To lock a `Mutex`, we don't need an owned value. A shared reference is enough, since `Mutex` uses internal mutability: + +```rust +impl Mutex { + // `&self`, not `self`! + pub fn lock(&self) -> LockResult> { + // Implementation details + } +} +``` + +It is therefore enough to send a shared reference to the client.\ +We can't do that directly, though, because the reference would have to be `'static` and that's not the case.\ +In a way, we need an "owned shared reference". It turns out that Rust has a type that fits the bill: `Arc`. + +## `Arc` to the rescue + +`Arc` stands for **atomic reference counting**.\ +`Arc` wraps around a value and keeps track of how many references to the value exist. +When the last reference is dropped, the value is deallocated.\ +The value wrapped in an `Arc` is immutable: you can only get shared references to it. + +```rust +use std::sync::Arc; + +let data: Arc = Arc::new(0); +let data_clone = Arc::clone(&data); + +// `Arc` implements `Deref`, so can convert +// a `&Arc` to a `&T` using deref coercion +let data_ref: &u32 = &data; +``` + +If you're having a déjà vu moment, you're right: `Arc` sounds very similar to `Rc`, the reference-counted pointer we +introduced when talking about interior mutability. The difference is thread-safety: `Rc` is not `Send`, while `Arc` is. +It boils down to the way the reference count is implemented: `Rc` uses a "normal" integer, while `Arc` uses an +**atomic** integer, which can be safely shared and modified across threads. + +## `Arc>` + +If we pair `Arc` with `Mutex`, we finally get a type that: + +- Can be sent between threads, because: + - `Arc` is `Send` if `T` is `Send`, and + - `Mutex` is `Send` if `T` is `Send`. + - `T` is `Ticket`, which is `Send`. +- Can be cloned, because `Arc` is `Clone` no matter what `T` is. + Cloning an `Arc` increments the reference count, the data is not copied. +- Can be used to modify the data it wraps, because `Arc` lets you get a shared + reference to `Mutex` which can in turn be used to acquire a lock. + +We have all the pieces we need to implement the locking strategy for our ticket store. + +## Further reading + +- We won't be covering the details of atomic operations in this course, but you can find more information + [in the `std` documentation](https://doc.rust-lang.org/std/sync/atomic/index.html) as well as in the + ["Rust atomics and locks" book](https://marabos.nl/atomics/). diff --git a/book/src/07_threads/12_rw_lock.md b/book/src/07_threads/12_rw_lock.md new file mode 100644 index 0000000..e8201ff --- /dev/null +++ b/book/src/07_threads/12_rw_lock.md @@ -0,0 +1,45 @@ +# Readers and writers + +Our new `TicketStore` works, but its read performance is not great: there can only be one client at a time +reading a specific ticket, because `Mutex` doesn't distinguish between readers and writers. + +We can solve the issue by using a different locking primitive: `RwLock`.\ +`RwLock` stands for **read-write lock**. It allows **multiple readers** to access the data simultaneously, +but only one writer at a time. + +`RwLock` has two methods to acquire a lock: `read` and `write`.\ +`read` returns a guard that allows you to read the data, while `write` returns a guard that allows you to modify it. + +```rust +use std::sync::RwLock; + +// An integer protected by a read-write lock +let lock = RwLock::new(0); + +// Acquire a read lock on the RwLock +let guard1 = lock.read().unwrap(); + +// Acquire a **second** read lock +// while the first one is still active +let guard2 = lock.read().unwrap(); +``` + +## Trade-offs + +On the surface, `RwLock` seems like a no-brainer: it provides a superset of the functionality of `Mutex`. +Why would you ever use `Mutex` if you can use `RwLock` instead? + +There are two key reasons: + +- Locking a `RwLock` is more expensive than locking a `Mutex`.\ + This is because `RwLock` has to keep track of the number of active readers and writers, while `Mutex` + only has to keep track of whether the lock is held or not. + This performance overhead is not an issue if there are more readers than writers, but if the workload + is write-heavy `Mutex` might be a better choice. +- `RwLock` can cause **writer starvation**.\ + If there are always readers waiting to acquire the lock, writers might never get a chance to run.\ + `RwLock` doesn't provide any guarantees about the order in which readers and writers are granted access to the lock. + It depends on the policy implemented by the underlying OS, which might not be fair to writers. + +In our case, we can expect the workload to be read-heavy (since most clients will be reading tickets, not modifying them), +so `RwLock` is a good choice. diff --git a/book/src/07_threads/13_without_channels.md b/book/src/07_threads/13_without_channels.md new file mode 100644 index 0000000..0c5774a --- /dev/null +++ b/book/src/07_threads/13_without_channels.md @@ -0,0 +1,54 @@ +# Design review + +Let's take a moment to review the journey we've been through. + +## Lockless with channel serialization + +Our first implementation of a multithreaded ticket store used: + +- a single long-lived thread (server), to hold the shared state +- multiple clients sending requests to it via channels from their own threads. + +No locking of the state was necessary, since the server was the only one modifying the state. That's because +the "inbox" channel naturally **serialized** incoming requests: the server would process them one by one.\ +We've already discussed the limitations of this approach when it comes to patching behaviour, but we didn't +discuss the performance implications of the original design: the server could only process one request at a time, +including reads. + +## Fine-grained locking + +We then moved to a more sophisticated design, where each ticket was protected by its own lock and +clients could independently decide if they wanted to read or atomically modify a ticket, acquiring the appropriate lock. + +This design allows for better parallelism (i.e. multiple clients can read tickets at the same time), but it is +still fundamentally **serial**: the server processes commands one by one. In particular, it hands out locks to clients +one by one. + +Could we remove the channels entirely and allow clients to directly access the `TicketStore`, relying exclusively on +locks to synchronize access? + +## Removing channels + +We have two problems to solve: + +- Sharing `TicketStore` across threads +- Synchronizing access to the store + +### Sharing `TicketStore` across threads + +We want all threads to refer to the same state, otherwise we don't really have a multithreaded system—we're just +running multiple single-threaded systems in parallel.\ +We've already encountered this problem when we tried to share a lock across threads: we can use an `Arc`. + +### Synchronizing access to the store + +There is one interaction that's still lockless thanks to the serialization provided by the channels: inserting +(or removing) a ticket from the store.\ +If we remove the channels, we need to introduce (another) lock to synchronize access to the `TicketStore` itself. + +If we use a `Mutex`, then it makes no sense to use an additional `RwLock` for each ticket: the `Mutex` will +already serialize access to the entire store, so we wouldn't be able to read tickets in parallel anyway.\ +If we use a `RwLock`, instead, we can read tickets in parallel. We just need to pause all reads while inserting +or removing a ticket. + +Let's go down this path and see where it leads us. diff --git a/book/src/07_threads/14_sync.md b/book/src/07_threads/14_sync.md new file mode 100644 index 0000000..2dc7d3f --- /dev/null +++ b/book/src/07_threads/14_sync.md @@ -0,0 +1,28 @@ +# `Sync` + +Before we wrap up this chapter, let's talk about another key trait in Rust's standard library: `Sync`. + +`Sync` is an auto trait, just like `Send`.\ +It is automatically implemented by all types that can be safely **shared** between threads. + +In order words: `T` is Sync if `&T` is `Send`. + +## `T: Sync` doesn't imply `T: Send` + +It's important to note that `T` can be `Sync` without being `Send`.\ +For example: `MutexGuard` is not `Send`, but it is `Sync`. + +It isn't `Send` because the lock must be released on the same thread that acquired it, therefore we don't +want `MutexGuard` to be dropped on a different thread.\ +But it is `Sync`, because giving a `&MutexGuard` to another thread has no impact on where the lock is released. + +## `T: Send` doesn't imply `T: Sync` + +The opposite is also true: `T` can be `Send` without being `Sync`.\ +For example: `RefCell` is `Send` (if `T` is `Send`), but it is not `Sync`. + +`RefCell` performs runtime borrow checking, but the counters it uses to track borrows are not thread-safe. +Therefore, having multiple threads holding a `&RefCell` would lead to a data race, with potentially +multiple threads obtaining mutable references to the same data. Hence `RefCell` is not `Sync`.\ +`Send` is fine, instead, because when we send a `RefCell` to another thread we're not +leaving behind any references to the data it contains, hence no risk of concurrent mutable access. diff --git a/book/src/08_futures/00_intro.md b/book/src/08_futures/00_intro.md new file mode 100644 index 0000000..d5feffc --- /dev/null +++ b/book/src/08_futures/00_intro.md @@ -0,0 +1,11 @@ +# Async Rust + +Threads are not the only way to write concurrent programs in Rust.\ +In this chapter we'll explore another approach: **asynchronous programming**. + +In particular, you'll get an introduction to: + +- The `async`/`.await` keywords, to write asynchronous code effortlessly +- The `Future` trait, to represent computations that may not be complete yet +- `tokio`, the most popular runtime for running asynchronous code +- The cooperative nature of Rust asynchronous model, and how this affects your code diff --git a/book/src/08_futures/01_async_fn.md b/book/src/08_futures/01_async_fn.md new file mode 100644 index 0000000..cf0ed4e --- /dev/null +++ b/book/src/08_futures/01_async_fn.md @@ -0,0 +1,144 @@ +# Asynchronous functions + +All the functions and methods you've written so far were eager.\ +Nothing happened until you invoked them. But once you did, they ran to +completion: they did **all** their work, and then returned their output. + +Sometimes that's undesirable.\ +For example, if you're writing an HTTP server, there might be a lot of +**waiting**: waiting for the request body to arrive, waiting for the +database to respond, waiting for a downstream service to reply, etc. + +What if you could do something else while you're waiting?\ +What if you could choose to give up midway through a computation?\ +What if you could choose to prioritise another task over the current one? + +That's where **asynchronous functions** come in. + +## `async fn` + +You use the `async` keyword to define an asynchronous function: + +```rust +use tokio::net::TcpListener; + +// This function is asynchronous +async fn bind_random() -> TcpListener { + // [...] +} +``` + +What happens if you call `bind_random` as you would a regular function? + +```rust +fn run() { + // Invoke `bind_random` + let listener = bind_random(); + // Now what? +} +``` + +Nothing happens!\ +Rust doesn't start executing `bind_random` when you call it, +not even as a background task (as you might expect based on your experience +with other languages). +Asynchronous functions in Rust are **lazy**: they don't do any work until you +explicitly ask them to. +Using Rust's terminology, we say that `bind_random` returns a **future**, a type +that represents a computation that may complete later. They're called futures +because they implement the `Future` trait, an interface that we'll examine in +detail later on in this chapter. + +## `.await` + +The most common way to ask an asynchronous function to do some work is to use +the `.await` keyword: + +```rust +use tokio::net::TcpListener; + +async fn bind_random() -> TcpListener { + // [...] +} + +async fn run() { + // Invoke `bind_random` and wait for it to complete + let listener = bind_random().await; + // Now `listener` is ready +} +``` + +`.await` doesn't return control to the caller until the asynchronous function +has run to completion—e.g. until the `TcpListener` has been created in the example above. + +## Runtimes + +If you're puzzled, you're right to be!\ +We've just said that the perk of asynchronous functions +is that they don't do **all** their work at once. We then introduced `.await`, which +doesn't return until the asynchronous function has run to completion. Haven't we +just re-introduced the problem we were trying to solve? What's the point? + +Not quite! A lot happens behind the scenes when you call `.await`!\ +You're yielding control to an **async runtime**, also known as an **async executor**. +Executors are where the magic happens: they are in charge of managing all your +ongoing asynchronous **tasks**. In particular, they balance two different goals: + +- **Progress**: they make sure that tasks make progress whenever they can. +- **Efficiency**: if a task is waiting for something, they try to make sure that + another task can run in the meantime, fully utilising the available resources. + +### No default runtime + +Rust is fairly unique in its approach to asynchronous programing: there is +no default runtime. The standard library doesn't ship with one. You need to +bring your own! + +In most cases, you'll choose one of the options available in the ecosystem. +Some runtimes are designed to be broadly applicable, a solid option for most applications. +`tokio` and `async-std` belong to this category. Other runtimes are optimised for +specific use cases—e.g. `embassy` for embedded systems. + +Throughout this course we'll rely on `tokio`, the most popular runtime for general-purpose +asynchronous programming in Rust. + +### `#[tokio::main]` + +The entrypoint of your executable, the `main` function, must be a synchronous function. +That's where you're supposed to set up and launch your chosen async runtime. + +Most runtimes provide a macro to make this easier. For `tokio`, it's `tokio::main`: + +```rust +#[tokio::main] +async fn main() { + // Your async code goes here +} +``` + +which expands to: + +```rust +fn main() { + let rt = tokio::runtime::Runtime::new().unwrap(); + rt.block_on( + // Your async function goes here + // [...] + ); +} +``` + +### `#[tokio::test]` + +The same goes for tests: they must be synchronous functions.\ +Each test function is run in its own thread, and you're responsible for +setting up and launching an async runtime if you need to run async code +in your tests.\ +`tokio` provides a `#[tokio::test]` macro to make this easier: + +```rust +#[tokio::test] +async fn my_test() { + // Your async test code goes here +} +``` diff --git a/book/src/08_futures/02_spawn.md b/book/src/08_futures/02_spawn.md new file mode 100644 index 0000000..369911e --- /dev/null +++ b/book/src/08_futures/02_spawn.md @@ -0,0 +1,122 @@ +# Spawning tasks + +Your solution to the previous exercise should look something like this: + +```rust +pub async fn echo(listener: TcpListener) -> Result<(), anyhow::Error> { + loop { + let (mut socket, _) = listener.accept().await?; + let (mut reader, mut writer) = socket.split(); + tokio::io::copy(&mut reader, &mut writer).await?; + } +} +``` + +This is not bad!\ +If a long time passes between two incoming connections, the `echo` function will be idle +(since `TcpListener::accept` is an asynchronous function), thus allowing the executor +to run other tasks in the meantime. + +But how can we actually have multiple tasks running concurrently?\ +If we always run our asynchronous functions until completion (by using `.await`), we'll never +have more than one task running at a time. + +This is where the `tokio::spawn` function comes in. + +## `tokio::spawn` + +`tokio::spawn` allows you to hand off a task to the executor, **without waiting for it to complete**.\ +Whenever you invoke `tokio::spawn`, you're telling `tokio` to continue running +the spawned task, in the background, **concurrently** with the task that spawned it. + +Here's how you can use it to process multiple connections concurrently: + +```rust +use tokio::net::TcpListener; + +pub async fn echo(listener: TcpListener) -> Result<(), anyhow::Error> { + loop { + let (mut socket, _) = listener.accept().await?; + // Spawn a background task to handle the connection + // thus allowing the main task to immediately start + // accepting new connections + tokio::spawn(async move { + let (mut reader, mut writer) = socket.split(); + tokio::io::copy(&mut reader, &mut writer).await?; + }); + } +} +``` + +### Asynchronous blocks + +In this example, we've passed an **asynchronous block** to `tokio::spawn`: `async move { /* */ }` +Asynchronous blocks are a quick way to mark a region of code as asynchronous without having +to define a separate async function. + +### `JoinHandle` + +`tokio::spawn` returns a `JoinHandle`.\ +You can use `JoinHandle` to `.await` the background task, in the same way +we used `join` for spawned threads. + +```rust +pub async fn run() { + // Spawn a background task to ship telemetry data + // to a remote server + let handle = tokio::spawn(emit_telemetry()); + // In the meantime, do some other useful work + do_work().await; + // But don't return to the caller until + // the telemetry data has been successfully delivered + handle.await; +} + +pub async fn emit_telemetry() { + // [...] +} + +pub async fn do_work() { + // [...] +} +``` + +### Panic boundary + +If a task spawned with `tokio::spawn` panics, the panic will be caught by the executor.\ +If you don't `.await` the corresponding `JoinHandle`, the panic won't be propagated to the spawner. +Even if you do `.await` the `JoinHandle`, the panic won't be propagated automatically. +Awaiting a `JoinHandle` returns a `Result`, with [`JoinError`](https://docs.rs/tokio/latest/tokio/task/struct.JoinError.html) +as its error type. You can then check if the task panicked by calling `JoinError::is_panic` and +choose what to do with the panic—either log it, ignore it, or propagate it. + +```rust +use tokio::task::JoinError; + +pub async fn run() { + let handle = tokio::spawn(work()); + if let Err(e) = handle.await { + if let Ok(reason) = e.try_into_panic() { + // The task has panicked + // We resume unwinding the panic, + // thus propagating it to the current task + panic::resume_unwind(reason); + } + } +} + +pub async fn work() { + // [...] +} +``` + +### `std::thread::spawn` vs `tokio::spawn` + +You can think of `tokio::spawn` as the asynchronous sibling of `std::thread::spawn`. + +Notice a key difference: with `std::thread::spawn`, you're delegating control to the OS scheduler. +You're not in control of how threads are scheduled. + +With `tokio::spawn`, you're delegating to an async executor that runs entirely in +user space. The underlying OS scheduler is not involved in the decision of which task +to run next. We're in charge of that decision now, via the executor we chose to use. diff --git a/book/src/08_futures/03_runtime.md b/book/src/08_futures/03_runtime.md new file mode 100644 index 0000000..17f528d --- /dev/null +++ b/book/src/08_futures/03_runtime.md @@ -0,0 +1,88 @@ +# Runtime architecture + +So far we've been talking about async runtimes as an abstract concept. +Let's dig a bit deeper into the way they are implemented—as you'll see soon enough, +it has an impact on our code. + +## Flavors + +`tokio` ships two different runtime _flavors_. + +You can configure your runtime via `tokio::runtime::Builder`: + +- `Builder::new_multi_thread` gives you a **multithreaded `tokio` runtime** +- `Builder::new_current_thread` will instead rely on the **current thread** for execution. + +`#[tokio::main]` returns a multithreaded runtime by default, while +`#[tokio::test]` uses a current thread runtime out of the box. + +### Current thread runtime + +The current-thread runtime, as the name implies, relies exclusively on the OS thread +it was launched on to schedule and execute tasks.\ +When using the current-thread runtime, you have **concurrency** but no **parallelism**: +asynchronous tasks will be interleaved, but there will always be at most one task running +at any given time. + +### Multithreaded runtime + +When using the multithreaded runtime, instead, there can be up to `N` tasks running +_in parallel_ at any given time, where `N` is the number of threads used by the +runtime. By default, `N` matches the number of available CPU cores. + +There's more: `tokio` performs **work-stealing**.\ +If a thread is idle, it won't wait around: it'll try to find a new task that's ready for +execution, either from a global queue or by stealing it from the local queue of another +thread.\ +Work-stealing can have significant performance benefits, especially on tail latencies, +whenever your application is dealing with workloads that are not perfectly balanced +across threads. + +## Implications + +`tokio::spawn` is flavor-agnostic: it'll work no matter if you're running on the multithreaded +or current-thread runtime. The downside is that the signature assumes the worst case +(i.e. multithreaded) and is constrained accordingly: + +```rust +pub fn spawn(future: F) -> JoinHandle +where + F: Future + Send + 'static, + F::Output: Send + 'static, +{ /* */ } +``` + +Let's ignore the `Future` trait for now to focus on the rest.\ +`spawn` is asking all its inputs to be `Send` and have a `'static` lifetime. + +The `'static` constraint follows the same rationale of the `'static` constraint +on `std::thread::spawn`: the spawned task may outlive the context it was spawned +from, therefore it shouldn't depend on any local data that may be de-allocated +after the spawning context is destroyed. + +```rust +fn spawner() { + let v = vec![1, 2, 3]; + // This won't work, since `&v` doesn't + // live long enough. + tokio::spawn(async { + for x in &v { + println!("{x}") + } + }) +} +``` + +`Send`, on the other hand, is a direct consequence of `tokio`'s work-stealing strategy: +a task that was spawned on thread `A` may end up being moved to thread `B` if that's idle, +thus requiring a `Send` bound since we're crossing thread boundaries. + +```rust +fn spawner(input: Rc) { + // This won't work either, because + // `Rc` isn't `Send`. + tokio::spawn(async move { + println!("{}", input); + }) +} +``` diff --git a/book/src/08_futures/04_future.md b/book/src/08_futures/04_future.md new file mode 100644 index 0000000..987147e --- /dev/null +++ b/book/src/08_futures/04_future.md @@ -0,0 +1,170 @@ +# The `Future` trait + +## The local `Rc` problem + +Let's go back to `tokio::spawn`'s signature: + +```rust +pub fn spawn(future: F) -> JoinHandle + where + F: Future + Send + 'static, + F::Output: Send + 'static, +{ /* */ } +``` + +What does it _actually_ mean for `F` to be `Send`?\ +It implies, as we saw in the previous section, that whatever value it captures from the +spawning environment has to be `Send`. But it goes further than that. + +Any value that's _held across a .await point_ has to be `Send`.\ +Let's look at an example: + +```rust +use std::rc::Rc; +use tokio::task::yield_now; + +fn spawner() { + tokio::spawn(example()); +} + +async fn example() { + // A value that's not `Send`, + // created _inside_ the async function + let non_send = Rc::new(1); + + // A `.await` point that does nothing + yield_now().await; + + // The local non-`Send` value is still needed + // after the `.await` + println!("{}", non_send); +} +``` + +The compiler will reject this code: + +```text +error: future cannot be sent between threads safely + | +5 | tokio::spawn(example()); + | ^^^^^^^^^ + | future returned by `example` is not `Send` + | +note: future is not `Send` as this value is used across an await + | +11 | let non_send = Rc::new(1); + | -------- has type `Rc` which is not `Send` +12 | // A `.await` point +13 | yield_now().await; + | ^^^^^ + | await occurs here, with `non_send` maybe used later +note: required by a bound in `tokio::spawn` + | +164 | pub fn spawn(future: F) -> JoinHandle + | ----- required by a bound in this function +165 | where +166 | F: Future + Send + 'static, + | ^^^^ required by this bound in `spawn` +``` + +To understand why that's the case, we need to refine our understanding of +Rust's asynchronous model. + +## The `Future` trait + +We stated early on that `async` functions return **futures**, types that implement +the `Future` trait. You can think of a future as a **state machine**. +It's in one of two states: + +- **pending**: the computation has not finished yet. +- **ready**: the computation has finished, here's the output. + +This is encoded in the trait definition: + +```rust +trait Future { + type Output; + + // Ignore `Pin` and `Context` for now + fn poll( + self: Pin<&mut Self>, + cx: &mut Context<'_> + ) -> Poll; +} +``` + +### `poll` + +The `poll` method is the heart of the `Future` trait.\ +A future on its own doesn't do anything. It needs to be **polled** to make progress.\ +When you call `poll`, you're asking the future to do some work. +`poll` tries to make progress, and then returns one of the following: + +- `Poll::Pending`: the future is not ready yet. You need to call `poll` again later. +- `Poll::Ready(value)`: the future has finished. `value` is the result of the computation, + of type `Self::Output`. + +Once `Future::poll` returns `Poll::Ready`, it should not be polled again: the future has +completed, there's nothing left to do. + +### The role of the runtime + +You'll rarely, if ever, be calling poll directly.\ +That's the job of your async runtime: it has all the required information (the `Context` +in `poll`'s signature) to ensure that your futures are making progress whenever they can. + +## `async fn` and futures + +We've worked with the high-level interface, asynchronous functions.\ +We've now looked at the low-level primitive, the `Future trait`. + +How are they related? + +Every time you mark a function as asynchronous, that function will return a future. +The compiler will transform the body of your asynchronous function into a **state machine**: +one state for each `.await` point. + +Going back to our `Rc` example: + +```rust +use std::rc::Rc; +use tokio::task::yield_now; + +async fn example() { + let non_send = Rc::new(1); + yield_now().await; + println!("{}", non_send); +} +``` + +The compiler would transform it into an enum that looks somewhat like this: + +```rust +pub enum ExampleFuture { + NotStarted, + YieldNow(Rc), + Terminated, +} +``` + +When `example` is called, it returns `ExampleFuture::NotStarted`. The future has never +been polled yet, so nothing has happened.\ +When the runtime polls it the first time, `ExampleFuture` will advance until the next +`.await` point: it'll stop at the `ExampleFuture::YieldNow(Rc)` stage of the state +machine, returning `Poll::Pending`.\ +When it's polled again, it'll execute the remaining code (`println!`) and +return `Poll::Ready(())`. + +When you look at its state machine representation, `ExampleFuture`, +it is now clear why `example` is not `Send`: it holds an `Rc`, therefore +it cannot be `Send`. + +## Yield points + +As you've just seen with `example`, every `.await` point creates a new intermediate +state in the lifecycle of a future.\ +That's why `.await` points are also known as **yield points**: your future _yields control_ +back to the runtime that was polling it, allowing the runtime to pause it and (if necessary) +schedule another task for execution, thus making progress on multiple fronts concurrently. + +We'll come back to the importance of yielding in a later section. diff --git a/book/src/08_futures/05_blocking.md b/book/src/08_futures/05_blocking.md new file mode 100644 index 0000000..42b34a2 --- /dev/null +++ b/book/src/08_futures/05_blocking.md @@ -0,0 +1,79 @@ +# Don't block the runtime + +Let's circle back to yield points.\ +Unlike threads, **Rust tasks cannot be preempted**. + +`tokio` cannot, on its own, decide to pause a task and run another one in its place. +The control goes back to the executor **exclusively** when the task yields—i.e. +when `Future::poll` returns `Poll::Pending` or, in the case of `async fn`, when +you `.await` a future. + +This exposes the runtime to a risk: if a task never yields, the runtime will never +be able to run another task. This is called **blocking the runtime**. + +## What is blocking? + +How long is too long? How much time can a task spend without yielding before it +becomes a problem? + +It depends on the runtime, the application, the number of in-flight tasks, and +many other factors. But, as a general rule of thumb, try to spend less than 100 +microseconds between yield points. + +## Consequences + +Blocking the runtime can lead to: + +- **Deadlocks**: if the task that's not yielding is waiting for another task to + complete, and that task is waiting for the first one to yield, you have a deadlock. + No progress can be made, unless the runtime is able to schedule the other task on + a different thread. +- **Starvation**: other tasks might not be able to run, or might run after a long + delay, which can lead to poor performances (e.g. high tail latencies). + +## Blocking is not always obvious + +Some types of operations should generally be avoided in async code, like: + +- Synchronous I/O. You can't predict how long it will take, and it's likely to be + longer than 100 microseconds. +- Expensive CPU-bound computations. + +The latter category is not always obvious though. For example, sorting a vector with +a few elements is not a problem; that evaluation changes if the vector has billions +of entries. + +## How to avoid blocking + +OK, so how do you avoid blocking the runtime assuming you _must_ perform an operation +that qualifies or risks qualifying as blocking?\ +You need to move the work to a different thread. You don't want to use the so-called +runtime threads, the ones used by `tokio` to run tasks. + +`tokio` provides a dedicated threadpool for this purpose, called the **blocking pool**. +You can spawn a synchronous operation on the blocking pool using the +`tokio::task::spawn_blocking` function. `spawn_blocking` returns a future that resolves +to the result of the operation when it completes. + +```rust +use tokio::task; + +fn expensive_computation() -> u64 { + // [...] +} + +async fn run() { + let handle = task::spawn_blocking(expensive_computation); + // Do other stuff in the meantime + let result = handle.await.unwrap(); +} +``` + +The blocking pool is long-lived. `spawn_blocking` should be faster +than creating a new thread directly via `std::thread::spawn` +because the cost of thread initialization is amortized over multiple calls. + +## Further reading + +- Check out [Alice Ryhl's blog post](https://ryhl.io/blog/async-what-is-blocking/) + on the topic. diff --git a/book/src/08_futures/06_async_aware_primitives.md b/book/src/08_futures/06_async_aware_primitives.md new file mode 100644 index 0000000..9360647 --- /dev/null +++ b/book/src/08_futures/06_async_aware_primitives.md @@ -0,0 +1,129 @@ +# Async-aware primitives + +If you browse `tokio`'s documentation, you'll notice that it provides a lot of types +that "mirror" the ones in the standard library, but with an asynchronous twist: +locks, channels, timers, and more. + +When working in an asynchronous context, you should prefer these asynchronous alternatives +to their synchronous counterparts. + +To understand why, let's take a look at `Mutex`, the mutually exclusive lock we explored +in the previous chapter. + +## Case study: `Mutex` + +Let's look at a simple example: + +```rust +use std::sync::{Arc, Mutex}; + +async fn run(m: Arc>>) { + let guard = m.lock().unwrap(); + http_call(&guard).await; + println!("Sent {:?} to the server", &guard); + // `guard` is dropped here +} + +/// Use `v` as the body of an HTTP call. +async fn http_call(v: &[u64]) { + // [...] +} +``` + +### `std::sync::MutexGuard` and yield points + +This code will compile, but it's dangerous. + +We try to acquire a lock over a `Mutex` from `std` in an asynchronous context. +We then hold on to the resulting `MutexGuard` across a yield point (the `.await` on +`http_call`). + +Let's imagine that there are two tasks executing `run`, concurrently, on a single-threaded +runtime. We observe the following sequence of scheduling events: + +```text + Task A Task B + | + Acquire lock +Yields to runtime + | + +--------------+ + | + Tries to acquire lock +``` + +We have a deadlock. Task B will never manage to acquire the lock, because the lock +is currently held by task A, which has yielded to the runtime before releasing the +lock and won't be scheduled again because the runtime cannot preempt task B. + +### `tokio::sync::Mutex` + +You can solve the issue by switching to `tokio::sync::Mutex`: + +```rust +use std::sync::Arc; +use tokio::sync::Mutex; + +async fn run(m: Arc>>) { + let guard = m.lock().await; + http_call(&guard).await; + println!("Sent {:?} to the server", &guard); + // `guard` is dropped here +} +``` + +Acquiring the lock is now an asynchronous operation, which yields back to the runtime +if it can't make progress.\ +Going back to the previous scenario, the following would happen: + +```text + Task A Task B + | + Acquires the lock + Starts `http_call` + Yields to runtime + | + +--------------+ + | + Tries to acquire the lock + Cannot acquire the lock + Yields to runtime + | + +--------------+ + | +`http_call` completes + Releases the lock + Yield to runtime + | + +--------------+ + | + Acquires the lock + [...] +``` + +All good! + +### Multithreaded won't save you + +We've used a single-threaded runtime as the execution context in our +previous example, but the same risk persists even when using a multithreaded +runtime.\ +The only difference is in the number of concurrent tasks required to create the deadlock: +in a single-threaded runtime, 2 are enough; in a multithreaded runtime, we +would need `N+1` tasks, where `N` is the number of runtime threads. + +### Downsides + +Having an async-aware `Mutex` comes with a performance penalty.\ +If you're confident that the lock isn't under significant contention +_and_ you're careful to never hold it across a yield point, you can +still use `std::sync::Mutex` in an asynchronous context. + +But weigh the performance benefit against the liveness risk you +will incur. + +## Other primitives + +We used `Mutex` as an example, but the same applies to `RwLock`, semaphores, etc.\ +Prefer async-aware versions when working in an asynchronous context to minimise +the risk of issues. diff --git a/book/src/08_futures/07_cancellation.md b/book/src/08_futures/07_cancellation.md new file mode 100644 index 0000000..197e605 --- /dev/null +++ b/book/src/08_futures/07_cancellation.md @@ -0,0 +1,109 @@ +# Cancellation + +What happens when a pending future is dropped?\ +The runtime will no longer poll it, therefore it won't make any further progress. +In other words, its execution has been **cancelled**. + +In the wild, this often happens when working with timeouts. +For example: + +```rust +use tokio::time::timeout; +use tokio::sync::oneshot; +use std::time::Duration; + +async fn http_call() { + // [...] +} + +async fn run() { + // Wrap the future with a `Timeout` set to expire in 10 milliseconds. + let duration = Duration::from_millis(10); + if let Err(_) = timeout(duration, http_call()).await { + println!("Didn't receive a value within 10 ms"); + } +} +``` + +When the timeout expires, the future returned by `http_call` will be cancelled. +Let's imagine that this is `http_call`'s body: + +```rust +use std::net::TcpStream; + +async fn http_call() { + let (stream, _) = TcpStream::connect(/* */).await.unwrap(); + let request: Vec = /* */; + stream.write_all(&request).await.unwrap(); +} +``` + +Each yield point becomes a **cancellation point**.\ +`http_call` can't be preempted by the runtime, so it can only be discarded after +it has yielded control back to the executor via `.await`. +This applies recursively—e.g. `stream.write_all(&request)` is likely to have multiple +yield points in its implementation. It is perfectly possible to see `http_call` pushing +a _partial_ request before being cancelled, thus dropping the connection and never +finishing transmitting the body. + +## Clean up + +Rust's cancellation mechanism is quite powerful—it allows the caller to cancel an ongoing task +without needing any form of cooperation from the task itself.\ +At the same time, this can be quite dangerous. It may be desirable to perform a +**graceful cancellation**, to ensure that some clean-up tasks are performed +before aborting the operation. + +For example, consider this fictional API for a SQL transaction: + +```rust +async fn transfer_money( + connection: SqlConnection, + payer_id: u64, + payee_id: u64, + amount: u64 +) -> Result<(), anyhow::Error> { + let transaction = connection.begin_transaction().await?; + update_balance(payer_id, amount, &transaction).await?; + decrease_balance(payee_id, amount, &transaction).await?; + transaction.commit().await?; +} +``` + +On cancellation, it'd be ideal to explicitly abort the pending transaction rather +than leaving it hanging. +Rust, unfortunately, doesn't provide a bullet-proof mechanism for this kind of +**asynchronous** clean up operations. + +The most common strategy is to rely on the `Drop` trait to schedule the required +clean-up work. This can be by: + +- Spawning a new task on the runtime +- Enqueueing a message on a channel +- Spawning a background thread + +The optimal choice is contextual. + +## Cancelling spawned tasks + +When you spawn a task using `tokio::spawn`, you can no longer drop it; +it belongs to the runtime.\ +Nonetheless, you can use its `JoinHandle` to cancel it if needed: + +```rust +async fn run() { + let handle = tokio::spawn(/* some async task */); + // Cancel the spawned task + handle.abort(); +} +``` + +## Further reading + +- Be extremely careful when using `tokio`'s `select!` macro to "race" two different futures. + Retrying the same task in a loop is dangerous unless you can ensure **cancellation safety**. + Check out [`select!`'s documentation](https://tokio.rs/tokio/tutorial/select) for more details.\ + If you need to interleave two asynchronous streams of data (e.g. a socket and a channel), prefer using + [`StreamExt::merge`](https://docs.rs/tokio-stream/latest/tokio_stream/trait.StreamExt.html#method.merge) instead. +- A [`CancellationToken`](https://docs.rs/tokio-util/latest/tokio_util/sync/struct.CancellationToken.html) may be + preferable to `JoinHandle::abort` in some cases. diff --git a/book/src/08_futures/08_outro.md b/book/src/08_futures/08_outro.md new file mode 100644 index 0000000..ee41b3c --- /dev/null +++ b/book/src/08_futures/08_outro.md @@ -0,0 +1,34 @@ +# Outro + +Rust's asynchronous model is quite powerful, but it does introduce additional +complexity. Take time to know your tools: dive deep into `tokio`'s documentation +and get familiar with its primitives to make the most out of it. + +Keep in mind, as well, that there is ongoing work at the language and `std` level +to streamline and "complete" Rust's asynchronous story. You may experience some +rough edges in your day-to-day work due to some of these missing pieces. + +A few recommendations for a mostly-pain-free async experience: + +- **Pick a runtime and stick to it.**\ + Some primitives (e.g. timers, I/O) are not portable across runtimes. Trying to + mix runtimes is likely to cause you pain. Trying to write code that's runtime + agnostic can significantly increase the complexity of your codebase. Avoid it + if you can. +- **There is no stable `Stream`/`AsyncIterator` interface yet.**\ + An `AsyncIterator` is, conceptually, an iterator that yields new items + asynchronously. There is ongoing design work, but no consensus (yet). + If you're using `tokio`, refer to [`tokio_stream`](https://docs.rs/tokio-stream/latest/tokio_stream/) + as your go-to interface. +- **Be careful with buffering.**\ + It is often the cause of subtle bugs. Check out + ["Barbara battles buffered streams"](https://rust-lang.github.io/wg-async/vision/submitted_stories/status_quo/barbara_battles_buffered_streams.html) + for more details. +- **There is no equivalent of scoped threads for asynchronous tasks**.\ + Check out ["The scoped task trilemma"](https://without.boats/blog/the-scoped-task-trilemma/) + for more details. + +Don't let these caveats scare you: asynchronous Rust is being used effectively +at _massive_ scale (e.g. AWS, Meta) to power foundational services.\ +You will have to master it if you're planning building networked applications +in Rust. diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md new file mode 100644 index 0000000..c1d1eb3 --- /dev/null +++ b/book/src/SUMMARY.md @@ -0,0 +1,109 @@ +# Summary + +- [Welcome](01_intro/00_welcome.md) + - [Syntax](01_intro/01_syntax.md) + +- [A Basic Calculator](02_basic_calculator/00_intro.md) + - [Integers](02_basic_calculator/01_integers.md) + - [Variables](02_basic_calculator/02_variables.md) + - [Branching: `if`/`else`](02_basic_calculator/03_if_else.md) + - [Panics](02_basic_calculator/04_panics.md) + - [Factorial](02_basic_calculator/05_factorial.md) + - [Loops: `while`](02_basic_calculator/06_while.md) + - [Loops: `for`](02_basic_calculator/07_for.md) + - [Overflow and underflow](02_basic_calculator/08_overflow.md) + - [Saturating arithmetic](02_basic_calculator/09_saturating.md) + - [Conversions: `as` casting](02_basic_calculator/10_as_casting.md) + +- [Ticket v1](03_ticket_v1/00_intro.md) + - [Structs](03_ticket_v1/01_struct.md) + - [Validation](03_ticket_v1/02_validation.md) + - [Modules](03_ticket_v1/03_modules.md) + - [Visibility](03_ticket_v1/04_visibility.md) + - [Encapsulation](03_ticket_v1/05_encapsulation.md) + - [Ownership](03_ticket_v1/06_ownership.md) + - [Setters](03_ticket_v1/07_setters.md) + - [Stack](03_ticket_v1/08_stack.md) + - [Heap](03_ticket_v1/09_heap.md) + - [References in memory](03_ticket_v1/10_references_in_memory.md) + - [Destructors](03_ticket_v1/11_destructor.md) + - [Outro](03_ticket_v1/12_outro.md) + +- [Traits](04_traits/00_intro.md) + - [Trait](04_traits/01_trait.md) + - [Orphan rule](04_traits/02_orphan_rule.md) + - [Operator overloading](04_traits/03_operator_overloading.md) + - [Derive macros](04_traits/04_derive.md) + - [Trait bounds](04_traits/05_trait_bounds.md) + - [String slices](04_traits/06_str_slice.md) + - [`Deref` trait](04_traits/07_deref.md) + - [`Sized` trait](04_traits/08_sized.md) + - [`From` trait](04_traits/09_from.md) + - [Associated vs generic types](04_traits/10_assoc_vs_generic.md) + - [`Clone` trait](04_traits/11_clone.md) + - [`Copy` trait](04_traits/12_copy.md) + - [`Drop` trait](04_traits/13_drop.md) + - [Outro](04_traits/14_outro.md) + +- [Ticket v2](05_ticket_v2/00_intro.md) + - [Enums](05_ticket_v2/01_enum.md) + - [Branching: `match`](05_ticket_v2/02_match.md) + - [Variants with data](05_ticket_v2/03_variants_with_data.md) + - [Branching: `if let` and `let/else`](05_ticket_v2/04_if_let.md) + - [Nullability](05_ticket_v2/05_nullability.md) + - [Fallibility](05_ticket_v2/06_fallibility.md) + - [Unwrap](05_ticket_v2/07_unwrap.md) + - [Error enums](05_ticket_v2/08_error_enums.md) + - [`Error` trait](05_ticket_v2/09_error_trait.md) + - [Packages](05_ticket_v2/10_packages.md) + - [Dependencies](05_ticket_v2/11_dependencies.md) + - [`thiserror`](05_ticket_v2/12_thiserror.md) + - [`TryFrom` trait](05_ticket_v2/13_try_from.md) + - [`Error::source`](05_ticket_v2/14_source.md) + - [Outro](05_ticket_v2/15_outro.md) + +- [Ticket Management](06_ticket_management/00_intro.md) + - [Arrays](06_ticket_management/01_arrays.md) + - [Vectors](06_ticket_management/02_vec.md) + - [Resizing](06_ticket_management/03_resizing.md) + - [Iterators](06_ticket_management/04_iterators.md) + - [Iter](06_ticket_management/05_iter.md) + - [Lifetimes](06_ticket_management/06_lifetimes.md) + - [Combinators](06_ticket_management/07_combinators.md) + - [`impl Trait`](06_ticket_management/08_impl_trait.md) + - [`impl Trait`, pt.2](06_ticket_management/09_impl_trait_2.md) + - [Slices](06_ticket_management/10_slices.md) + - [Mutable slices](06_ticket_management/11_mutable_slices.md) + - [Two states](06_ticket_management/12_two_states.md) + - [`Index` trait](06_ticket_management/13_index.md) + - [`IndexMut` trait](06_ticket_management/14_index_mut.md) + - [`HashMap`](06_ticket_management/15_hashmap.md) + - [`BTreeMap`](06_ticket_management/16_btreemap.md) + +- [Threads](07_threads/00_intro.md) + - [Threads](07_threads/01_threads.md) + - [`'static` lifetime](07_threads/02_static.md) + - [Leaking memory](07_threads/03_leak.md) + - [Scoped threads](07_threads/04_scoped_threads.md) + - [Channels](07_threads/05_channels.md) + - [Interior mutability](07_threads/06_interior_mutability.md) + - [Ack pattern](07_threads/07_ack.md) + - [Client](07_threads/08_client.md) + - [Bounded channels](07_threads/09_bounded.md) + - [Patching](07_threads/10_patch.md) + - [`Mutex`, `Send` and `Arc`](07_threads/11_locks.md) + - [`RwLock`](07_threads/12_rw_lock.md) + - [Without channels](07_threads/13_without_channels.md) + - [`Sync` trait](07_threads/14_sync.md) + +- [Futures](08_futures/00_intro.md) + - [Asynchronous functions](08_futures/01_async_fn.md) + - [Spawning tasks](08_futures/02_spawn.md) + - [Runtime](08_futures/03_runtime.md) + - [Future trait](08_futures/04_future.md) + - [Blocking the runtime](08_futures/05_blocking.md) + - [Async-aware primitives](08_futures/06_async_aware_primitives.md) + - [Cancellation](08_futures/07_cancellation.md) + - [Outro](08_futures/08_outro.md) + +* [Going further](going_further.md) diff --git a/book/src/going_further.md b/book/src/going_further.md new file mode 100644 index 0000000..07afaaf --- /dev/null +++ b/book/src/going_further.md @@ -0,0 +1,52 @@ +# Epilogue + +Our tour of Rust ends here.\ +It has been quite extensive, but by no means exhaustive: Rust is a language with +a large surface area, and an even larger ecosystem!\ +Don't let this scare you, though: there's **no need to learn everything**. +You'll pick up whatever is necessary to be effective in the domain +(backend, embedded, CLIs, GUIs, etc.) **while working on your projects**. + +In the end, there are no shortcuts: if you want to get good at something, +you need to do it, over and over again. Throughout this course you wrote a fair +amount of Rust, enough to get the language and its syntax flowing under your +fingers. It'll take many more lines of code to feel it "yours", but that moment +will come without a doubt if you keep practicing. + +## Going further + +Let's close with some pointers to additional resources that you might find +useful as you move forward in your journey with Rust. + +### Exercises + +You can find more exercises to practice Rust in the [`rustlings`](https://github.com/rust-lang/rustlings) +project and on [exercism.io](https://exercism.io)'s Rust track. + +### Introductory material + +Check out [the Rust book](https://doc.rust-lang.org/book/title-page.html) and +["Programming Rust"](https://www.oreilly.com/library/view/programming-rust-2nd/9781492052586/) +if you're looking for a different perspective on the same concepts we covered throughout this course. +You'll certainly learn something new since they don't cover exactly the same topics; Rust has a lot of surface area! + +### Advanced material + +If you want to dive deeper into the language, refer to the [Rustonomicon](https://doc.rust-lang.org/nomicon/) +and ["Rust for Rustaceans"](https://nostarch.com/rust-rustaceans).\ +The ["Decrusted" series](https://www.youtube.com/playlist?list=PLqbS7AVVErFirH9armw8yXlE6dacF-A6z) is another excellent +resource to learn more about the internals of many of the most popular Rust libraries. + +### Domain-specific material + +If you want to use Rust for backend development, +check out ["Zero to Production in Rust"](https://zero2prod.com).\ +If you want to use Rust for embedded development, +check out the [Embedded Rust book](https://docs.rust-embedded.org/book/). + +### Masterclasses + +You can then find resources on key topics that cut across domains.\ +For testing, check out +["Advanced testing, going beyond the basics"](https://rust-exercises.com/advanced-testing/).\ +For telemetry, check out ["You can't fix what you can't see"](https://rust-exercises.com/telemetry/). diff --git a/dprint.json b/dprint.json new file mode 100644 index 0000000..86cedb3 --- /dev/null +++ b/dprint.json @@ -0,0 +1,11 @@ +{ + "markdown": { + }, + "toml": { + }, + "excludes": [], + "plugins": [ + "https://plugins.dprint.dev/markdown-0.17.0.wasm", + "https://plugins.dprint.dev/toml-0.6.1.wasm" + ] +} diff --git a/exercises/01_intro/00_welcome/Cargo.toml b/exercises/01_intro/00_welcome/Cargo.toml new file mode 100644 index 0000000..b32cad9 --- /dev/null +++ b/exercises/01_intro/00_welcome/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "welcome_00" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/01_intro/00_welcome/src/lib.rs b/exercises/01_intro/00_welcome/src/lib.rs new file mode 100644 index 0000000..e0f1fc2 --- /dev/null +++ b/exercises/01_intro/00_welcome/src/lib.rs @@ -0,0 +1,46 @@ +// This is a Rust file. It is a plain text file with a `.rs` extension. +// +// Like most modern programming languages, Rust supports comments. You're looking at one right now! +// Comments are ignored by the compiler; you can leverage them to annotate code with notes and +// explanations. +// There are various ways to write comments in Rust, each with its own purpose. +// For now we'll stick to the most common one: the line comment. +// Everything from `//` to the end of the line is considered a comment. + +// Exercises will include `TODO`, `todo!()` or `__` markers to draw your attention to the lines +// where you need to write code. +// You'll need to replace these markers with your own code to complete the exercise. +// Sometimes it'll be enough to write a single line of code, other times you'll have to write +// longer sections. +// +// If you get stuck for more than 10 minutes on an exercise, grab a trainer! We're here to help! +// You can also find solutions to all exercises in the `solutions` git branch. +fn greeting() -> &'static str { + // TODO: fix me 👇 + "I'm ready to learn Rust!" +} + +// Your solutions will be automatically verified by a set of tests. +// You can run these tests directly by invoking the `cargo test` command in your terminal, +// from the root of this exercise's directory. That's what the `wr` command does for you +// under the hood. +// +// Rust lets you write tests alongside your code. +// The `#[cfg(test)]` attribute tells the compiler to only compile the code below when +// running tests (i.e. when you run `cargo test`). +// You'll learn more about attributes and testing later in the course. +// For now, just know that you need to look for the `#[cfg(test)]` attribute to find the tests +// that will be verifying the correctness of your solutions! +// +// ⚠️ **DO NOT MODIFY THE TESTS** ⚠️ +// They are there to help you validate your solutions. You should only change the code that's being +// tested, not the tests themselves. +#[cfg(test)] +mod tests { + use crate::greeting; + + #[test] + fn test_welcome() { + assert_eq!(greeting(), "I'm ready to learn Rust!"); + } +} diff --git a/exercises/01_intro/01_syntax/Cargo.toml b/exercises/01_intro/01_syntax/Cargo.toml new file mode 100644 index 0000000..1c50ba8 --- /dev/null +++ b/exercises/01_intro/01_syntax/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "syntax" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/01_intro/01_syntax/src/lib.rs b/exercises/01_intro/01_syntax/src/lib.rs new file mode 100644 index 0000000..1845605 --- /dev/null +++ b/exercises/01_intro/01_syntax/src/lib.rs @@ -0,0 +1,19 @@ +// TODO: fix the function signature below to make the tests pass. +// Make sure to read the compiler error message—the Rust compiler is your pair programming +// partner in this course and it'll often guide you in the right direction! +// +// The input parameters should have the same type of the return type. +fn compute(a: u32, b: u32) -> u32 { + // Don't touch the function body. + a + b * 2 +} + +#[cfg(test)] +mod tests { + use crate::compute; + + #[test] + fn case() { + assert_eq!(compute(1, 2), 5); + } +} diff --git a/exercises/02_basic_calculator/00_intro/Cargo.toml b/exercises/02_basic_calculator/00_intro/Cargo.toml new file mode 100644 index 0000000..b90a529 --- /dev/null +++ b/exercises/02_basic_calculator/00_intro/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "intro_01" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/02_basic_calculator/00_intro/src/lib.rs b/exercises/02_basic_calculator/00_intro/src/lib.rs new file mode 100644 index 0000000..03aeb16 --- /dev/null +++ b/exercises/02_basic_calculator/00_intro/src/lib.rs @@ -0,0 +1,14 @@ +fn intro() -> &'static str { + // TODO: fix me 👇 + "I'm ready to __!" +} + +#[cfg(test)] +mod tests { + use crate::intro; + + #[test] + fn test_intro() { + assert_eq!(intro(), "I'm ready to build a calculator in Rust!"); + } +} diff --git a/exercises/02_basic_calculator/01_integers/Cargo.toml b/exercises/02_basic_calculator/01_integers/Cargo.toml new file mode 100644 index 0000000..50e66e9 --- /dev/null +++ b/exercises/02_basic_calculator/01_integers/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "integers" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/02_basic_calculator/01_integers/src/lib.rs b/exercises/02_basic_calculator/01_integers/src/lib.rs new file mode 100644 index 0000000..a87b56f --- /dev/null +++ b/exercises/02_basic_calculator/01_integers/src/lib.rs @@ -0,0 +1,15 @@ +fn compute(a: u32, b: u32) -> u32 { + // TODO: change the line below to fix the compiler error and make the tests pass. + let multiplier: u8 = 4; + a + b * multiplier +} + +#[cfg(test)] +mod tests { + use crate::compute; + + #[test] + fn case() { + assert_eq!(compute(1, 2), 9); + } +} diff --git a/exercises/02_basic_calculator/02_variables/Cargo.toml b/exercises/02_basic_calculator/02_variables/Cargo.toml new file mode 100644 index 0000000..40dde0e --- /dev/null +++ b/exercises/02_basic_calculator/02_variables/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "variables" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/02_basic_calculator/02_variables/src/lib.rs b/exercises/02_basic_calculator/02_variables/src/lib.rs new file mode 100644 index 0000000..e8d1167 --- /dev/null +++ b/exercises/02_basic_calculator/02_variables/src/lib.rs @@ -0,0 +1,34 @@ +// 👇 The lines below, starting with `///`, are called **documentation comments**. +// They attach documentation to the item that follows them. In this case, the `speed` function. +// If you run `cargo doc --open` from this exercise's directory, Rust will generate +// HTML documentation from these comments and open it in your browser. + +/// Given the start and end points of a journey, and the time it took to complete it, +/// calculate the average speed. +pub fn speed(start: u32, end: u32, time_elapsed: u32) -> u32 { + // TODO: define a variable named `distance` with the right value to get tests to pass + // Do you need to annotate the type of `distance`? Why or why not? + + // Don't change the line below + distance / time_elapsed +} + +#[cfg(test)] +mod tests { + use crate::speed; + + #[test] + fn case1() { + assert_eq!(speed(0, 10, 10), 1); + } + + #[test] + fn case2() { + assert_eq!(speed(10, 30, 10), 2); + } + + #[test] + fn case3() { + assert_eq!(speed(10, 31, 10), 2); + } +} diff --git a/exercises/02_basic_calculator/03_if_else/Cargo.toml b/exercises/02_basic_calculator/03_if_else/Cargo.toml new file mode 100644 index 0000000..f4c9c0b --- /dev/null +++ b/exercises/02_basic_calculator/03_if_else/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "if_else" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/02_basic_calculator/03_if_else/src/lib.rs b/exercises/02_basic_calculator/03_if_else/src/lib.rs new file mode 100644 index 0000000..fa2e06e --- /dev/null +++ b/exercises/02_basic_calculator/03_if_else/src/lib.rs @@ -0,0 +1,36 @@ +/// Return `12` if `n` is even, +/// `13` if `n` is divisible by `3`, +/// `17` otherwise. +fn magic_number(n: u32) -> u32 { + todo!() +} + +#[cfg(test)] +mod tests { + use crate::magic_number; + + #[test] + fn one() { + assert_eq!(magic_number(1), 17); + } + + #[test] + fn two() { + assert_eq!(magic_number(2), 12); + } + + #[test] + fn six() { + assert_eq!(magic_number(6), 12); + } + + #[test] + fn nine() { + assert_eq!(magic_number(9), 13); + } + + #[test] + fn high() { + assert_eq!(magic_number(233), 17); + } +} diff --git a/exercises/02_basic_calculator/04_panics/Cargo.toml b/exercises/02_basic_calculator/04_panics/Cargo.toml new file mode 100644 index 0000000..0ab3397 --- /dev/null +++ b/exercises/02_basic_calculator/04_panics/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "panics" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/02_basic_calculator/04_panics/src/lib.rs b/exercises/02_basic_calculator/04_panics/src/lib.rs new file mode 100644 index 0000000..702b7bd --- /dev/null +++ b/exercises/02_basic_calculator/04_panics/src/lib.rs @@ -0,0 +1,26 @@ +/// Given the start and end points of a journey, and the time it took to complete the journey, +/// calculate the average speed of the journey. +fn speed(start: u32, end: u32, time_elapsed: u32) -> u32 { + // TODO: Panic with a custom message if `time_elapsed` is 0 + + (end - start) / time_elapsed +} + +#[cfg(test)] +mod tests { + use crate::speed; + + #[test] + fn case1() { + assert_eq!(speed(0, 10, 10), 1); + } + + #[test] + // 👇 With the `#[should_panic]` annotation we can assert that we expect the code + // under test to panic. We can also check the panic message by using `expected`. + // This is all part of Rust's built-in test framework! + #[should_panic(expected = "The journey took no time at all. That's impossible!")] + fn by_zero() { + speed(0, 10, 0); + } +} diff --git a/exercises/02_basic_calculator/05_factorial/Cargo.toml b/exercises/02_basic_calculator/05_factorial/Cargo.toml new file mode 100644 index 0000000..64088a3 --- /dev/null +++ b/exercises/02_basic_calculator/05_factorial/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "factorial" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/02_basic_calculator/05_factorial/src/lib.rs b/exercises/02_basic_calculator/05_factorial/src/lib.rs new file mode 100644 index 0000000..d2f11a7 --- /dev/null +++ b/exercises/02_basic_calculator/05_factorial/src/lib.rs @@ -0,0 +1,36 @@ +// Define a function named `factorial` that, given a non-negative integer `n`, +// returns `n!`, the factorial of `n`. +// +// The factorial of `n` is defined as the product of all positive integers up to `n`. +// For example, `5!` (read "five factorial") is `5 * 4 * 3 * 2 * 1`, which is `120`. +// `0!` is defined to be `1`. +// +// We expect `factorial(0)` to return `1`, `factorial(1)` to return `1`, +// `factorial(2)` to return `2`, and so on. +// +// Use only what you learned! No loops yet, so you'll have to use recursion! + +#[cfg(test)] +mod tests { + use crate::factorial; + + #[test] + fn first() { + assert_eq!(factorial(0), 1); + } + + #[test] + fn second() { + assert_eq!(factorial(1), 1); + } + + #[test] + fn third() { + assert_eq!(factorial(2), 2); + } + + #[test] + fn fifth() { + assert_eq!(factorial(5), 120); + } +} diff --git a/exercises/02_basic_calculator/06_while/Cargo.toml b/exercises/02_basic_calculator/06_while/Cargo.toml new file mode 100644 index 0000000..34c8eaf --- /dev/null +++ b/exercises/02_basic_calculator/06_while/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "while_" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/02_basic_calculator/06_while/src/lib.rs b/exercises/02_basic_calculator/06_while/src/lib.rs new file mode 100644 index 0000000..dbc30eb --- /dev/null +++ b/exercises/02_basic_calculator/06_while/src/lib.rs @@ -0,0 +1,33 @@ +// Rewrite the factorial function using a `while` loop. +pub fn factorial(n: u32) -> u32 { + // The `todo!()` macro is a placeholder that the compiler + // interprets as "I'll get back to this later", thus + // suppressing type errors. + // It panics at runtime. + todo!() +} + +#[cfg(test)] +mod tests { + use crate::factorial; + + #[test] + fn first() { + assert_eq!(factorial(0), 1); + } + + #[test] + fn second() { + assert_eq!(factorial(1), 1); + } + + #[test] + fn third() { + assert_eq!(factorial(2), 2); + } + + #[test] + fn fifth() { + assert_eq!(factorial(5), 120); + } +} diff --git a/exercises/02_basic_calculator/07_for/Cargo.toml b/exercises/02_basic_calculator/07_for/Cargo.toml new file mode 100644 index 0000000..ac8c4a8 --- /dev/null +++ b/exercises/02_basic_calculator/07_for/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "for_" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/02_basic_calculator/07_for/src/lib.rs b/exercises/02_basic_calculator/07_for/src/lib.rs new file mode 100644 index 0000000..d571d57 --- /dev/null +++ b/exercises/02_basic_calculator/07_for/src/lib.rs @@ -0,0 +1,29 @@ +// Rewrite the factorial function using a `for` loop. +pub fn factorial(n: u32) -> u32 { + todo!() +} + +#[cfg(test)] +mod tests { + use crate::factorial; + + #[test] + fn first() { + assert_eq!(factorial(0), 1); + } + + #[test] + fn second() { + assert_eq!(factorial(1), 1); + } + + #[test] + fn third() { + assert_eq!(factorial(2), 2); + } + + #[test] + fn fifth() { + assert_eq!(factorial(5), 120); + } +} diff --git a/exercises/02_basic_calculator/08_overflow/Cargo.toml b/exercises/02_basic_calculator/08_overflow/Cargo.toml new file mode 100644 index 0000000..b5bd80e --- /dev/null +++ b/exercises/02_basic_calculator/08_overflow/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "overflow" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/02_basic_calculator/08_overflow/src/lib.rs b/exercises/02_basic_calculator/08_overflow/src/lib.rs new file mode 100644 index 0000000..f99dd7c --- /dev/null +++ b/exercises/02_basic_calculator/08_overflow/src/lib.rs @@ -0,0 +1,49 @@ +// Customize the `dev` profile to wrap around on overflow. +// Check Cargo's documentation to find out the right syntax: +// https://doc.rust-lang.org/cargo/reference/profiles.html +// +// For reasons that we'll explain later, the customization needs to be done in the `Cargo.toml` +// at the root of the repository, not in the `Cargo.toml` of the exercise. + +pub fn factorial(n: u32) -> u32 { + let mut result = 1; + for i in 1..=n { + result *= i; + } + result +} + +#[cfg(test)] +mod tests { + use crate::factorial; + + #[test] + fn twentieth() { + // 20! is 2432902008176640000, which is too large to fit in a u32 + // With the default dev profile, this will panic when you run `cargo test` + // We want it to wrap around instead + assert_eq!(factorial(20), 2_192_834_560); + // ☝️ + // A large number literal using underscores to improve readability! + } + + #[test] + fn first() { + assert_eq!(factorial(0), 1); + } + + #[test] + fn second() { + assert_eq!(factorial(1), 1); + } + + #[test] + fn third() { + assert_eq!(factorial(2), 2); + } + + #[test] + fn fifth() { + assert_eq!(factorial(5), 120); + } +} diff --git a/exercises/02_basic_calculator/09_saturating/Cargo.toml b/exercises/02_basic_calculator/09_saturating/Cargo.toml new file mode 100644 index 0000000..6fd77a4 --- /dev/null +++ b/exercises/02_basic_calculator/09_saturating/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "saturating" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/02_basic_calculator/09_saturating/src/lib.rs b/exercises/02_basic_calculator/09_saturating/src/lib.rs new file mode 100644 index 0000000..4b0adde --- /dev/null +++ b/exercises/02_basic_calculator/09_saturating/src/lib.rs @@ -0,0 +1,39 @@ +pub fn factorial(n: u32) -> u32 { + let mut result = 1; + for i in 1..=n { + // Use saturating multiplication to stop at the maximum value of u32 + // rather than overflowing and wrapping around + result *= i; + } + result +} + +#[cfg(test)] +mod tests { + use crate::factorial; + + #[test] + fn twentieth() { + assert_eq!(factorial(20), u32::MAX); + } + + #[test] + fn first() { + assert_eq!(factorial(0), 1); + } + + #[test] + fn second() { + assert_eq!(factorial(1), 1); + } + + #[test] + fn third() { + assert_eq!(factorial(2), 2); + } + + #[test] + fn fifth() { + assert_eq!(factorial(5), 120); + } +} diff --git a/exercises/02_basic_calculator/10_as_casting/Cargo.toml b/exercises/02_basic_calculator/10_as_casting/Cargo.toml new file mode 100644 index 0000000..b009f38 --- /dev/null +++ b/exercises/02_basic_calculator/10_as_casting/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "as_cast" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/02_basic_calculator/10_as_casting/src/lib.rs b/exercises/02_basic_calculator/10_as_casting/src/lib.rs new file mode 100644 index 0000000..2ba058c --- /dev/null +++ b/exercises/02_basic_calculator/10_as_casting/src/lib.rs @@ -0,0 +1,37 @@ +// TODO: based on what you learned in this section, replace `todo!()` with +// the correct value after the conversion. + +#[cfg(test)] +mod tests { + + #[test] + fn u16_to_u32() { + let v: u32 = todo!(); + assert_eq!(47u16 as u32, v); + } + + #[test] + fn u8_to_i8() { + // The compiler is smart enough to know that the value 255 cannot fit + // inside an i8, so it'll emit a hard error. We intentionally disable + // this guardrail to make this (bad) conversion possible. + // The compiler is only able to pick on this because the value is a + // literal. If we were to use a variable, the compiler wouldn't be able to + // catch this at compile time. + #[allow(overflowing_literals)] + let x = { 255 as i8 }; + + // You could solve this by using exactly the same expression as above, + // but that would defeat the purpose of the exercise. Instead, use a genuine + // `i8` value that is equivalent to `255` when converted to `u8`. + let y: i8 = todo!(); + + assert_eq!(x, y); + } + + #[test] + fn bool_to_u8() { + let v: u8 = todo!(); + assert_eq!(true as u8, v); + } +} diff --git a/exercises/03_ticket_v1/00_intro/Cargo.toml b/exercises/03_ticket_v1/00_intro/Cargo.toml new file mode 100644 index 0000000..baf0a5d --- /dev/null +++ b/exercises/03_ticket_v1/00_intro/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "intro_02" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/03_ticket_v1/00_intro/src/lib.rs b/exercises/03_ticket_v1/00_intro/src/lib.rs new file mode 100644 index 0000000..f7afa47 --- /dev/null +++ b/exercises/03_ticket_v1/00_intro/src/lib.rs @@ -0,0 +1,14 @@ +fn intro() -> &'static str { + // TODO: fix me 👇 + "I'm ready to __!" +} + +#[cfg(test)] +mod tests { + use crate::intro; + + #[test] + fn test_intro() { + assert_eq!(intro(), "I'm ready to start modelling a software ticket!"); + } +} diff --git a/exercises/03_ticket_v1/01_struct/Cargo.toml b/exercises/03_ticket_v1/01_struct/Cargo.toml new file mode 100644 index 0000000..29bb908 --- /dev/null +++ b/exercises/03_ticket_v1/01_struct/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "struct_" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/03_ticket_v1/01_struct/src/lib.rs b/exercises/03_ticket_v1/01_struct/src/lib.rs new file mode 100644 index 0000000..1119e33 --- /dev/null +++ b/exercises/03_ticket_v1/01_struct/src/lib.rs @@ -0,0 +1,29 @@ +// Define a struct named `Order` with the following fields: +// - `price`, an unsigned integer +// - `quantity`, an unsigned integer +// +// It should also have a method named `is_available` that returns a `true` if the quantity is +// greater than 0, otherwise `false`. + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_order_is_available() { + let order = Order { + price: 100, + quantity: 10, + }; + assert!(order.is_available()); + } + + #[test] + fn test_order_is_not_available() { + let order = Order { + price: 100, + quantity: 0, + }; + assert!(!order.is_available()); + } +} diff --git a/exercises/03_ticket_v1/02_validation/Cargo.toml b/exercises/03_ticket_v1/02_validation/Cargo.toml new file mode 100644 index 0000000..669c4fb --- /dev/null +++ b/exercises/03_ticket_v1/02_validation/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "validation" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +common = { path = "../../../helpers/common" } + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/03_ticket_v1/02_validation/src/lib.rs b/exercises/03_ticket_v1/02_validation/src/lib.rs new file mode 100644 index 0000000..7eaa5e5 --- /dev/null +++ b/exercises/03_ticket_v1/02_validation/src/lib.rs @@ -0,0 +1,74 @@ +struct Ticket { + title: String, + description: String, + status: String, +} + +impl Ticket { + // TODO: implement the `new` function. + // The following requirements should be met: + // - Only `To-Do`, `In Progress`, and `Done` statuses are allowed. + // - The `title` and `description` fields should not be empty. + // - the `title` should be at most 50 bytes long. + // - the `description` should be at most 500 bytes long. + // The method should panic if any of the requirements are not met. + // You can find the needed panic messages in the tests. + // + // You'll have to use what you learned in the previous exercises, + // as well as some `String` methods. Use the documentation of Rust's standard library + // to find the most appropriate options -> https://doc.rust-lang.org/std/string/struct.String.html + fn new(title: String, description: String, status: String) -> Self { + todo!(); + Self { + title, + description, + status, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{overly_long_description, overly_long_title, valid_description, valid_title}; + + #[test] + #[should_panic(expected = "Title cannot be empty")] + fn title_cannot_be_empty() { + Ticket::new("".into(), valid_description(), "To-Do".into()); + } + + #[test] + #[should_panic(expected = "Description cannot be empty")] + fn description_cannot_be_empty() { + Ticket::new(valid_title(), "".into(), "To-Do".into()); + } + + #[test] + #[should_panic(expected = "Title cannot be longer than 50 bytes")] + fn title_cannot_be_longer_than_fifty_chars() { + Ticket::new(overly_long_title(), valid_description(), "To-Do".into()); + } + + #[test] + #[should_panic(expected = "Description cannot be longer than 500 bytes")] + fn description_cannot_be_longer_than_500_chars() { + Ticket::new(valid_title(), overly_long_description(), "To-Do".into()); + } + + #[test] + #[should_panic(expected = "Only `To-Do`, `In Progress`, and `Done` statuses are allowed")] + fn status_must_be_valid() { + Ticket::new(valid_title(), valid_description(), "Funny".into()); + } + + #[test] + fn done_is_allowed() { + Ticket::new(valid_title(), valid_description(), "Done".into()); + } + + #[test] + fn in_progress_is_allowed() { + Ticket::new(valid_title(), valid_description(), "In Progress".into()); + } +} diff --git a/exercises/03_ticket_v1/03_modules/Cargo.toml b/exercises/03_ticket_v1/03_modules/Cargo.toml new file mode 100644 index 0000000..5290511 --- /dev/null +++ b/exercises/03_ticket_v1/03_modules/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "modules" +version = "0.1.0" +edition = "2021" + +[lints.rust] +# We silence dead code warnings for the time being in order to reduce +# compiler noise. +# We'll re-enable them again once we explain how visibility works in Rust. +dead_code = "allow" diff --git a/exercises/03_ticket_v1/03_modules/src/lib.rs b/exercises/03_ticket_v1/03_modules/src/lib.rs new file mode 100644 index 0000000..df07620 --- /dev/null +++ b/exercises/03_ticket_v1/03_modules/src/lib.rs @@ -0,0 +1,40 @@ +mod helpers { + // TODO: Make this code compile, either by adding a `use` statement or by using + // the appropriate path to refer to the `Ticket` struct. + + fn create_todo_ticket(title: String, description: String) -> Ticket { + Ticket::new(title, description, "To-Do".into()) + } +} + +struct Ticket { + title: String, + description: String, + status: String, +} + +impl Ticket { + fn new(title: String, description: String, status: String) -> Ticket { + if title.is_empty() { + panic!("Title cannot be empty"); + } + if title.len() > 50 { + panic!("Title cannot be longer than 50 bytes"); + } + if description.is_empty() { + panic!("Description cannot be empty"); + } + if description.len() > 500 { + panic!("Description cannot be longer than 500 bytes"); + } + if status != "To-Do" && status != "In Progress" && status != "Done" { + panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed"); + } + + Ticket { + title, + description, + status, + } + } +} diff --git a/exercises/03_ticket_v1/04_visibility/Cargo.toml b/exercises/03_ticket_v1/04_visibility/Cargo.toml new file mode 100644 index 0000000..e6e426d --- /dev/null +++ b/exercises/03_ticket_v1/04_visibility/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "visibility" +version = "0.1.0" +edition = "2021" diff --git a/exercises/03_ticket_v1/04_visibility/src/lib.rs b/exercises/03_ticket_v1/04_visibility/src/lib.rs new file mode 100644 index 0000000..b494fc9 --- /dev/null +++ b/exercises/03_ticket_v1/04_visibility/src/lib.rs @@ -0,0 +1,77 @@ +mod ticket { + struct Ticket { + title: String, + description: String, + status: String, + } + + impl Ticket { + fn new(title: String, description: String, status: String) -> Ticket { + if title.is_empty() { + panic!("Title cannot be empty"); + } + if title.len() > 50 { + panic!("Title cannot be longer than 50 bytes"); + } + if description.is_empty() { + panic!("Description cannot be empty"); + } + if description.len() > 500 { + panic!("Description cannot be longer than 500 bytes"); + } + if status != "To-Do" && status != "In Progress" && status != "Done" { + panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed"); + } + + Ticket { + title, + description, + status, + } + } + } +} + +// TODO: **Exceptionally**, you'll be modifying both the `ticket` module and the `tests` module +// in this exercise. +#[cfg(test)] +mod tests { + // TODO: Add the necessary `pub` modifiers in the parent module to remove the compiler + // errors about the use statement below. + use super::ticket::Ticket; + + // Be careful though! We don't want this function to compile after you have changed + // visibility to make the use statement compile! + // Once you have verified that it indeed doesn't compile, comment it out. + fn should_not_be_possible() { + let ticket = Ticket::new("A title".into(), "A description".into(), "To-Do".into()); + + // You should be seeing this error when trying to run this exercise: + // + // error[E0616]: field `description` of struct `Ticket` is private + // | + // | assert_eq!(ticket.description, "A description"); + // | ^^^^^^^^^^^^^^^^^^ + // + // TODO: Once you have verified that the below does not compile, + // comment the line out to move on to the next exercise! + assert_eq!(ticket.description, "A description"); + } + + fn encapsulation_cannot_be_violated() { + // This should be impossible as well, with a similar error as the one encountered above. + // (It will throw a compilation error only after you have commented the faulty line + // in the previous test - next compilation stage!) + // + // This proves that `Ticket::new` is now the only way to get a `Ticket` instance. + // It's impossible to create a ticket with an illegal title or description! + // + // TODO: Once you have verified that the below does not compile, + // comment the lines out to move on to the next exercise! + let ticket = Ticket { + title: "A title".into(), + description: "A description".into(), + status: "To-Do".into(), + }; + } +} diff --git a/exercises/03_ticket_v1/05_encapsulation/Cargo.toml b/exercises/03_ticket_v1/05_encapsulation/Cargo.toml new file mode 100644 index 0000000..b3b6a7a --- /dev/null +++ b/exercises/03_ticket_v1/05_encapsulation/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "encapsulation" +version = "0.1.0" +edition = "2021" diff --git a/exercises/03_ticket_v1/05_encapsulation/src/lib.rs b/exercises/03_ticket_v1/05_encapsulation/src/lib.rs new file mode 100644 index 0000000..91e06eb --- /dev/null +++ b/exercises/03_ticket_v1/05_encapsulation/src/lib.rs @@ -0,0 +1,61 @@ +pub mod ticket { + pub struct Ticket { + title: String, + description: String, + status: String, + } + + impl Ticket { + pub fn new(title: String, description: String, status: String) -> Ticket { + if title.is_empty() { + panic!("Title cannot be empty"); + } + if title.len() > 50 { + panic!("Title cannot be longer than 50 bytes"); + } + if description.is_empty() { + panic!("Description cannot be empty"); + } + if description.len() > 500 { + panic!("Description cannot be longer than 500 bytes"); + } + if status != "To-Do" && status != "In Progress" && status != "Done" { + panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed"); + } + + Ticket { + title, + description, + status, + } + } + + // TODO: Add three public methods to the `Ticket` struct: + // - `title` that returns the `title` field. + // - `description` that returns the `description` field. + // - `status` that returns the `status` field. + } +} + +#[cfg(test)] +mod tests { + use super::ticket::Ticket; + + #[test] + fn description() { + let ticket = Ticket::new("A title".into(), "A description".into(), "To-Do".into()); + assert_eq!(ticket.description(), "A description"); + } + + #[test] + fn title() { + let ticket = Ticket::new("A title".into(), "A description".into(), "To-Do".into()); + assert_eq!(ticket.title(), "A title"); + } + + #[test] + fn status() { + let ticket = Ticket::new("A title".into(), "A description".into(), "To-Do".into()); + assert_eq!(ticket.status(), "To-Do"); + } +} diff --git a/exercises/03_ticket_v1/06_ownership/Cargo.toml b/exercises/03_ticket_v1/06_ownership/Cargo.toml new file mode 100644 index 0000000..ae90ec1 --- /dev/null +++ b/exercises/03_ticket_v1/06_ownership/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "ownership" +version = "0.1.0" +edition = "2021" diff --git a/exercises/03_ticket_v1/06_ownership/src/lib.rs b/exercises/03_ticket_v1/06_ownership/src/lib.rs new file mode 100644 index 0000000..a9639b2 --- /dev/null +++ b/exercises/03_ticket_v1/06_ownership/src/lib.rs @@ -0,0 +1,64 @@ +// TODO: based on what we just learned about ownership, it sounds like immutable references +// are a good fit for our accessor methods. +// Change the existing implementation of `Ticket`'s accessor methods to take a reference +// to `self` as an argument, rather than taking ownership of it. + +pub struct Ticket { + title: String, + description: String, + status: String, +} + +impl Ticket { + pub fn new(title: String, description: String, status: String) -> Ticket { + if title.is_empty() { + panic!("Title cannot be empty"); + } + if title.len() > 50 { + panic!("Title cannot be longer than 50 bytes"); + } + if description.is_empty() { + panic!("Description cannot be empty"); + } + if description.len() > 500 { + panic!("Description cannot be longer than 500 bytes"); + } + if status != "To-Do" && status != "In Progress" && status != "Done" { + panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed"); + } + + Ticket { + title, + description, + status, + } + } + + pub fn title(self) -> String { + self.title + } + + pub fn description(self) -> String { + self.description + } + + pub fn status(self) -> String { + self.status + } +} + +#[cfg(test)] +mod tests { + use super::Ticket; + + #[test] + fn works() { + let ticket = Ticket::new("A title".into(), "A description".into(), "To-Do".into()); + // If you change the signatures as requested, this should compile: + // we can call these methods one after the other because they borrow `self` + // rather than taking ownership of it. + assert_eq!(ticket.title(), "A title"); + assert_eq!(ticket.description(), "A description"); + assert_eq!(ticket.status(), "To-Do"); + } +} diff --git a/exercises/03_ticket_v1/07_setters/Cargo.toml b/exercises/03_ticket_v1/07_setters/Cargo.toml new file mode 100644 index 0000000..cdeeebd --- /dev/null +++ b/exercises/03_ticket_v1/07_setters/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "setters" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +common = { path = "../../../helpers/common" } diff --git a/exercises/03_ticket_v1/07_setters/src/lib.rs b/exercises/03_ticket_v1/07_setters/src/lib.rs new file mode 100644 index 0000000..e13ec87 --- /dev/null +++ b/exercises/03_ticket_v1/07_setters/src/lib.rs @@ -0,0 +1,98 @@ +// TODO: Add &mut-setters to the `Ticket` struct for each of its fields. +// Make sure to enforce the same validation rules you have in `Ticket::new`! +// Even better, extract that logic and reuse it in both places. You can use +// private functions or private static methods for that. + +pub struct Ticket { + title: String, + description: String, + status: String, +} + +impl Ticket { + pub fn new(title: String, description: String, status: String) -> Ticket { + if title.is_empty() { + panic!("Title cannot be empty"); + } + if title.len() > 50 { + panic!("Title cannot be longer than 50 bytes"); + } + if description.is_empty() { + panic!("Description cannot be empty"); + } + if description.len() > 500 { + panic!("Description cannot be longer than 500 bytes"); + } + if status != "To-Do" && status != "In Progress" && status != "Done" { + panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed"); + } + + Ticket { + title, + description, + status, + } + } + + pub fn title(&self) -> &String { + &self.title + } + + pub fn description(&self) -> &String { + &self.description + } + + pub fn status(&self) -> &String { + &self.status + } +} + +#[cfg(test)] +mod tests { + use super::Ticket; + use common::{overly_long_description, overly_long_title, valid_description, valid_title}; + + #[test] + fn works() { + let mut ticket = Ticket::new("A title".into(), "A description".into(), "To-Do".into()); + ticket.set_title("A new title".into()); + ticket.set_description("A new description".into()); + ticket.set_status("Done".into()); + + assert_eq!(ticket.title(), "A new title"); + assert_eq!(ticket.description(), "A new description"); + assert_eq!(ticket.status(), "Done"); + } + + #[test] + #[should_panic(expected = "Title cannot be empty")] + fn title_cannot_be_empty() { + Ticket::new(valid_title(), valid_description(), "To-Do".into()).set_title("".into()); + } + + #[test] + #[should_panic(expected = "Description cannot be empty")] + fn description_cannot_be_empty() { + Ticket::new(valid_title(), valid_description(), "To-Do".into()).set_description("".into()); + } + + #[test] + #[should_panic(expected = "Title cannot be longer than 50 bytes")] + fn title_cannot_be_longer_than_fifty_chars() { + Ticket::new(valid_title(), valid_description(), "To-Do".into()) + .set_title(overly_long_title()) + } + + #[test] + #[should_panic(expected = "Description cannot be longer than 500 bytes")] + fn description_cannot_be_longer_than_500_chars() { + Ticket::new(valid_title(), valid_description(), "To-Do".into()) + .set_description(overly_long_description()) + } + + #[test] + #[should_panic(expected = "Only `To-Do`, `In Progress`, and `Done` statuses are allowed")] + fn status_must_be_valid() { + Ticket::new(valid_title(), valid_description(), "To-Do".into()).set_status("Funny".into()); + } +} diff --git a/exercises/03_ticket_v1/08_stack/Cargo.toml b/exercises/03_ticket_v1/08_stack/Cargo.toml new file mode 100644 index 0000000..65efdd9 --- /dev/null +++ b/exercises/03_ticket_v1/08_stack/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "stack" +version = "0.1.0" +edition = "2021" diff --git a/exercises/03_ticket_v1/08_stack/src/lib.rs b/exercises/03_ticket_v1/08_stack/src/lib.rs new file mode 100644 index 0000000..e97518c --- /dev/null +++ b/exercises/03_ticket_v1/08_stack/src/lib.rs @@ -0,0 +1,21 @@ +// TODO: based on what you learned in this section, replace `todo!()` with +// the correct **stack size** for the respective type. +#[cfg(test)] +mod tests { + use std::mem::size_of; + + #[test] + fn u16_size() { + assert_eq!(size_of::(), todo!()); + } + + #[test] + fn i32_size() { + assert_eq!(size_of::(), todo!()); + } + + #[test] + fn bool_size() { + assert_eq!(size_of::(), todo!()); + } +} diff --git a/exercises/03_ticket_v1/09_heap/Cargo.toml b/exercises/03_ticket_v1/09_heap/Cargo.toml new file mode 100644 index 0000000..d8e4453 --- /dev/null +++ b/exercises/03_ticket_v1/09_heap/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "heap" +version = "0.1.0" +edition = "2021" diff --git a/exercises/03_ticket_v1/09_heap/src/lib.rs b/exercises/03_ticket_v1/09_heap/src/lib.rs new file mode 100644 index 0000000..7273c20 --- /dev/null +++ b/exercises/03_ticket_v1/09_heap/src/lib.rs @@ -0,0 +1,28 @@ +pub struct Ticket { + title: String, + description: String, + status: String, +} + +// TODO: based on what you learned in this section, replace `todo!()` with +// the correct **stack size** for the respective type. +#[cfg(test)] +mod tests { + use super::Ticket; + use std::mem::size_of; + + #[test] + fn string_size() { + assert_eq!(size_of::(), todo!()); + } + + #[test] + fn ticket_size() { + // This is a tricky question! + // The "intuitive" answer happens to be the correct answer this time, + // but, in general, the memory layout of structs is a more complex topic. + // If you're curious, check out the "Type layout" section of The Rust Reference + // https://doc.rust-lang.org/reference/type-layout.html for more information. + assert_eq!(size_of::(), todo!()); + } +} diff --git a/exercises/03_ticket_v1/10_references_in_memory/Cargo.toml b/exercises/03_ticket_v1/10_references_in_memory/Cargo.toml new file mode 100644 index 0000000..685fdd8 --- /dev/null +++ b/exercises/03_ticket_v1/10_references_in_memory/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "references_in_memory" +version = "0.1.0" +edition = "2021" diff --git a/exercises/03_ticket_v1/10_references_in_memory/src/lib.rs b/exercises/03_ticket_v1/10_references_in_memory/src/lib.rs new file mode 100644 index 0000000..d580758 --- /dev/null +++ b/exercises/03_ticket_v1/10_references_in_memory/src/lib.rs @@ -0,0 +1,28 @@ +pub struct Ticket { + title: String, + description: String, + status: String, +} + +// TODO: based on what you learned in this section, replace `todo!()` with +// the correct **stack size** for the respective type. +#[cfg(test)] +mod tests { + use super::Ticket; + use std::mem::size_of; + + #[test] + fn u16_ref_size() { + assert_eq!(size_of::<&u16>(), todo!()); + } + + #[test] + fn u64_mut_ref_size() { + assert_eq!(size_of::<&mut u64>(), todo!()); + } + + #[test] + fn ticket_ref_size() { + assert_eq!(size_of::<&Ticket>(), todo!()); + } +} diff --git a/exercises/03_ticket_v1/11_destructor/Cargo.toml b/exercises/03_ticket_v1/11_destructor/Cargo.toml new file mode 100644 index 0000000..178c5b6 --- /dev/null +++ b/exercises/03_ticket_v1/11_destructor/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "destructor" +version = "0.1.0" +edition = "2021" diff --git a/exercises/03_ticket_v1/11_destructor/src/lib.rs b/exercises/03_ticket_v1/11_destructor/src/lib.rs new file mode 100644 index 0000000..45bc89c --- /dev/null +++ b/exercises/03_ticket_v1/11_destructor/src/lib.rs @@ -0,0 +1,16 @@ +// We need some more machinery to write a proper exercise for destructors. +// We'll pick the concept up again in a later chapter after covering traits and +// interior mutability. +fn outro() -> &'static str { + "I have a basic understanding of __!" +} + +#[cfg(test)] +mod tests { + use crate::outro; + + #[test] + fn test_outro() { + assert_eq!(outro(), "I have a basic understanding of destructors!"); + } +} diff --git a/exercises/03_ticket_v1/12_outro/Cargo.toml b/exercises/03_ticket_v1/12_outro/Cargo.toml new file mode 100644 index 0000000..8205e2b --- /dev/null +++ b/exercises/03_ticket_v1/12_outro/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "outro_02" +version = "0.1.0" +edition = "2021" diff --git a/exercises/03_ticket_v1/12_outro/src/lib.rs b/exercises/03_ticket_v1/12_outro/src/lib.rs new file mode 100644 index 0000000..15c99b8 --- /dev/null +++ b/exercises/03_ticket_v1/12_outro/src/lib.rs @@ -0,0 +1,13 @@ +// TODO: Define a new `Order` type. +// It should keep track of three pieces of information: `product_name`, `quantity`, and `unit_price`. +// The product name can't be empty and it can't be longer than 300 bytes. +// The quantity must be strictly greater than zero. +// The unit price is in cents and must be strictly greater than zero. +// Order must include a method named `total` that returns the total price of the order. +// Order must provide setters and getters for each field. +// +// Tests are located in a different place this time—in the `tests` folder. +// The `tests` folder is a special location for `cargo`. It's where it looks for **integration tests**. +// Integration here has a very specific meaning: they test **the public API** of your project. +// You'll need to pay attention to the visibility of your types and methods; integration +// tests can't access private or `pub(crate)` items. diff --git a/exercises/03_ticket_v1/12_outro/tests/integration.rs b/exercises/03_ticket_v1/12_outro/tests/integration.rs new file mode 100644 index 0000000..574dcaf --- /dev/null +++ b/exercises/03_ticket_v1/12_outro/tests/integration.rs @@ -0,0 +1,49 @@ +use outro_02::Order; + +// Files inside the `tests` directory are only compiled when you run tests. +// As a consequence, we don't need the `#[cfg(test)]` attribute for conditional compilation—it's +// implied. + +#[test] +fn test_order() { + let mut order = Order::new("Rusty Book".to_string(), 3, 2999); + + assert_eq!(order.product_name(), "Rusty Book"); + assert_eq!(order.quantity(), &3); + assert_eq!(order.unit_price(), &2999); + assert_eq!(order.total(), 8997); + + order.set_product_name("Rust Book".to_string()); + order.set_quantity(2); + order.set_unit_price(3999); + + assert_eq!(order.product_name(), "Rust Book"); + assert_eq!(order.quantity(), &2); + assert_eq!(order.unit_price(), &3999); + assert_eq!(order.total(), 7998); +} + +// Validation tests +#[test] +#[should_panic] +fn test_empty_product_name() { + Order::new("".to_string(), 3, 2999); +} + +#[test] +#[should_panic] +fn test_long_product_name() { + Order::new("a".repeat(301), 3, 2999); +} + +#[test] +#[should_panic] +fn test_zero_quantity() { + Order::new("Rust Book".to_string(), 0, 2999); +} + +#[test] +#[should_panic] +fn test_zero_unit_price() { + Order::new("Rust Book".to_string(), 3, 0); +} diff --git a/exercises/04_traits/00_intro/Cargo.toml b/exercises/04_traits/00_intro/Cargo.toml new file mode 100644 index 0000000..117f76b --- /dev/null +++ b/exercises/04_traits/00_intro/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "intro_03" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/00_intro/src/lib.rs b/exercises/04_traits/00_intro/src/lib.rs new file mode 100644 index 0000000..9513649 --- /dev/null +++ b/exercises/04_traits/00_intro/src/lib.rs @@ -0,0 +1,14 @@ +fn intro() -> &'static str { + // TODO: fix me 👇 + "I'm ready to __!" +} + +#[cfg(test)] +mod tests { + use crate::intro; + + #[test] + fn test_intro() { + assert_eq!(intro(), "I'm ready to learn about traits!"); + } +} diff --git a/exercises/04_traits/01_trait/Cargo.toml b/exercises/04_traits/01_trait/Cargo.toml new file mode 100644 index 0000000..c3708a8 --- /dev/null +++ b/exercises/04_traits/01_trait/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "trait_" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/01_trait/src/lib.rs b/exercises/04_traits/01_trait/src/lib.rs new file mode 100644 index 0000000..258eac5 --- /dev/null +++ b/exercises/04_traits/01_trait/src/lib.rs @@ -0,0 +1,23 @@ +// Define a trait named `IsEven` that has a method `is_even` that returns a `true` if `self` is +// even, otherwise `false`. +// +// Then implement the trait for `u32` and `i32`. + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_u32_is_even() { + assert!(42u32.is_even()); + assert!(!43u32.is_even()); + } + + #[test] + fn test_i32_is_even() { + assert!(42i32.is_even()); + assert!(!43i32.is_even()); + assert!(0i32.is_even()); + assert!(!(-1i32).is_even()); + } +} diff --git a/exercises/04_traits/02_orphan_rule/Cargo.toml b/exercises/04_traits/02_orphan_rule/Cargo.toml new file mode 100644 index 0000000..b90db81 --- /dev/null +++ b/exercises/04_traits/02_orphan_rule/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "orphan" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/02_orphan_rule/src/lib.rs b/exercises/04_traits/02_orphan_rule/src/lib.rs new file mode 100644 index 0000000..b707c10 --- /dev/null +++ b/exercises/04_traits/02_orphan_rule/src/lib.rs @@ -0,0 +1,11 @@ +// TODO: this is an example of an orphan rule violation. +// We're implementing a foreign trait (`PartialEq`, from `std`) on +// a foreign type (`u32`, from `std`). +// Look at the compiler error to get familiar with what it looks like. +// Then delete the code below and move on to the next exercise. + +impl PartialEq for u32 { + fn eq(&self, _other: &Self) -> bool { + todo!() + } +} diff --git a/exercises/04_traits/03_operator_overloading/Cargo.toml b/exercises/04_traits/03_operator_overloading/Cargo.toml new file mode 100644 index 0000000..30a503d --- /dev/null +++ b/exercises/04_traits/03_operator_overloading/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "overloading" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/03_operator_overloading/src/lib.rs b/exercises/04_traits/03_operator_overloading/src/lib.rs new file mode 100644 index 0000000..b75c0f1 --- /dev/null +++ b/exercises/04_traits/03_operator_overloading/src/lib.rs @@ -0,0 +1,85 @@ +use std::cmp::PartialEq; + +struct Ticket { + title: String, + description: String, + status: String, +} + +// TODO: Implement the `PartialEq` trait for `Ticket`. + +impl PartialEq for Ticket {} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_partial_eq() { + let title = "title"; + let description = "description"; + let status = "To-Do"; + let ticket1 = Ticket { + title: title.to_string(), + description: description.to_string(), + status: status.to_string(), + }; + let ticket2 = Ticket { + title: title.to_string(), + description: description.to_string(), + status: status.to_string(), + }; + assert!(ticket1 == ticket2); + } + + #[test] + fn test_description_not_matching() { + let title = "title"; + let status = "To-Do"; + let ticket1 = Ticket { + title: title.to_string(), + description: "description".to_string(), + status: status.to_string(), + }; + let ticket2 = Ticket { + title: title.to_string(), + description: "description2".to_string(), + status: status.to_string(), + }; + assert!(ticket1 != ticket2); + } + + #[test] + fn test_title_not_matching() { + let status = "To-Do"; + let description = "description"; + let ticket1 = Ticket { + title: "title".to_string(), + description: description.to_string(), + status: status.to_string(), + }; + let ticket2 = Ticket { + title: "title2".to_string(), + description: description.to_string(), + status: status.to_string(), + }; + assert!(ticket1 != ticket2); + } + + #[test] + fn test_status_not_matching() { + let title = "title"; + let description = "description"; + let ticket1 = Ticket { + title: title.to_string(), + description: description.to_string(), + status: "status".to_string(), + }; + let ticket2 = Ticket { + title: title.to_string(), + description: description.to_string(), + status: "status2".to_string(), + }; + assert!(ticket1 != ticket2); + } +} diff --git a/exercises/04_traits/04_derive/Cargo.toml b/exercises/04_traits/04_derive/Cargo.toml new file mode 100644 index 0000000..0b712f5 --- /dev/null +++ b/exercises/04_traits/04_derive/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "derives" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/04_derive/src/lib.rs b/exercises/04_traits/04_derive/src/lib.rs new file mode 100644 index 0000000..0a74a26 --- /dev/null +++ b/exercises/04_traits/04_derive/src/lib.rs @@ -0,0 +1,90 @@ +// TODO: A (derivable) trait implementation is missing for this exercise to compile successfully. +// Fix it! +// +// # `Debug` primer +// +// `Debug` returns a representation of a Rust type that's suitable for debugging (hence the name). +// `assert_eq!` requires `Ticket` to implement `Debug` because, when the assertion fails, it tries to +// print both sides of the comparison to the terminal. +// If the compared type doesn't implement `Debug`, it doesn't know how to represent them! + +#[derive(PartialEq)] +struct Ticket { + title: String, + description: String, + status: String, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_partial_eq() { + let title = "title"; + let description = "description"; + let status = "To-Do"; + let ticket1 = Ticket { + title: title.to_string(), + description: description.to_string(), + status: status.to_string(), + }; + let ticket2 = Ticket { + title: title.to_string(), + description: description.to_string(), + status: status.to_string(), + }; + assert_eq!(ticket1, ticket2); + } + + #[test] + fn test_description_not_matching() { + let title = "title"; + let status = "To-Do"; + let ticket1 = Ticket { + title: title.to_string(), + description: "description".to_string(), + status: status.to_string(), + }; + let ticket2 = Ticket { + title: title.to_string(), + description: "description2".to_string(), + status: status.to_string(), + }; + assert_ne!(ticket1, ticket2); + } + + #[test] + fn test_title_not_matching() { + let status = "To-Do"; + let description = "description"; + let ticket1 = Ticket { + title: "title".to_string(), + description: description.to_string(), + status: status.to_string(), + }; + let ticket2 = Ticket { + title: "title2".to_string(), + description: description.to_string(), + status: status.to_string(), + }; + assert_ne!(ticket1, ticket2); + } + + #[test] + fn test_status_not_matching() { + let title = "title"; + let description = "description"; + let ticket1 = Ticket { + title: title.to_string(), + description: description.to_string(), + status: "status".to_string(), + }; + let ticket2 = Ticket { + title: title.to_string(), + description: description.to_string(), + status: "status2".to_string(), + }; + assert_ne!(ticket1, ticket2); + } +} diff --git a/exercises/04_traits/05_trait_bounds/Cargo.toml b/exercises/04_traits/05_trait_bounds/Cargo.toml new file mode 100644 index 0000000..bcf3579 --- /dev/null +++ b/exercises/04_traits/05_trait_bounds/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "trait_bounds" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/05_trait_bounds/src/lib.rs b/exercises/04_traits/05_trait_bounds/src/lib.rs new file mode 100644 index 0000000..10f0eb4 --- /dev/null +++ b/exercises/04_traits/05_trait_bounds/src/lib.rs @@ -0,0 +1,15 @@ +// TODO: Add the necessary trait bounds to `min` so that it compiles successfully. +// Refer to the documentation of the `std::cmp` module for more information on the traits you might need. +// +// Note: there are different trait bounds that'll make the compiler happy, but they come with +// different _semantics_. We'll cover those differences later in the course when we talk about ordered +// collections (e.g. BTreeMap). + +/// Return the minimum of two values. +pub fn min(left: T, right: T) -> T { + if left <= right { + left + } else { + right + } +} diff --git a/exercises/04_traits/06_str_slice/Cargo.toml b/exercises/04_traits/06_str_slice/Cargo.toml new file mode 100644 index 0000000..a290d9b --- /dev/null +++ b/exercises/04_traits/06_str_slice/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "str_slice" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +common = { path = "../../../helpers/common" } diff --git a/exercises/04_traits/06_str_slice/src/lib.rs b/exercises/04_traits/06_str_slice/src/lib.rs new file mode 100644 index 0000000..5bf6614 --- /dev/null +++ b/exercises/04_traits/06_str_slice/src/lib.rs @@ -0,0 +1,61 @@ +// TODO: Re-implement `Ticket`'s accessor methods. This time return a `&str` rather than a `&String`. + +pub struct Ticket { + title: String, + description: String, + status: String, +} + +impl Ticket { + pub fn new(title: String, description: String, status: String) -> Ticket { + if title.is_empty() { + panic!("Title cannot be empty"); + } + if title.len() > 50 { + panic!("Title cannot be longer than 50 bytes"); + } + if description.is_empty() { + panic!("Description cannot be empty"); + } + if description.len() > 500 { + panic!("Description cannot be longer than 500 bytes"); + } + if status != "To-Do" && status != "In Progress" && status != "Done" { + panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed"); + } + + Ticket { + title, + description, + status, + } + } + + pub fn title(&self) -> &String { + &self.title + } + + pub fn description(&self) -> &String { + &self.description + } + + pub fn status(&self) -> &String { + &self.status + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{valid_description, valid_title}; + use std::any::{Any, TypeId}; + + #[test] + fn test_type() { + let ticket = Ticket::new(valid_title(), valid_description(), "To-Do".to_string()); + // Some dark magic to verify that you used the expected return types + assert_eq!(TypeId::of::(), ticket.title().type_id()); + assert_eq!(TypeId::of::(), ticket.description().type_id()); + assert_eq!(TypeId::of::(), ticket.status().type_id()); + } +} diff --git a/exercises/04_traits/07_deref/Cargo.toml b/exercises/04_traits/07_deref/Cargo.toml new file mode 100644 index 0000000..63994ef --- /dev/null +++ b/exercises/04_traits/07_deref/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "deref" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/07_deref/src/lib.rs b/exercises/04_traits/07_deref/src/lib.rs new file mode 100644 index 0000000..c7a5c35 --- /dev/null +++ b/exercises/04_traits/07_deref/src/lib.rs @@ -0,0 +1,38 @@ +// TODO: whenever `title` and `description` are returned via their accessor methods, they +// should be normalized—i.e. leading and trailing whitespace should be removed. +// There is a method in Rust's standard library that can help with this, but you won't +// find it in the documentation for `String`. +// Can you figure out where it is defined and how to use it? + +pub struct Ticket { + title: String, + description: String, + status: String, +} + +impl Ticket { + pub fn title(&self) -> &str { + todo!() + } + + pub fn description(&self) -> &str { + todo!() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_normalization() { + let ticket = Ticket { + title: " A title ".to_string(), + description: " A description ".to_string(), + status: "To-Do".to_string(), + }; + + assert_eq!("A title", ticket.title()); + assert_eq!("A description", ticket.description()); + } +} diff --git a/exercises/04_traits/08_sized/Cargo.toml b/exercises/04_traits/08_sized/Cargo.toml new file mode 100644 index 0000000..2b6fe0e --- /dev/null +++ b/exercises/04_traits/08_sized/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "sized" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/08_sized/src/lib.rs b/exercises/04_traits/08_sized/src/lib.rs new file mode 100644 index 0000000..a406fc5 --- /dev/null +++ b/exercises/04_traits/08_sized/src/lib.rs @@ -0,0 +1,7 @@ +pub fn example() { + // Trying to get the size of a str (or any other DST) + // via `std::mem::size_of` will result in a compile-time error. + // + // TODO: Comment out the following line and move on to the next exercise. + std::mem::size_of::(); +} diff --git a/exercises/04_traits/09_from/Cargo.toml b/exercises/04_traits/09_from/Cargo.toml new file mode 100644 index 0000000..25d9cf0 --- /dev/null +++ b/exercises/04_traits/09_from/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "from" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/09_from/src/lib.rs b/exercises/04_traits/09_from/src/lib.rs new file mode 100644 index 0000000..cc6f5b1 --- /dev/null +++ b/exercises/04_traits/09_from/src/lib.rs @@ -0,0 +1,10 @@ +// TODO: Implement the `From` trait for the `WrappingU32` type to make `example` compile. + +pub struct WrappingU32 { + value: u32, +} + +fn example() { + let wrapping: WrappingU32 = 42.into(); + let wrapping = WrappingU32::from(42); +} diff --git a/exercises/04_traits/10_assoc_vs_generic/Cargo.toml b/exercises/04_traits/10_assoc_vs_generic/Cargo.toml new file mode 100644 index 0000000..29a4ea2 --- /dev/null +++ b/exercises/04_traits/10_assoc_vs_generic/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "assoc_vs_generic" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/10_assoc_vs_generic/src/lib.rs b/exercises/04_traits/10_assoc_vs_generic/src/lib.rs new file mode 100644 index 0000000..84f3e7b --- /dev/null +++ b/exercises/04_traits/10_assoc_vs_generic/src/lib.rs @@ -0,0 +1,37 @@ +// TODO: Define a new trait, `Power`, that has a method `power` that raises `self` +// to the power of `n`. +// The trait definition and its implementations should be enough to get +// the tests to compile and pass. +// +// Recommendation: you may be tempted to write a generic implementation to handle +// all cases at once. However, this is fairly complicated and requires the use of +// additional crates (i.e. `num-traits`). +// Even then, it might be preferable to use a simple macro instead to avoid +// the complexity of a highly generic implementation. Check out the +// "Little book of Rust macros" (https://veykril.github.io/tlborm/) if you're +// interested in learning more about it. +// You don't have to though: it's perfectly okay to write three separate +// implementations manually. Venture further only if you're curious. + +#[cfg(test)] +mod tests { + use super::Power; + + #[test] + fn test_power_u16() { + let x: u32 = 2_u32.power(3u16); + assert_eq!(x, 8); + } + + #[test] + fn test_power_u32() { + let x: u32 = 2_u32.power(3u32); + assert_eq!(x, 8); + } + + #[test] + fn test_power_ref_u32() { + let x: u32 = 2_u32.power(&3u32); + assert_eq!(x, 8); + } +} diff --git a/exercises/04_traits/11_clone/Cargo.toml b/exercises/04_traits/11_clone/Cargo.toml new file mode 100644 index 0000000..48a0623 --- /dev/null +++ b/exercises/04_traits/11_clone/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "clone" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/11_clone/src/lib.rs b/exercises/04_traits/11_clone/src/lib.rs new file mode 100644 index 0000000..4fbbe47 --- /dev/null +++ b/exercises/04_traits/11_clone/src/lib.rs @@ -0,0 +1,26 @@ +// TODO: add the necessary `Clone` implementations (and invocations) +// to get the code to compile. + +pub fn summary(ticket: Ticket) -> (Ticket, Summary) { + (ticket, ticket.summary()) +} + +pub struct Ticket { + pub title: String, + pub description: String, + pub status: String, +} + +impl Ticket { + pub fn summary(self) -> Summary { + Summary { + title: self.title, + status: self.status, + } + } +} + +pub struct Summary { + pub title: String, + pub status: String, +} diff --git a/exercises/04_traits/12_copy/Cargo.toml b/exercises/04_traits/12_copy/Cargo.toml new file mode 100644 index 0000000..65d9c94 --- /dev/null +++ b/exercises/04_traits/12_copy/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "copy" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/12_copy/src/lib.rs b/exercises/04_traits/12_copy/src/lib.rs new file mode 100644 index 0000000..d74720b --- /dev/null +++ b/exercises/04_traits/12_copy/src/lib.rs @@ -0,0 +1,25 @@ +// TODO: implement the necessary traits to make the test compile and pass. +// You *can't* modify the test. + +pub struct WrappingU32 { + value: u32, +} + +impl WrappingU32 { + pub fn new(value: u32) -> Self { + Self { value } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_ops() { + let x = WrappingU32::new(42); + let y = WrappingU32::new(31); + let z = WrappingU32::new(u32::MAX); + assert_eq!(x + y + y + z, WrappingU32::new(103)); + } +} diff --git a/exercises/04_traits/13_drop/Cargo.toml b/exercises/04_traits/13_drop/Cargo.toml new file mode 100644 index 0000000..2fe0fce --- /dev/null +++ b/exercises/04_traits/13_drop/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "drop" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/13_drop/src/lib.rs b/exercises/04_traits/13_drop/src/lib.rs new file mode 100644 index 0000000..2124d34 --- /dev/null +++ b/exercises/04_traits/13_drop/src/lib.rs @@ -0,0 +1,23 @@ +// TODO: implement a so-called "Drop bomb": a type that panics when dropped +// unless a certain operation has been performed on it. +// You can see the expected API in the tests below. + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[should_panic] + fn test_drop_bomb() { + let bomb = DropBomb::new(); + // The bomb should panic when dropped + } + + #[test] + fn test_defused_drop_bomb() { + let mut bomb = DropBomb::new(); + bomb.defuse(); + // The bomb should not panic when dropped + // since it has been defused + } +} diff --git a/exercises/04_traits/14_outro/Cargo.toml b/exercises/04_traits/14_outro/Cargo.toml new file mode 100644 index 0000000..98b008a --- /dev/null +++ b/exercises/04_traits/14_outro/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "outro_03" +version = "0.1.0" +edition = "2021" diff --git a/exercises/04_traits/14_outro/src/lib.rs b/exercises/04_traits/14_outro/src/lib.rs new file mode 100644 index 0000000..547fd94 --- /dev/null +++ b/exercises/04_traits/14_outro/src/lib.rs @@ -0,0 +1,10 @@ +// TODO: Define a new `SaturatingU16` type. +// It should hold a `u16` value. +// It should provide conversions from `u16`, `u8`, `&u16` and `&u8`. +// It should support addition with a right-hand side of type +// SaturatingU16, u16, &u16, and &SaturatingU16. Addition should saturate at the +// maximum value for `u16`. +// It should be possible to compare it with another `SaturatingU16` or a `u16`. +// It should be possible to print its debug representation. +// +// Tests are located in the `tests` folder—pay attention to the visibility of your types and methods. diff --git a/exercises/04_traits/14_outro/tests/integration.rs b/exercises/04_traits/14_outro/tests/integration.rs new file mode 100644 index 0000000..b27b2f8 --- /dev/null +++ b/exercises/04_traits/14_outro/tests/integration.rs @@ -0,0 +1,17 @@ +use outro_03::SaturatingU16; + +#[test] +fn test_saturating_u16() { + let a: SaturatingU16 = (&10u8).into(); + let b: SaturatingU16 = 5u8.into(); + let c: SaturatingU16 = u16::MAX.into(); + let d: SaturatingU16 = (&1u16).into(); + let e = &c; + + assert_eq!(a + b, SaturatingU16::from(15u16)); + assert_eq!(a + c, SaturatingU16::from(u16::MAX)); + assert_eq!(a + d, SaturatingU16::from(11u16)); + assert_eq!(a + a, 20u16); + assert_eq!(a + 5u16, 15u16); + assert_eq!(a + e, SaturatingU16::from(u16::MAX)); +} diff --git a/exercises/05_ticket_v2/00_intro/Cargo.toml b/exercises/05_ticket_v2/00_intro/Cargo.toml new file mode 100644 index 0000000..da4122d --- /dev/null +++ b/exercises/05_ticket_v2/00_intro/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "intro_04" +version = "0.1.0" +edition = "2021" diff --git a/exercises/05_ticket_v2/00_intro/src/lib.rs b/exercises/05_ticket_v2/00_intro/src/lib.rs new file mode 100644 index 0000000..ce1f75f --- /dev/null +++ b/exercises/05_ticket_v2/00_intro/src/lib.rs @@ -0,0 +1,14 @@ +fn intro() -> &'static str { + // TODO: fix me 👇 + "I'm ready to __!" +} + +#[cfg(test)] +mod tests { + use crate::intro; + + #[test] + fn test_intro() { + assert_eq!(intro(), "I'm ready to refine the `Ticket` type!"); + } +} diff --git a/exercises/05_ticket_v2/01_enum/Cargo.toml b/exercises/05_ticket_v2/01_enum/Cargo.toml new file mode 100644 index 0000000..d5e3c74 --- /dev/null +++ b/exercises/05_ticket_v2/01_enum/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "enum_" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +common = { path = "../../../helpers/common" } diff --git a/exercises/05_ticket_v2/01_enum/src/lib.rs b/exercises/05_ticket_v2/01_enum/src/lib.rs new file mode 100644 index 0000000..a3d9592 --- /dev/null +++ b/exercises/05_ticket_v2/01_enum/src/lib.rs @@ -0,0 +1,127 @@ +// TODO: use `Status` as type for `Ticket::status` +// Adjust the signature and implementation of all other methods as necessary. + +#[derive(Debug, PartialEq)] +// `derive`s are recursive: it can only derive `PartialEq` if all fields also implement `PartialEq`. +// Same holds for `Debug`. Do what you must with `Status` to make this work. +struct Ticket { + title: String, + description: String, + status: String, +} + +enum Status { + // TODO: add the missing variants +} + +impl Ticket { + pub fn new(title: String, description: String, status: String) -> Ticket { + if title.is_empty() { + panic!("Title cannot be empty"); + } + if title.len() > 50 { + panic!("Title cannot be longer than 50 bytes"); + } + if description.is_empty() { + panic!("Description cannot be empty"); + } + if description.len() > 500 { + panic!("Description cannot be longer than 500 bytes"); + } + if status != "To-Do" && status != "In Progress" && status != "Done" { + panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed"); + } + + Ticket { + title, + description, + status, + } + } + + pub fn title(&self) -> &String { + &self.title + } + + pub fn description(&self) -> &String { + &self.description + } + + pub fn status(&self) -> &String { + &self.status + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{valid_description, valid_title}; + + #[test] + fn test_partial_eq() { + let title = valid_title(); + let description = valid_description(); + let ticket1 = Ticket { + title: title.clone(), + description: description.clone(), + status: Status::ToDo, + }; + let ticket2 = Ticket { + title: title.clone(), + description: description.clone(), + status: Status::ToDo, + }; + assert_eq!(ticket1, ticket2); + } + + #[test] + fn test_description_not_matching() { + let title = valid_title(); + let status = Status::ToDo; + let ticket1 = Ticket { + title: title.clone(), + description: "description".to_string(), + status, + }; + let ticket2 = Ticket { + title: title.clone(), + description: "description2".to_string(), + status, + }; + assert_ne!(ticket1, ticket2); + } + + #[test] + fn test_title_not_matching() { + let description = valid_description(); + let status = Status::InProgress; + let ticket1 = Ticket { + title: "title".to_string(), + description: description.clone(), + status, + }; + let ticket2 = Ticket { + title: "title2".to_string(), + description: description.clone(), + status, + }; + assert_ne!(ticket1, ticket2); + } + + #[test] + fn test_status_not_matching() { + let title = valid_title(); + let description = valid_description(); + let ticket1 = Ticket { + title: title.clone(), + description: description.clone(), + status: Status::InProgress, + }; + let ticket2 = Ticket { + title: title.clone(), + description: description.clone(), + status: Status::Done, + }; + assert_ne!(ticket1, ticket2); + } +} diff --git a/exercises/05_ticket_v2/02_match/Cargo.toml b/exercises/05_ticket_v2/02_match/Cargo.toml new file mode 100644 index 0000000..b9ad3b8 --- /dev/null +++ b/exercises/05_ticket_v2/02_match/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "match_" +version = "0.1.0" +edition = "2021" diff --git a/exercises/05_ticket_v2/02_match/src/lib.rs b/exercises/05_ticket_v2/02_match/src/lib.rs new file mode 100644 index 0000000..d30c569 --- /dev/null +++ b/exercises/05_ticket_v2/02_match/src/lib.rs @@ -0,0 +1,44 @@ +enum Shape { + Circle, + Square, + Rectangle, + Triangle, + Pentagon, +} + +impl Shape { + // TODO: Implement the `n_sides` method using a `match`. + pub fn n_sides(&self) -> u8 { + todo!() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_circle() { + assert_eq!(Shape::Circle.n_sides(), 0); + } + + #[test] + fn test_square() { + assert_eq!(Shape::Square.n_sides(), 4); + } + + #[test] + fn test_rectangle() { + assert_eq!(Shape::Rectangle.n_sides(), 4); + } + + #[test] + fn test_triangle() { + assert_eq!(Shape::Triangle.n_sides(), 3); + } + + #[test] + fn test_pentagon() { + assert_eq!(Shape::Pentagon.n_sides(), 5); + } +} diff --git a/exercises/05_ticket_v2/03_variants_with_data/Cargo.toml b/exercises/05_ticket_v2/03_variants_with_data/Cargo.toml new file mode 100644 index 0000000..f841f1a --- /dev/null +++ b/exercises/05_ticket_v2/03_variants_with_data/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "variants_with_data" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +common = { path = "../../../helpers/common" } diff --git a/exercises/05_ticket_v2/03_variants_with_data/src/lib.rs b/exercises/05_ticket_v2/03_variants_with_data/src/lib.rs new file mode 100644 index 0000000..03faf0c --- /dev/null +++ b/exercises/05_ticket_v2/03_variants_with_data/src/lib.rs @@ -0,0 +1,75 @@ +// TODO: Implement `Ticket::assigned_to`. +// Return the name of the person assigned to the ticket, if the ticket is in progress. +// Panic otherwise. + +#[derive(Debug, PartialEq)] +struct Ticket { + title: String, + description: String, + status: Status, +} + +#[derive(Debug, PartialEq)] +enum Status { + ToDo, + InProgress { assigned_to: String }, + Done, +} + +impl Ticket { + pub fn new(title: String, description: String, status: Status) -> Ticket { + if title.is_empty() { + panic!("Title cannot be empty"); + } + if title.len() > 50 { + panic!("Title cannot be longer than 50 bytes"); + } + if description.is_empty() { + panic!("Description cannot be empty"); + } + if description.len() > 500 { + panic!("Description cannot be longer than 500 bytes"); + } + + Ticket { + title, + description, + status, + } + } + pub fn assigned_to(&self) -> &str { + todo!() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{valid_description, valid_title}; + + #[test] + #[should_panic(expected = "Only `In-Progress` tickets can be assigned to someone")] + fn test_todo() { + let ticket = Ticket::new(valid_title(), valid_description(), Status::ToDo); + ticket.assigned_to(); + } + + #[test] + #[should_panic(expected = "Only `In-Progress` tickets can be assigned to someone")] + fn test_done() { + let ticket = Ticket::new(valid_title(), valid_description(), Status::Done); + ticket.assigned_to(); + } + + #[test] + fn test_in_progress() { + let ticket = Ticket::new( + valid_title(), + valid_description(), + Status::InProgress { + assigned_to: "Alice".to_string(), + }, + ); + assert_eq!(ticket.assigned_to(), "Alice"); + } +} diff --git a/exercises/05_ticket_v2/04_if_let/Cargo.toml b/exercises/05_ticket_v2/04_if_let/Cargo.toml new file mode 100644 index 0000000..69864d9 --- /dev/null +++ b/exercises/05_ticket_v2/04_if_let/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "if_let" +version = "0.1.0" +edition = "2021" diff --git a/exercises/05_ticket_v2/04_if_let/src/lib.rs b/exercises/05_ticket_v2/04_if_let/src/lib.rs new file mode 100644 index 0000000..0884fb5 --- /dev/null +++ b/exercises/05_ticket_v2/04_if_let/src/lib.rs @@ -0,0 +1,39 @@ +enum Shape { + Circle { radius: f64 }, + Square { border: f64 }, + Rectangle { width: f64, height: f64 }, +} + +impl Shape { + // TODO: Implement the `radius` method using + // either an `if let` or a `let/else`. + pub fn radius(&self) -> f64 { + todo!() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_circle() { + let _ = Shape::Circle { radius: 1.0 }.radius(); + } + + #[test] + #[should_panic] + fn test_square() { + let _ = Shape::Square { border: 1.0 }.radius(); + } + + #[test] + #[should_panic] + fn test_rectangle() { + let _ = Shape::Rectangle { + width: 1.0, + height: 2.0, + } + .radius(); + } +} diff --git a/exercises/05_ticket_v2/05_nullability/Cargo.toml b/exercises/05_ticket_v2/05_nullability/Cargo.toml new file mode 100644 index 0000000..be285ba --- /dev/null +++ b/exercises/05_ticket_v2/05_nullability/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "nullability" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +common = { path = "../../../helpers/common" } diff --git a/exercises/05_ticket_v2/05_nullability/src/lib.rs b/exercises/05_ticket_v2/05_nullability/src/lib.rs new file mode 100644 index 0000000..f4e5cb2 --- /dev/null +++ b/exercises/05_ticket_v2/05_nullability/src/lib.rs @@ -0,0 +1,71 @@ +// TODO: Implement `Ticket::assigned_to` using `Option` as the return type. + +#[derive(Debug, PartialEq)] +struct Ticket { + title: String, + description: String, + status: Status, +} + +#[derive(Debug, PartialEq)] +enum Status { + ToDo, + InProgress { assigned_to: String }, + Done, +} + +impl Ticket { + pub fn new(title: String, description: String, status: Status) -> Ticket { + if title.is_empty() { + panic!("Title cannot be empty"); + } + if title.len() > 50 { + panic!("Title cannot be longer than 50 bytes"); + } + if description.is_empty() { + panic!("Description cannot be empty"); + } + if description.len() > 500 { + panic!("Description cannot be longer than 500 bytes"); + } + + Ticket { + title, + description, + status, + } + } + pub fn assigned_to(&self) -> Option<&String> { + todo!() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{valid_description, valid_title}; + + #[test] + fn test_todo() { + let ticket = Ticket::new(valid_title(), valid_description(), Status::ToDo); + assert!(ticket.assigned_to().is_none()); + } + + #[test] + fn test_done() { + let ticket = Ticket::new(valid_title(), valid_description(), Status::Done); + assert!(ticket.assigned_to().is_none()); + } + + #[test] + fn test_in_progress() { + let ticket = Ticket::new( + valid_title(), + valid_description(), + Status::InProgress { + assigned_to: "Alice".to_string(), + }, + ); + assert_eq!(ticket.assigned_to(), Some(&"Alice".to_string())); + } +} diff --git a/exercises/05_ticket_v2/06_fallibility/Cargo.toml b/exercises/05_ticket_v2/06_fallibility/Cargo.toml new file mode 100644 index 0000000..82e9758 --- /dev/null +++ b/exercises/05_ticket_v2/06_fallibility/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "fallibility" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +common = { path = "../../../helpers/common" } diff --git a/exercises/05_ticket_v2/06_fallibility/src/lib.rs b/exercises/05_ticket_v2/06_fallibility/src/lib.rs new file mode 100644 index 0000000..3144bee --- /dev/null +++ b/exercises/05_ticket_v2/06_fallibility/src/lib.rs @@ -0,0 +1,71 @@ +// TODO: Convert the `Ticket::new` method to return a `Result` instead of panicking. +// Use `String` as the error type. + +#[derive(Debug, PartialEq)] +struct Ticket { + title: String, + description: String, + status: Status, +} + +#[derive(Debug, PartialEq)] +enum Status { + ToDo, + InProgress { assigned_to: String }, + Done, +} + +impl Ticket { + pub fn new(title: String, description: String, status: Status) -> Ticket { + if title.is_empty() { + panic!("Title cannot be empty"); + } + if title.len() > 50 { + panic!("Title cannot be longer than 50 bytes"); + } + if description.is_empty() { + panic!("Description cannot be empty"); + } + if description.len() > 500 { + panic!("Description cannot be longer than 500 bytes"); + } + + Ticket { + title, + description, + status, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{overly_long_description, overly_long_title, valid_description, valid_title}; + + #[test] + fn title_cannot_be_empty() { + let error = Ticket::new("".into(), valid_description(), Status::ToDo).unwrap_err(); + assert_eq!(error, "Title cannot be empty"); + } + + #[test] + fn description_cannot_be_empty() { + let error = Ticket::new(valid_title(), "".into(), Status::ToDo).unwrap_err(); + assert_eq!(error, "Description cannot be empty"); + } + + #[test] + fn title_cannot_be_longer_than_fifty_chars() { + let error = + Ticket::new(overly_long_title(), valid_description(), Status::ToDo).unwrap_err(); + assert_eq!(error, "Title cannot be longer than 50 bytes"); + } + + #[test] + fn description_cannot_be_longer_than_500_chars() { + let error = + Ticket::new(valid_title(), overly_long_description(), Status::ToDo).unwrap_err(); + assert_eq!(error, "Description cannot be longer than 500 bytes"); + } +} diff --git a/exercises/05_ticket_v2/07_unwrap/Cargo.toml b/exercises/05_ticket_v2/07_unwrap/Cargo.toml new file mode 100644 index 0000000..9044e45 --- /dev/null +++ b/exercises/05_ticket_v2/07_unwrap/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "unwrap" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +common = { path = "../../../helpers/common" } diff --git a/exercises/05_ticket_v2/07_unwrap/src/lib.rs b/exercises/05_ticket_v2/07_unwrap/src/lib.rs new file mode 100644 index 0000000..4b6419b --- /dev/null +++ b/exercises/05_ticket_v2/07_unwrap/src/lib.rs @@ -0,0 +1,73 @@ +// TODO: `easy_ticket` should panic when the title is invalid. +// When the description is invalid, instead, it should use a default description: +// "Description not provided". +fn easy_ticket(title: String, description: String, status: Status) -> Ticket { + todo!() +} + +#[derive(Debug, PartialEq, Clone)] +struct Ticket { + title: String, + description: String, + status: Status, +} + +#[derive(Debug, PartialEq, Clone)] +enum Status { + ToDo, + InProgress { assigned_to: String }, + Done, +} + +impl Ticket { + pub fn new(title: String, description: String, status: Status) -> Result { + if title.is_empty() { + return Err("Title cannot be empty".to_string()); + } + if title.len() > 50 { + return Err("Title cannot be longer than 50 bytes".to_string()); + } + if description.is_empty() { + return Err("Description cannot be empty".to_string()); + } + if description.len() > 500 { + return Err("Description cannot be longer than 500 bytes".to_string()); + } + + Ok(Ticket { + title, + description, + status, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{overly_long_description, overly_long_title, valid_description, valid_title}; + + #[test] + #[should_panic(expected = "Title cannot be empty")] + fn title_cannot_be_empty() { + easy_ticket("".into(), valid_description(), Status::ToDo); + } + + #[test] + fn template_description_is_used_if_empty() { + let ticket = easy_ticket(valid_title(), "".into(), Status::ToDo); + assert_eq!(ticket.description, "Description not provided"); + } + + #[test] + #[should_panic(expected = "Title cannot be longer than 50 bytes")] + fn title_cannot_be_longer_than_fifty_chars() { + easy_ticket(overly_long_title(), valid_description(), Status::ToDo); + } + + #[test] + fn template_description_is_used_if_too_long() { + let ticket = easy_ticket(valid_title(), overly_long_description(), Status::ToDo); + assert_eq!(ticket.description, "Description not provided"); + } +} diff --git a/exercises/05_ticket_v2/08_error_enums/Cargo.toml b/exercises/05_ticket_v2/08_error_enums/Cargo.toml new file mode 100644 index 0000000..76ce4b5 --- /dev/null +++ b/exercises/05_ticket_v2/08_error_enums/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "error_enums" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +common = { path = "../../../helpers/common" } diff --git a/exercises/05_ticket_v2/08_error_enums/src/lib.rs b/exercises/05_ticket_v2/08_error_enums/src/lib.rs new file mode 100644 index 0000000..c74fcc9 --- /dev/null +++ b/exercises/05_ticket_v2/08_error_enums/src/lib.rs @@ -0,0 +1,83 @@ +// TODO: Use two variants, one for a title error and one for a description error. +// Each variant should contain a string with the explanation of what went wrong exactly. +// You'll have to update the implementation of `Ticket::new` as well. +enum TicketNewError {} + +// TODO: `easy_ticket` should panic when the title is invalid, using the error message +// stored inside the relevant variant of the `TicketNewError` enum. +// When the description is invalid, instead, it should use a default description: +// "Description not provided". +fn easy_ticket(title: String, description: String, status: Status) -> Ticket { + todo!() +} + +#[derive(Debug, PartialEq)] +struct Ticket { + title: String, + description: String, + status: Status, +} + +#[derive(Debug, PartialEq, Clone)] +enum Status { + ToDo, + InProgress { assigned_to: String }, + Done, +} + +impl Ticket { + pub fn new( + title: String, + description: String, + status: Status, + ) -> Result { + if title.is_empty() { + return Err("Title cannot be empty".to_string()); + } + if title.len() > 50 { + return Err("Title cannot be longer than 50 bytes".to_string()); + } + if description.is_empty() { + return Err("Description cannot be empty".to_string()); + } + if description.len() > 500 { + return Err("Description cannot be longer than 500 bytes".to_string()); + } + + Ok(Ticket { + title, + description, + status, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{overly_long_description, overly_long_title, valid_description, valid_title}; + + #[test] + #[should_panic(expected = "Title cannot be empty")] + fn title_cannot_be_empty() { + easy_ticket("".into(), valid_description(), Status::ToDo); + } + + #[test] + fn template_description_is_used_if_empty() { + let ticket = easy_ticket(valid_title(), "".into(), Status::ToDo); + assert_eq!(ticket.description, "Description not provided"); + } + + #[test] + #[should_panic(expected = "Title cannot be longer than 50 bytes")] + fn title_cannot_be_longer_than_fifty_chars() { + easy_ticket(overly_long_title(), valid_description(), Status::ToDo); + } + + #[test] + fn template_description_is_used_if_too_long() { + let ticket = easy_ticket(valid_title(), overly_long_description(), Status::ToDo); + assert_eq!(ticket.description, "Description not provided"); + } +} diff --git a/exercises/05_ticket_v2/09_error_trait/Cargo.toml b/exercises/05_ticket_v2/09_error_trait/Cargo.toml new file mode 100644 index 0000000..dc24282 --- /dev/null +++ b/exercises/05_ticket_v2/09_error_trait/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "error_trait" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +common = { path = "../../../helpers/common" } +static_assertions = "1.1.0" diff --git a/exercises/05_ticket_v2/09_error_trait/src/lib.rs b/exercises/05_ticket_v2/09_error_trait/src/lib.rs new file mode 100644 index 0000000..68b5769 --- /dev/null +++ b/exercises/05_ticket_v2/09_error_trait/src/lib.rs @@ -0,0 +1,105 @@ +// TODO: Implement `Debug`, `Display` and `Error` for the `TicketNewError` enum. +// When implementing `Display`, you may want to use the `write!` macro from Rust's standard library. +// The docs for the `std::fmt` module are a good place to start and look for examples: +// https://doc.rust-lang.org/std/fmt/index.html#write + +enum TicketNewError { + TitleError(String), + DescriptionError(String), +} + +// TODO: `easy_ticket` should panic when the title is invalid, using the error message +// stored inside the relevant variant of the `TicketNewError` enum. +// When the description is invalid, instead, it should use a default description: +// "Description not provided". +fn easy_ticket(title: String, description: String, status: Status) -> Ticket { + todo!() +} + +#[derive(Debug, PartialEq, Clone)] +struct Ticket { + title: String, + description: String, + status: Status, +} + +#[derive(Debug, PartialEq, Clone)] +enum Status { + ToDo, + InProgress { assigned_to: String }, + Done, +} + +impl Ticket { + pub fn new( + title: String, + description: String, + status: Status, + ) -> Result { + if title.is_empty() { + return Err(TicketNewError::TitleError( + "Title cannot be empty".to_string(), + )); + } + if title.len() > 50 { + return Err(TicketNewError::TitleError( + "Title cannot be longer than 50 bytes".to_string(), + )); + } + if description.is_empty() { + return Err(TicketNewError::DescriptionError( + "Description cannot be empty".to_string(), + )); + } + if description.len() > 500 { + return Err(TicketNewError::DescriptionError( + "Description cannot be longer than 500 bytes".to_string(), + )); + } + + Ok(Ticket { + title, + description, + status, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{overly_long_description, overly_long_title, valid_description, valid_title}; + use static_assertions::assert_impl_one; + + #[test] + #[should_panic(expected = "Title cannot be empty")] + fn title_cannot_be_empty() { + easy_ticket("".into(), valid_description(), Status::ToDo); + } + + #[test] + fn template_description_is_used_if_empty() { + let ticket = easy_ticket(valid_title(), "".into(), Status::ToDo); + assert_eq!(ticket.description, "Description not provided"); + } + + #[test] + #[should_panic(expected = "Title cannot be longer than 50 bytes")] + fn title_cannot_be_longer_than_fifty_chars() { + easy_ticket(overly_long_title(), valid_description(), Status::ToDo); + } + + #[test] + fn template_description_is_used_if_too_long() { + let ticket = easy_ticket(valid_title(), overly_long_description(), Status::ToDo); + assert_eq!(ticket.description, "Description not provided"); + } + + #[test] + fn display_is_correctly_implemented() { + let ticket = Ticket::new("".into(), valid_description(), Status::ToDo); + assert_eq!(format!("{}", ticket.unwrap_err()), "Title cannot be empty"); + } + + assert_impl_one!(TicketNewError: std::error::Error); +} diff --git a/exercises/05_ticket_v2/10_packages/Cargo.toml b/exercises/05_ticket_v2/10_packages/Cargo.toml new file mode 100644 index 0000000..8572f49 --- /dev/null +++ b/exercises/05_ticket_v2/10_packages/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "packages" +version = "0.1.0" +edition = "2021" diff --git a/exercises/05_ticket_v2/10_packages/src/main.rs b/exercises/05_ticket_v2/10_packages/src/main.rs new file mode 100644 index 0000000..5a1e0b2 --- /dev/null +++ b/exercises/05_ticket_v2/10_packages/src/main.rs @@ -0,0 +1,11 @@ +// This is a `main.rs` file, therefore `cargo` interprets this as the root of a binary target. + +// TODO: fix this broken import. Create a new library target in the `src` directory. +// The library target should expose a public function named `hello_world` that takes no arguments +// and returns nothing. +use packages::hello_world; + +// This is the entrypoint of the binary. +fn main() { + hello_world(); +} diff --git a/exercises/05_ticket_v2/11_dependencies/Cargo.toml b/exercises/05_ticket_v2/11_dependencies/Cargo.toml new file mode 100644 index 0000000..c18abf9 --- /dev/null +++ b/exercises/05_ticket_v2/11_dependencies/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "deps" +version = "0.1.0" +edition = "2021" diff --git a/exercises/05_ticket_v2/11_dependencies/src/lib.rs b/exercises/05_ticket_v2/11_dependencies/src/lib.rs new file mode 100644 index 0000000..185131a --- /dev/null +++ b/exercises/05_ticket_v2/11_dependencies/src/lib.rs @@ -0,0 +1,6 @@ +// TODO: Add `anyhow` as a dependency of this project. +// Don't touch this import! + +// When you import a type (`Error`) from a dependency, the import path must start +// with the crate name (`anyhow`, in this case). +use anyhow::Error; diff --git a/exercises/05_ticket_v2/12_thiserror/Cargo.toml b/exercises/05_ticket_v2/12_thiserror/Cargo.toml new file mode 100644 index 0000000..fb9c7d5 --- /dev/null +++ b/exercises/05_ticket_v2/12_thiserror/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "thiserror_" +version = "0.1.0" +edition = "2021" + +[dependencies] + +[dev-dependencies] +common = { path = "../../../helpers/common" } diff --git a/exercises/05_ticket_v2/12_thiserror/src/lib.rs b/exercises/05_ticket_v2/12_thiserror/src/lib.rs new file mode 100644 index 0000000..9289143 --- /dev/null +++ b/exercises/05_ticket_v2/12_thiserror/src/lib.rs @@ -0,0 +1,85 @@ +// TODO: Implement the `Error` trait for `TicketNewError` using `thiserror`. +// We've changed the enum variants to be more specific, thus removing the need for storing +// a `String` field into each variant. +// You'll also have to add `thiserror` as a dependency in the `Cargo.toml` file. + +enum TicketNewError { + TitleCannotBeEmpty, + TitleTooLong, + DescriptionCannotBeEmpty, + DescriptionTooLong, +} + +#[derive(Debug, PartialEq, Clone)] +struct Ticket { + title: String, + description: String, + status: Status, +} + +#[derive(Debug, PartialEq, Clone)] +enum Status { + ToDo, + InProgress { assigned_to: String }, + Done, +} + +impl Ticket { + pub fn new( + title: String, + description: String, + status: Status, + ) -> Result { + if title.is_empty() { + return Err(TicketNewError::TitleCannotBeEmpty); + } + if title.len() > 50 { + return Err(TicketNewError::TitleTooLong); + } + if description.is_empty() { + return Err(TicketNewError::DescriptionCannotBeEmpty); + } + if description.len() > 500 { + return Err(TicketNewError::DescriptionTooLong); + } + + Ok(Ticket { + title, + description, + status, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{overly_long_description, overly_long_title, valid_description, valid_title}; + + #[test] + fn title_cannot_be_empty() { + let err = Ticket::new("".into(), valid_description(), Status::ToDo).unwrap_err(); + assert_eq!(err.to_string(), "Title cannot be empty"); + } + + #[test] + fn description_cannot_be_empty() { + let err = Ticket::new(valid_title(), "".into(), Status::ToDo).unwrap_err(); + assert_eq!(err.to_string(), "Description cannot be empty"); + } + + #[test] + fn title_cannot_be_longer_than_fifty_chars() { + let err = Ticket::new(overly_long_title(), valid_description(), Status::ToDo).unwrap_err(); + assert_eq!(err.to_string(), "Title cannot be longer than 50 bytes"); + } + + #[test] + fn description_cannot_be_too_long() { + let err = Ticket::new(valid_title(), overly_long_description(), Status::ToDo).unwrap_err(); + assert_eq!( + err.to_string(), + "Description cannot be longer than 500 bytes" + ); + } +} diff --git a/exercises/05_ticket_v2/13_try_from/Cargo.toml b/exercises/05_ticket_v2/13_try_from/Cargo.toml new file mode 100644 index 0000000..5d70357 --- /dev/null +++ b/exercises/05_ticket_v2/13_try_from/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "tryfrom" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/exercises/05_ticket_v2/13_try_from/src/lib.rs b/exercises/05_ticket_v2/13_try_from/src/lib.rs new file mode 100644 index 0000000..e0e1115 --- /dev/null +++ b/exercises/05_ticket_v2/13_try_from/src/lib.rs @@ -0,0 +1,39 @@ +// TODO: Implement `TryFrom` and `TryFrom<&str>` for `Status`. +// The parsing should be case-insensitive. + +#[derive(Debug, PartialEq, Clone)] +enum Status { + ToDo, + InProgress, + Done, +} + +#[cfg(test)] +mod tests { + use super::*; + use std::convert::TryFrom; + + #[test] + fn test_try_from_string() { + let status = Status::try_from("ToDO".to_string()).unwrap(); + assert_eq!(status, Status::ToDo); + + let status = Status::try_from("inproGress".to_string()).unwrap(); + assert_eq!(status, Status::InProgress); + + let status = Status::try_from("Done".to_string()).unwrap(); + assert_eq!(status, Status::Done); + } + + #[test] + fn test_try_from_str() { + let status = Status::try_from("todo").unwrap(); + assert_eq!(status, Status::ToDo); + + let status = Status::try_from("inprogress").unwrap(); + assert_eq!(status, Status::InProgress); + + let status = Status::try_from("done").unwrap(); + assert_eq!(status, Status::Done); + } +} diff --git a/exercises/05_ticket_v2/14_source/Cargo.toml b/exercises/05_ticket_v2/14_source/Cargo.toml new file mode 100644 index 0000000..0742f21 --- /dev/null +++ b/exercises/05_ticket_v2/14_source/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "source" +version = "0.1.0" +edition = "2021" + +[dependencies] +thiserror = "1.0.59" + +[dev-dependencies] +common = { path = "../../../helpers/common" } diff --git a/exercises/05_ticket_v2/14_source/src/lib.rs b/exercises/05_ticket_v2/14_source/src/lib.rs new file mode 100644 index 0000000..9f7cce5 --- /dev/null +++ b/exercises/05_ticket_v2/14_source/src/lib.rs @@ -0,0 +1,76 @@ +use crate::status::Status; + +// We've seen how to declare modules in one of the earliest exercises, but +// we haven't seen how to extract them into separate files. +// Let's fix that now! +// +// In the simplest case, when the extracted module is a single file, it is enough to +// create a new file with the same name as the module and move the module content there. +// The module file should be placed in the same directory as the file that declares the module. +// In this case, `src/lib.rs`, thus `status.rs` should be placed in the `src` directory. +mod status; + +// TODO: Add a new error variant to `TicketNewError` for when the status string is invalid. +// When calling `source` on an error of that variant, it should return a `ParseStatusError` rather than `None`. + +#[derive(Debug, thiserror::Error)] +pub enum TicketNewError { + #[error("Title cannot be empty")] + TitleCannotBeEmpty, + #[error("Title cannot be longer than 50 bytes")] + TitleTooLong, + #[error("Description cannot be empty")] + DescriptionCannotBeEmpty, + #[error("Description cannot be longer than 500 bytes")] + DescriptionTooLong, +} + +#[derive(Debug, PartialEq, Clone)] +pub struct Ticket { + title: String, + description: String, + status: Status, +} + +impl Ticket { + pub fn new(title: String, description: String, status: String) -> Result { + if title.is_empty() { + return Err(TicketNewError::TitleCannotBeEmpty); + } + if title.len() > 50 { + return Err(TicketNewError::TitleTooLong); + } + if description.is_empty() { + return Err(TicketNewError::DescriptionCannotBeEmpty); + } + if description.len() > 500 { + return Err(TicketNewError::DescriptionTooLong); + } + + // TODO: Parse the status string into a `Status` enum. + + Ok(Ticket { + title, + description, + status, + }) + } +} + +#[cfg(test)] +mod tests { + use common::{valid_description, valid_title}; + use std::error::Error; + + use super::*; + + #[test] + fn invalid_status() { + let err = Ticket::new(valid_title(), valid_description(), "invalid".into()).unwrap_err(); + assert_eq!( + err.to_string(), + "`invalid` is not a valid status. Use one of: ToDo, InProgress, Done" + ); + assert!(err.source().is_some()); + } +} diff --git a/exercises/05_ticket_v2/14_source/src/status.rs b/exercises/05_ticket_v2/14_source/src/status.rs new file mode 100644 index 0000000..bc91e09 --- /dev/null +++ b/exercises/05_ticket_v2/14_source/src/status.rs @@ -0,0 +1,46 @@ +#[derive(Debug, PartialEq, Clone)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TryFrom for Status { + type Error = ParseStatusError; + + fn try_from(value: String) -> Result { + let value = value.to_lowercase(); + match value.as_str() { + "todo" => Ok(Status::ToDo), + "inprogress" => Ok(Status::InProgress), + "done" => Ok(Status::Done), + _ => Err(ParseStatusError { + invalid_status: value, + }), + } + } +} + +#[derive(Debug, thiserror::Error)] +#[error("`{invalid_status}` is not a valid status. Use one of: ToDo, InProgress, Done")] +pub struct ParseStatusError { + invalid_status: String, +} + +#[cfg(test)] +mod tests { + use super::*; + use std::convert::TryFrom; + + #[test] + fn test_try_from_string() { + let status = Status::try_from("ToDO".to_string()).unwrap(); + assert_eq!(status, Status::ToDo); + + let status = Status::try_from("inproGress".to_string()).unwrap(); + assert_eq!(status, Status::InProgress); + + let status = Status::try_from("Done".to_string()).unwrap(); + assert_eq!(status, Status::Done); + } +} diff --git a/exercises/05_ticket_v2/15_outro/Cargo.toml b/exercises/05_ticket_v2/15_outro/Cargo.toml new file mode 100644 index 0000000..dc32a41 --- /dev/null +++ b/exercises/05_ticket_v2/15_outro/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "outro_04" +version = "0.1.0" +edition = "2021" diff --git a/exercises/05_ticket_v2/15_outro/src/description.rs b/exercises/05_ticket_v2/15_outro/src/description.rs new file mode 100644 index 0000000..ecf55ad --- /dev/null +++ b/exercises/05_ticket_v2/15_outro/src/description.rs @@ -0,0 +1,39 @@ +// TODO: Implement `TryFrom` and `TryFrom<&str>` for the `TicketDescription` type, +// enforcing that the description is not empty and is not longer than 500 bytes. +// Implement the traits required to make the tests pass too. + +pub struct TicketDescription(String); + +#[cfg(test)] +mod tests { + use super::*; + use std::convert::TryFrom; + + #[test] + fn test_try_from_string() { + let description = TicketDescription::try_from("A description".to_string()).unwrap(); + assert_eq!(description.0, "A description"); + } + + #[test] + fn test_try_from_empty_string() { + let err = TicketDescription::try_from("".to_string()).unwrap_err(); + assert_eq!(err.to_string(), "The description cannot be empty"); + } + + #[test] + fn test_try_from_long_string() { + let description = "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.".to_string(); + let err = TicketDescription::try_from(description).unwrap_err(); + assert_eq!( + err.to_string(), + "The description cannot be longer than 500 bytes" + ); + } + + #[test] + fn test_try_from_str() { + let description = TicketDescription::try_from("A description").unwrap(); + assert_eq!(description.0, "A description"); + } +} diff --git a/exercises/05_ticket_v2/15_outro/src/lib.rs b/exercises/05_ticket_v2/15_outro/src/lib.rs new file mode 100644 index 0000000..fe9bd99 --- /dev/null +++ b/exercises/05_ticket_v2/15_outro/src/lib.rs @@ -0,0 +1,28 @@ +// TODO: you have something to do in each of the modules in this crate! +mod description; +mod status; +mod title; + +// A common pattern in Rust is to split code into multiple (private) modules +// and then re-export the public parts of those modules at the root of the crate. +// +// This hides the internal structure of the crate from your users, while still +// allowing you to organize your code however you like. +pub use description::TicketDescription; +pub use status::Status; +pub use title::TicketTitle; + +#[derive(Debug, PartialEq, Clone)] +// We no longer need to make the fields private! +// Since each field encapsulates its own validation logic, there is no risk of +// a user of `Ticket` modifying the fields in a way that would break the +// invariants of the struct. +// +// Careful though: if you had any invariants that spanned multiple fields, you +// would need to ensure that those invariants are still maintained and go back +// to making the fields private. +pub struct Ticket { + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} diff --git a/exercises/05_ticket_v2/15_outro/src/status.rs b/exercises/05_ticket_v2/15_outro/src/status.rs new file mode 100644 index 0000000..4453d52 --- /dev/null +++ b/exercises/05_ticket_v2/15_outro/src/status.rs @@ -0,0 +1,44 @@ +// TODO: Implement `TryFrom` and `TryFrom<&str>` for the `Status` enum. +// The parsing should be case-insensitive. + +pub enum Status { + ToDo, + InProgress, + Done, +} + +#[cfg(test)] +mod tests { + use super::*; + use std::convert::TryFrom; + + #[test] + fn test_try_from_string() { + let status = Status::try_from("ToDO".to_string()).unwrap(); + assert_eq!(status, Status::ToDo); + + let status = Status::try_from("inproGress".to_string()).unwrap(); + assert_eq!(status, Status::InProgress); + + let status = Status::try_from("Done".to_string()).unwrap(); + assert_eq!(status, Status::Done); + } + + #[test] + fn test_try_from_str() { + let status = Status::try_from("ToDO").unwrap(); + assert_eq!(status, Status::ToDo); + + let status = Status::try_from("inproGress").unwrap(); + assert_eq!(status, Status::InProgress); + + let status = Status::try_from("Done").unwrap(); + assert_eq!(status, Status::Done); + } + + #[test] + fn test_try_from_invalid() { + let status = Status::try_from("Invalid"); + assert!(status.is_err()); + } +} diff --git a/exercises/05_ticket_v2/15_outro/src/title.rs b/exercises/05_ticket_v2/15_outro/src/title.rs new file mode 100644 index 0000000..7c26c93 --- /dev/null +++ b/exercises/05_ticket_v2/15_outro/src/title.rs @@ -0,0 +1,38 @@ +// TODO: Implement `TryFrom` and `TryFrom<&str>` for the `TicketTitle` type, +// enforcing that the title is not empty and is not longer than 50 bytes. +// Implement the traits required to make the tests pass too. + +pub struct TicketTitle(String); + +#[cfg(test)] +mod tests { + use super::*; + use std::convert::TryFrom; + + #[test] + fn test_try_from_string() { + let title = TicketTitle::try_from("A title".to_string()).unwrap(); + assert_eq!(title.0, "A title"); + } + + #[test] + fn test_try_from_empty_string() { + let err = TicketTitle::try_from("".to_string()).unwrap_err(); + assert_eq!(err.to_string(), "The title cannot be empty"); + } + + #[test] + fn test_try_from_long_string() { + let title = + "A title that's definitely longer than what should be allowed in a development ticket" + .to_string(); + let err = TicketTitle::try_from(title).unwrap_err(); + assert_eq!(err.to_string(), "The title cannot be longer than 50 bytes"); + } + + #[test] + fn test_try_from_str() { + let title = TicketTitle::try_from("A title").unwrap(); + assert_eq!(title.0, "A title"); + } +} diff --git a/exercises/06_ticket_management/00_intro/Cargo.toml b/exercises/06_ticket_management/00_intro/Cargo.toml new file mode 100644 index 0000000..f6e07a3 --- /dev/null +++ b/exercises/06_ticket_management/00_intro/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "intro_05" +version = "0.1.0" +edition = "2021" diff --git a/exercises/06_ticket_management/00_intro/src/lib.rs b/exercises/06_ticket_management/00_intro/src/lib.rs new file mode 100644 index 0000000..118e483 --- /dev/null +++ b/exercises/06_ticket_management/00_intro/src/lib.rs @@ -0,0 +1,14 @@ +fn intro() -> &'static str { + // TODO: fix me 👇 + "I'm ready to __!" +} + +#[cfg(test)] +mod tests { + use crate::intro; + + #[test] + fn test_intro() { + assert_eq!(intro(), "I'm ready to build a ticket management system!"); + } +} diff --git a/exercises/06_ticket_management/01_arrays/Cargo.toml b/exercises/06_ticket_management/01_arrays/Cargo.toml new file mode 100644 index 0000000..2a74a17 --- /dev/null +++ b/exercises/06_ticket_management/01_arrays/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "arrays" +version = "0.1.0" +edition = "2021" diff --git a/exercises/06_ticket_management/01_arrays/src/lib.rs b/exercises/06_ticket_management/01_arrays/src/lib.rs new file mode 100644 index 0000000..e06cb2b --- /dev/null +++ b/exercises/06_ticket_management/01_arrays/src/lib.rs @@ -0,0 +1,80 @@ +// TODO: Flesh out the `WeekTemperatures` struct and its method implementations to pass the tests. + +pub struct WeekTemperatures { + // TODO +} + +pub enum Weekday { + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday, +} + +impl WeekTemperatures { + pub fn new() -> Self { + todo!() + } + + pub fn get_temperature(&self, day: Weekday) -> Option { + todo!() + } + + pub fn set_temperature(&mut self, day: Weekday, temperature: i32) { + todo!() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_temperature() { + let mut week_temperatures = WeekTemperatures::new(); + + assert_eq!(week_temperatures.get_temperature(Weekday::Monday), None); + assert_eq!(week_temperatures.get_temperature(Weekday::Tuesday), None); + assert_eq!(week_temperatures.get_temperature(Weekday::Wednesday), None); + assert_eq!(week_temperatures.get_temperature(Weekday::Thursday), None); + assert_eq!(week_temperatures.get_temperature(Weekday::Friday), None); + assert_eq!(week_temperatures.get_temperature(Weekday::Saturday), None); + assert_eq!(week_temperatures.get_temperature(Weekday::Sunday), None); + + week_temperatures.set_temperature(Weekday::Monday, 20); + assert_eq!(week_temperatures.get_temperature(Weekday::Monday), Some(20)); + + week_temperatures.set_temperature(Weekday::Monday, 25); + assert_eq!(week_temperatures.get_temperature(Weekday::Monday), Some(25)); + + week_temperatures.set_temperature(Weekday::Tuesday, 30); + week_temperatures.set_temperature(Weekday::Wednesday, 35); + week_temperatures.set_temperature(Weekday::Thursday, 40); + week_temperatures.set_temperature(Weekday::Friday, 45); + week_temperatures.set_temperature(Weekday::Saturday, 50); + week_temperatures.set_temperature(Weekday::Sunday, 55); + + assert_eq!(week_temperatures.get_temperature(Weekday::Monday), Some(25)); + assert_eq!( + week_temperatures.get_temperature(Weekday::Tuesday), + Some(30) + ); + assert_eq!( + week_temperatures.get_temperature(Weekday::Wednesday), + Some(35) + ); + assert_eq!( + week_temperatures.get_temperature(Weekday::Thursday), + Some(40) + ); + assert_eq!(week_temperatures.get_temperature(Weekday::Friday), Some(45)); + assert_eq!( + week_temperatures.get_temperature(Weekday::Saturday), + Some(50) + ); + assert_eq!(week_temperatures.get_temperature(Weekday::Sunday), Some(55)); + } +} diff --git a/exercises/06_ticket_management/02_vec/Cargo.toml b/exercises/06_ticket_management/02_vec/Cargo.toml new file mode 100644 index 0000000..66ee1de --- /dev/null +++ b/exercises/06_ticket_management/02_vec/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "vec" +version = "0.1.0" +edition = "2021" diff --git a/exercises/06_ticket_management/02_vec/src/lib.rs b/exercises/06_ticket_management/02_vec/src/lib.rs new file mode 100644 index 0000000..2e8b498 --- /dev/null +++ b/exercises/06_ticket_management/02_vec/src/lib.rs @@ -0,0 +1,49 @@ +// Given a number `n`, return the `n+1`th number in the Fibonacci sequence. +// +// The Fibonacci sequence is defined as follows: +// +// - The first number of the sequence is 0. +// - The second number of the sequence is 1. +// - Every subsequent number is the sum of the two preceding numbers. +// +// So the sequence goes: 0, 1, 1, 2, 3, 5, 8, 13, 21, and so on. +// +// We expect `fibonacci(0)` to return `0`, `fibonacci(1)` to return `1`, +// `fibonacci(2)` to return `1`, and so on. +pub fn fibonacci(n: u32) -> u32 { + // TODO: implement the `fibonacci` function + // + // Hint: use a `Vec` to memoize the results you have already calculated + // so that you don't have to recalculate them several times. + todo!() +} + +#[cfg(test)] +mod tests { + use crate::fibonacci; + + #[test] + fn first() { + assert_eq!(fibonacci(0), 0); + } + + #[test] + fn second() { + assert_eq!(fibonacci(1), 1); + } + + #[test] + fn third() { + assert_eq!(fibonacci(2), 1); + } + + #[test] + fn tenth() { + assert_eq!(fibonacci(10), 55); + } + + #[test] + fn thirtieth() { + assert_eq!(fibonacci(30), 832040); + } +} diff --git a/exercises/06_ticket_management/03_resizing/Cargo.toml b/exercises/06_ticket_management/03_resizing/Cargo.toml new file mode 100644 index 0000000..5217320 --- /dev/null +++ b/exercises/06_ticket_management/03_resizing/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "resizing" +version = "0.1.0" +edition = "2021" diff --git a/exercises/06_ticket_management/03_resizing/src/lib.rs b/exercises/06_ticket_management/03_resizing/src/lib.rs new file mode 100644 index 0000000..000ca2d --- /dev/null +++ b/exercises/06_ticket_management/03_resizing/src/lib.rs @@ -0,0 +1,17 @@ +#[cfg(test)] +mod tests { + #[test] + fn resizing() { + let mut v = Vec::with_capacity(2); + v.push(1); + v.push(2); // max capacity reached + assert_eq!(v.capacity(), 2); + + v.push(3); // beyond capacity, needs to resize + + // Can you guess what the new capacity will be? + // Beware that the standard library makes no guarantees about the + // algorithm used to resize the vector, so this may change in the future. + assert_eq!(v.capacity(), todo!()); + } +} diff --git a/exercises/06_ticket_management/04_iterators/Cargo.toml b/exercises/06_ticket_management/04_iterators/Cargo.toml new file mode 100644 index 0000000..5852552 --- /dev/null +++ b/exercises/06_ticket_management/04_iterators/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "iterators" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/06_ticket_management/04_iterators/src/lib.rs b/exercises/06_ticket_management/04_iterators/src/lib.rs new file mode 100644 index 0000000..e7eb9f9 --- /dev/null +++ b/exercises/06_ticket_management/04_iterators/src/lib.rs @@ -0,0 +1,68 @@ +use ticket_fields::{TicketDescription, TicketTitle}; + +// TODO: Let's start sketching our ticket store! +// First task: implement `IntoIterator` on `TicketStore` to allow iterating over all the tickets +// it contains using a `for` loop. +// +// Hint: you shouldn't have to implement the `Iterator` trait in this case. +// You want to *delegate* the iteration to the `Vec` field in `TicketStore`. +// Look at the standard library documentation for `Vec` to find the right type +// to return from `into_iter`. +#[derive(Clone)] +pub struct TicketStore { + tickets: Vec, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: Vec::new(), + } + } + + pub fn add_ticket(&mut self, ticket: Ticket) { + self.tickets.push(ticket); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use ticket_fields::test_helpers::{ticket_description, ticket_title}; + + #[test] + fn add_ticket() { + let mut store = TicketStore::new(); + + let ticket = Ticket { + title: ticket_title(), + description: ticket_description(), + status: Status::ToDo, + }; + store.add_ticket(ticket); + + let ticket = Ticket { + title: ticket_title(), + description: ticket_description(), + status: Status::InProgress, + }; + store.add_ticket(ticket); + + let tickets: Vec<_> = store.clone().into_iter().collect(); + assert_eq!(tickets, store.tickets); + } +} diff --git a/exercises/06_ticket_management/05_iter/Cargo.toml b/exercises/06_ticket_management/05_iter/Cargo.toml new file mode 100644 index 0000000..3705fca --- /dev/null +++ b/exercises/06_ticket_management/05_iter/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "iter" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/06_ticket_management/05_iter/src/lib.rs b/exercises/06_ticket_management/05_iter/src/lib.rs new file mode 100644 index 0000000..71d3e51 --- /dev/null +++ b/exercises/06_ticket_management/05_iter/src/lib.rs @@ -0,0 +1,66 @@ +use ticket_fields::{TicketDescription, TicketTitle}; + +// TODO: Provide an `iter` method that returns an iterator over `&Ticket` items. +// +// Hint: just like in the previous exercise, you want to delegate the iteration to +// the `Vec` field in `TicketStore`. Look at the standard library documentation +// for `Vec` to find the right type to return from `iter`. +#[derive(Clone)] +pub struct TicketStore { + tickets: Vec, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Ticket { + title: TicketTitle, + description: TicketDescription, + status: Status, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: Vec::new(), + } + } + + pub fn add_ticket(&mut self, ticket: Ticket) { + self.tickets.push(ticket); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use ticket_fields::test_helpers::{ticket_description, ticket_title}; + + #[test] + fn add_ticket() { + let mut store = TicketStore::new(); + + let ticket = Ticket { + title: ticket_title(), + description: ticket_description(), + status: Status::ToDo, + }; + store.add_ticket(ticket); + + let ticket = Ticket { + title: ticket_title(), + description: ticket_description(), + status: Status::InProgress, + }; + store.add_ticket(ticket); + + let tickets: Vec<&Ticket> = store.iter().collect(); + let tickets2: Vec<&Ticket> = store.iter().collect(); + assert_eq!(tickets, tickets2); + } +} diff --git a/exercises/06_ticket_management/06_lifetimes/Cargo.toml b/exercises/06_ticket_management/06_lifetimes/Cargo.toml new file mode 100644 index 0000000..8bbe485 --- /dev/null +++ b/exercises/06_ticket_management/06_lifetimes/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "lifetime" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/06_ticket_management/06_lifetimes/src/lib.rs b/exercises/06_ticket_management/06_lifetimes/src/lib.rs new file mode 100644 index 0000000..545ed75 --- /dev/null +++ b/exercises/06_ticket_management/06_lifetimes/src/lib.rs @@ -0,0 +1,66 @@ +use ticket_fields::{TicketDescription, TicketTitle}; + +// TODO: Implement the `IntoIterator` trait for `&TicketStore` so that the test compiles and passes. +#[derive(Clone)] +pub struct TicketStore { + tickets: Vec, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: Vec::new(), + } + } + + pub fn add_ticket(&mut self, ticket: Ticket) { + self.tickets.push(ticket); + } + + pub fn iter(&self) -> std::slice::Iter { + self.tickets.iter() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use ticket_fields::test_helpers::{ticket_description, ticket_title}; + + #[test] + fn add_ticket() { + let mut store = TicketStore::new(); + + let ticket = Ticket { + title: ticket_title(), + description: ticket_description(), + status: Status::ToDo, + }; + store.add_ticket(ticket); + + let ticket = Ticket { + title: ticket_title(), + description: ticket_description(), + status: Status::InProgress, + }; + store.add_ticket(ticket); + + let tickets: Vec<&Ticket> = store.iter().collect(); + let tickets2: Vec<&Ticket> = (&store).into_iter().collect(); + assert_eq!(tickets, tickets2); + } +} diff --git a/exercises/06_ticket_management/07_combinators/Cargo.toml b/exercises/06_ticket_management/07_combinators/Cargo.toml new file mode 100644 index 0000000..788b83d --- /dev/null +++ b/exercises/06_ticket_management/07_combinators/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "combinators" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/06_ticket_management/07_combinators/src/lib.rs b/exercises/06_ticket_management/07_combinators/src/lib.rs new file mode 100644 index 0000000..2731211 --- /dev/null +++ b/exercises/06_ticket_management/07_combinators/src/lib.rs @@ -0,0 +1,63 @@ +// TODO: Implement the `to_dos` method. It must return a `Vec` of references to the tickets +// in `TicketStore` with status set to `Status::ToDo`. +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone)] +pub struct TicketStore { + tickets: Vec, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: Vec::new(), + } + } + + pub fn add_ticket(&mut self, ticket: Ticket) { + self.tickets.push(ticket); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use ticket_fields::test_helpers::{ticket_description, ticket_title}; + + #[test] + fn todos() { + let mut store = TicketStore::new(); + + let todo = Ticket { + title: ticket_title(), + description: ticket_description(), + status: Status::ToDo, + }; + store.add_ticket(todo.clone()); + + let ticket = Ticket { + title: ticket_title(), + description: ticket_description(), + status: Status::InProgress, + }; + store.add_ticket(ticket); + + let todos: Vec<&Ticket> = store.to_dos(); + assert_eq!(todos.len(), 1); + assert_eq!(todos[0], &todo); + } +} diff --git a/exercises/06_ticket_management/08_impl_trait/Cargo.toml b/exercises/06_ticket_management/08_impl_trait/Cargo.toml new file mode 100644 index 0000000..3b80f9d --- /dev/null +++ b/exercises/06_ticket_management/08_impl_trait/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "impl_trait" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/06_ticket_management/08_impl_trait/src/lib.rs b/exercises/06_ticket_management/08_impl_trait/src/lib.rs new file mode 100644 index 0000000..d8afbe0 --- /dev/null +++ b/exercises/06_ticket_management/08_impl_trait/src/lib.rs @@ -0,0 +1,63 @@ +// TODO: Implement the `in_progress` method. It must return an iterator over the tickets in +// `TicketStore` with status set to `Status::InProgress`. +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone)] +pub struct TicketStore { + tickets: Vec, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: Vec::new(), + } + } + + pub fn add_ticket(&mut self, ticket: Ticket) { + self.tickets.push(ticket); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use ticket_fields::test_helpers::{ticket_description, ticket_title}; + + #[test] + fn in_progress() { + let mut store = TicketStore::new(); + + let todo = Ticket { + title: ticket_title(), + description: ticket_description(), + status: Status::ToDo, + }; + store.add_ticket(todo); + + let in_progress = Ticket { + title: ticket_title(), + description: ticket_description(), + status: Status::InProgress, + }; + store.add_ticket(in_progress.clone()); + + let in_progress_tickets: Vec<&Ticket> = store.in_progress().collect(); + assert_eq!(in_progress_tickets.len(), 1); + assert_eq!(in_progress_tickets[0], &in_progress); + } +} diff --git a/exercises/06_ticket_management/09_impl_trait_2/Cargo.toml b/exercises/06_ticket_management/09_impl_trait_2/Cargo.toml new file mode 100644 index 0000000..e7babbd --- /dev/null +++ b/exercises/06_ticket_management/09_impl_trait_2/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "impl_trait_2" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/06_ticket_management/09_impl_trait_2/src/lib.rs b/exercises/06_ticket_management/09_impl_trait_2/src/lib.rs new file mode 100644 index 0000000..33e982b --- /dev/null +++ b/exercises/06_ticket_management/09_impl_trait_2/src/lib.rs @@ -0,0 +1,70 @@ +// TODO: Rework the signature of `TicketStore::add_ticket` to use a generic type parameter rather +// than `impl Trait` syntax. + +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone)] +pub struct TicketStore { + tickets: Vec, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: Vec::new(), + } + } + + // Using `Into` as the type parameter for `ticket` allows the method to accept any type + // that can be infallibly converted into a `Ticket`. + // This can make it nicer to use the method, as it removes the syntax noise of `.into()` + // from the calling site. It can worsen the quality of the compiler error messages, though. + pub fn add_ticket(&mut self, ticket: impl Into) { + self.tickets.push(ticket.into()); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use ticket_fields::test_helpers::{ticket_description, ticket_title}; + + struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, + } + + impl From for Ticket { + fn from(draft: TicketDraft) -> Self { + Self { + title: draft.title, + description: draft.description, + status: Status::ToDo, + } + } + } + + #[test] + fn generic_add() { + let mut store = TicketStore::new(); + // This won't compile if `add_ticket` uses `impl Trait` syntax in argument position. + store.add_ticket::(TicketDraft { + title: ticket_title(), + description: ticket_description(), + }); + } +} diff --git a/exercises/06_ticket_management/10_slices/Cargo.toml b/exercises/06_ticket_management/10_slices/Cargo.toml new file mode 100644 index 0000000..e4e0e50 --- /dev/null +++ b/exercises/06_ticket_management/10_slices/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "slice" +version = "0.1.0" +edition = "2021" diff --git a/exercises/06_ticket_management/10_slices/src/lib.rs b/exercises/06_ticket_management/10_slices/src/lib.rs new file mode 100644 index 0000000..1d2c6f7 --- /dev/null +++ b/exercises/06_ticket_management/10_slices/src/lib.rs @@ -0,0 +1,31 @@ +// TODO: Define a function named `sum` that takes a reference to a slice of `u32` and returns the sum of all +// elements in the slice. + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty() { + let v = vec![]; + assert_eq!(sum(&v), 0); + } + + #[test] + fn one_element() { + let v = vec![1]; + assert_eq!(sum(&v), 1); + } + + #[test] + fn multiple_elements() { + let v = vec![1, 2, 3, 4, 5]; + assert_eq!(sum(&v), 15); + } + + #[test] + fn array_slice() { + let v = [1, 2, 3, 4, 5]; + assert_eq!(sum(&v), 15); + } +} diff --git a/exercises/06_ticket_management/11_mutable_slices/Cargo.toml b/exercises/06_ticket_management/11_mutable_slices/Cargo.toml new file mode 100644 index 0000000..41833f9 --- /dev/null +++ b/exercises/06_ticket_management/11_mutable_slices/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "mut_slice" +version = "0.1.0" +edition = "2021" diff --git a/exercises/06_ticket_management/11_mutable_slices/src/lib.rs b/exercises/06_ticket_management/11_mutable_slices/src/lib.rs new file mode 100644 index 0000000..4ba888c --- /dev/null +++ b/exercises/06_ticket_management/11_mutable_slices/src/lib.rs @@ -0,0 +1,28 @@ +// TODO: Define a function named `squared` that raises all `i32`s within a slice to the power of 2. +// The slice should be modified in place. + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty() { + let mut s = vec![]; + squared(&mut s); + assert_eq!(s, vec![]); + } + + #[test] + fn one() { + let mut s = [2]; + squared(&mut s); + assert_eq!(s, [4]); + } + + #[test] + fn multiple() { + let mut s = vec![2, 4]; + squared(&mut s); + assert_eq!(s, vec![4, 16]); + } +} diff --git a/exercises/06_ticket_management/12_two_states/Cargo.toml b/exercises/06_ticket_management/12_two_states/Cargo.toml new file mode 100644 index 0000000..581535e --- /dev/null +++ b/exercises/06_ticket_management/12_two_states/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "two_states" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/06_ticket_management/12_two_states/src/lib.rs b/exercises/06_ticket_management/12_two_states/src/lib.rs new file mode 100644 index 0000000..10b5cb1 --- /dev/null +++ b/exercises/06_ticket_management/12_two_states/src/lib.rs @@ -0,0 +1,80 @@ +// TODO: Update `add_ticket`'s signature: it should take a `TicketDraft` as input +// and return a `TicketId` as output. +// Each ticket should have a unique id, generated by `TicketStore`. +// Feel free to modify `TicketStore` fields, if needed. +// +// You also need to add a `get` method that takes as input a `TicketId` +// and returns an `Option<&Ticket>`. + +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone)] +pub struct TicketStore { + tickets: Vec, +} + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct TicketId(u64); + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: Vec::new(), + } + } + + pub fn add_ticket(&mut self, ticket: Ticket) { + self.tickets.push(ticket); + } +} + +#[cfg(test)] +mod tests { + use crate::{Status, TicketDraft, TicketStore}; + use ticket_fields::test_helpers::{ticket_description, ticket_title}; + + #[test] + fn works() { + let mut store = TicketStore::new(); + + let draft1 = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let id1 = store.add_ticket(draft1.clone()); + let ticket1 = store.get(id1).unwrap(); + assert_eq!(draft1.title, ticket1.title); + assert_eq!(draft1.description, ticket1.description); + assert_eq!(ticket1.status, Status::ToDo); + + let draft2 = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let id2 = store.add_ticket(draft2); + let ticket2 = store.get(id2).unwrap(); + + assert_ne!(id1, id2); + } +} diff --git a/exercises/06_ticket_management/13_index/Cargo.toml b/exercises/06_ticket_management/13_index/Cargo.toml new file mode 100644 index 0000000..f69e3f9 --- /dev/null +++ b/exercises/06_ticket_management/13_index/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "index" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/06_ticket_management/13_index/src/lib.rs b/exercises/06_ticket_management/13_index/src/lib.rs new file mode 100644 index 0000000..0b08cc1 --- /dev/null +++ b/exercises/06_ticket_management/13_index/src/lib.rs @@ -0,0 +1,89 @@ +// TODO: Implement `Index<&TicketId>` and `Index` for `TicketStore`. + +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone)] +pub struct TicketStore { + tickets: Vec, + counter: u64, +} + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct TicketId(u64); + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: Vec::new(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + self.tickets.push(ticket); + id + } + + pub fn get(&self, id: TicketId) -> Option<&Ticket> { + self.tickets.iter().find(|&t| t.id == id) + } +} + +#[cfg(test)] +mod tests { + use crate::{Status, TicketDraft, TicketStore}; + use ticket_fields::test_helpers::{ticket_description, ticket_title}; + + #[test] + fn works() { + let mut store = TicketStore::new(); + + let draft1 = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let id1 = store.add_ticket(draft1.clone()); + let ticket1 = &store[id1]; + assert_eq!(draft1.title, ticket1.title); + assert_eq!(draft1.description, ticket1.description); + assert_eq!(ticket1.status, Status::ToDo); + + let draft2 = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let id2 = store.add_ticket(draft2); + let ticket2 = &store[&id2]; + + assert_ne!(id1, id2); + } +} diff --git a/exercises/06_ticket_management/14_index_mut/Cargo.toml b/exercises/06_ticket_management/14_index_mut/Cargo.toml new file mode 100644 index 0000000..33ba122 --- /dev/null +++ b/exercises/06_ticket_management/14_index_mut/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "index_mut" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/06_ticket_management/14_index_mut/src/lib.rs b/exercises/06_ticket_management/14_index_mut/src/lib.rs new file mode 100644 index 0000000..fa39451 --- /dev/null +++ b/exercises/06_ticket_management/14_index_mut/src/lib.rs @@ -0,0 +1,109 @@ +// TODO: Implement `IndexMut<&TicketId>` and `IndexMut` for `TicketStore`. + +use std::ops::Index; +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone)] +pub struct TicketStore { + tickets: Vec, + counter: u64, +} + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct TicketId(u64); + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: Vec::new(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + self.tickets.push(ticket); + id + } + + pub fn get(&self, id: TicketId) -> Option<&Ticket> { + self.tickets.iter().find(|&t| t.id == id) + } +} + +impl Index for TicketStore { + type Output = Ticket; + + fn index(&self, index: TicketId) -> &Self::Output { + self.get(index).unwrap() + } +} + +impl Index<&TicketId> for TicketStore { + type Output = Ticket; + + fn index(&self, index: &TicketId) -> &Self::Output { + &self[*index] + } +} + +#[cfg(test)] +mod tests { + use crate::{Status, TicketDraft, TicketStore}; + use ticket_fields::test_helpers::{ticket_description, ticket_title}; + + #[test] + fn works() { + let mut store = TicketStore::new(); + + let draft = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let id = store.add_ticket(draft.clone()); + let ticket = &store[id]; + assert_eq!(draft.title, ticket.title); + assert_eq!(draft.description, ticket.description); + assert_eq!(ticket.status, Status::ToDo); + + let ticket = &mut store[id]; + ticket.status = Status::InProgress; + + let ticket = &store[id]; + assert_eq!(ticket.status, Status::InProgress); + + let ticket = &mut store[&id]; + ticket.status = Status::Done; + + let ticket = &store[id]; + assert_eq!(ticket.status, Status::Done); + } +} diff --git a/exercises/06_ticket_management/15_hashmap/Cargo.toml b/exercises/06_ticket_management/15_hashmap/Cargo.toml new file mode 100644 index 0000000..6104aeb --- /dev/null +++ b/exercises/06_ticket_management/15_hashmap/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "hashmap" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/06_ticket_management/15_hashmap/src/lib.rs b/exercises/06_ticket_management/15_hashmap/src/lib.rs new file mode 100644 index 0000000..ea109a6 --- /dev/null +++ b/exercises/06_ticket_management/15_hashmap/src/lib.rs @@ -0,0 +1,121 @@ +// TODO: Replace `todo!()`s with the correct implementation. +// Implement additional traits on `TicketId` if needed. + +use std::collections::HashMap; +use std::ops::{Index, IndexMut}; +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone)] +pub struct TicketStore { + tickets: HashMap, + counter: u64, +} + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct TicketId(u64); + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq, Eq)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: todo!(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + todo!(); + id + } + + pub fn get(&self, id: TicketId) -> Option<&Ticket> { + todo!() + } + + pub fn get_mut(&mut self, id: TicketId) -> Option<&mut Ticket> { + todo!() + } +} + +impl Index for TicketStore { + type Output = Ticket; + + fn index(&self, index: TicketId) -> &Self::Output { + self.get(index).unwrap() + } +} + +impl Index<&TicketId> for TicketStore { + type Output = Ticket; + + fn index(&self, index: &TicketId) -> &Self::Output { + &self[*index] + } +} + +impl IndexMut for TicketStore { + fn index_mut(&mut self, index: TicketId) -> &mut Self::Output { + self.get_mut(index).unwrap() + } +} + +impl IndexMut<&TicketId> for TicketStore { + fn index_mut(&mut self, index: &TicketId) -> &mut Self::Output { + &mut self[*index] + } +} + +#[cfg(test)] +mod tests { + use crate::{Status, TicketDraft, TicketStore}; + use ticket_fields::test_helpers::{ticket_description, ticket_title}; + + #[test] + fn works() { + let mut store = TicketStore::new(); + + let draft = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let id = store.add_ticket(draft.clone()); + let ticket = &store[id]; + assert_eq!(draft.title, ticket.title); + assert_eq!(draft.description, ticket.description); + assert_eq!(ticket.status, Status::ToDo); + + let ticket = &mut store[id]; + ticket.status = Status::InProgress; + + let ticket = &store[id]; + assert_eq!(ticket.status, Status::InProgress); + } +} diff --git a/exercises/06_ticket_management/16_btreemap/Cargo.toml b/exercises/06_ticket_management/16_btreemap/Cargo.toml new file mode 100644 index 0000000..85a8341 --- /dev/null +++ b/exercises/06_ticket_management/16_btreemap/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "btreemap" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/06_ticket_management/16_btreemap/src/lib.rs b/exercises/06_ticket_management/16_btreemap/src/lib.rs new file mode 100644 index 0000000..d9af95d --- /dev/null +++ b/exercises/06_ticket_management/16_btreemap/src/lib.rs @@ -0,0 +1,135 @@ +// TODO: Replace `todo!()`s with the correct implementation. +// Implement `IntoIterator` for `&TicketStore`. The iterator should yield immutable +// references to the tickets, ordered by their `TicketId`. +// Implement additional traits on `TicketId` if needed. + +use std::collections::BTreeMap; +use std::ops::{Index, IndexMut}; +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone)] +pub struct TicketStore { + tickets: BTreeMap, + counter: u64, +} + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct TicketId(u64); + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq, Eq)] +pub enum Status { + ToDo, + InProgress, + Done, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: todo!(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + todo!(); + id + } + + pub fn get(&self, id: TicketId) -> Option<&Ticket> { + todo!() + } + + pub fn get_mut(&mut self, id: TicketId) -> Option<&mut Ticket> { + todo!() + } +} + +impl Index for TicketStore { + type Output = Ticket; + + fn index(&self, index: TicketId) -> &Self::Output { + self.get(index).unwrap() + } +} + +impl Index<&TicketId> for TicketStore { + type Output = Ticket; + + fn index(&self, index: &TicketId) -> &Self::Output { + &self[*index] + } +} + +impl IndexMut for TicketStore { + fn index_mut(&mut self, index: TicketId) -> &mut Self::Output { + self.get_mut(index).unwrap() + } +} + +impl IndexMut<&TicketId> for TicketStore { + fn index_mut(&mut self, index: &TicketId) -> &mut Self::Output { + &mut self[*index] + } +} + +#[cfg(test)] +mod tests { + use crate::{Status, TicketDraft, TicketId, TicketStore}; + use ticket_fields::test_helpers::{ticket_description, ticket_title}; + + #[test] + fn works() { + let mut store = TicketStore::new(); + + let n_tickets = 5; + + for i in 0..n_tickets { + let draft = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let id = store.add_ticket(draft.clone()); + let ticket = &store[id]; + assert_eq!(draft.title, ticket.title); + assert_eq!(draft.description, ticket.description); + assert_eq!(ticket.status, Status::ToDo); + + let ticket = &mut store[id]; + ticket.status = Status::InProgress; + + let ticket = &store[id]; + assert_eq!(ticket.status, Status::InProgress); + } + + let ids: Vec = (&store).into_iter().map(|t| t.id).collect(); + let sorted_ids = { + let mut v = ids.clone(); + v.sort(); + v + }; + assert_eq!(ids, sorted_ids); + } +} diff --git a/exercises/07_threads/00_intro/Cargo.toml b/exercises/07_threads/00_intro/Cargo.toml new file mode 100644 index 0000000..2d4e68e --- /dev/null +++ b/exercises/07_threads/00_intro/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "intro_07" +version = "0.1.0" +edition = "2021" diff --git a/exercises/07_threads/00_intro/src/lib.rs b/exercises/07_threads/00_intro/src/lib.rs new file mode 100644 index 0000000..df6490d --- /dev/null +++ b/exercises/07_threads/00_intro/src/lib.rs @@ -0,0 +1,17 @@ +fn intro() -> &'static str { + // TODO: fix me 👇 + "I'm ready to _!" +} + +#[cfg(test)] +mod tests { + use crate::intro; + + #[test] + fn test_intro() { + assert_eq!( + intro(), + "I'm ready to build a concurrent ticket management system!" + ); + } +} diff --git a/exercises/07_threads/01_threads/Cargo.toml b/exercises/07_threads/01_threads/Cargo.toml new file mode 100644 index 0000000..5d3642f --- /dev/null +++ b/exercises/07_threads/01_threads/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "threads" +version = "0.1.0" +edition = "2021" diff --git a/exercises/07_threads/01_threads/src/lib.rs b/exercises/07_threads/01_threads/src/lib.rs new file mode 100644 index 0000000..7d084ac --- /dev/null +++ b/exercises/07_threads/01_threads/src/lib.rs @@ -0,0 +1,49 @@ +// TODO: implement a multi-threaded version of the `sum` function +// using `spawn` and `join`. +// Given a vector of integers, split the vector into two halves and +// sum each half in a separate thread. + +// Caveat: We can't test *how* the function is implemented, +// we can only verify that it produces the correct result. +// You _could_ pass this test by just returning `v.iter().sum()`, +// but that would defeat the purpose of the exercise. +// +// Hint: you won't be able to get the spawned threads to _borrow_ +// slices of the vector directly. You'll need to allocate new +// vectors for each half of the original vector. We'll see why +// this is necessary in the next exercise. +use std::thread; + +pub fn sum(v: Vec) -> i32 { + todo!() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty() { + assert_eq!(sum(vec![]), 0); + } + + #[test] + fn one() { + assert_eq!(sum(vec![1]), 1); + } + + #[test] + fn five() { + assert_eq!(sum(vec![1, 2, 3, 4, 5]), 15); + } + + #[test] + fn nine() { + assert_eq!(sum(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]), 45); + } + + #[test] + fn ten() { + assert_eq!(sum(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 55); + } +} diff --git a/exercises/07_threads/02_static/Cargo.toml b/exercises/07_threads/02_static/Cargo.toml new file mode 100644 index 0000000..9fdab87 --- /dev/null +++ b/exercises/07_threads/02_static/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "static" +version = "0.1.0" +edition = "2021" diff --git a/exercises/07_threads/02_static/src/lib.rs b/exercises/07_threads/02_static/src/lib.rs new file mode 100644 index 0000000..4b9241b --- /dev/null +++ b/exercises/07_threads/02_static/src/lib.rs @@ -0,0 +1,43 @@ +// TODO: Given a static slice of integers, split the slice into two halves and +// sum each half in a separate thread. +// Do not allocate any additional memory! +use std::thread; + +pub fn sum(slice: &'static [i32]) -> i32 { + todo!() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty() { + static ARRAY: [i32; 0] = []; + assert_eq!(sum(&ARRAY), 0); + } + + #[test] + fn one() { + static ARRAY: [i32; 1] = [1]; + assert_eq!(sum(&ARRAY), 1); + } + + #[test] + fn five() { + static ARRAY: [i32; 5] = [1, 2, 3, 4, 5]; + assert_eq!(sum(&ARRAY), 15); + } + + #[test] + fn nine() { + static ARRAY: [i32; 9] = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + assert_eq!(sum(&ARRAY), 45); + } + + #[test] + fn ten() { + static ARRAY: [i32; 10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + assert_eq!(sum(&ARRAY), 55); + } +} diff --git a/exercises/07_threads/03_leak/Cargo.toml b/exercises/07_threads/03_leak/Cargo.toml new file mode 100644 index 0000000..e168fe4 --- /dev/null +++ b/exercises/07_threads/03_leak/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "leaking" +version = "0.1.0" +edition = "2021" diff --git a/exercises/07_threads/03_leak/src/lib.rs b/exercises/07_threads/03_leak/src/lib.rs new file mode 100644 index 0000000..fef6b46 --- /dev/null +++ b/exercises/07_threads/03_leak/src/lib.rs @@ -0,0 +1,40 @@ +// TODO: Given a vector of integers, leak its heap allocation. +// Then split the resulting static slice into two halves and +// sum each half in a separate thread. +// Hint: check out `Vec::leak`. + +use std::thread; + +pub fn sum(v: Vec) -> i32 { + todo!() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty() { + assert_eq!(sum(vec![]), 0); + } + + #[test] + fn one() { + assert_eq!(sum(vec![1]), 1); + } + + #[test] + fn five() { + assert_eq!(sum(vec![1, 2, 3, 4, 5]), 15); + } + + #[test] + fn nine() { + assert_eq!(sum(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]), 45); + } + + #[test] + fn ten() { + assert_eq!(sum(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 55); + } +} diff --git a/exercises/07_threads/04_scoped_threads/Cargo.toml b/exercises/07_threads/04_scoped_threads/Cargo.toml new file mode 100644 index 0000000..8764ded --- /dev/null +++ b/exercises/07_threads/04_scoped_threads/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "scoped_threads" +version = "0.1.0" +edition = "2021" diff --git a/exercises/07_threads/04_scoped_threads/src/lib.rs b/exercises/07_threads/04_scoped_threads/src/lib.rs new file mode 100644 index 0000000..d81a3a9 --- /dev/null +++ b/exercises/07_threads/04_scoped_threads/src/lib.rs @@ -0,0 +1,37 @@ +// TODO: Given a vector of integers, split it in two halves +// and compute the sum of each half in a separate thread. +// Don't perform any heap allocation. Don't leak any memory. + +pub fn sum(v: Vec) -> i32 { + todo!() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty() { + assert_eq!(sum(vec![]), 0); + } + + #[test] + fn one() { + assert_eq!(sum(vec![1]), 1); + } + + #[test] + fn five() { + assert_eq!(sum(vec![1, 2, 3, 4, 5]), 15); + } + + #[test] + fn nine() { + assert_eq!(sum(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]), 45); + } + + #[test] + fn ten() { + assert_eq!(sum(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 55); + } +} diff --git a/exercises/07_threads/05_channels/Cargo.toml b/exercises/07_threads/05_channels/Cargo.toml new file mode 100644 index 0000000..e09e98c --- /dev/null +++ b/exercises/07_threads/05_channels/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "channels" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/07_threads/05_channels/src/data.rs b/exercises/07_threads/05_channels/src/data.rs new file mode 100644 index 0000000..352d361 --- /dev/null +++ b/exercises/07_threads/05_channels/src/data.rs @@ -0,0 +1,23 @@ +use crate::store::TicketId; +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq, Eq)] +pub enum Status { + ToDo, + InProgress, + Done, +} diff --git a/exercises/07_threads/05_channels/src/lib.rs b/exercises/07_threads/05_channels/src/lib.rs new file mode 100644 index 0000000..175d1dd --- /dev/null +++ b/exercises/07_threads/05_channels/src/lib.rs @@ -0,0 +1,23 @@ +use std::sync::mpsc::{Receiver, Sender}; + +pub mod data; +pub mod store; + +pub enum Command { + Insert(todo!()), +} + +// Start the system by spawning the server thread. +// It returns a `Sender` instance which can then be used +// by one or more clients to interact with the server. +pub fn launch() -> Sender { + let (sender, receiver) = std::sync::mpsc::channel(); + std::thread::spawn(move || server(receiver)); + sender +} + +// TODO: The server task should **never** stop. +// Enter a loop: wait for a command to show up in +// the channel, then execute it, then start waiting +// for the next command. +pub fn server(receiver: Receiver) {} diff --git a/exercises/07_threads/05_channels/src/store.rs b/exercises/07_threads/05_channels/src/store.rs new file mode 100644 index 0000000..cca2fb5 --- /dev/null +++ b/exercises/07_threads/05_channels/src/store.rs @@ -0,0 +1,33 @@ +use crate::data::{Status, Ticket, TicketDraft}; +use std::collections::BTreeMap; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct TicketId(u64); + +#[derive(Clone)] +pub struct TicketStore { + tickets: BTreeMap, + counter: u64, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: BTreeMap::new(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + self.tickets.insert(id, ticket); + id + } +} diff --git a/exercises/07_threads/05_channels/tests/insert.rs b/exercises/07_threads/05_channels/tests/insert.rs new file mode 100644 index 0000000..651a467 --- /dev/null +++ b/exercises/07_threads/05_channels/tests/insert.rs @@ -0,0 +1,32 @@ +// TODO: Set `move_forward` to `true` in `ready` when you think you're done with this exercise. +// Feel free to call an instructor to verify your solution! +use channels::data::TicketDraft; +use channels::{launch, Command}; +use std::time::Duration; +use ticket_fields::test_helpers::{ticket_description, ticket_title}; + +#[test] +fn a_thread_is_spawned() { + let sender = launch(); + std::thread::sleep(Duration::from_millis(200)); + + sender + .send(Command::Insert(TicketDraft { + title: ticket_title(), + description: ticket_description(), + })) + // If the thread is no longer running, this will panic + // because the channel will be closed. + .expect("Did you actually spawn a thread? The channel is closed!"); +} + +#[test] +fn ready() { + // There's very little that we can check automatically in this exercise, + // since our server doesn't expose any **read** actions. + // We have no way to know if the inserts are actually happening and if they + // are happening correctly. + let move_forward = false; + + assert!(move_forward); +} diff --git a/exercises/07_threads/06_interior_mutability/Cargo.toml b/exercises/07_threads/06_interior_mutability/Cargo.toml new file mode 100644 index 0000000..ab3cbc5 --- /dev/null +++ b/exercises/07_threads/06_interior_mutability/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "interior_mutability" +version = "0.1.0" +edition = "2021" diff --git a/exercises/07_threads/06_interior_mutability/src/lib.rs b/exercises/07_threads/06_interior_mutability/src/lib.rs new file mode 100644 index 0000000..37d4d4f --- /dev/null +++ b/exercises/07_threads/06_interior_mutability/src/lib.rs @@ -0,0 +1,46 @@ +// TODO: Use `Rc` and `RefCell` to implement `DropTracker`, a wrapper around a value of type `T` +// that increments a shared `usize` counter every time the wrapped value is dropped. + +use std::cell::RefCell; +use std::rc::Rc; + +pub struct DropTracker { + value: T, + counter: todo!(), +} + +impl DropTracker { + pub fn new(value: T, counter: todo!()) -> Self { + Self { value, counter } + } +} + +impl Drop for DropTracker { + fn drop(&mut self) { + todo!() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let counter = Rc::new(RefCell::new(0)); + let _ = DropTracker::new((), Rc::clone(&counter)); + assert_eq!(*counter.borrow(), 1); + } + + #[test] + fn multiple() { + let counter = Rc::new(RefCell::new(0)); + + { + let a = DropTracker::new(5, Rc::clone(&counter)); + let b = DropTracker::new(6, Rc::clone(&counter)); + } + + assert_eq!(*counter.borrow(), 2); + } +} diff --git a/exercises/07_threads/07_ack/Cargo.toml b/exercises/07_threads/07_ack/Cargo.toml new file mode 100644 index 0000000..a03d749 --- /dev/null +++ b/exercises/07_threads/07_ack/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "response" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/07_threads/07_ack/src/data.rs b/exercises/07_threads/07_ack/src/data.rs new file mode 100644 index 0000000..352d361 --- /dev/null +++ b/exercises/07_threads/07_ack/src/data.rs @@ -0,0 +1,23 @@ +use crate::store::TicketId; +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq, Eq)] +pub enum Status { + ToDo, + InProgress, + Done, +} diff --git a/exercises/07_threads/07_ack/src/lib.rs b/exercises/07_threads/07_ack/src/lib.rs new file mode 100644 index 0000000..746c355 --- /dev/null +++ b/exercises/07_threads/07_ack/src/lib.rs @@ -0,0 +1,39 @@ +use std::sync::mpsc::{Receiver, Sender}; +use crate::store::TicketStore; + +pub mod data; +pub mod store; + +// Refer to the tests to understand the expected schema. +pub enum Command { + Insert { todo!() }, + Get { todo!() } +} + +pub fn launch() -> Sender { + let (sender, receiver) = std::sync::mpsc::channel(); + std::thread::spawn(move || server(receiver)); + sender +} + +// TODO: handle incoming commands as expected. +pub fn server(receiver: Receiver) { + let mut store = TicketStore::new(); + loop { + match receiver.recv() { + Ok(Command::Insert {}) => { + todo!() + } + Ok(Command::Get { + todo!() + }) => { + todo!() + } + Err(_) => { + // There are no more senders, so we can safely break + // and shut down the server. + break + }, + } + } +} diff --git a/exercises/07_threads/07_ack/src/store.rs b/exercises/07_threads/07_ack/src/store.rs new file mode 100644 index 0000000..6029d94 --- /dev/null +++ b/exercises/07_threads/07_ack/src/store.rs @@ -0,0 +1,37 @@ +use crate::data::{Status, Ticket, TicketDraft}; +use std::collections::BTreeMap; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct TicketId(u64); + +#[derive(Clone)] +pub struct TicketStore { + tickets: BTreeMap, + counter: u64, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: BTreeMap::new(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + self.tickets.insert(id, ticket); + id + } + + pub fn get(&self, id: TicketId) -> Option<&Ticket> { + self.tickets.get(&id) + } +} diff --git a/exercises/07_threads/07_ack/tests/insert.rs b/exercises/07_threads/07_ack/tests/insert.rs new file mode 100644 index 0000000..85eb143 --- /dev/null +++ b/exercises/07_threads/07_ack/tests/insert.rs @@ -0,0 +1,45 @@ +use response::data::{Status, Ticket, TicketDraft}; +use response::store::TicketId; +use response::{launch, Command}; +use ticket_fields::test_helpers::{ticket_description, ticket_title}; + +#[test] +fn insert_works() { + let sender = launch(); + let (response_sender, response_receiver) = std::sync::mpsc::channel(); + + let draft = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let command = Command::Insert { + draft: draft.clone(), + response_sender, + }; + + sender + .send(command) + // If the thread is no longer running, this will panic + // because the channel will be closed. + .expect("Did you actually spawn a thread? The channel is closed!"); + + let ticket_id: TicketId = response_receiver.recv().expect("No response received!"); + + let (response_sender, response_receiver) = std::sync::mpsc::channel(); + let command = Command::Get { + id: ticket_id, + response_sender, + }; + sender + .send(command) + .expect("Did you actually spawn a thread? The channel is closed!"); + + let ticket: Ticket = response_receiver + .recv() + .expect("No response received!") + .unwrap(); + assert_eq!(ticket_id, ticket.id); + assert_eq!(ticket.status, Status::ToDo); + assert_eq!(ticket.title, draft.title); + assert_eq!(ticket.description, draft.description); +} diff --git a/exercises/07_threads/08_client/Cargo.toml b/exercises/07_threads/08_client/Cargo.toml new file mode 100644 index 0000000..b3a02e3 --- /dev/null +++ b/exercises/07_threads/08_client/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "client" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/07_threads/08_client/src/data.rs b/exercises/07_threads/08_client/src/data.rs new file mode 100644 index 0000000..352d361 --- /dev/null +++ b/exercises/07_threads/08_client/src/data.rs @@ -0,0 +1,23 @@ +use crate::store::TicketId; +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq, Eq)] +pub enum Status { + ToDo, + InProgress, + Done, +} diff --git a/exercises/07_threads/08_client/src/lib.rs b/exercises/07_threads/08_client/src/lib.rs new file mode 100644 index 0000000..a934bd3 --- /dev/null +++ b/exercises/07_threads/08_client/src/lib.rs @@ -0,0 +1,66 @@ +use crate::data::{Ticket, TicketDraft}; +use crate::store::{TicketId, TicketStore}; +use std::sync::mpsc::{Receiver, Sender}; + +pub mod data; +pub mod store; + +#[derive(Clone)] +// TODO: flesh out the client implementation. +pub struct TicketStoreClient {} + +impl TicketStoreClient { + // Feel free to panic on all errors, for simplicity. + pub fn insert(&self, draft: TicketDraft) -> TicketId { + todo!() + } + + pub fn get(&self, id: TicketId) -> Option { + todo!() + } +} + +pub fn launch() -> TicketStoreClient { + let (sender, receiver) = std::sync::mpsc::channel(); + std::thread::spawn(move || server(receiver)); + todo!() +} + +// No longer public! This becomes an internal detail of the library now. +enum Command { + Insert { + draft: TicketDraft, + response_channel: Sender, + }, + Get { + id: TicketId, + response_channel: Sender>, + }, +} + +fn server(receiver: Receiver) { + let mut store = TicketStore::new(); + loop { + match receiver.recv() { + Ok(Command::Insert { + draft, + response_channel, + }) => { + let id = store.add_ticket(draft); + let _ = response_channel.send(id); + } + Ok(Command::Get { + id, + response_channel, + }) => { + let ticket = store.get(id); + let _ = response_channel.send(ticket.cloned()); + } + Err(_) => { + // There are no more senders, so we can safely break + // and shut down the server. + break; + } + } + } +} diff --git a/exercises/07_threads/08_client/src/store.rs b/exercises/07_threads/08_client/src/store.rs new file mode 100644 index 0000000..6029d94 --- /dev/null +++ b/exercises/07_threads/08_client/src/store.rs @@ -0,0 +1,37 @@ +use crate::data::{Status, Ticket, TicketDraft}; +use std::collections::BTreeMap; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct TicketId(u64); + +#[derive(Clone)] +pub struct TicketStore { + tickets: BTreeMap, + counter: u64, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: BTreeMap::new(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + self.tickets.insert(id, ticket); + id + } + + pub fn get(&self, id: TicketId) -> Option<&Ticket> { + self.tickets.get(&id) + } +} diff --git a/exercises/07_threads/08_client/tests/insert.rs b/exercises/07_threads/08_client/tests/insert.rs new file mode 100644 index 0000000..0f1b3ac --- /dev/null +++ b/exercises/07_threads/08_client/tests/insert.rs @@ -0,0 +1,21 @@ +use client::data::{Status, TicketDraft}; +use client::launch; +use ticket_fields::test_helpers::{ticket_description, ticket_title}; + +#[test] +fn insert_works() { + // Notice how much simpler the test is now that we have a client to handle the details! + let client = launch(); + let draft = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let ticket_id = client.insert(draft.clone()); + + let client2 = client.clone(); + let ticket = client2.get(ticket_id).unwrap(); + assert_eq!(ticket_id, ticket.id); + assert_eq!(ticket.status, Status::ToDo); + assert_eq!(ticket.title, draft.title); + assert_eq!(ticket.description, draft.description); +} diff --git a/exercises/07_threads/09_bounded/Cargo.toml b/exercises/07_threads/09_bounded/Cargo.toml new file mode 100644 index 0000000..506d14a --- /dev/null +++ b/exercises/07_threads/09_bounded/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "bounded" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/07_threads/09_bounded/src/data.rs b/exercises/07_threads/09_bounded/src/data.rs new file mode 100644 index 0000000..352d361 --- /dev/null +++ b/exercises/07_threads/09_bounded/src/data.rs @@ -0,0 +1,23 @@ +use crate::store::TicketId; +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq, Eq)] +pub enum Status { + ToDo, + InProgress, + Done, +} diff --git a/exercises/07_threads/09_bounded/src/lib.rs b/exercises/07_threads/09_bounded/src/lib.rs new file mode 100644 index 0000000..e661e68 --- /dev/null +++ b/exercises/07_threads/09_bounded/src/lib.rs @@ -0,0 +1,66 @@ +// TODO: Convert the implementation to use bounded channels. +use crate::data::{Ticket, TicketDraft}; +use crate::store::{TicketId, TicketStore}; +use std::sync::mpsc::{Receiver, Sender}; + +pub mod data; +pub mod store; + +#[derive(Clone)] +pub struct TicketStoreClient { + sender: todo!(), +} + +impl TicketStoreClient { + pub fn insert(&self, draft: TicketDraft) -> Result { + todo!() + } + + pub fn get(&self, id: TicketId) -> Result, todo!()> { + todo!() + } +} + +pub fn launch(capacity: usize) -> TicketStoreClient { + todo!(); + std::thread::spawn(move || server(receiver)); + todo!() +} + +enum Command { + Insert { + draft: TicketDraft, + response_channel: todo!(), + }, + Get { + id: TicketId, + response_channel: todo!(), + }, +} + +pub fn server(receiver: Receiver) { + let mut store = TicketStore::new(); + loop { + match receiver.recv() { + Ok(Command::Insert { + draft, + response_channel, + }) => { + let id = store.add_ticket(draft); + todo!() + } + Ok(Command::Get { + id, + response_channel, + }) => { + let ticket = store.get(id); + todo!() + } + Err(_) => { + // There are no more senders, so we can safely break + // and shut down the server. + break; + } + } + } +} diff --git a/exercises/07_threads/09_bounded/src/store.rs b/exercises/07_threads/09_bounded/src/store.rs new file mode 100644 index 0000000..6029d94 --- /dev/null +++ b/exercises/07_threads/09_bounded/src/store.rs @@ -0,0 +1,37 @@ +use crate::data::{Status, Ticket, TicketDraft}; +use std::collections::BTreeMap; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct TicketId(u64); + +#[derive(Clone)] +pub struct TicketStore { + tickets: BTreeMap, + counter: u64, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: BTreeMap::new(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + self.tickets.insert(id, ticket); + id + } + + pub fn get(&self, id: TicketId) -> Option<&Ticket> { + self.tickets.get(&id) + } +} diff --git a/exercises/07_threads/09_bounded/tests/insert.rs b/exercises/07_threads/09_bounded/tests/insert.rs new file mode 100644 index 0000000..acca3f8 --- /dev/null +++ b/exercises/07_threads/09_bounded/tests/insert.rs @@ -0,0 +1,20 @@ +use bounded::data::{Status, TicketDraft}; +use bounded::launch; +use ticket_fields::test_helpers::{ticket_description, ticket_title}; + +#[test] +fn works() { + let client = launch(5); + let draft = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let ticket_id = client.insert(draft.clone()).unwrap(); + + let client2 = client.clone(); + let ticket = client2.get(ticket_id).unwrap().unwrap(); + assert_eq!(ticket_id, ticket.id); + assert_eq!(ticket.status, Status::ToDo); + assert_eq!(ticket.title, draft.title); + assert_eq!(ticket.description, draft.description); +} diff --git a/exercises/07_threads/10_patch/Cargo.toml b/exercises/07_threads/10_patch/Cargo.toml new file mode 100644 index 0000000..396b6f6 --- /dev/null +++ b/exercises/07_threads/10_patch/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "patch" +version = "0.1.0" +edition = "2021" + +[dependencies] +thiserror = "1.0.59" +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/07_threads/10_patch/src/data.rs b/exercises/07_threads/10_patch/src/data.rs new file mode 100644 index 0000000..b8cf488 --- /dev/null +++ b/exercises/07_threads/10_patch/src/data.rs @@ -0,0 +1,31 @@ +use crate::store::TicketId; +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TicketPatch { + pub id: TicketId, + pub title: Option, + pub description: Option, + pub status: Option, +} + +#[derive(Clone, Debug, Copy, PartialEq, Eq)] +pub enum Status { + ToDo, + InProgress, + Done, +} diff --git a/exercises/07_threads/10_patch/src/lib.rs b/exercises/07_threads/10_patch/src/lib.rs new file mode 100644 index 0000000..492f767 --- /dev/null +++ b/exercises/07_threads/10_patch/src/lib.rs @@ -0,0 +1,97 @@ +use std::sync::mpsc::{sync_channel, Receiver, SyncSender}; + +// TODO: Implement the patching functionality. +use crate::data::{Ticket, TicketDraft, TicketPatch}; +use crate::store::{TicketId, TicketStore}; + +pub mod data; +pub mod store; + +#[derive(Clone)] +pub struct TicketStoreClient { + sender: SyncSender, +} + +impl TicketStoreClient { + pub fn insert(&self, draft: TicketDraft) -> Result { + let (response_sender, response_receiver) = sync_channel(1); + self.sender + .try_send(Command::Insert { + draft, + response_channel: response_sender, + }) + .map_err(|_| OverloadedError)?; + Ok(response_receiver.recv().unwrap()) + } + + pub fn get(&self, id: TicketId) -> Result, OverloadedError> { + let (response_sender, response_receiver) = sync_channel(1); + self.sender + .try_send(Command::Get { + id, + response_channel: response_sender, + }) + .map_err(|_| OverloadedError)?; + Ok(response_receiver.recv().unwrap()) + } + + pub fn update(&self, ticket_patch: TicketPatch) -> Result<(), OverloadedError> {} +} + +#[derive(Debug, thiserror::Error)] +#[error("The store is overloaded")] +pub struct OverloadedError; + +pub fn launch(capacity: usize) -> TicketStoreClient { + let (sender, receiver) = sync_channel(capacity); + std::thread::spawn(move || server(receiver)); + TicketStoreClient { sender } +} + +enum Command { + Insert { + draft: TicketDraft, + response_channel: SyncSender, + }, + Get { + id: TicketId, + response_channel: SyncSender>, + }, + Update { + patch: TicketPatch, + response_channel: SyncSender<()>, + }, +} + +pub fn server(receiver: Receiver) { + let mut store = TicketStore::new(); + loop { + match receiver.recv() { + Ok(Command::Insert { + draft, + response_channel, + }) => { + let id = store.add_ticket(draft); + let _ = response_channel.send(id); + } + Ok(Command::Get { + id, + response_channel, + }) => { + let ticket = store.get(id); + let _ = response_channel.send(ticket.cloned()); + } + Ok(Command::Update { + patch, + response_channel, + }) => { + todo!() + } + Err(_) => { + // There are no more senders, so we can safely break + // and shut down the server. + break; + } + } + } +} diff --git a/exercises/07_threads/10_patch/src/store.rs b/exercises/07_threads/10_patch/src/store.rs new file mode 100644 index 0000000..bf28a44 --- /dev/null +++ b/exercises/07_threads/10_patch/src/store.rs @@ -0,0 +1,41 @@ +use crate::data::{Status, Ticket, TicketDraft}; +use std::collections::BTreeMap; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct TicketId(u64); + +#[derive(Clone)] +pub struct TicketStore { + tickets: BTreeMap, + counter: u64, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: BTreeMap::new(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + self.tickets.insert(id, ticket); + id + } + + pub fn get(&self, id: TicketId) -> Option<&Ticket> { + self.tickets.get(&id) + } + + pub fn get_mut(&mut self, id: TicketId) -> Option<&mut Ticket> { + self.tickets.get_mut(&id) + } +} diff --git a/exercises/07_threads/10_patch/tests/check.rs b/exercises/07_threads/10_patch/tests/check.rs new file mode 100644 index 0000000..c7d6513 --- /dev/null +++ b/exercises/07_threads/10_patch/tests/check.rs @@ -0,0 +1,31 @@ +use patch::data::{Status, TicketDraft, TicketPatch}; +use patch::launch; +use ticket_fields::test_helpers::{ticket_description, ticket_title}; + +#[test] +fn works() { + let client = launch(5); + let draft = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let ticket_id = client.insert(draft.clone()).unwrap(); + + let ticket = client.get(ticket_id).unwrap().unwrap(); + assert_eq!(ticket_id, ticket.id); + assert_eq!(ticket.status, Status::ToDo); + assert_eq!(ticket.title, draft.title); + assert_eq!(ticket.description, draft.description); + + let patch = TicketPatch { + id: ticket_id, + title: None, + description: None, + status: Some(Status::InProgress), + }; + client.update(patch).unwrap(); + + let ticket = client.get(ticket_id).unwrap().unwrap(); + assert_eq!(ticket.id, ticket_id); + assert_eq!(ticket.status, Status::InProgress); +} diff --git a/exercises/07_threads/11_locks/Cargo.toml b/exercises/07_threads/11_locks/Cargo.toml new file mode 100644 index 0000000..49d0fa4 --- /dev/null +++ b/exercises/07_threads/11_locks/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "locks" +version = "0.1.0" +edition = "2021" + +[dependencies] +thiserror = "1.0.60" +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/07_threads/11_locks/src/data.rs b/exercises/07_threads/11_locks/src/data.rs new file mode 100644 index 0000000..352d361 --- /dev/null +++ b/exercises/07_threads/11_locks/src/data.rs @@ -0,0 +1,23 @@ +use crate::store::TicketId; +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq, Eq)] +pub enum Status { + ToDo, + InProgress, + Done, +} diff --git a/exercises/07_threads/11_locks/src/lib.rs b/exercises/07_threads/11_locks/src/lib.rs new file mode 100644 index 0000000..b5e6c0d --- /dev/null +++ b/exercises/07_threads/11_locks/src/lib.rs @@ -0,0 +1,88 @@ +// TODO: Fill in the missing methods for `TicketStore`. +// Notice how we no longer need a separate update command: `Get` now returns a handle to the ticket +// which allows the caller to both modify and read the ticket. +use std::sync::mpsc::{sync_channel, Receiver, SyncSender, TrySendError}; +use std::sync::{Arc, Mutex}; + +use crate::data::{Ticket, TicketDraft}; +use crate::store::{TicketId, TicketStore}; + +pub mod data; +pub mod store; + +#[derive(Clone)] +pub struct TicketStoreClient { + sender: SyncSender, +} + +impl TicketStoreClient { + pub fn insert(&self, draft: TicketDraft) -> Result { + let (response_sender, response_receiver) = sync_channel(1); + self.sender + .try_send(Command::Insert { + draft, + response_channel: response_sender, + }) + .map_err(|_| OverloadedError)?; + Ok(response_receiver.recv().unwrap()) + } + + pub fn get(&self, id: TicketId) -> Result>>, OverloadedError> { + let (response_sender, response_receiver) = sync_channel(1); + self.sender + .try_send(Command::Get { + id, + response_channel: response_sender, + }) + .map_err(|_| OverloadedError)?; + Ok(response_receiver.recv().unwrap()) + } +} + +#[derive(Debug, thiserror::Error)] +#[error("The store is overloaded")] +pub struct OverloadedError; + +pub fn launch(capacity: usize) -> TicketStoreClient { + let (sender, receiver) = sync_channel(capacity); + std::thread::spawn(move || server(receiver)); + TicketStoreClient { sender } +} + +enum Command { + Insert { + draft: TicketDraft, + response_channel: SyncSender, + }, + Get { + id: TicketId, + response_channel: SyncSender>>>, + }, +} + +pub fn server(receiver: Receiver) { + let mut store = TicketStore::new(); + loop { + match receiver.recv() { + Ok(Command::Insert { + draft, + response_channel, + }) => { + let id = store.add_ticket(draft); + let _ = response_channel.send(id); + } + Ok(Command::Get { + id, + response_channel, + }) => { + let ticket = store.get(id); + let _ = response_channel.send(ticket); + } + Err(_) => { + // There are no more senders, so we can safely break + // and shut down the server. + break; + } + } + } +} diff --git a/exercises/07_threads/11_locks/src/store.rs b/exercises/07_threads/11_locks/src/store.rs new file mode 100644 index 0000000..9387499 --- /dev/null +++ b/exercises/07_threads/11_locks/src/store.rs @@ -0,0 +1,40 @@ +use crate::data::{Status, Ticket, TicketDraft}; +use std::collections::BTreeMap; +use std::sync::{Arc, Mutex}; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct TicketId(u64); + +#[derive(Clone)] +pub struct TicketStore { + tickets: BTreeMap>>, + counter: u64, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: BTreeMap::new(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + todo!(); + id + } + + // The `get` method should return a handle to the ticket + // which allows the caller to either read or modify the ticket. + pub fn get(&self, id: TicketId) -> Option { + todo!() + } +} diff --git a/exercises/07_threads/11_locks/tests/check.rs b/exercises/07_threads/11_locks/tests/check.rs new file mode 100644 index 0000000..19939b1 --- /dev/null +++ b/exercises/07_threads/11_locks/tests/check.rs @@ -0,0 +1,31 @@ +use locks::data::{Status, TicketDraft}; +use locks::launch; +use ticket_fields::test_helpers::{ticket_description, ticket_title}; + +#[test] +fn works() { + let client = launch(5); + let draft = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let ticket_id = client.insert(draft.clone()).unwrap(); + + let ticket = client.get(ticket_id).unwrap().unwrap(); + { + let mut ticket = ticket.lock().unwrap(); + assert_eq!(ticket_id, ticket.id); + assert_eq!(ticket.status, Status::ToDo); + assert_eq!(ticket.title, draft.title); + assert_eq!(ticket.description, draft.description); + + ticket.status = Status::InProgress; + } + + let ticket = client.get(ticket_id).unwrap().unwrap(); + { + let ticket = ticket.lock().unwrap(); + assert_eq!(ticket_id, ticket.id); + assert_eq!(ticket.status, Status::InProgress); + } +} diff --git a/exercises/07_threads/12_rw_lock/Cargo.toml b/exercises/07_threads/12_rw_lock/Cargo.toml new file mode 100644 index 0000000..aa90f38 --- /dev/null +++ b/exercises/07_threads/12_rw_lock/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "rwlock" +version = "0.1.0" +edition = "2021" + +[dependencies] +thiserror = "1.0.60" +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/07_threads/12_rw_lock/src/data.rs b/exercises/07_threads/12_rw_lock/src/data.rs new file mode 100644 index 0000000..352d361 --- /dev/null +++ b/exercises/07_threads/12_rw_lock/src/data.rs @@ -0,0 +1,23 @@ +use crate::store::TicketId; +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq, Eq)] +pub enum Status { + ToDo, + InProgress, + Done, +} diff --git a/exercises/07_threads/12_rw_lock/src/lib.rs b/exercises/07_threads/12_rw_lock/src/lib.rs new file mode 100644 index 0000000..0c33f53 --- /dev/null +++ b/exercises/07_threads/12_rw_lock/src/lib.rs @@ -0,0 +1,87 @@ +// TODO: Replace `Mutex` with `RwLock` in the `TicketStore` struct and +// all other relevant places to allow multiple readers to access the ticket store concurrently. +use std::sync::mpsc::{sync_channel, Receiver, SyncSender, TrySendError}; +use std::sync::{Arc, Mutex}; + +use crate::data::{Ticket, TicketDraft}; +use crate::store::{TicketId, TicketStore}; + +pub mod data; +pub mod store; + +#[derive(Clone)] +pub struct TicketStoreClient { + sender: SyncSender, +} + +impl TicketStoreClient { + pub fn insert(&self, draft: TicketDraft) -> Result { + let (response_sender, response_receiver) = sync_channel(1); + self.sender + .try_send(Command::Insert { + draft, + response_channel: response_sender, + }) + .map_err(|_| OverloadedError)?; + Ok(response_receiver.recv().unwrap()) + } + + pub fn get(&self, id: TicketId) -> Result>>, OverloadedError> { + let (response_sender, response_receiver) = sync_channel(1); + self.sender + .try_send(Command::Get { + id, + response_channel: response_sender, + }) + .map_err(|_| OverloadedError)?; + Ok(response_receiver.recv().unwrap()) + } +} + +#[derive(Debug, thiserror::Error)] +#[error("The store is overloaded")] +pub struct OverloadedError; + +pub fn launch(capacity: usize) -> TicketStoreClient { + let (sender, receiver) = sync_channel(capacity); + std::thread::spawn(move || server(receiver)); + TicketStoreClient { sender } +} + +enum Command { + Insert { + draft: TicketDraft, + response_channel: SyncSender, + }, + Get { + id: TicketId, + response_channel: SyncSender>>>, + }, +} + +pub fn server(receiver: Receiver) { + let mut store = TicketStore::new(); + loop { + match receiver.recv() { + Ok(Command::Insert { + draft, + response_channel, + }) => { + let id = store.add_ticket(draft); + let _ = response_channel.send(id); + } + Ok(Command::Get { + id, + response_channel, + }) => { + let ticket = store.get(id); + let _ = response_channel.send(ticket); + } + Err(_) => { + // There are no more senders, so we can safely break + // and shut down the server. + break; + } + } + } +} diff --git a/exercises/07_threads/12_rw_lock/src/store.rs b/exercises/07_threads/12_rw_lock/src/store.rs new file mode 100644 index 0000000..7387efd --- /dev/null +++ b/exercises/07_threads/12_rw_lock/src/store.rs @@ -0,0 +1,41 @@ +use crate::data::{Status, Ticket, TicketDraft}; +use std::collections::BTreeMap; +use std::sync::{Arc, Mutex}; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct TicketId(u64); + +#[derive(Clone)] +pub struct TicketStore { + tickets: BTreeMap>>, + counter: u64, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: BTreeMap::new(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + let ticket = Arc::new(Mutex::new(ticket)); + self.tickets.insert(id, ticket); + id + } + + // The `get` method should return a handle to the ticket + // which allows the caller to either read or modify the ticket. + pub fn get(&self, id: TicketId) -> Option>> { + self.tickets.get(&id).cloned() + } +} diff --git a/exercises/07_threads/12_rw_lock/tests/check.rs b/exercises/07_threads/12_rw_lock/tests/check.rs new file mode 100644 index 0000000..21fdce5 --- /dev/null +++ b/exercises/07_threads/12_rw_lock/tests/check.rs @@ -0,0 +1,31 @@ +use rwlock::data::{Status, TicketDraft}; +use rwlock::launch; +use ticket_fields::test_helpers::{ticket_description, ticket_title}; + +#[test] +fn works() { + let client = launch(5); + let draft = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + let ticket_id = client.insert(draft.clone()).unwrap(); + + let ticket = client.get(ticket_id).unwrap().unwrap(); + let lock1 = ticket.read().unwrap(); + { + let ticket = ticket.read().unwrap(); + assert_eq!(ticket_id, ticket.id); + assert_eq!(ticket.status, Status::ToDo); + assert_eq!(ticket.title, draft.title); + assert_eq!(ticket.description, draft.description); + } + + drop(lock1); + + let ticket = client.get(ticket_id).unwrap().unwrap(); + { + let mut ticket = ticket.write().unwrap(); + ticket.status = Status::InProgress; + } +} diff --git a/exercises/07_threads/13_without_channels/Cargo.toml b/exercises/07_threads/13_without_channels/Cargo.toml new file mode 100644 index 0000000..21e87a4 --- /dev/null +++ b/exercises/07_threads/13_without_channels/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "without_channels" +version = "0.1.0" +edition = "2021" + +[dependencies] +ticket_fields = { path = "../../../helpers/ticket_fields" } diff --git a/exercises/07_threads/13_without_channels/src/data.rs b/exercises/07_threads/13_without_channels/src/data.rs new file mode 100644 index 0000000..352d361 --- /dev/null +++ b/exercises/07_threads/13_without_channels/src/data.rs @@ -0,0 +1,23 @@ +use crate::store::TicketId; +use ticket_fields::{TicketDescription, TicketTitle}; + +#[derive(Clone, Debug, PartialEq)] +pub struct Ticket { + pub id: TicketId, + pub title: TicketTitle, + pub description: TicketDescription, + pub status: Status, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TicketDraft { + pub title: TicketTitle, + pub description: TicketDescription, +} + +#[derive(Clone, Debug, Copy, PartialEq, Eq)] +pub enum Status { + ToDo, + InProgress, + Done, +} diff --git a/exercises/07_threads/13_without_channels/src/lib.rs b/exercises/07_threads/13_without_channels/src/lib.rs new file mode 100644 index 0000000..8064df0 --- /dev/null +++ b/exercises/07_threads/13_without_channels/src/lib.rs @@ -0,0 +1,7 @@ +// TODO: You don't actually have to change anything in the library itself! +// We mostly had to **remove** code (the client type, the launch function, the command enum) +// that's no longer necessary. +// Fix the `todo!()` in the testing code and see how the new design can be used. + +pub mod data; +pub mod store; diff --git a/exercises/07_threads/13_without_channels/src/store.rs b/exercises/07_threads/13_without_channels/src/store.rs new file mode 100644 index 0000000..03be3ab --- /dev/null +++ b/exercises/07_threads/13_without_channels/src/store.rs @@ -0,0 +1,40 @@ +use std::collections::BTreeMap; +use std::sync::{Arc, RwLock}; + +use crate::data::{Status, Ticket, TicketDraft}; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct TicketId(u64); + +#[derive(Clone)] +pub struct TicketStore { + tickets: BTreeMap>>, + counter: u64, +} + +impl TicketStore { + pub fn new() -> Self { + Self { + tickets: BTreeMap::new(), + counter: 0, + } + } + + pub fn add_ticket(&mut self, ticket: TicketDraft) -> TicketId { + let id = TicketId(self.counter); + self.counter += 1; + let ticket = Ticket { + id, + title: ticket.title, + description: ticket.description, + status: Status::ToDo, + }; + let ticket = Arc::new(RwLock::new(ticket)); + self.tickets.insert(id, ticket); + id + } + + pub fn get(&self, id: TicketId) -> Option>> { + self.tickets.get(&id).cloned() + } +} diff --git a/exercises/07_threads/13_without_channels/tests/check.rs b/exercises/07_threads/13_without_channels/tests/check.rs new file mode 100644 index 0000000..e0d9c88 --- /dev/null +++ b/exercises/07_threads/13_without_channels/tests/check.rs @@ -0,0 +1,40 @@ +use std::sync::{Arc, RwLock}; +use std::thread::spawn; + +use ticket_fields::test_helpers::{ticket_description, ticket_title}; +use without_channels::data::TicketDraft; +use without_channels::store::TicketStore; + +#[test] +fn works() { + let store = todo!(); + + let store1 = store.clone(); + let client1 = spawn(move || { + let draft = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + store1.write().unwrap().add_ticket(draft) + }); + + let store2 = store.clone(); + let client2 = spawn(move || { + let draft = TicketDraft { + title: ticket_title(), + description: ticket_description(), + }; + store2.write().unwrap().add_ticket(draft) + }); + + let ticket_id1 = client1.join().unwrap(); + let ticket_id2 = client2.join().unwrap(); + + let reader = store.read().unwrap(); + + let ticket1 = reader.get(ticket_id1).unwrap(); + assert_eq!(ticket_id1, ticket1.read().unwrap().id); + + let ticket2 = reader.get(ticket_id2).unwrap(); + assert_eq!(ticket_id2, ticket2.read().unwrap().id); +} diff --git a/exercises/07_threads/14_sync/Cargo.toml b/exercises/07_threads/14_sync/Cargo.toml new file mode 100644 index 0000000..908e619 --- /dev/null +++ b/exercises/07_threads/14_sync/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "sync" +version = "0.1.0" +edition = "2021" diff --git a/exercises/07_threads/14_sync/src/lib.rs b/exercises/07_threads/14_sync/src/lib.rs new file mode 100644 index 0000000..c67d0f7 --- /dev/null +++ b/exercises/07_threads/14_sync/src/lib.rs @@ -0,0 +1,14 @@ +// Not much to be exercised on `Sync`, just a thing to remember. +fn outro() -> &'static str { + "I have a good understanding of __!" +} + +#[cfg(test)] +mod tests { + use crate::outro; + + #[test] + fn test_outro() { + assert_eq!(outro(), "I have a good understanding of Send and Sync!"); + } +} diff --git a/exercises/08_futures/00_intro/Cargo.toml b/exercises/08_futures/00_intro/Cargo.toml new file mode 100644 index 0000000..907f35e --- /dev/null +++ b/exercises/08_futures/00_intro/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "intro_08" +version = "0.1.0" +edition = "2021" diff --git a/exercises/08_futures/00_intro/src/lib.rs b/exercises/08_futures/00_intro/src/lib.rs new file mode 100644 index 0000000..c730220 --- /dev/null +++ b/exercises/08_futures/00_intro/src/lib.rs @@ -0,0 +1,14 @@ +fn intro() -> &'static str { + // TODO: fix me 👇 + "I'm ready to _!" +} + +#[cfg(test)] +mod tests { + use crate::intro; + + #[test] + fn test_intro() { + assert_eq!(intro(), "I'm ready to learn about futures!"); + } +} diff --git a/exercises/08_futures/01_async_fn/Cargo.toml b/exercises/08_futures/01_async_fn/Cargo.toml new file mode 100644 index 0000000..28433da --- /dev/null +++ b/exercises/08_futures/01_async_fn/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "async_fn" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.83" +tokio = { version = "1", features = ["full"] } diff --git a/exercises/08_futures/01_async_fn/src/lib.rs b/exercises/08_futures/01_async_fn/src/lib.rs new file mode 100644 index 0000000..b8a83d8 --- /dev/null +++ b/exercises/08_futures/01_async_fn/src/lib.rs @@ -0,0 +1,45 @@ +use tokio::net::TcpListener; + +// TODO: write an echo server that accepts incoming TCP connections and +// echoes the received data back to the client. +// `echo` should not return when it finishes processing a connection, but should +// continue to accept new connections. +// +// Hint: you should rely on `tokio`'s structs and methods to implement the echo server. +// In particular: +// - `tokio::net::TcpListener::accept` to process the next incoming connection +// - `tokio::net::TcpStream::split` to obtain a reader and a writer from the socket +// - `tokio::io::copy` to copy data from the reader to the writer +pub async fn echo(listener: TcpListener) -> Result<(), anyhow::Error> { + todo!() +} + +#[cfg(test)] +mod tests { + use super::*; + use tokio::io::{AsyncReadExt, AsyncWriteExt}; + + #[tokio::test] + async fn test_echo() { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + tokio::spawn(echo(listener)); + + let requests = vec!["hello", "world", "foo", "bar"]; + + for request in requests { + let mut socket = tokio::net::TcpStream::connect(addr).await.unwrap(); + let (mut reader, mut writer) = socket.split(); + + // Send the request + writer.write_all(request.as_bytes()).await.unwrap(); + // Close the write side of the socket + writer.shutdown().await.unwrap(); + + // Read the response + let mut buf = Vec::with_capacity(request.len()); + reader.read_to_end(&mut buf).await.unwrap(); + assert_eq!(&buf, request.as_bytes()); + } + } +} diff --git a/exercises/08_futures/02_spawn/Cargo.toml b/exercises/08_futures/02_spawn/Cargo.toml new file mode 100644 index 0000000..27c1ca3 --- /dev/null +++ b/exercises/08_futures/02_spawn/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "spawn" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.83" +tokio = { version = "1", features = ["full"] } diff --git a/exercises/08_futures/02_spawn/src/lib.rs b/exercises/08_futures/02_spawn/src/lib.rs new file mode 100644 index 0000000..9e00f36 --- /dev/null +++ b/exercises/08_futures/02_spawn/src/lib.rs @@ -0,0 +1,60 @@ +use tokio::net::TcpListener; + +// TODO: write an echo server that accepts TCP connections on two listeners, concurrently. +// Multiple connections (on the same listeners) should be processed concurrently. +// The received data should be echoed back to the client. +pub async fn echoes(first: TcpListener, second: TcpListener) -> Result<(), anyhow::Error> { + todo!() +} + +#[cfg(test)] +mod tests { + use super::*; + use std::net::SocketAddr; + use std::panic; + use tokio::io::{AsyncReadExt, AsyncWriteExt}; + use tokio::task::JoinSet; + + async fn bind_random() -> (TcpListener, SocketAddr) { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + (listener, addr) + } + + #[tokio::test] + async fn test_echo() { + let (first_listener, first_addr) = bind_random().await; + let (second_listener, second_addr) = bind_random().await; + tokio::spawn(echoes(first_listener, second_listener)); + + let requests = vec!["hello", "world", "foo", "bar"]; + let mut join_set = JoinSet::new(); + + for request in requests.clone() { + for addr in [first_addr, second_addr] { + join_set.spawn(async move { + let mut socket = tokio::net::TcpStream::connect(addr).await.unwrap(); + let (mut reader, mut writer) = socket.split(); + + // Send the request + writer.write_all(request.as_bytes()).await.unwrap(); + // Close the write side of the socket + writer.shutdown().await.unwrap(); + + // Read the response + let mut buf = Vec::with_capacity(request.len()); + reader.read_to_end(&mut buf).await.unwrap(); + assert_eq!(&buf, request.as_bytes()); + }); + } + } + + while let Some(outcome) = join_set.join_next().await { + if let Err(e) = outcome { + if let Ok(reason) = e.try_into_panic() { + panic::resume_unwind(reason); + } + } + } + } +} diff --git a/exercises/08_futures/03_runtime/Cargo.toml b/exercises/08_futures/03_runtime/Cargo.toml new file mode 100644 index 0000000..d1b3ef2 --- /dev/null +++ b/exercises/08_futures/03_runtime/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "runtime" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.83" +tokio = { version = "1", features = ["full"] } diff --git a/exercises/08_futures/03_runtime/src/lib.rs b/exercises/08_futures/03_runtime/src/lib.rs new file mode 100644 index 0000000..087ddc0 --- /dev/null +++ b/exercises/08_futures/03_runtime/src/lib.rs @@ -0,0 +1,61 @@ +// TODO: Implement the `fixed_reply` function. It should accept two `TcpListener` instances, +// accept connections on both of them concurrently, and always reply to clients by sending +// the `Display` representation of the `reply` argument as a response. +use std::fmt::Display; +use tokio::io::AsyncWriteExt; +use tokio::net::TcpListener; + +pub async fn fixed_reply(first: TcpListener, second: TcpListener, reply: T) +where + // `T` cannot be cloned. How do you share it between the two server tasks? + T: Display + Send + Sync + 'static, +{ + todo!() +} + +#[cfg(test)] +mod tests { + use super::*; + use std::net::SocketAddr; + use std::panic; + use tokio::io::AsyncReadExt; + use tokio::task::JoinSet; + + async fn bind_random() -> (TcpListener, SocketAddr) { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + (listener, addr) + } + + #[tokio::test] + async fn test_echo() { + let (first_listener, first_addr) = bind_random().await; + let (second_listener, second_addr) = bind_random().await; + let reply = "Yo"; + tokio::spawn(fixed_reply(first_listener, second_listener, reply)); + + let mut join_set = JoinSet::new(); + + for _ in 0..3 { + for addr in [first_addr, second_addr] { + join_set.spawn(async move { + let mut socket = tokio::net::TcpStream::connect(addr).await.unwrap(); + let (mut reader, _) = socket.split(); + + // Read the response + let mut buf = Vec::new(); + reader.read_to_end(&mut buf).await.unwrap(); + assert_eq!(&buf, reply.as_bytes()); + }); + } + } + + while let Some(outcome) = join_set.join_next().await { + if let Err(e) = outcome { + if let Ok(reason) = e.try_into_panic() { + panic::resume_unwind(reason); + } + } + } + } +} diff --git a/exercises/08_futures/04_future/Cargo.toml b/exercises/08_futures/04_future/Cargo.toml new file mode 100644 index 0000000..745e6ec --- /dev/null +++ b/exercises/08_futures/04_future/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "future" +version = "0.1.0" +edition = "2021" + +[dependencies] +tokio = { version = "1", features = ["full"] } diff --git a/exercises/08_futures/04_future/src/lib.rs b/exercises/08_futures/04_future/src/lib.rs new file mode 100644 index 0000000..8dc1c96 --- /dev/null +++ b/exercises/08_futures/04_future/src/lib.rs @@ -0,0 +1,16 @@ +//! TODO: get the code to compile by **re-ordering** the statements +//! in the `example` function. You're not allowed to change the +//! `spawner` function nor what each line does in `example`. +//! You can wrap existing statements in blocks `{}` if needed. +use std::rc::Rc; +use tokio::task::yield_now; + +fn spawner() { + tokio::spawn(example()); +} + +async fn example() { + let non_send = Rc::new(1); + yield_now().await; + println!("{}", non_send); +} diff --git a/exercises/08_futures/05_blocking/Cargo.toml b/exercises/08_futures/05_blocking/Cargo.toml new file mode 100644 index 0000000..963a3e2 --- /dev/null +++ b/exercises/08_futures/05_blocking/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "blocking" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.83" +tokio = { version = "1", features = ["full"] } diff --git a/exercises/08_futures/05_blocking/src/lib.rs b/exercises/08_futures/05_blocking/src/lib.rs new file mode 100644 index 0000000..e9b4354 --- /dev/null +++ b/exercises/08_futures/05_blocking/src/lib.rs @@ -0,0 +1,71 @@ +// TODO: the `echo` server uses non-async primitives. +// When running the tests, you should observe that it hangs, due to a +// deadlock between the caller and the server. +// Use `spawn_blocking` inside `echo` to resolve the issue. +use std::io::{Read, Write}; +use tokio::net::TcpListener; + +pub async fn echo(listener: TcpListener) -> Result<(), anyhow::Error> { + loop { + let (socket, _) = listener.accept().await?; + let mut socket = socket.into_std()?; + socket.set_nonblocking(false)?; + let mut buffer = Vec::new(); + socket.read_to_end(&mut buffer)?; + socket.write_all(&buffer)?; + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::net::SocketAddr; + use std::panic; + use tokio::io::{AsyncReadExt, AsyncWriteExt}; + use tokio::task::JoinSet; + + async fn bind_random() -> (TcpListener, SocketAddr) { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + (listener, addr) + } + + #[tokio::test] + async fn test_echo() { + let (listener, addr) = bind_random().await; + tokio::spawn(echo(listener)); + + let requests = vec![ + "hello here we go with a long message", + "world", + "foo", + "bar", + ]; + let mut join_set = JoinSet::new(); + + for request in requests { + join_set.spawn(async move { + let mut socket = tokio::net::TcpStream::connect(addr).await.unwrap(); + let (mut reader, mut writer) = socket.split(); + + // Send the request + writer.write_all(request.as_bytes()).await.unwrap(); + // Close the write side of the socket + writer.shutdown().await.unwrap(); + + // Read the response + let mut buf = Vec::with_capacity(request.len()); + reader.read_to_end(&mut buf).await.unwrap(); + assert_eq!(&buf, request.as_bytes()); + }); + } + + while let Some(outcome) = join_set.join_next().await { + if let Err(e) = outcome { + if let Ok(reason) = e.try_into_panic() { + panic::resume_unwind(reason); + } + } + } + } +} diff --git a/exercises/08_futures/06_async_aware_primitives/Cargo.toml b/exercises/08_futures/06_async_aware_primitives/Cargo.toml new file mode 100644 index 0000000..4b517c2 --- /dev/null +++ b/exercises/08_futures/06_async_aware_primitives/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "async_locks" +version = "0.1.0" +edition = "2021" + +[dependencies] +tokio = { version = "1", features = ["full"] } diff --git a/exercises/08_futures/06_async_aware_primitives/src/lib.rs b/exercises/08_futures/06_async_aware_primitives/src/lib.rs new file mode 100644 index 0000000..16efb4a --- /dev/null +++ b/exercises/08_futures/06_async_aware_primitives/src/lib.rs @@ -0,0 +1,53 @@ +/// TODO: the code below will deadlock because it's using std's channels, +/// which are not async-aware. +/// Rewrite it to use `tokio`'s channels primitive (you'll have to touch +/// the testing code too, yes). +/// +/// Can you understand the sequence of events that can lead to a deadlock? +use std::sync::mpsc; + +pub struct Message { + payload: String, + response_channel: mpsc::Sender, +} + +/// Replies with `pong` to any message it receives, setting up a new +/// channel to continue communicating with the caller. +pub async fn pong(mut receiver: mpsc::Receiver) { + loop { + if let Ok(msg) = receiver.recv() { + println!("Pong received: {}", msg.payload); + let (sender, new_receiver) = mpsc::channel(); + msg.response_channel + .send(Message { + payload: "pong".into(), + response_channel: sender, + }) + .unwrap(); + receiver = new_receiver; + } + } +} + +#[cfg(test)] +mod tests { + use crate::{pong, Message}; + use std::sync::mpsc; + + #[tokio::test] + async fn ping() { + let (sender, receiver) = mpsc::channel(); + let (response_sender, response_receiver) = mpsc::channel(); + sender + .send(Message { + payload: "pong".into(), + response_channel: response_sender, + }) + .unwrap(); + + tokio::spawn(pong(receiver)); + + let answer = response_receiver.recv().unwrap().payload; + assert_eq!(answer, "pong"); + } +} diff --git a/exercises/08_futures/07_cancellation/Cargo.toml b/exercises/08_futures/07_cancellation/Cargo.toml new file mode 100644 index 0000000..3b18d85 --- /dev/null +++ b/exercises/08_futures/07_cancellation/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "cancellation" +version = "0.1.0" +edition = "2021" + +[dependencies] +tokio = { version = "1", features = ["full"] } diff --git a/exercises/08_futures/07_cancellation/src/lib.rs b/exercises/08_futures/07_cancellation/src/lib.rs new file mode 100644 index 0000000..f62301e --- /dev/null +++ b/exercises/08_futures/07_cancellation/src/lib.rs @@ -0,0 +1,51 @@ +// TODO: fix the `assert_eq` at the end of the tests. +// Do you understand why that's the resulting output? +use std::time::Duration; +use tokio::io::AsyncReadExt; +use tokio::net::TcpListener; + +pub async fn run(listener: TcpListener, n_messages: usize, timeout: Duration) -> Vec { + let mut buffer = Vec::new(); + for _ in 0..n_messages { + let (mut stream, _) = listener.accept().await.unwrap(); + let _ = tokio::time::timeout(timeout, async { + stream.read_to_end(&mut buffer).await.unwrap(); + }) + .await; + } + buffer +} + +#[cfg(test)] +mod tests { + use super::*; + use tokio::io::AsyncWriteExt; + + #[tokio::test] + async fn ping() { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + let messages = vec!["hello", "from", "this", "task"]; + let timeout = Duration::from_millis(20); + let handle = tokio::spawn(run(listener, messages.len(), timeout.clone())); + + for message in messages { + let mut socket = tokio::net::TcpStream::connect(addr).await.unwrap(); + let (_, mut writer) = socket.split(); + + let (beginning, end) = message.split_at(message.len() / 2); + + // Send first half + writer.write_all(beginning.as_bytes()).await.unwrap(); + tokio::time::sleep(timeout * 2).await; + writer.write_all(end.as_bytes()).await.unwrap(); + + // Close the write side of the socket + let _ = writer.shutdown().await; + } + + let buffered = handle.await.unwrap(); + let buffered = std::str::from_utf8(&buffered).unwrap(); + assert_eq!(buffered, ""); + } +} diff --git a/exercises/08_futures/08_outro/Cargo.toml b/exercises/08_futures/08_outro/Cargo.toml new file mode 100644 index 0000000..dff6885 --- /dev/null +++ b/exercises/08_futures/08_outro/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "outro_08" +version = "0.1.0" +edition = "2021" + +[dependencies] +tokio = { version = "1", features = ["full"] } diff --git a/exercises/08_futures/08_outro/src/lib.rs b/exercises/08_futures/08_outro/src/lib.rs new file mode 100644 index 0000000..8a8f07a --- /dev/null +++ b/exercises/08_futures/08_outro/src/lib.rs @@ -0,0 +1,10 @@ +// This is our last exercise. Let's go down a more unstructured path! +// Try writing an **asynchronous REST API** to expose the functionality +// of the ticket management system we built throughout the course. +// It should expose endpoints to: +// - Create a ticket +// - Retrieve ticket details +// - Patch a ticket +// +// Use Rust's package registry, crates.io, to find the dependencies you need +// (if any) to build this system. diff --git a/helpers/common/Cargo.toml b/helpers/common/Cargo.toml new file mode 100644 index 0000000..e020b17 --- /dev/null +++ b/helpers/common/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "common" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/helpers/common/src/lib.rs b/helpers/common/src/lib.rs new file mode 100644 index 0000000..27e2db1 --- /dev/null +++ b/helpers/common/src/lib.rs @@ -0,0 +1,15 @@ +pub fn overly_long_description() -> String { + "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.".into() +} + +pub fn overly_long_title() -> String { + "A title that's definitely longer than what should be allowed in a development ticket".into() +} + +pub fn valid_title() -> String { + "A title".into() +} + +pub fn valid_description() -> String { + "A description".into() +} diff --git a/helpers/json2redirects.sh b/helpers/json2redirects.sh new file mode 100755 index 0000000..2b17989 --- /dev/null +++ b/helpers/json2redirects.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# Ensure the JSON file is provided as an argument +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +input_file=$1 + +# Use jq to parse the JSON and format the output +jq -r 'to_entries[] | "/" + .value + " " + .key' "$input_file" diff --git a/helpers/mdbook-exercise-linker/Cargo.toml b/helpers/mdbook-exercise-linker/Cargo.toml new file mode 100644 index 0000000..26574ee --- /dev/null +++ b/helpers/mdbook-exercise-linker/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "mdbook-exercise-linker" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.86" +clap = "4.5.4" +mdbook = "0.4.40" +semver = "1.0.23" +serde_json = "1.0.117" diff --git a/helpers/mdbook-exercise-linker/src/lib.rs b/helpers/mdbook-exercise-linker/src/lib.rs new file mode 100644 index 0000000..38700ae --- /dev/null +++ b/helpers/mdbook-exercise-linker/src/lib.rs @@ -0,0 +1,75 @@ +use anyhow::{Context, Error}; +use mdbook::book::Book; +use mdbook::preprocess::{Preprocessor, PreprocessorContext}; +use mdbook::BookItem; + +pub struct ExerciseLinker; + +impl ExerciseLinker { + pub fn new() -> ExerciseLinker { + ExerciseLinker + } +} + +impl Preprocessor for ExerciseLinker { + fn name(&self) -> &str { + "exercise-linker" + } + + fn run(&self, ctx: &PreprocessorContext, mut book: Book) -> Result { + let config = ctx + .config + .get_preprocessor(self.name()) + .context("Failed to get preprocessor configuration")?; + let key = String::from("exercise_root_url"); + let root_url = config + .get(&key) + .context("Failed to get `exercise_root_url`")?; + let root_url = root_url + .as_str() + .context("`exercise_root_url` is not a string")? + .to_owned(); + + book.sections + .iter_mut() + .for_each(|i| process_book_item(i, &ctx.renderer, &root_url)); + Ok(book) + } + + fn supports_renderer(&self, _renderer: &str) -> bool { + true + } +} + +fn process_book_item(item: &mut BookItem, renderer: &str, root_url: &str) { + match item { + BookItem::Chapter(chapter) => { + chapter.sub_items.iter_mut().for_each(|item| { + process_book_item(item, renderer, root_url); + }); + + let Some(source_path) = &chapter.source_path else { + return; + }; + let source_path = source_path.display().to_string(); + + // Ignore non-exercise chapters + if !source_path.chars().take(2).all(|c| c.is_digit(10)) { + return; + } + + let exercise_path = source_path.strip_suffix(".md").unwrap(); + let link_section = format!( + "\n## Exercise\n\nThe exercise for this section is located in [`{exercise_path}`]({})\n", + format!("{}/{}", root_url, exercise_path) + ); + chapter.content.push_str(&link_section); + + if renderer == "pandoc" { + chapter.content.push_str("`\\newpage`{=latex}\n"); + } + } + BookItem::Separator => {} + BookItem::PartTitle(_) => {} + } +} diff --git a/helpers/mdbook-exercise-linker/src/main.rs b/helpers/mdbook-exercise-linker/src/main.rs new file mode 100644 index 0000000..ac4b52f --- /dev/null +++ b/helpers/mdbook-exercise-linker/src/main.rs @@ -0,0 +1,67 @@ +use std::io; +use std::process; + +use clap::{Arg, ArgMatches, Command}; +use mdbook::errors::Error; +use mdbook::preprocess::{CmdPreprocessor, Preprocessor}; +use semver::{Version, VersionReq}; + +use mdbook_exercise_linker::ExerciseLinker; + +pub fn make_app() -> Command { + Command::new("exercise-linker").subcommand( + Command::new("supports") + .arg(Arg::new("renderer").required(true)) + .about("Check whether a renderer is supported by this preprocessor"), + ) +} + +fn main() { + let matches = make_app().get_matches(); + + // Users will want to construct their own preprocessor here + let preprocessor = ExerciseLinker::new(); + + if let Some(sub_args) = matches.subcommand_matches("supports") { + handle_supports(&preprocessor, sub_args); + } else if let Err(e) = handle_preprocessing(&preprocessor) { + eprintln!("{}", e); + process::exit(1); + } +} + +fn handle_preprocessing(pre: &dyn Preprocessor) -> Result<(), Error> { + let (ctx, book) = CmdPreprocessor::parse_input(io::stdin())?; + + let book_version = Version::parse(&ctx.mdbook_version)?; + let version_req = VersionReq::parse(mdbook::MDBOOK_VERSION)?; + + if !version_req.matches(&book_version) { + eprintln!( + "Warning: The {} plugin was built against version {} of mdbook, \ + but we're being called from version {}", + pre.name(), + mdbook::MDBOOK_VERSION, + ctx.mdbook_version + ); + } + + let processed_book = pre.run(&ctx, book)?; + serde_json::to_writer(io::stdout(), &processed_book)?; + + Ok(()) +} + +fn handle_supports(pre: &dyn Preprocessor, sub_args: &ArgMatches) -> ! { + let renderer = sub_args + .get_one::("renderer") + .expect("Required argument"); + let supported = pre.supports_renderer(renderer); + + // Signal whether the renderer is supported by exiting with 1 or 0. + if supported { + process::exit(0); + } else { + process::exit(1); + } +} diff --git a/helpers/mdbook-link-shortener/Cargo.toml b/helpers/mdbook-link-shortener/Cargo.toml new file mode 100644 index 0000000..944aedd --- /dev/null +++ b/helpers/mdbook-link-shortener/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "mdbook-link-shortener" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.86" +bimap = { version = "0.6.3", features = ["serde"] } +clap = { version = "4.5.4", features = ["derive"] } +itertools = "0.13.0" +mdbook = "0.4.40" +pulldown-cmark = "0.11.0" +pulldown-cmark-to-cmark = "15" +semver = "1.0.23" +serde_json = "1.0.117" diff --git a/helpers/mdbook-link-shortener/src/lib.rs b/helpers/mdbook-link-shortener/src/lib.rs new file mode 100644 index 0000000..28bd556 --- /dev/null +++ b/helpers/mdbook-link-shortener/src/lib.rs @@ -0,0 +1,224 @@ +use anyhow::{Context, Error}; +use bimap::BiHashMap; +use itertools::Itertools; +use mdbook::book::{Book, Chapter}; +use mdbook::preprocess::{Preprocessor, PreprocessorContext}; +use mdbook::BookItem; +use std::collections::{BTreeMap, BTreeSet}; +use std::fs::File; +use std::path::PathBuf; +use std::str::FromStr; + +pub struct LinkShortener; + +struct AliasGenerator { + cursors: [usize; 3], +} + +impl AliasGenerator { + const ALPHABET: &'static [u8] = b"f2z4x6v8bnm3q5w7e9rtyuplkshgjdca"; + + fn new() -> AliasGenerator { + AliasGenerator { cursors: [0, 0, 0] } + } + + /// Generate a 4 alphanumeric long alias, starting from "aaaa" and incrementing by one each time + /// until "9999", using only lowercase letters and numbers. + /// We skip ambiguous characters like "0", "o", "1", "l". + fn next(&mut self) -> String { + let mut alias = String::with_capacity(4); + for cursor in &mut self.cursors { + alias.push(Self::ALPHABET[*cursor] as char); + } + + for cursor in self.cursors.iter_mut().rev() { + if *cursor == Self::ALPHABET.len() - 1 { + *cursor = 0; + } else { + *cursor += 1; + break; + } + } + + alias + } + + /// Generate a unique alias that is not already used by the `link2alias` map. + fn next_until_unique(&mut self, link2alias: &BiHashMap) -> String { + let mut alias = self.next(); + while link2alias.contains_right(&alias) { + alias = self.next(); + } + alias + } +} + +impl LinkShortener { + pub fn new() -> LinkShortener { + LinkShortener + } +} + +impl Preprocessor for LinkShortener { + fn name(&self) -> &str { + "link-shortener" + } + + fn run(&self, ctx: &PreprocessorContext, mut book: Book) -> Result { + let config = ctx + .config + .get_preprocessor(self.name()) + .context("Failed to get preprocessor configuration")?; + let root_url = { + let root_url = config.get("base_url").context("Failed to get `base_url`")?; + root_url + .as_str() + .context("`base_url` is not a string")? + .to_owned() + }; + let mapping = { + let mapping = config.get("mapping").context("Failed to get `mapping`")?; + let mapping = mapping + .as_str() + .context("`mapping` is not a string")? + .to_owned(); + PathBuf::from_str(&mapping).context("Failed to parse `mapping` as a path")? + }; + let mut link2alias = { + match File::open(&mapping) { + Ok(file) => { + serde_json::from_reader(file).context("Failed to parse existing mapping")? + } + Err(e) => { + if e.kind() == std::io::ErrorKind::NotFound { + BiHashMap::new() + } else { + return Err(e).context("Failed to open existing mapping"); + } + } + } + }; + let verify = config + .get("verify") + .context("Failed to get `verify`")? + .as_bool() + .context("`verify` is not a boolean")?; + // Env var overrides config + let verify = std::env::var("LINK_SHORTENER_VERIFY") + .map(|v| v == "true") + .unwrap_or(verify); + + let mut alias_gen = AliasGenerator::new(); + + book.sections.iter_mut().for_each(|i| { + if let BookItem::Chapter(c) = i { + c.content = replace_anchors(c, &root_url, &mut alias_gen, &mut link2alias, verify) + .expect("Error converting links for chapter"); + for i in c.sub_items.iter_mut() { + if let BookItem::Chapter(sub_chapter) = i { + sub_chapter.content = replace_anchors( + sub_chapter, + &root_url, + &mut alias_gen, + &mut link2alias, + verify, + ) + .expect("Error converting links for subchapter"); + } + } + } + }); + + if !verify { + std::fs::create_dir_all(mapping.parent().expect("Mapping file path has no parent"))?; + let mut file = File::create(&mapping).context("Failed to upsert mapping file")?; + let ordered = link2alias.iter().collect::>(); + serde_json::to_writer_pretty(&mut file, &ordered)?; + } + + Ok(book) + } + + fn supports_renderer(&self, _renderer: &str) -> bool { + true + } +} + +fn replace_anchors( + chapter: &mut Chapter, + root_url: &str, + alias_gen: &mut AliasGenerator, + link2alias: &mut BiHashMap, + verify: bool, +) -> Result { + use pulldown_cmark::{CowStr, Event, LinkType, Options, Parser, Tag}; + use pulldown_cmark_to_cmark::cmark; + + let mut buf = String::with_capacity(chapter.content.len()); + + let mut unshortened_links = BTreeSet::new(); + let events = Parser::new_ext(&chapter.content, Options::all()) + .map(|e| { + let Event::Start(Tag::Link { + link_type, + dest_url, + title, + id, + }) = &e + else { + return e; + }; + + match link_type { + LinkType::Autolink + | LinkType::Shortcut + | LinkType::Inline + | LinkType::Reference + | LinkType::Collapsed => { + if dest_url.starts_with("http") { + let alias = if let Some(alias) = link2alias.get_by_left(dest_url.as_ref()) { + alias.to_owned() + } else { + if verify { + unshortened_links.insert(dest_url.to_string()); + return e; + } + let alias = alias_gen.next_until_unique(&link2alias); + alias + }; + link2alias.insert(dest_url.to_string(), alias.clone()); + + Event::Start(Tag::Link { + link_type: link_type.to_owned(), + dest_url: CowStr::from(format!( + "{root_url}/{alias}", + root_url = root_url, + alias = alias + )), + title: title.clone(), + id: id.clone(), + }) + } else { + e + } + } + LinkType::Email + | LinkType::ReferenceUnknown + | LinkType::CollapsedUnknown + | LinkType::ShortcutUnknown => e, + } + }) + .collect_vec(); + + if verify && !unshortened_links.is_empty() { + let unshortened_links = unshortened_links.iter().join(", "); + return Err(anyhow::anyhow!( + "The following links are not shortened: {unshortened_links}\nRun again with `LINK_SHORTENER_VERIFY=false` to update the mapping \ + with the shortened links." + )); + } + + cmark(events.into_iter(), &mut buf) + .map(|_| buf) + .map_err(|err| anyhow::anyhow!("Markdown serialization failed: {err}")) +} diff --git a/helpers/mdbook-link-shortener/src/main.rs b/helpers/mdbook-link-shortener/src/main.rs new file mode 100644 index 0000000..a69d424 --- /dev/null +++ b/helpers/mdbook-link-shortener/src/main.rs @@ -0,0 +1,66 @@ +use clap::Parser; +use mdbook::errors::Error; +use mdbook::preprocess::{CmdPreprocessor, Preprocessor}; +use mdbook_link_shortener::LinkShortener; +use semver::{Version, VersionReq}; +use std::io; +use std::process; + +#[derive(clap::Parser, Debug)] +#[command(version, about)] +pub struct Cli { + #[command(subcommand)] + sub: Option, +} + +#[derive(clap::Parser, Debug)] +pub enum SubCommand { + #[clap(name = "supports")] + Supports(Supports), +} + +#[derive(clap::Parser, Debug)] +pub struct Supports { + #[arg(long)] + renderer: String, +} + +fn main() -> Result<(), anyhow::Error> { + let cli = Cli::parse(); + let preprocessor = LinkShortener::new(); + + if let Some(SubCommand::Supports(Supports { renderer })) = cli.sub { + let code = if preprocessor.supports_renderer(&renderer) { + 0 + } else { + 1 + }; + process::exit(code); + } + + handle_preprocessing(&preprocessor)?; + + Ok(()) +} + +fn handle_preprocessing(pre: &dyn Preprocessor) -> Result<(), Error> { + let (ctx, book) = CmdPreprocessor::parse_input(io::stdin())?; + + let book_version = Version::parse(&ctx.mdbook_version)?; + let version_req = VersionReq::parse(mdbook::MDBOOK_VERSION)?; + + if !version_req.matches(&book_version) { + eprintln!( + "Warning: The {} plugin was built against version {} of mdbook, \ + but we're being called from version {}", + pre.name(), + mdbook::MDBOOK_VERSION, + ctx.mdbook_version + ); + } + + let processed_book = pre.run(&ctx, book)?; + serde_json::to_writer(io::stdout(), &processed_book)?; + + Ok(()) +} diff --git a/helpers/ticket_fields/Cargo.toml b/helpers/ticket_fields/Cargo.toml new file mode 100644 index 0000000..44704c3 --- /dev/null +++ b/helpers/ticket_fields/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "ticket_fields" +version = "0.1.0" +edition = "2021" + +[dependencies] +common = { path = "../common" } +thiserror = "1.0.59" diff --git a/helpers/ticket_fields/src/description.rs b/helpers/ticket_fields/src/description.rs new file mode 100644 index 0000000..c06d4f4 --- /dev/null +++ b/helpers/ticket_fields/src/description.rs @@ -0,0 +1,73 @@ +#[derive(Debug, PartialEq, Clone, Eq)] +pub struct TicketDescription(String); + +#[derive(Debug, thiserror::Error)] +pub enum TicketDescriptionError { + #[error("The description cannot be empty")] + Empty, + #[error("The description cannot be longer than 500 bytes")] + TooLong, +} + +impl TryFrom for TicketDescription { + type Error = TicketDescriptionError; + + fn try_from(value: String) -> Result { + validate(&value)?; + Ok(Self(value)) + } +} + +impl TryFrom<&str> for TicketDescription { + type Error = TicketDescriptionError; + + fn try_from(value: &str) -> Result { + validate(value)?; + Ok(Self(value.to_string())) + } +} + +fn validate(description: &str) -> Result<(), TicketDescriptionError> { + if description.is_empty() { + Err(TicketDescriptionError::Empty) + } else if description.len() > 500 { + Err(TicketDescriptionError::TooLong) + } else { + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{overly_long_description, valid_description}; + use std::convert::TryFrom; + + #[test] + fn test_try_from_string() { + let input = valid_description(); + let description = TicketDescription::try_from(input.clone()).unwrap(); + assert_eq!(description.0, input); + } + + #[test] + fn test_try_from_empty_string() { + let err = TicketDescription::try_from("".to_string()).unwrap_err(); + assert_eq!(err.to_string(), "The description cannot be empty"); + } + + #[test] + fn test_try_from_long_string() { + let err = TicketDescription::try_from(overly_long_description()).unwrap_err(); + assert_eq!( + err.to_string(), + "The description cannot be longer than 500 bytes" + ); + } + + #[test] + fn test_try_from_str() { + let description = TicketDescription::try_from("A description").unwrap(); + assert_eq!(description.0, "A description"); + } +} diff --git a/helpers/ticket_fields/src/lib.rs b/helpers/ticket_fields/src/lib.rs new file mode 100644 index 0000000..434bafa --- /dev/null +++ b/helpers/ticket_fields/src/lib.rs @@ -0,0 +1,6 @@ +mod description; +pub mod test_helpers; +mod title; + +pub use description::TicketDescription; +pub use title::TicketTitle; diff --git a/helpers/ticket_fields/src/test_helpers.rs b/helpers/ticket_fields/src/test_helpers.rs new file mode 100644 index 0000000..7a5fb77 --- /dev/null +++ b/helpers/ticket_fields/src/test_helpers.rs @@ -0,0 +1,14 @@ +use crate::{TicketDescription, TicketTitle}; +use common::{valid_description, valid_title}; + +/// A function to generate a valid ticket title, +/// for test purposes. +pub fn ticket_title() -> TicketTitle { + valid_title().try_into().unwrap() +} + +/// A function to generate a valid ticket description, +/// for test purposes. +pub fn ticket_description() -> TicketDescription { + valid_description().try_into().unwrap() +} diff --git a/helpers/ticket_fields/src/title.rs b/helpers/ticket_fields/src/title.rs new file mode 100644 index 0000000..3687a5b --- /dev/null +++ b/helpers/ticket_fields/src/title.rs @@ -0,0 +1,72 @@ +use std::convert::TryFrom; + +#[derive(Debug, PartialEq, Clone, Eq)] +pub struct TicketTitle(String); + +#[derive(Debug, thiserror::Error)] +pub enum TicketTitleError { + #[error("The title cannot be empty")] + Empty, + #[error("The title cannot be longer than 50 bytes")] + TooLong, +} + +impl TryFrom for TicketTitle { + type Error = TicketTitleError; + + fn try_from(value: String) -> Result { + validate(&value)?; + Ok(Self(value)) + } +} + +impl TryFrom<&str> for TicketTitle { + type Error = TicketTitleError; + + fn try_from(value: &str) -> Result { + validate(value)?; + Ok(Self(value.to_string())) + } +} + +fn validate(title: &str) -> Result<(), TicketTitleError> { + if title.is_empty() { + Err(TicketTitleError::Empty) + } else if title.len() > 50 { + Err(TicketTitleError::TooLong) + } else { + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use common::{overly_long_title, valid_title}; + use std::convert::TryFrom; + + #[test] + fn test_try_from_string() { + let input = valid_title(); + let title = TicketTitle::try_from(input.clone()).unwrap(); + assert_eq!(title.0, input); + } + + #[test] + fn test_try_from_empty_string() { + let err = TicketTitle::try_from("".to_string()).unwrap_err(); + assert_eq!(err.to_string(), "The title cannot be empty"); + } + + #[test] + fn test_try_from_long_string() { + let err = TicketTitle::try_from(overly_long_title()).unwrap_err(); + assert_eq!(err.to_string(), "The title cannot be longer than 50 bytes"); + } + + #[test] + fn test_try_from_str() { + let title = TicketTitle::try_from("A title").unwrap(); + assert_eq!(title.0, "A title"); + } +} diff --git a/site/_redirects b/site/_redirects new file mode 100644 index 0000000..184a548 --- /dev/null +++ b/site/_redirects @@ -0,0 +1,194 @@ +/f6c https://code.visualstudio.com +/f4q https://crates.io +/f2n https://crates.io/crates/cargo-modules +/ffr https://doc.rust-lang.org/book/ch03-02-data-types.html#integer-types +/f6t https://doc.rust-lang.org/book/title-page.html +/f4m https://doc.rust-lang.org/cargo/reference/cargo-targets.html#cargo-targets +/ffc https://doc.rust-lang.org/cargo/reference/profiles.html +/f45 https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html +/f6u https://doc.rust-lang.org/nomicon/ +/f2z https://doc.rust-lang.org/reference/expressions/operator-expr.html#numeric-cast +/fzf https://doc.rust-lang.org/reference/items/implementations.html#trait-implementation-coherence +/f4c https://doc.rust-lang.org/reference/lifetime-elision.html +/fxy https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html +/fzm https://doc.rust-lang.org/std/cmp/index.html +/fzz https://doc.rust-lang.org/std/cmp/trait.PartialEq.html +/fzb https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html +/fzp https://doc.rust-lang.org/std/convert/trait.From.html#implementors +/fzl https://doc.rust-lang.org/std/convert/trait.Into.html#implementors +/f4s https://doc.rust-lang.org/std/iter/trait.FusedIterator.html +/fxf https://doc.rust-lang.org/std/iter/trait.Iterator.html +/ffj https://doc.rust-lang.org/std/keyword.for.html +/ffh https://doc.rust-lang.org/std/keyword.while.html +/ffl https://doc.rust-lang.org/std/macro.panic.html +/f27 https://doc.rust-lang.org/std/mem/fn.size_of.html +/fzn https://doc.rust-lang.org/std/ops/index.html +/fz4 https://doc.rust-lang.org/std/ops/trait.Add.html +/fzt https://doc.rust-lang.org/std/ops/trait.Deref.html#deref-coercion +/fzv https://doc.rust-lang.org/std/ops/trait.Div.html +/fz6 https://doc.rust-lang.org/std/ops/trait.Mul.html +/fz8 https://doc.rust-lang.org/std/ops/trait.Rem.html +/fzx https://doc.rust-lang.org/std/ops/trait.Sub.html +/f2c https://doc.rust-lang.org/std/prelude/index.html +/ffe https://doc.rust-lang.org/std/primitive.i32.html#associatedconstant.MAX +/ff7 https://doc.rust-lang.org/std/primitive.i32.html#associatedconstant.MIN +/ffw https://doc.rust-lang.org/std/primitive.u32.html#associatedconstant.MAX +/f4d https://doc.rust-lang.org/std/slice/struct.Iter.html +/f26 https://doc.rust-lang.org/std/string/struct.String.html +/fxh https://doc.rust-lang.org/std/sync/atomic/index.html +/f4j https://doc.rust-lang.org/std/vec/struct.Vec.html#method.iter +/f2y https://docs.rs/dhat/latest/dhat/ +/fx2 https://docs.rs/itertools/ +/f4n https://docs.rs/thiserror/latest/thiserror/ +/f65 https://docs.rs/tokio-stream/latest/tokio_stream/ +/f6m https://docs.rs/tokio-stream/latest/tokio_stream/trait.StreamExt.html#method.merge +/f63 https://docs.rs/tokio-util/latest/tokio_util/sync/struct.CancellationToken.html +/f6z https://docs.rs/tokio/latest/tokio/task/struct.JoinError.html +/f6k https://docs.rust-embedded.org/book/ +/f2h https://en.wikipedia.org/wiki/Dangling_pointer +/fx7 https://en.wikipedia.org/wiki/Data_segment +/f2r https://en.wikipedia.org/wiki/Memory_address +/f2e https://en.wikipedia.org/wiki/Stack_overflow +/ff9 https://en.wikipedia.org/wiki/Two%27s_complement +/f2v https://en.wikipedia.org/wiki/UTF-8 +/f6r https://exercism.io +/ffb https://github.com/LukeMathWalker/cargo-chef +/ffm https://github.com/LukeMathWalker/wiremock-rs +/fzq https://github.com/dtolnay/cargo-expand +/fzw https://github.com/dtolnay/proc-macro-workshop +/ff6 https://github.com/mainmatter/100-exercises-to-learn-rust +/ff3 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/01_intro/00_welcome +/ffq https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/01_intro/01_syntax +/ff5 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/00_intro +/fft https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/01_integers +/ffy https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/02_variables +/ffu https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/03_if_else +/ffk https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/04_panics +/ffs https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/05_factorial +/ffg https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/06_while +/ffd https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/07_for +/f2f https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/08_overflow +/f22 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/09_saturating +/f24 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/02_basic_calculator/10_as_casting +/f2x https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/00_intro +/f28 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/01_struct +/f2b https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/02_validation +/f2m https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/03_modules +/f23 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/04_visibility +/f2q https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/05_encapsulation +/f25 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/06_ownership +/f2w https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/07_setters +/f29 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/08_stack +/f2p https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/09_heap +/f2l https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/10_references_in_memory +/f2g https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/11_destructor +/f2j https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/03_ticket_v1/12_outro +/f2d https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/00_intro +/f2a https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/01_trait +/fz2 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/02_orphan_rule +/fz3 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/03_operator_overloading +/fz7 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/04_derive +/fz9 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/05_trait_bounds +/fzr https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/06_str_slice +/fzy https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/07_deref +/fzu https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/08_sized +/fzk https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/09_from +/fzs https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/10_assoc_vs_generic +/fzh https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/11_clone +/fzg https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/12_copy +/fzj https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/13_drop +/fzc https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/04_traits/14_outro +/fza https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/00_intro +/f4f https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/01_enum +/f42 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/02_match +/f4z https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/03_variants_with_data +/f44 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/04_if_let +/f4x https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/05_nullability +/f46 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/06_fallibility +/f4v https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/07_unwrap +/f48 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/08_error_enums +/f4b https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/09_error_trait +/f43 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/10_packages +/f4w https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/11_dependencies +/f47 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/12_thiserror +/f4e https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/13_try_from +/f49 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/14_source +/f4y https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/05_ticket_v2/15_outro +/f4u https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/00_intro +/f4p https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/01_arrays +/f4l https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/02_vec +/f4k https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/03_resizing +/f4h https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/04_iterators +/f4g https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/05_iter +/f4a https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/06_lifetimes +/fxz https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/07_combinators +/fx4 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/08_impl_trait +/fxx https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/09_impl_trait_2 +/fx6 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/10_slices +/fxv https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/11_mutable_slices +/fx8 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/12_two_states +/fxb https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/13_index +/fxn https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/14_index_mut +/fxm https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/15_hashmap +/fx3 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/06_ticket_management/16_btreemap +/fxq https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/00_intro +/fxw https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/01_threads +/fxe https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/02_static +/fx9 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/03_leak +/fxr https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/04_scoped_threads +/fxt https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/05_channels +/fxu https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/06_interior_mutability +/fxp https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/07_ack +/fxl https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/08_client +/fxk https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/09_bounded +/fxs https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/10_patch +/fxj https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/11_locks +/fxd https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/12_rw_lock +/fxc https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/13_without_channels +/fxa https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/07_threads/14_sync +/f6f https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/00_intro +/f62 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/01_async_fn +/f64 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/02_spawn +/f6x https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/03_runtime +/f66 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/04_future +/f68 https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/05_blocking +/f6b https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/06_async_aware_primitives +/f6q https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/07_cancellation +/f6e https://github.com/mainmatter/100-exercises-to-learn-rust/tree/main/exercises/08_futures/08_outro +/ffz https://github.com/mainmatter/100-exercises-to-learn-rust/tree/solutions +/fzd https://github.com/mainmatter/rust-advanced-testing-workshop +/f69 https://github.com/rust-lang/rustlings +/ffa https://huonw.github.io/blog/2016/04/myths-and-legends-about-integer-overflow-in-rust/ +/f4r https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/ +/ff2 https://mainmatter.com/contact/ +/fff https://mainmatter.com/rust-consulting/ +/fv2 https://mainmatter.github.io/rust-workshop-runner/ +/fxg https://marabos.nl/atomics/ +/f6a https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer +/f6p https://nostarch.com/rust-rustaceans +/f2k https://owasp.org/www-community/vulnerabilities/Doubly_freeing_memory +/f2s https://owasp.org/www-community/vulnerabilities/Using_freed_memory +/ffn https://pavex.dev +/ffp https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=36e5ddbe3b3f741dfa9f74c956622bac +/fx5 https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=afedf7062298ca8f5a248bc551062eaa +/ffx https://rust-exercises.com/100-exercises-to-learn-rust.pdf +/ff4 https://rust-exercises.com/100-exercises/ +/f6s https://rust-exercises.com/advanced-testing/ +/f6h https://rust-exercises.com/telemetry/ +/fze https://rust-lang.github.io/api-guidelines/naming.html#casing-conforms-to-rfc-430-c-case +/f6w https://rust-lang.github.io/wg-async/vision/submitted_stories/status_quo/barbara_battles_buffered_streams.html +/f6v https://ryhl.io/blog/async-what-is-blocking/ +/fvf https://ti.to/mainmatter/rust-from-scratch-jan-2025 +/f6n https://tokio.rs/tokio/tutorial/select +/f2t https://valgrind.org/docs/manual/dh-manual.html +/fz5 https://veykril.github.io/tlborm/ +/f2u https://web.archive.org/web/20240517051950/https://blog.acolyer.org/2019/05/28/cheri-abi/ +/f67 https://without.boats/blog/the-scoped-task-trilemma/ +/f6g https://www.amazon.com/dp/B0DJ14KQQG/ +/f6d https://www.jetbrains.com/rust/ +/ffv https://www.lpalmieri.com/ +/f4t https://www.lpalmieri.com/posts/2020-12-11-zero-to-production-6-domain-modelling/ +/f6y https://www.oreilly.com/library/view/programming-rust-2nd/9781492052586/ +/f6j https://www.rust-lang.org/tools/install +/f6l https://www.youtube.com/playlist?list=PLqbS7AVVErFirH9armw8yXlE6dacF-A6z +/ff8 https://zero2prod.com

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