{ description = "bwtui - A terminal-based vault browser for Bitwarden."; inputs = { nixpkgs.url = "github:NixOS/nixpkgs"; flake-utils.url = "github:numtide/flake-utils"; treefmt-nix = { url = "github:numtide/treefmt-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; crane = { url = "github:ipetkov/crane"; inputs.nixpkgs.follows = "nixpkgs"; }; rust-overlay = { url = "github:oxalica/rust-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, flake-utils, treefmt-nix, crane, rust-overlay, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; overlays = [ (import rust-overlay) ]; }; inherit (pkgs) lib; treefmt = treefmt-nix.lib.evalModule pkgs { projectRootFile = "flake.nix"; programs = { deadnix.enable = true; nixfmt = { enable = true; package = pkgs.nixfmt-classic; }; prettier.enable = true; statix.enable = true; taplo.enable = true; }; }; rustToolchain = pkgs.rust-bin.stable.latest.default.override { extensions = [ "rust-analyzer" ]; }; craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain; src = craneLib.cleanCargoSource (craneLib.path ./.); commonArgs = { inherit src; strictDeps = true; nativeBuildInputs = with pkgs; [ pkg-config ]; buildInputs = with pkgs; [ openssl ]; }; cargoTypos = args: craneLib.mkCargoDerivation (args // { cargoArtifacts = null; cargoVendorDir = null; buildPhaseCargoCommand = "typos"; pnameSuffix = "-typos"; nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ (with pkgs; [ typos cargo-machete ]); preInstallPhases = [ "ensureTargetDir" ] ++ (args.preInstallPhases or [ ]); ensureTargetDir = '' mkdir -p ''${CARGO_TARGET_DIR:-target} ''; }); shouldRunCoverage = system == "x86_64-linux" && ((builtins.getEnv "CI") != ""); cargoArtifacts = craneLib.buildDepsOnly commonArgs; commonArgsWithArtifacts = commonArgs // { inherit cargoArtifacts; }; bwtui = craneLib.buildPackage commonArgsWithArtifacts; in { checks = { inherit bwtui; default = bwtui; formatting = treefmt.config.build.check self; bwtui-clippy = craneLib.cargoClippy (commonArgsWithArtifacts // { cargoClippyExtraArgs = "--all-targets -- --deny warnings"; }); bwtui-doc = craneLib.cargoDoc commonArgsWithArtifacts; bwtui-fmt = craneLib.cargoFmt commonArgs; bwtui-typos = cargoTypos commonArgs; } // lib.optionalAttrs shouldRunCoverage { bwtui-coverage = craneLib.cargoTarpaulin commonArgsWithArtifacts; }; formatter = treefmt.config.build.wrapper; packages = rec { inherit bwtui; default = bwtui; }; apps = let bwtuiApp = flake-utils.lib.mkApp { drv = bwtui; }; in { bwtui = bwtuiApp; default = bwtuiApp; }; devShells.default = pkgs.mkShell { inputsFrom = (builtins.attrValues self.checks.${system}) ++ [ treefmt.config.build.devShell ]; nativeBuildInputs = with pkgs; [ rustToolchain ]; }; }); }