{ inputs, pkgs, perSystem, }: let crateBuilder = inputs.self.lib.mkCrateBuilder pkgs; craneLib = crateBuilder.craneLib; lib = crateBuilder.lib; commonArgs = crateBuilder.commonArgs; # Treefmt doesn't easily expose the programs with out its flake-parts module (as far as I can tell) # This snipit, modified from their default.nix, lets us grab the programs after building with our treefmt config treefmt-module-builder = nixpkgs: configuration: let mod = inputs.treefmt-nix.lib.evalModule nixpkgs configuration; in mod.config.build; treefmt-module = treefmt-module-builder pkgs (import ./treefmt.nix); treefmt-bin = treefmt-module.wrapper; treefmt-programs = lib.attrValues treefmt-module.programs; # Grab cargo, clippy, rustfmt, etc from crane's devShell to put in our own craneToolchain = (craneLib.devShell {}).nativeBuildInputs; in inputs.devenv.lib.mkShell { inherit inputs pkgs; modules = [ { packages = with pkgs; [ rust-analyzer cargo-limit cargo-nextest cargo-dist just bacon oranda perSystem.cargo-nextest-xdg.default ] # Include the extra packages we use to build our crate ++ commonArgs.buildInputs # Include crane's toolchain (cargo, clippy, rustfmt, etc) ++ craneToolchain # Include treefmt and formatters ++ treefmt-programs ++ [treefmt-bin]; enterShell = '' just --list ''; pre-commit.hooks = { treefmt = { enable = true; package = treefmt-bin; }; }; } ]; } #craneLib.devShell { # Inherit inputs from checks. #checks = self.checks.${system}; TODO # Additional dev-shell environment variables can be set directly # MY_CUSTOM_DEVELOPMENT_VAR = "something else"; # Extra inputs can be added here; cargo and rustc are provided by default. #}