# Toolchain and Infrastructure

This repository uses a pinned, hermetic toolchain managed via CIPD
([`infra/cipd.ensure`](../infra/cipd.ensure)) for compiling, testing, and
formatting code. The toolchain versions (Rust, Clang/LLVM, GCC, and `bindgen`)
are kept in sync with the `fuchsia.git` toolchain.

## Setting Up the Environment

Before compiling, testing, or formatting code in this repository, always set up
the shell environment to use the `infra` versions of the toolchain rather than
system-installed or `rustup` (`~/.cargo/bin`) tools:

* **Bash / Zsh**:
  ```bash
  source infra/env_setup.sh
  ```
* **Fish**:
  ```fish
  source infra/env_setup.fish
  ```

Sourcing these scripts ensures the CIPD packages are present in
`infra/packages` and prepends `infra/packages/bin` and `infra/packages` to
`PATH`.

> **Note for AI Agents:** Always ensure `infra/env_setup.sh` is sourced (or
> `infra/packages/bin` is prepended to `PATH`) before running `cargo` or other
> build/test commands so that you use the `infra` versions of the toolchain.

## Building and Testing Rust Crates

The Rust workspace is located in the [`rust/`](../rust/) directory. When running
`cargo` commands from the repository root, pass `--manifest-path rust/Cargo.toml`
(or run `cargo` from within the `rust/` directory):

```bash
cargo build --manifest-path rust/Cargo.toml
cargo test --manifest-path rust/Cargo.toml
```

## Formatting Code (`cargo fmt`)

Always use **`cargo fmt`** instead of invoking `rustfmt` directly in this
repository:

```bash
# From the repository root:
cargo fmt --manifest-path rust/Cargo.toml

# Or from within the rust/ directory:
cargo fmt
```

To check formatting without modifying files (as done in presubmit):

```bash
cargo fmt --manifest-path rust/Cargo.toml -- --check
```

### Why `cargo fmt` instead of `rustfmt`?

* **Toolchain consistency:** `cargo fmt` (when run with the `infra` versions of
  the toolchain) uses the pinned `rustfmt` binary from `infra/packages/bin`
  rather than a host `rustup` binary.
* **Configuration discovery:** `cargo fmt` automatically locates and applies
  [`rust/rustfmt.toml`](../rust/rustfmt.toml), which configures edition `2024`
  and nightly formatting options (`wrap_comments = true`,
  `use_small_heuristics = "Max"`, etc.) that match downstream repositories.
  Running `rustfmt` directly on individual files can miss these settings or fail
  on unstable options if the wrong binary is invoked.
