{ description = "Landkreis-Sprints"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; rust-overlay.url = "github:oxalica/rust-overlay"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { nixpkgs, rust-overlay, flake-utils, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; overlays = [ rust-overlay.overlays.default ]; }; rust = pkgs.rust-bin.stable.latest.default.override { extensions = [ "rustfmt" "clippy" ]; }; in { devShells.default = pkgs.mkShell { packages = with pkgs; [ rust # Database postgresql postgresqlPackages.postgis sqlx-cli # GIS gdal geos proj # Build dependencies pkg-config openssl ]; shellHook = '' set -e # ------------------------------------------------------------ # Local PostgreSQL # ------------------------------------------------------------ export PGDATA="$PWD/.pgdata" export PGHOST="$PWD/.pgsocket" export PGPORT="5433" export PGDATABASE="county_sprints" export PGUSER="county_sprints" mkdir -p "$PGHOST" # ------------------------------------------------------------ # Initialise PostgreSQL cluster # ------------------------------------------------------------ if [ ! -f "$PGDATA/PG_VERSION" ]; then echo echo "==> Initialising local PostgreSQL cluster" initdb \ --auth=trust \ --no-locale \ --encoding=UTF8 \ "$PGDATA" \ >/dev/null fi # ------------------------------------------------------------ # Configure PostgreSQL # ------------------------------------------------------------ # Always write our development settings. This means changing # the flake also updates an already existing local cluster. cat > "$PGDATA/postgresql.conf" </dev/null 2>&1 then echo echo "==> Starting local PostgreSQL" pg_ctl \ -D "$PGDATA" \ -o "-k $PGHOST -p $PGPORT" \ -l "$PGDATA/postgresql.log" \ start \ >/dev/null # Wait until PostgreSQL actually accepts connections. for i in $(seq 1 30); do if pg_isready \ -h "$PGHOST" \ -p "$PGPORT" \ >/dev/null 2>&1 then break fi sleep 0.2 done fi # ------------------------------------------------------------ # Create application role # ------------------------------------------------------------ if ! psql \ -h "$PGHOST" \ -p "$PGPORT" \ -d postgres \ -tAc \ "SELECT 1 FROM pg_roles WHERE rolname = '$PGUSER'" | grep -q 1 then echo echo "==> Creating PostgreSQL role '$PGUSER'" psql \ -h "$PGHOST" \ -p "$PGPORT" \ -d postgres \ -v ON_ERROR_STOP=1 \ -c \ "CREATE ROLE \"$PGUSER\" LOGIN;" fi # ------------------------------------------------------------ # Create application database # ------------------------------------------------------------ if ! psql \ -h "$PGHOST" \ -p "$PGPORT" \ -d postgres \ -tAc \ "SELECT 1 FROM pg_database WHERE datname = '$PGDATABASE'" | grep -q 1 then echo echo "==> Creating PostgreSQL database '$PGDATABASE'" psql \ -h "$PGHOST" \ -p "$PGPORT" \ -d postgres \ -v ON_ERROR_STOP=1 \ -c \ "CREATE DATABASE \"$PGDATABASE\" OWNER \"$PGUSER\";" fi # ------------------------------------------------------------ # Make sure the application role owns the database # ------------------------------------------------------------ psql \ -h "$PGHOST" \ -p "$PGPORT" \ -d postgres \ -v ON_ERROR_STOP=1 \ -c \ "ALTER DATABASE \"$PGDATABASE\" OWNER TO \"$PGUSER\";" \ >/dev/null # ------------------------------------------------------------ # PostGIS # ------------------------------------------------------------ echo echo "==> Checking PostGIS" psql \ -h "$PGHOST" \ -p "$PGPORT" \ -d "$PGDATABASE" \ -v ON_ERROR_STOP=1 \ -c \ "CREATE EXTENSION IF NOT EXISTS postgis;" \ >/dev/null # ------------------------------------------------------------ # DATABASE_URL for sqlx / application # ------------------------------------------------------------ export DATABASE_URL="postgresql://$PGUSER@/$PGDATABASE?host=$PGHOST&port=$PGPORT" # ------------------------------------------------------------ # Environment # ------------------------------------------------------------ export RUST_BACKTRACE=1 if [ -z "''${RUST_LOG:-}" ]; then export RUST_LOG="info" fi # ------------------------------------------------------------ # Info # ------------------------------------------------------------ echo echo "==============================================" echo " Landkreis-Sprints development environment" echo "==============================================" echo echo "Rust:" rustc --version echo echo "PostgreSQL:" psql \ -h "$PGHOST" \ -p "$PGPORT" \ -d "$PGDATABASE" \ -tAc "SELECT version();" | sed 's/^/ /' echo echo "PostGIS:" psql \ -h "$PGHOST" \ -p "$PGPORT" \ -d "$PGDATABASE" \ -tAc "SELECT PostGIS_Full_Version();" | sed 's/^/ /' echo echo "DATABASE_URL:" echo " $DATABASE_URL" echo echo "Run:" echo " sqlx migrate run" echo " cargo test" echo " cargo run" echo ''; }; } ); }