{ description = "damocles-daemon - Matrix chat presence for Damocles"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; crane.url = "github:ipetkov/crane"; treefmt-nix = { url = "github:numtide/treefmt-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, crane, treefmt-nix, ... }: let systems = [ "x86_64-linux" "aarch64-linux" ]; forAllSystems = f: nixpkgs.lib.genAttrs systems ( system: let pkgs = nixpkgs.legacyPackages.${system}; craneLib = crane.mkLib pkgs; src = craneLib.cleanCargoSource ./.; commonArgs = { inherit src; pname = "damocles-daemon"; version = "0.1.0"; nativeBuildInputs = with pkgs; [ pkg-config ]; buildInputs = with pkgs; [ openssl sqlite ]; }; # deps-only build - cached separately, only rebuilds when Cargo.lock changes cargoArtifacts = craneLib.buildDepsOnly commonArgs; in f { inherit pkgs craneLib commonArgs cargoArtifacts ; treefmt-eval = treefmt-nix.lib.evalModule pkgs treefmt-config; } ); treefmt-config = { projectRootFile = "flake.nix"; programs.nixfmt.enable = true; programs.rustfmt.enable = true; programs.taplo.enable = true; }; in { packages = forAllSystems ( { craneLib, commonArgs, cargoArtifacts, ... }: { default = craneLib.buildPackage ( commonArgs // { inherit cargoArtifacts; meta = { description = "Matrix chat daemon for Damocles"; mainProgram = "damocles-daemon"; platforms = nixpkgs.lib.platforms.linux; }; } ); } ); devShells = forAllSystems ( { pkgs, ... }: { default = pkgs.mkShell { packages = with pkgs; [ cargo rustc rust-analyzer clippy rustfmt pkg-config openssl sqlite ]; }; } ); formatter = forAllSystems ({ treefmt-eval, ... }: treefmt-eval.config.build.wrapper); checks = forAllSystems ( { pkgs, craneLib, commonArgs, cargoArtifacts, treefmt-eval, ... }: { formatting = treefmt-eval.config.build.check self; build = self.packages.${pkgs.stdenv.hostPlatform.system}.default; clippy = craneLib.cargoClippy ( commonArgs // { inherit cargoArtifacts; cargoClippyExtraArgs = "--all-targets"; } ); tests = craneLib.cargoTest ( commonArgs // { inherit cargoArtifacts; } ); } ); }; }