OOKNET                             [ /  search the index  ]  
──────────────────────────────────────────────────────────────────────────────────────
══════════════════════════════════════════════════════════════════════════════════════
OOKNET   [ /  search  ]  
────────────────────────────────────────────────
════════════════════════════════════════════════
 
 
main @ 240 LINES
 
[ HISTORY ]  [ UP ]
 

{
  lib,
  config,
  pkgs,
  osConfig,
  ...
}: let
  inherit (lib) mkIf;
  inherit (osConfig.ooknet.console) multiplexer;
  inherit (config.ooknet) binds;
  zellijmenu = pkgs.writeShellApplication {
    name = "zellijmenu";
    runtimeInputs = with pkgs; [zellij coreutils rofi];
    text =
      /*
      bash
      */
      ''
        set -e

        type=""
        type_dir=""
        project_name=""
        project_dir=""
        session_name=""
        layout=""
        spawn_terminal=0

        while [[ "$#" -gt 0 ]]; do
          case $1 in
          -n) spawn_terminal=1 ;;
          *)
            echo "Unknown parameter: $1" >&2
            exit 1
            ;;
          esac
          shift
        done

        rofi_cmd() {
          MSG=$1
          rofi -dmenu -i -mesg "$MSG"
        }

        zellij_cmd() {
          if [[ "$spawn_terminal" -eq 1 ]]; then
            ${binds.terminalLaunch} zellij "$@"
          else
            zellij "$@"
          fi
        }

        session_manager() {
          session_list() {
            zellij ls -s | tr ' ' '\n'
          }

          layout_menu() {
            layout_list=$(find ~/.config/zellij/layouts -name "*.kdl" | sed 's|.*/
||; s/\.kdl$//' | tr ' ' '\n')
            echo -e "$layout_list" | rofi_cmd "Select layout for $session_name:"
          }

          session_menu() {
            echo -e "$(session_list)" | rofi_cmd "Session:"
          }

          session_select() {
            session_name=$(session_menu)
            if [[ -z "$session_name" ]]; then
              echo "Nothing selected."
              exit 0
            fi

            if session_list | grep -qx "$session_name"; then
              session_action="select"
            else
              session_action="create"
            fi
          }

          selection_menu() {
            echo -e "Attach\nDelete\nBack" | rofi_cmd "$session_name action:"
          }

          while true; do
            session_select
            case $session_action in
            "create")
              layout="$(layout_menu)"
              if [ -z "$layout" ]; then
                echo "No layout given"
                continue
              fi
              zellij_cmd  --layout "$layout" attach -c "$session_name"
              break
              ;;
            "select")
              selection=$(selection_menu)
              case $selection in
              "Attach")
                zellij_cmd attach "$session_name"
                break
                ;;
              "Delete") zellij delete-session --force "$session_name" ;;
              "Back") echo "Going back." ;;
              *) echo "Going Back." ;;
              esac
              ;;
            *) echo "Going Back" ;;
            esac
          done
        }

        project_manager() {
          get_project_type() {
            while true; do
              type=$(echo -e "script\nnix" | rofi_cmd "Select project type:")
              case "$type" in
              script)
                type_dir="$SCRIPTS"
                break
                ;;
              nix)
                type_dir="$NIX_DIR"
                break
                ;;
              *)
                echo "Invalid selection, try again."
                ;;
              esac
            done
          }

          get_project_name() {
            while true; do
              project_name=$(rofi_cmd "Enter project name:")
              if [ -z "$project_name" ]; then
                echo "No name provided, try again."
              elif [ -d "$type_dir/$project_name" ]; then
                echo "Project already exists, try again."
              else
                project_dir="$type_dir/$project_name"
                break
              fi
            done
          }

          get_session_name() {
            session_name="$project_name"
            if zellij ls | grep -q "^$session_name$"; then
              session_name=$(rofi_cmd "Session name '$project_name' in use, enter 
a new session name:")
              if [ -z "$session_name" ]; then
                echo "No session name entered, exiting."
                exit 1
              fi
            fi
          }

          get_layout() {
            case "$type" in
            script)
              layout="script"
              ;;
            nix)
              layout="nix"
              ;;
            *)
              echo "Unknown project type, using default layout."
              layout="base"
              ;;
            esac
          }

          select_project() {
            project_name=$(find "$type_dir" -maxdepth 1 -mindepth 1 -type d ! -nam
e .git -exec basename {} \; | rofi_cmd "Select project:")
            project_dir="$type_dir/$project_name"

            cd "$project_dir" || return 1
            get_session_name
            get_layout
            zellij_cmd -s "$session_name" --layout "$layout"
          }

          create_and_start_project() {
            mkdir -p "$project_dir"
            cd "$project_dir" || return 1

            case "$type" in
            script)
              echo -e "#!/usr/bin/env bash\necho 'hello world'" >"$project_name.sh
