diff --git a/lib/config.nix b/lib/config.nix index a2b8970..c7430b8 100644 --- a/lib/config.nix +++ b/lib/config.nix @@ -1,6 +1,9 @@ {lib}: let inherit (lib.options) mkOption; inherit (lib.types) bool; + inherit (lib.modules) mkRenamedOptionModule; + inherit (lib.attrsets) mapAttrsToList; + inherit (lib.lists) flatten; in { mkBool = value: description: mkOption { @@ -8,4 +11,56 @@ in { default = value; inherit description; }; + + /* + Generates a list of mkRenamedOptionModule, from a mapping of the old name to + the new name. Nested options can optionally supply a "_name" to indicate its + new name. + + # Example + + ```nix + batchRenameOptions ["nvimTree"] ["nvimTree" "setupOpts"] { + disableNetrw = "disable_netrw"; + nestedOption = { + _name = "nested_option"; + somethingElse = "something_else"; + }; + } + ``` + + The above code is equivalent to this: + + ```nix + [ + ( + mkRenamedOptionModule + ["nvimTree" "disableNetrw"] + ["nvimTree" "setupOpts" "disable_netrw"] + ) + ( + mkRenamedOptionModule + ["nvimTree" "nestedOption" "somethingElse"] + ["nvimTree" "setupOpts" "nested_option" "something_else"] + ) + ] + ``` + */ + batchRenameOptions = oldBasePath: newBasePath: mappings: let + genSetupOptRenames = oldSubpath: newSubpath: table: + mapAttrsToList ( + oldName: newNameOrAttr: + if builtins.isAttrs newNameOrAttr + then + genSetupOptRenames (oldSubpath ++ [oldName]) (newSubpath + ++ [newNameOrAttr._name or oldName]) + newNameOrAttr + else + mkRenamedOptionModule + (oldBasePath ++ oldSubpath ++ [oldName]) + (newBasePath ++ newSubpath ++ [newNameOrAttr]) + ) + table; + in + flatten (genSetupOptRenames [] [] mappings); } diff --git a/modules/plugins/filetree/nvimtree/nvimtree.nix b/modules/plugins/filetree/nvimtree/nvimtree.nix index b962dfe..9c443a6 100644 --- a/modules/plugins/filetree/nvimtree/nvimtree.nix +++ b/modules/plugins/filetree/nvimtree/nvimtree.nix @@ -3,13 +3,11 @@ lib, ... }: let - inherit (lib.modules) mkRenamedOptionModule; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.generators) mkLuaInline; inherit (lib.types) nullOr str bool int submodule listOf enum oneOf attrs addCheck; inherit (lib.nvim.types) mkPluginSetupOption; - inherit (lib.lists) flatten; - inherit (lib.attrsets) mapAttrsToList; + inherit (lib.nvim.config) batchRenameOptions; migrationTable = { disableNetrw = "disable_netrw"; @@ -67,21 +65,11 @@ ui = "ui"; }; - renamedSetupOpts = flatten (genSetupOptRenames [] migrationTable); - - # Note: I cut a few corners so it only works in this specific case - # if the parent of a nested option needs to be renamed, this would not work - genSetupOptRenames = path: table: - mapAttrsToList ( - oldName: newNameOrAttr: - if builtins.isAttrs newNameOrAttr - then genSetupOptRenames (path ++ [oldName]) newNameOrAttr - else - mkRenamedOptionModule - (["vim" "filetree" "nvimTree"] ++ path ++ [oldName]) - (["vim" "filetree" "nvimTree" "setupOpts"] ++ path ++ [newNameOrAttr]) - ) - table; + renamedSetupOpts = + batchRenameOptions + ["vim" "filetree" "nvimTree"] + ["vim" "filetree" "nvimTree" "setupOpts"] + migrationTable; in { imports = renamedSetupOpts; options.vim.filetree.nvimTree = {