{
description = "Rust project";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
rust-overlay.url = "github:oxalica/rust-overlay";
crane.url = "github:ipetkov/crane";
flake-utils.url = "github:numtide/flake-utils";
treefmt-nix.url = "github:numtide/treefmt-nix";
git-hooks.url = "github:cachix/git-hooks.nix";
};
outputs = {
self,
nixpkgs,
rust-overlay,
crane,
flake-utils,
treefmt-nix,
git-hooks,
...
}:
flake-utils.lib.eachDefaultSystem (system: let
pkgs = import nixpkgs {
inherit system;
overlays = [(import rust-overlay)];
};
rustToolchain = pkgs.rust-bin.stable.latest.default.override {
extensions = ["rustfmt" "clippy"];
};
craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain;
src = craneLib.cleanCargoSource ./.;
commonArgs = {
inherit src;
strictDeps = true;
};
cargoArtifacts = craneLib.buildDepsOnly commonArgs;
package = craneLib.buildPackage (commonArgs // {inherit cargoArtifacts;});
treefmtEval = treefmt-nix.lib.evalModule pkgs (import ./nix/treefmt.nix);
pre-commit-check = git-hooks.lib.${system}.run {
src = ./.;
hooks = import ./nix/pre-commit.nix {
inherit pkgs;
treefmtWrapper = treefmtEval.config.build.wrapper;
inherit rustToolchain;
};
};
in {
packages.default = package;
formatter = treefmtEval.config.build.wrapper;
checks = {
default = package;
formatting = treefmtEval.config.build.check self;
clippy = craneLib.cargoClippy (commonArgs
// {
inherit cargoArtifacts;
cargoClippyExtraArgs = "--all-targets --all-features -- --deny warnings";
});
fmt = craneLib.cargoFmt {inherit src;};
};
devShells.default = craneLib.devShell {
checks = self.checks.${system};
packages = with pkgs;
[
cargo-nextest
pre-commit
rust-analyzer
]
++ pre-commit-check.enabledPackages;
shellHook = pre-commit-check.shellHook;
};
});
}