From 0d8c7e5085c51cee430b91e35a092ae7c74d6931 Mon Sep 17 00:00:00 2001
From: Rob Ede <robjtede@icloud.com>
Date: Sun, 4 Aug 2024 22:39:19 +0100
Subject: [PATCH] build: add nix flake

---
 .envrc     |  1 +
 .gitignore |  4 ++++
 flake.lock | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 flake.nix  | 30 ++++++++++++++++++++++++++++
 justfile   | 28 ++++++++++++++++++--------
 5 files changed, 113 insertions(+), 8 deletions(-)
 create mode 100644 .envrc
 create mode 100644 flake.lock
 create mode 100644 flake.nix

diff --git a/.envrc b/.envrc
new file mode 100644
index 00000000..3550a30f
--- /dev/null
+++ b/.envrc
@@ -0,0 +1 @@
+use flake
diff --git a/.gitignore b/.gitignore
index a6909f1f..fb5c32e1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,4 +13,8 @@ guide/build/
 # These are backup files generated by rustfmt
 **/*.rs.bk
 
+# IDEs
 .idea
+
+# direnv
+/.direnv
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 00000000..1a6dff87
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,58 @@
+{
+  "nodes": {
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib"
+      },
+      "locked": {
+        "lastModified": 1715865404,
+        "narHash": "sha256-/GJvTdTpuDjNn84j82cU6bXztE0MSkdnTWClUCRub78=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "8dc45382d5206bd292f9c2768b8058a8fd8311d9",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1722651103,
+        "narHash": "sha256-IRiJA0NVAoyaZeKZluwfb2DoTpBAj+FLI0KfybBeDU0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "a633d89c6dc9a2a8aae11813a62d7c58b2c0cc51",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-24.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "lastModified": 1714640452,
+        "narHash": "sha256-QBx10+k6JWz6u7VsohfSw8g8hjdBZEf8CFzXH1/1Z94=",
+        "type": "tarball",
+        "url": "https://github.com/NixOS/nixpkgs/archive/50eb7ecf4cd0a5756d7275c8ba36790e5bd53e33.tar.gz"
+      },
+      "original": {
+        "type": "tarball",
+        "url": "https://github.com/NixOS/nixpkgs/archive/50eb7ecf4cd0a5756d7275c8ba36790e5bd53e33.tar.gz"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-parts": "flake-parts",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 00000000..1a53656e
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,30 @@
+{
+  inputs = {
+    nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
+    flake-parts.url = "github:hercules-ci/flake-parts";
+  };
+
+  outputs = inputs@{ flake-parts, ... }:
+    flake-parts.lib.mkFlake { inherit inputs; } {
+      systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
+      perSystem = { pkgs, config, inputs', system, lib, ... }: {
+        formatter = pkgs.nixpkgs-fmt;
+
+        devShells.default = pkgs.mkShell {
+          packages = [
+            config.formatter
+            pkgs.fd
+            pkgs.just
+            pkgs.nodePackages.prettier
+            pkgs.taplo
+            pkgs.watchexec
+          ] ++ lib.optional pkgs.stdenv.isDarwin [
+            pkgs.pkgsBuildHost.darwin.apple_sdk.frameworks.Security
+            pkgs.pkgsBuildHost.darwin.apple_sdk.frameworks.CoreFoundation
+            pkgs.pkgsBuildHost.darwin.apple_sdk.frameworks.SystemConfiguration
+            pkgs.pkgsBuildHost.libiconv
+          ];
+        };
+      };
+    };
+}
diff --git a/justfile b/justfile
index e7a7978a..9e92635a 100644
--- a/justfile
+++ b/justfile
@@ -1,6 +1,23 @@
 _list:
     @just --list
 
+# Check project.
+check: && clippy
+    just --unstable --fmt --check
+    # nixpkgs-fmt --check .
+    fd --hidden --type=file -e=md -e=yml --exec-batch prettier --check
+    fd --hidden -e=toml --exec-batch taplo format --check
+    fd --hidden -e=toml --exec-batch taplo lint
+    cargo +nightly fmt -- --check
+
+# Format project.
+fmt:
+    just --unstable --fmt
+    # nixpkgs-fmt .
+    fd --hidden --type=file -e=md -e=yml --exec-batch prettier --write
+    fd --type=file --hidden -e=toml --exec-batch taplo format
+    cargo +nightly fmt
+
 # Downgrade dev-dependencies necessary to run MSRV checks/tests.
 [private]
 downgrade-for-msrv:
@@ -12,7 +29,6 @@ msrv := ```
     | sed -E 's/^1\.([0-9]{2})$/1\.\1\.0/'
 ```
 msrv_rustup := "+" + msrv
-
 non_linux_all_features_list := ```
     cargo metadata --format-version=1 \
     | jq '.packages[] | select(.source == null) | .features | keys' \
@@ -20,19 +36,15 @@ non_linux_all_features_list := ```
         --arg exclusions "tokio-uring,io-uring" \
         'add | unique | . - ($exclusions | split(",")) | join(",")'
 ```
-
-all_crate_features := if os() == "linux" {
-    "--all-features"
-} else {
-    "--features='" + non_linux_all_features_list + "'"
-}
+all_crate_features := if os() == "linux" { "--all-features" } else { "--features='" + non_linux_all_features_list + "'" }
 
 # Run Clippy over workspace.
 clippy toolchain="":
     cargo {{ toolchain }} clippy --workspace --all-targets {{ all_crate_features }}
 
 # Test workspace code.
-[macos, windows]
+[macos]
+[windows]
 test toolchain="":
     cargo {{ toolchain }} test --lib --tests --package=actix-macros
     cargo {{ toolchain }} nextest run --workspace --exclude=actix-macros --no-default-features