"
              chmod +x "$project_name.sh"
              ;;
            nix)
              echo "Creating Nix project..."
              # still need to implement
              ;;
            *)
              echo "Unknown project type."
              return 1
              ;;
            esac

            get_session_name
            get_layout
            zellij_cmd -s "$session_name" --layout "$layout"
          }
          project_action=$(echo -e "Create Project\nSelect Project" | rofi_cmd "Pr
oject action:")
          case "$project_action" in
          "Create Project")
            get_project_type
            get_project_name
            create_and_start_project
            ;;
          "Select Project")
            get_project_type
            select_project
            ;;
          esac

        }

        main() {
          main_action=$(echo -e "Projects\nSessions" | rofi_cmd "Choose action:")
          case "$main_action" in
          "Projects") project_manager ;;
          "Sessions") session_manager ;;
          *) echo "Invalid option, exiting." ;;
          esac
        }

        main
      '';
  };
in {
  config = mkIf (multiplexer == "zellij") {
    home.packages = [zellijmenu];
    ooknet.binds.zellijMenu = "zellijmenu -n";
  };
}

{
  lib,
  config,
  pkgs,
  osConfig,
  ...
}: let
  inherit (lib) mkIf;
  inherit (osConfig.ooknet.console) multiple
xer;
  inherit (config.ooknet) binds;
  zellijmenu = pkgs.writeShellApplication {
    name = "zellijmenu";
    runtimeInputs = with pkgs; [zellij coreu
tils rofi];
    text =
      /*
      bash
      */
      ''
        set -e

        type=""
        type_dir=""
        project_name=""
        project_dir=""
        session_name=""
        layout=""
        spawn_terminal=0

        while [[ "$#" -gt 0 ]]; do
          case $1 in
          -n) spawn_terminal=1 ;;
          *)
            echo "Unknown parameter: $1" >&2
            exit 1
            ;;
          esac
          shift
        done

        rofi_cmd() {
          MSG=$1
          rofi -dmenu -i -mesg "$MSG"
        }

        zellij_cmd() {
          if [[ "$spawn_terminal" -eq 1 ]]; 
then
            ${binds.terminalLaunch} zellij "
$@"
          else
            zellij "$@"
          fi
        }

        session_manager() {
          session_list() {
            zellij ls -s | tr ' ' '\n'
          }

          layout_menu() {
            layout_list=$(find ~/.config/zel
lij/layouts -name "*.kdl" | sed 's|.*/||; s/
\.kdl$//' | tr ' ' '\n')
            echo -e "$layout_list" | rofi_cm
d "Select layout for $session_name:"
          }

          session_menu() {
            echo -e "$(session_list)" | rofi
_cmd "Session:"
          }

          session_select() {
            session_name=$(session_menu)
            if [[ -z "$session_name" ]]; the
n
              echo "Nothing selected."
              exit 0
            fi

            if session_list | grep -qx "$ses
sion_name"; then
              session_action="select"
            else
              session_action="create"
            fi
          }

          selection_menu() {
            echo -e "Attach\nDelete\nBack" |
 rofi_cmd "$session_name action:"
          }

          while true; do
            session_select
            case $session_action in
            "create")
              layout="$(layout_menu)"
              if [ -z "$layout" ]; then
                echo "No layout given"
                continue
              fi
              zellij_cmd  --layout "$layout"
 attach -c "$session_name"
              break
              ;;
            "select")
              selection=$(selection_menu)
              case $selection in
              "Attach")
                zellij_cmd attach "$session_
