From 8899663b5928c1326a4d8f721430da7e947f4dc1 Mon Sep 17 00:00:00 2001
From: Johan Larsson <jolars@posteo.com>
Date: Wed, 8 Jan 2025 14:44:58 +0100
Subject: [PATCH] plugins/persistence: convert to mkNeovimPlugin and fix
 settings
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Restrict no nonnegative numbers

Co-authored-by: Gaétan Lepage <33058747+GaetanLepage@users.noreply.github.com>

chore: include optionsRenamedToSettings in TODO

Merge imports

Co-authored-by: Gaétan Lepage <33058747+GaetanLepage@users.noreply.github.com>
---
 plugins/by-name/persistence/default.nix       | 118 +++++++-----------
 .../plugins/by-name/persistence/default.nix   |  14 +--
 2 files changed, 53 insertions(+), 79 deletions(-)

diff --git a/plugins/by-name/persistence/default.nix b/plugins/by-name/persistence/default.nix
index 9a64c6b313..c97360e0e3 100644
--- a/plugins/by-name/persistence/default.nix
+++ b/plugins/by-name/persistence/default.nix
@@ -1,79 +1,57 @@
-{
-  lib,
-  helpers,
-  config,
-  pkgs,
-  ...
-}:
-with lib;
-{
-  options.plugins.persistence = lib.nixvim.plugins.neovim.extraOptionsOptions // {
-    enable = mkEnableOption "persistence.nvim";
+{ lib, ... }:
+let
+  inherit (lib.nixvim) defaultNullOpts literalLua;
+in
+lib.nixvim.plugins.mkNeovimPlugin {
+  name = "persistence";
+  packPathName = "persistence.nvim";
+  package = "persistence-nvim";
+  description = "A simple lua plugin for automated session management.";
 
-    package = lib.mkPackageOption pkgs "persistence.nvim" {
-      default = [
-        "vimPlugins"
-        "persistence-nvim"
-      ];
-    };
+  maintainers = [ lib.maintainers.jolars ];
 
-    dir = helpers.defaultNullOpts.mkStr {
-      __raw = ''vim.fn.expand(vim.fn.stdpath("state") .. "/sessions/")'';
-    } "directory where session files are saved";
+  # TODO: introduced 2025-01-08: remove after 25.05
+  optionsRenamedToSettings = [
+    "dir"
+  ];
+  imports =
+    let
+      basePluginPath = [
+        "plugins"
+        "persistence"
+      ];
+    in
+    map
+      (
+        option:
+        lib.mkRemovedOptionModule (basePluginPath ++ [ option ]) ''
+          This option has been deprecated upstream. The plugin now provides
+          user events to hook into instead.
+        ''
+      )
+      [
+        "options"
+        "preSave"
+        "saveEmpty"
+      ];
 
-    options =
-      let
-        # https://neovim.io/doc/user/options.html#'sessionoptions'
-        sessionOpts = [
-          "blank"
-          "buffers"
-          "curdir"
-          "folds"
-          "globals"
-          "help"
-          "localoptions"
-          "options"
-          "skiprtp"
-          "resize"
-          "sesdir"
-          "tabpages"
-          "terminal"
-          "winpos"
-          "winsize"
-        ];
-      in
-      helpers.defaultNullOpts.mkListOf (types.enum sessionOpts) [
-        "buffers"
-        "curdir"
-        "tabpages"
-        "winsize"
-        "skiprtp"
-      ] "sessionoptions used for saving";
+  settingsOptions = {
+    branch = defaultNullOpts.mkBool true ''
+      Use git branch to save session.
+    '';
 
-    preSave = helpers.defaultNullOpts.mkLuaFn "nil" "a function to call before saving the session";
+    dir = defaultNullOpts.mkStr (literalLua "vim.fn.expand(vim.fn.stdpath('state') .. '/sessions/')") ''
+      Directory where session files are saved.
+    '';
 
-    saveEmpty = helpers.defaultNullOpts.mkBool false ''
-      don't save if there are no open file buffers
+    need = defaultNullOpts.mkUnsignedInt 1 ''
+      Minimum number of file buffers that need to be open to save. Set to
+      0 to always save.
     '';
   };
 
-  config =
-    let
-      cfg = config.plugins.persistence;
-    in
-    mkIf cfg.enable {
-      extraPlugins = [ cfg.package ];
-
-      extraConfigLua =
-        let
-          opts = {
-            inherit (cfg) dir options;
-            pre_save = cfg.preSave;
-            save_empty = cfg.saveEmpty;
-          };
-        in
-        ''
-          require('persistence').setup(${lib.nixvim.toLuaObject opts})
-        '';
-    };
+  settingsExample = {
+    need = 0;
+    branch = false;
+  };
 }
diff --git a/tests/test-sources/plugins/by-name/persistence/default.nix b/tests/test-sources/plugins/by-name/persistence/default.nix
index 412a3e341f..587d64f523 100644
--- a/tests/test-sources/plugins/by-name/persistence/default.nix
+++ b/tests/test-sources/plugins/by-name/persistence/default.nix
@@ -7,15 +7,11 @@
     plugins.persistence = {
       enable = true;
 
-      dir.__raw = ''vim.fn.expand(vim.fn.stdpath("state") .. "/sessions/")'';
-      options = [
-        "buffers"
-        "curdir"
-        "tabpages"
-        "winsize"
-      ];
-      preSave = null;
-      saveEmpty = false;
+      settings = {
+        branch = true;
+        dir.__raw = ''vim.fn.expand(vim.fn.stdpath("state") .. "/sessions/")'';
+        need = 1;
+      };
     };
   };
 }