{ description = "Prism - ATProto AppView service for gmstn"; inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; rust-overlay = { url = "github:oxalica/rust-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; crane.url = "github:ipetkov/crane"; }; outputs = { self, nixpkgs, rust-overlay, crane, }: let supportedSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; forAllSystems = nixpkgs.lib.genAttrs supportedSystems; mkPkgs = system: import nixpkgs { inherit system; overlays = [ rust-overlay.overlays.default ]; }; in { packages = forAllSystems ( system: let pkgs = mkPkgs system; rustToolchain = pkgs.rust-bin.stable.latest.default; craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain; commonArgs = { src = craneLib.cleanCargoSource ./.; strictDeps = true; buildInputs = with pkgs; [ openssl postgresql ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.apple-sdk ]; nativeBuildInputs = with pkgs; [ pkg-config ]; SQLX_OFFLINE = "true"; }; cargoArtifacts = craneLib.buildDepsOnly commonArgs; prism = craneLib.buildPackage ( commonArgs // { inherit cargoArtifacts; } ); in { inherit prism; default = prism; } ); devShells = forAllSystems ( system: let pkgs = mkPkgs system; rustToolchain = pkgs.rust-bin.stable.latest.default.override { extensions = [ "rust-src" "rust-analyzer" ]; }; in { default = pkgs.mkShell { buildInputs = with pkgs; [ rustToolchain pkg-config openssl postgresql sqlx-cli docker-client ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.apple-sdk ]; DATABASE_URL = "postgres://postgres:postgres@localhost:5432/prism"; shellHook = '' echo "🔮 Prism development environment" echo "" echo "Available commands:" echo " cargo run - Start the server" echo " cargo test - Run tests (needs Docker)" echo " cargo sqlx - Database migrations" echo "" echo "Database: $DATABASE_URL" ''; }; } ); overlays.default = final: prev: { prism = self.packages.${final.stdenv.hostPlatform.system}.prism; }; }; }