nixos/templates/rust/flake.nix

171 lines
4.6 KiB
Nix
Raw Normal View History

2025-05-03 23:23:02 +08:00
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-utils = {
url = "github:numtide/flake-utils";
};
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs = {
nixpkgs.follows = "nixpkgs";
};
};
2025-05-14 03:37:58 +08:00
advisory-db = {
url = "github:rustsec/advisory-db";
flake = false;
};
crane = {
url = "github:ipetkov/crane";
};
2025-05-25 23:28:27 +08:00
pre-commit-hooks = {
url = "github:cachix/git-hooks.nix";
inputs = {
nixpkgs.follows = "nixpkgs";
};
};
2025-05-03 23:23:02 +08:00
};
2025-07-13 06:04:55 +08:00
outputs =
{
self,
flake-utils,
nixpkgs,
rust-overlay,
advisory-db,
crane,
pre-commit-hooks,
...
}:
flake-utils.lib.eachDefaultSystem (
system:
let
inherit (pkgs) lib;
pkgs = import nixpkgs {
inherit system;
overlays = [
(import rust-overlay)
(_final: prev: {
lib = prev.lib // (import ./nix/lib.nix prev.lib);
})
];
};
rustToolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain;
srcFilters =
path: type:
builtins.any (lib.flip lib.hasSuffix path) [
".sql"
".diff"
".md"
".adoc"
".json"
]
|| (craneLib.filterCargoSources path type);
src = lib.cleanSourceWith {
src = ./.;
filter = srcFilters;
};
basicArgs = {
inherit src;
strictDeps = true;
};
nativeBuildInputs = [ ];
buildInputs = [ ];
genInputs = lib.genInputsWith pkgs;
commonArgs = basicArgs // {
cargoArtifacts = self.packages.${system}.cargo-artifacts;
buildInputs = genInputs buildInputs;
nativeBuildInputs = genInputs nativeBuildInputs;
2025-05-14 03:37:58 +08:00
};
2025-07-13 06:04:55 +08:00
in
{
formatter = pkgs.alejandra;
checks = {
pre-commit-check = pre-commit-hooks.lib.${system}.run {
src = ./.;
hooks = {
alejandra = {
enable = true;
};
rustfmt.enable = true;
cargo-check = {
enable = true;
stages = [ "pre-push" ];
};
clippy = {
enable = true;
stages = [ "pre-push" ];
settings.denyWarnings = true;
};
2025-05-25 23:28:27 +08:00
};
};
2025-07-13 06:04:55 +08:00
package = self.packages.${system}.default.overrideAttrs {
doCheck = true;
};
clippy = craneLib.cargoClippy (
commonArgs
// {
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
}
);
doc = craneLib.cargoDoc commonArgs;
deny = craneLib.cargoDeny commonArgs;
fmt = craneLib.cargoFmt basicArgs;
audit = craneLib.cargoAudit {
inherit src advisory-db;
};
nextest = craneLib.cargoNextest (
commonArgs
// {
partitions = 1;
partitionType = "count";
cargoNextestExtraArgs = "--no-tests pass";
env = {
CARGO_PROFILE = "dev";
};
}
);
2025-05-25 23:28:27 +08:00
};
2025-07-13 06:04:55 +08:00
packages =
let
callPackage = lib.callPackageWith (pkgs // { inherit craneLib callPackage; });
packageArgs = {
inherit
lib
basicArgs
buildInputs
nativeBuildInputs
;
2025-05-14 03:37:58 +08:00
};
2025-07-13 06:04:55 +08:00
importWithArgs = with lib; flip import packageArgs;
in
rec {
cargo-artifacts = callPackage (importWithArgs ./nix/cargo-artifacts.nix) { };
rust-demo = callPackage (importWithArgs ./nix/package.nix) {
cargoArtifacts = cargo-artifacts;
};
default = rust-demo;
};
apps.default = flake-utils.lib.mkApp {
drv = self.packages."${system}".default;
};
2025-07-13 06:04:55 +08:00
devShells.default = craneLib.devShell {
checks = self.checks.${system};
shellHook = '''' + self.checks.${system}.pre-commit-check.shellHook;
packages = with pkgs; [
rust-analyzer
cargo-audit
cargo-deny
cargo-watch
cargo-nextest
];
env = {
RUST_SRC_PATH = "${rustToolchain}/lib/rustlib/src/rust/library";
};
2025-05-14 03:37:58 +08:00
};
2025-07-13 06:04:55 +08:00
}
);
2025-05-14 03:37:58 +08:00
nixConfig = {
keepOutputs = true;
};
2025-05-03 23:23:02 +08:00
}