# M3b task 14: move the pipe handling into its own module **Branch:** `m3b` (run `git switch m3b`; `git status --short` must be empty, otherwise stop) **Commit subject:** `brokerd: move the container's pipe handling into pipes.rs` ## Goal `container.rs` is 432 lines, and the next two tasks add to the pipe handling. Before they do, move that code into its own file, **without changing what it does**. This is a pure move: every test passes before and after, unchanged. ## Files - Create: `crates/brokerd/src/pipes.rs` - Modify: `crates/brokerd/src/container.rs`, `crates/brokerd/src/lib.rs`, `docs/implementer-log.md` - No test files change. ## What moves From `container.rs`, cut these three items, **bodies unchanged**, and paste them into `pipes.rs`: 1. `struct Io { … }` (the three `JoinHandle` fields) → `pub(crate) struct Io`. 2. `impl Io { fn start(…) … fn finish(…) … }` → the same, with `pub(crate) fn start` and `pub(crate) fn finish`. 3. `fn read_capped(…)` → `pub(crate) fn read_capped`. Their doc comments move with them. `pipes.rs` starts with a module doc comment: ```rust //! The three pipes of one container: its arguments go in on standard input, its output and errors //! come back, each on its own thread so no pipe can block another. ``` and the `use` lines those items need (`std::io::{Read, Write}`, `std::process::Child`, `std::thread::JoinHandle`). `Io::start` uses `STDERR_KEPT`: leave that constant in `container.rs` (the tests import it from there) and write `crate::container::STDERR_KEPT` in `pipes.rs`. In `lib.rs`: `pub mod pipes;`, between `pub mod ledger;` and `pub mod podman;`. In `container.rs`: add `use crate::pipes::Io;`, and remove the `use` lines the compiler then says are unused. Nothing else in `container.rs` changes. ## Steps - [ ] **1. Branch.** `git switch m3b`. - [ ] **2. Move the three items** as above. Run `cargo fmt --all`. - [ ] **3. Check it builds.** `cargo check -p brokerd`, then `cargo clippy -p brokerd --all-targets -- -D warnings`. Fix only imports. - [ ] **4. See every test pass, unchanged.** `cargo test -p brokerd --test container --test container_egress --test serve_runner`. Expected: 11, 6 and 2 passed. - [ ] **5. Check it moved.** `grep -n "struct Io\|fn read_capped" crates/brokerd/src/container.rs` prints nothing; `wc -l crates/brokerd/src/container.rs` is under 380. - [ ] **6. Run the gate.** `make gate`. Expected last line: `gate: ok`. - [ ] **7. Log and commit.** `git add crates/brokerd docs/implementer-log.md Cargo.lock && git commit` ## Done when - `container.rs` no longer holds `Io` or `read_capped`; `make gate` prints `gate: ok`. ## Stop and report if - Any test fails after the move: a pure move cannot break one, so report instead of changing code.