{ description = "Hyperplonk dev env"; inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; inputs.flake-utils.url = "github:numtide/flake-utils"; # for dedup # allow shell.nix alongside flake.nix inputs.flake-compat.url = "github:edolstra/flake-compat"; inputs.flake-compat.flake = false; inputs.rust-overlay.url = "github:oxalica/rust-overlay"; inputs.pre-commit-hooks.url = "github:cachix/pre-commit-hooks.nix"; inputs.pre-commit-hooks.inputs.nixpkgs.follows = "nixpkgs"; outputs = { self, nixpkgs, flake-utils, flake-compat, rust-overlay, pre-commit-hooks, ... }: flake-utils.lib.eachDefaultSystem (system: let overlays = [ (import rust-overlay) ]; pkgs = import nixpkgs { inherit system overlays; }; nightlyToolchain = pkgs.rust-bin.selectLatestNightlyWith (toolchain: toolchain.minimal.override { extensions = [ "rustfmt" ]; }); stableToolchain = pkgs.rust-bin.stable.latest.minimal.override { extensions = [ "clippy" "llvm-tools-preview" "rust-src" ]; }; in with pkgs; { check = { pre-commit-check = pre-commit-hooks.lib.${system}.run { src = ./.; hooks = { check-format = { enable = true; files = "\\.rs$"; entry = "cargo fmt -- --check"; }; doctest = { enable = true; entry = "cargo test --doc"; files = "\\.rs$"; pass_filenames = false; }; cargo-clippy = { enable = true; description = "Lint Rust code."; entry = "cargo-clippy --workspace -- -D warnings"; files = "\\.rs$"; pass_filenames = false; }; cargo-sort = { enable = true; description = "Ensure Cargo.toml are sorted"; entry = "cargo sort -w"; pass_filenames = false; }; }; }; }; devShell = mkShell { buildInputs = [ argbash openssl pkgconfig git stableToolchain nightlyToolchain cargo-sort ] ++ lib.optionals stdenv.isDarwin [ darwin.apple_sdk.frameworks.Security ]; shellHook = '' export RUST_BACKTRACE=full export PATH="$PATH:$(pwd)/target/debug:$(pwd)/target/release" # Ensure `cargo fmt` uses `rustfmt` from nightly. export RUSTFMT="${nightlyToolchain}/bin/rustfmt" '' # install pre-commit hooks + self.check.${system}.pre-commit-check.shellHook; }; } ); }