Local Rust docs with Nixpkgs and Fenix

The Rust ecosystem has a nifty trick for opening documentation locally, but when managing Rust with Nix, we're missing one important piece in the toolchain.

rustup doc is an praise-worthy little feature of the Rust ecosystem, but we don’t have rustup when managing our Rust tooling with Nix.

Fortunately, there’s a trick one can use when Fenix is in play.

open "$(nix build fenix#latest.rust-docs --json --no-link | jq -r '.[0].outputs.out')/share/doc/rust/html/index.html

Note that on Linux, one will likely want to use xdg-open in place of macOS’ open to browse the generated docs.

A full Home-Manager module for macOS might look like this:

}: let
  inherit (lib) mkEnableOption mkIf;
  cfg = config.my.home.rust;

  rust-docs = pkgs.writeShellScriptBin "rust-docs" ''
    open "$(nix build fenix#latest.rust-docs --json --no-link | jq -r '.[0].outputs.out')/share/doc/rust/html/index.html"
in {
  options.my.home.rust = {
    enable = mkEnableOption "rust";

  config = mkIf cfg.enable {
    home = {
      sessionVariables = {
        RUSTUP_HOME = "${config.xdg.dataHome}/rustup";

      packages = with pkgs; [
        (fenix.stable.withComponents [