Documentation
{
  description = "Dix - Diff Nix";

  nixConfig = {
    extra-substituters = [
      "https://dix.cachix.org/"
    ];

    extra-trusted-public-keys = [
      "dix.cachix.org-1:8zQJZGvlOLYwlSCY/gVY14rqL8taVslOVbtT0jZFDGk="
    ];
  };

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    systems.url = "github:nix-systems/default";

    crane.url = "github:ipetkov/crane";

    fenix = {
      url = "github:nix-community/fenix";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    advisory-db = {
      url = "github:rustsec/advisory-db";
      flake = false;
    };
  };

  outputs = inputs @ { self, nixpkgs, systems, ... }: let
    inherit (nixpkgs) lib;

    eachSystem = lib.genAttrs (import systems);

    pkgsFor = eachSystem (system: import nixpkgs {
      inherit system;

      overlays = [
        inputs.fenix.overlays.default

        (self: _: {
          crane = (inputs.crane.mkLib self).overrideToolchain (self.fenix.combine (lib.attrValues {
            inherit (self.fenix.stable)
              cargo
              clippy
              rust-analyzer
              rustc
            ;

            # Nightly rustfmt for the formatting options.
            inherit (self.fenix.default)
              rustfmt
            ;
          }));

          dix = {
            src = self.crane.cleanCargoSource ./.;

            cargoArguments = {
              inherit (self.dix) src;

              strictDeps = true;
            };

            cargoArtifacts = self.crane.buildDepsOnly self.dix.cargoArguments;
          };
        })
      ];
    });
  in {
    packages = eachSystem (system: let pkgs = pkgsFor.${system}; in {
      default = self.packages.${system}.dix;

      dix = pkgs.crane.buildPackage (pkgs.dix.cargoArguments // {
        inherit (pkgs.dix) cargoArtifacts;

        pname = "dix";
        cargoExtraArgs = "--package dix";

        doCheck = false;
      });
    });

    devShells = eachSystem (system: let pkgs = pkgsFor.${system}; in {
      default = self.devShells.${system}.dix;

      dix = pkgs.crane.devShell {
        packages = lib.attrValues {
          inherit (pkgs)
            # A nice compiler daemon.
            bacon

            # Better tests.
            cargo-nextest

            # TOML formatting.
            taplo
          ;
        };

        # For some reason rust-analyzer doesn't pick it up sometimes.
        env.CLIPPY_CONF_DIR = pkgs.writeTextDir "clippy.toml" (lib.readFile ./.clippy.toml);

        shellHook = ''
          # So we can do `dix` instead of `./target/debug/dix`
          root=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
          export PATH="$PATH":"$root/target/debug"
        '';
      };
    });

    checks = eachSystem (system: let pkgs = pkgsFor.${system}; in {
      inherit (self.packages.${system}) dix;

      dix-doctest = pkgs.crane.cargoDocTest (pkgs.dix.cargoArguments // {
        inherit (pkgs.dix) cargoArtifacts;
      });

      dix-nextest = pkgs.crane.cargoNextest (pkgs.dix.cargoArguments // {
        inherit (pkgs.dix) cargoArtifacts;
      });

      dix-clippy = pkgs.crane.cargoClippy (pkgs.dix.cargoArguments // {
        inherit (pkgs.dix) cargoArtifacts;

        env.CLIPPY_CONF_DIR = pkgs.writeTextDir "clippy.toml" (lib.readFile ./.clippy.toml);

        cargoClippyExtraArgs = "--all-targets -- --deny warnings";
      });

      dix-doc = pkgs.crane.cargoDoc (pkgs.dix.cargoArguments // {
        inherit (pkgs.dix) cargoArtifacts;
      });

      dix-fmt = pkgs.crane.cargoFmt {
        inherit (pkgs.dix) src;

        rustFmtExtraArgs = "--config-path ${./.rustfmt.toml}";
      };

      dix-toml-fmt = pkgs.crane.taploFmt {
        src = lib.sources.sourceFilesBySuffices pkgs.dix.src [ ".toml" ];

        taploExtraArgs = "--config ${./.taplo.toml}";
      };

      dix-audit = pkgs.crane.cargoAudit {
        inherit (inputs) advisory-db;
        inherit (pkgs.dix) src;
      };

      dix-deny = pkgs.crane.cargoDeny {
        inherit (pkgs.dix) src;

        cargoDenyChecks = "bans licenses sources --config ${./.deny.toml}";
      };
    });
  };
}