Coverage map

Every chapter of The Rust Programming Language against this workspace · updated after lesson 0009

The chapter list is taken verbatim from the book's table of contents, not from memory. Read means you covered it in your two months. Produced means code you wrote in this workspace uses it correctly — that is the only column that counts for the mission.

The map

ChTopicStateEvidence / gap
1–2Getting started, guessing gameProduced hello_cargo/, guessing_game/
3Variables, types, functions, control flowProduced variables/, function/, control_flow/; 0001 diagnostic solid
4Ownership, borrowing, slicesProduced &self methods and &[Task] accessor in tasks/. Watch for: you have never hit a borrow-checker fight in your own multi-owner code, because nothing has needed two owners yet.
5Structs and methodsProduced0003 / 0004, tasks/src/task.rs
6Enums and matchProduced Status, Priority, Command, and now TaskError (0006)
7Packages, crates, modulesProduced tasks/ is a lib + bin package with four modules
8Collections: Vec, String, HashMapProduced 0008 drill, in tasks/: HashMap<Priority, usize> built with the entry/or_insert counting idiom, get().copied().unwrap_or(0), Eq + Hash + Copy derives on a key type, and a String built by collect. Not done: BTreeMap, HashSet, string slicing by byte index.
9Error handling: panic!, Result, ?Produced 0005 + 0006: ?, ok_or, own error enum, stderr + exit 1
10.1Generic data typesProduced 0008 drill: fn tally<T, K, F>(items: &[T], key: F) -> HashMap<K, usize> in tasks/src/stats.rs, with a where clause bounding K: Eq + Hash and F: Fn(&T) -> K — written from the signature up, called at three different T/K pairs, one of them a non-Copy key. Not done: generic structs and generic impl blocks.
10.2TraitsProduced Display for Task (0005), Display + Error + From for TaskError (0006), FromStr for Task with an associated type Err and a hand-written PartialEq (0007)
10.3LifetimesGap — untouched Zero exposure in this workspace. You have dodged it by owning everything (String, not &'a str). Needed to read other people's code and to review a PR; not needed to ship your CLI.
11Writing automated testsTaught — drill pending 0009: #[test], #[cfg(test)] mod tests with use super::*, the three assertion macros and their failure output, #[should_panic(expected)] vs a -> Result<(), E> test, unit vs integration access (E0603/E0616), tests/common/mod.rs, the runner flags, and why src/main.rs is untestable — run moves to the library and writes to &mut impl Write. Graded by six planted mutants, not by a test count.
12I/O project: args, files, stderr, envProduced 0007: fs::read_to_string/fs::write, io::Error + ErrorKind::NotFound match guard, env::var with a default, on top of env::args and stderr + exit 1 from 0005. Not done: BufReader, file locking, serde — none needed at this size.
13Closures and iteratorsProduced 0008 drill: filter/map/collect chains, find vs position, Vec::retain, lines(), collect::<Result<Vec<_>, E>>() short-circuiting, and a function that takes a closure (F: Fn). Not done: fold, zip, impl Iterator for your own type.
14Cargo, crates.io, workspacesSkip for now Learn cargo add and features when a dependency is actually needed (serde, axum).
15Smart pointers: Box, Rc, RefCell, Deref, DropPartial Box<dyn Error> met in 0005/0006. Rc/RefCell untouched — reach for them only when a real shared-ownership problem appears, not before.
16Concurrency: threads, channels, Send/SyncGap Untouched apart from the Send + Sync bound your 0006 test asserts. Prerequisite for understanding why an axum handler must be Send.
17Async: futures, async/await, streamsGap — by design Required for axum/tokio, deliberately last. The unused trpl dependency in get-dependecies/ is the abandoned first attempt. Do it after 8, 11, 13.
18Trait objects, OOP patternsPartial dyn Error is the same mechanism as 18.2. The state-machine pattern (18.3) is optional reading.
19Patterns and matchingPartial match ✓, if let ✓ (0005 drill). Guards (Some(x) if x > 5), @ bindings, let ... else, and matches! — one page of reading, high value per minute.
20Unsafe, advanced traits, macrosSkip Associated types and generic-parameter defaults matter eventually (serde uses them). Not now.
21Final project: multithreaded web serverNot started The natural capstone before axum — it is a backend service with no framework.

The order that follows from this

After the 0009 drill, one gap in the book's core is left, and it is the mildest one:

  1. Lifetimes (ch 10.3) — as reading practice, not as a build. You have written two without noticing: titles_with returns Vec<&str> borrowed from &self, and Status::label returns &str the same way. Elision filled both annotations in. Reading other people's signatures needs the explicit form.
  2. Patterns (ch 19) — one page: match guards, @ bindings, matches!, let … else. Your suite already uses matches!; the rest is high value per minute.

Then serde → axum → async, where the traits from 0005–0008 and the testing from 0009 stop being an exercise and start being the whole API surface: an axum handler is a function a test can call. Chapter 21's web server is the natural capstone before a framework.