name"
                break
                ;;
              "Delete") zellij delete-sessio
n --force "$session_name" ;;
              "Back") echo "Going back." ;;
              *) echo "Going Back." ;;
              esac
              ;;
            *) echo "Going Back" ;;
            esac
          done
        }

        project_manager() {
          get_project_type() {
            while true; do
              type=$(echo -e "script\nnix" |
 rofi_cmd "Select project type:")
              case "$type" in
              script)
                type_dir="$SCRIPTS"
                break
                ;;
              nix)
                type_dir="$NIX_DIR"
                break
                ;;
              *)
                echo "Invalid selection, try
 again."
                ;;
              esac
            done
          }

          get_project_name() {
            while true; do
              project_name=$(rofi_cmd "Enter
 project name:")
              if [ -z "$project_name" ]; the
n
                echo "No name provided, try 
again."
              elif [ -d "$type_dir/$project_
name" ]; then
                echo "Project already exists
, try again."
              else
                project_dir="$type_dir/$proj
ect_name"
                break
              fi
            done
          }

          get_session_name() {
            session_name="$project_name"
            if zellij ls | grep -q "^$sessio
n_name$"; then
              session_name=$(rofi_cmd "Sessi
on name '$project_name' in use, enter a new 
session name:")
              if [ -z "$session_name" ]; the
n
                echo "No session name entere
d, exiting."
                exit 1
              fi
            fi
          }

          get_layout() {
            case "$type" in
            script)
              layout="script"
              ;;
            nix)
              layout="nix"
              ;;
            *)
              echo "Unknown project type, us
ing default layout."
              layout="base"
              ;;
            esac
          }

          select_project() {
            project_name=$(find "$type_dir" 
-maxdepth 1 -mindepth 1 -type d ! -name .git
 -exec basename {} \; | rofi_cmd "Select pro
ject:")
            project_dir="$type_dir/$project_
name"

            cd "$project_dir" || return 1
            get_session_name
            get_layout
            zellij_cmd -s "$session_name" --
layout "$layout"
          }

          create_and_start_project() {
            mkdir -p "$project_dir"
            cd "$project_dir" || return 1

            case "$type" in
            script)
              echo -e "#!/usr/bin/env bash\n
echo 'hello world'" >"$project_name.sh"
              chmod +x "$project_name.sh"
              ;;
            nix)
              echo "Creating Nix project..."
              # still need to implement
              ;;
            *)
              echo "Unknown project type."
              return 1
              ;;
            esac

            get_session_name
            get_layout
            zellij_cmd -s "$session_name" --
layout "$layout"
          }
          project_action=$(echo -e "Create P
roject\nSelect Project" | rofi_cmd "Project 
action:")
          case "$project_action" in
          "Create Project")
            get_project_type
            get_project_name
            create_and_start_project
            ;;
          "Select Project")
            get_project_type
            select_project
            ;;
          esac

        }

        main() {
          main_action=$(echo -e "Projects\nS
essions" | rofi_cmd "Choose action:")
          case "$main_action" in
          "Projects") project_manager ;;
          "Sessions") session_manager ;;
          *) echo "Invalid option, exiting."
 ;;
          esac
        }

        main
      '';
  };
in {
  config = mkIf (multiplexer == "zellij") {
    home.packages = [zellijmenu];
    ooknet.binds.zellijMenu = "zellijmenu -n
";
  };
}
 
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET