command-error 0.8.0

Detailed error messages and status checking for `std::process::Command`
Documentation
{
  lib,
  stdenv,
  libiconv,
  darwin,
  inputs,
  craneLib,
  rustPlatform,
  rust-analyzer,
  cargo-release,
  cargo-hack,
}: let
  inherit (inputs) advisory-db;
  src = lib.cleanSourceWith {
    src = craneLib.path ../../.;
    # Keep test data.
    filter = path: type:
      lib.hasInfix "/data" path
      || (craneLib.filterCargoSources path type);
  };

  commonArgs' = {
    inherit src;

    nativeBuildInputs = lib.optionals stdenv.isDarwin [
      libiconv
      darwin.apple_sdk.frameworks.CoreServices
    ];
  };

  # Build *just* the cargo dependencies, so we can reuse
  # all of that work (e.g. via cachix) when running in CI
  cargoArtifacts = craneLib.buildDepsOnly commonArgs';

  commonArgs =
    commonArgs'
    // {
      inherit cargoArtifacts;
    };

  checks = {
    command-error-nextest =
      (craneLib.cargoNextest (commonArgs
        // {
          nativeBuildInputs =
            commonArgs.nativeBuildInputs
            ++ [
              cargo-hack
            ];

          NEXTEST_HIDE_PROGRESS_BAR = "true";
        }))
      .overrideAttrs (drv: {
        checkPhase =
          builtins.replaceStrings
          ["cargo nextest"]
          ["cargo hack --feature-powerset nextest"]
          drv.checkPhase;
      });
    command-error-doctest = (craneLib.cargoDocTest commonArgs).overrideAttrs (drv: {
        checkPhase =
          builtins.replaceStrings
          ["cargo test"]
          ["cargo hack --feature-powerset test"]
          drv.checkPhase;
      });
    command-error-clippy = craneLib.cargoClippy (
      commonArgs
      // {
        cargoClippyExtraArgs = "--all-targets -- --deny warnings";
      }
    );
    command-error-rustdoc = craneLib.cargoDoc (
      commonArgs
      // {
        cargoDocExtraArgs = "--document-private-items";
        RUSTDOCFLAGS = "-D warnings";
      }
    );
    command-error-fmt = craneLib.cargoFmt commonArgs;
    command-error-audit = craneLib.cargoAudit (
      commonArgs
      // {
        inherit advisory-db;
      }
    );
  };

  devShell = craneLib.devShell {
    inherit checks;

    # Make rust-analyzer work
    RUST_SRC_PATH = rustPlatform.rustLibSrc;

    # Extra development tools (cargo and rustc are included by default).
    packages = [
      rust-analyzer
      cargo-release
    ];
  };
in
  # Build the actual crate itself, reusing the dependency
  # artifacts from above.
  craneLib.buildPackage (
    commonArgs
    // {
      # Don't run tests; we'll do that in a separate derivation.
      doCheck = false;

      passthru = {
        inherit
          checks
          devShell
          commonArgs
          craneLib
          ;
      };
    }
  )