From 56ce8ba7351c88be500a321fb2584d75f277ce74 Mon Sep 17 00:00:00 2001
From: Oliver Davies <oliver@oliverdavies.dev>
Date: Sat, 31 Aug 2024 17:17:32 +0100
Subject: [PATCH] Add `create-zellij-session` script

Based on t.nix, this creates or attaches to a Zellij session based on a
given directory.
---
 lib/shared/home-manager-packages.nix         |  4 ++
 lib/shared/scripts/create-zellij-session.nix | 67 ++++++++++++++++++++
 2 files changed, 71 insertions(+)
 create mode 100644 lib/shared/scripts/create-zellij-session.nix

diff --git a/lib/shared/home-manager-packages.nix b/lib/shared/home-manager-packages.nix
index ed7b8832..daa54dc8 100644
--- a/lib/shared/home-manager-packages.nix
+++ b/lib/shared/home-manager-packages.nix
@@ -12,6 +12,9 @@ let
   inherit (pkgs) writeShellApplication;
 
   _timer = writeShellApplication (import ./scripts/_timer.nix);
+  create-zellij-session = writeShellApplication (
+    import ./scripts/create-zellij-session.nix { inherit pkgs; }
+  );
   export-video-list = writeShellApplication (
     import ./scripts/export-video-list.nix { inherit pkgs username; }
   );
@@ -66,6 +69,7 @@ with pkgs;
   yarn
 
   # Scripts.
+  create-zellij-session
   notetaker
   run
   t
diff --git a/lib/shared/scripts/create-zellij-session.nix b/lib/shared/scripts/create-zellij-session.nix
new file mode 100644
index 00000000..808c1753
--- /dev/null
+++ b/lib/shared/scripts/create-zellij-session.nix
@@ -0,0 +1,67 @@
+{ pkgs }:
+{
+  name = "create-zellij-session";
+
+  runtimeInputs = with pkgs; [
+    openssl
+    zellij
+  ];
+
+  text = ''
+    function _execute_zellij_layout {
+      local session_name="$1"
+      local layout_file="$2"
+
+      DIGEST="$(openssl sha512 "$layout_file")"
+
+      # Prompt the first time we see a given layout file before running it.
+      if ! grep -q "$DIGEST" ~/..zellij.digests 2> /dev/null; then
+        cat "$layout_file"
+
+        read -r -n 1 -p "Trust (and run) this Zellij file? (t = trust, otherwise = skip) "
+
+        if [[ $REPLY =~ ^[Tt]$ ]]; then
+          echo "$DIGEST" >> ~/..zellij.digests
+
+          _attach_to_or_create_zellij_session --layout "$layout_file"
+        fi
+      else
+        _attach_to_or_create_zellij_session --layout "$layout_file"
+      fi
+    }
+
+    function _attach_to_or_create_zellij_session {
+      zellij attach "$session_name" 2>/dev/null || zellij --session "$session_name" "$@"
+    }
+
+    function main {
+      if [[ $# -eq 1 ]]; then
+        selected_path=$1
+      else
+        items=$(find "$REPOS" ~/Documents \
+          -maxdepth 1 -mindepth 1 -type d \
+          ! -name "*-old" \
+          ! -name "*.bak" \
+          ! -name "*.old" \
+          ! -name "_archive"
+        )
+
+        selected_path=$(echo "''${items}" | sort | fzf --reverse)
+      fi
+
+      session_name=$(basename "$selected_path")
+
+      cd "$selected_path"
+
+      if [[ -f ".ignored/dev.kdl" ]]; then
+        _execute_zellij_layout "$session_name" ".ignored/dev.kdl"
+      elif [[ -f "dev.kdl" ]]; then
+        _execute_zellij_layout "$session_name" "dev.kdl"
+      fi
+
+      _attach_to_or_create_zellij_session
+    }
+
+    main "$@"
+  '';
+}