From 406d34d919e9e8b831b531782cf5ef6995188566 Mon Sep 17 00:00:00 2001 From: musjj <72612857+musjj@users.noreply.github.com> Date: Sat, 12 Aug 2023 23:10:49 +0700 Subject: [PATCH] lf: simplify option validation (#4334) Don't try to validate a limited set of hardcoded options, instead just convert them as-is. Now, users can keep all their options in a single attribute set, including arbitrary `user_{option}`s which was impossible to express with a hard-coded submodule. As a plus, there is also less maintainence burden. --- modules/programs/lf.nix | 78 ++++------------------- tests/modules/programs/lf/all-options.nix | 2 +- 2 files changed, 13 insertions(+), 67 deletions(-) diff --git a/modules/programs/lf.nix b/modules/programs/lf.nix index e7ad02744..995b926f4 100644 --- a/modules/programs/lf.nix +++ b/modules/programs/lf.nix @@ -2,55 +2,7 @@ with lib; -let - cfg = config.programs.lf; - - knownSettings = { - anchorfind = types.bool; - color256 = types.bool; - dircounts = types.bool; - dirfirst = types.bool; - drawbox = types.bool; - globsearch = types.bool; - icons = types.bool; - hidden = types.bool; - ignorecase = types.bool; - ignoredia = types.bool; - incsearch = types.bool; - preview = types.bool; - reverse = types.bool; - smartcase = types.bool; - smartdia = types.bool; - wrapscan = types.bool; - wrapscroll = types.bool; - number = types.bool; - relativenumber = types.bool; - findlen = types.int; - period = types.int; - scrolloff = types.int; - tabstop = types.int; - errorfmt = types.str; - filesep = types.str; - ifs = types.str; - promptfmt = types.str; - shell = types.str; - sortby = types.str; - timefmt = types.str; - ratios = types.str; - info = types.str; - shellopts = types.str; - }; - - lfSettingsType = types.submodule { - options = let - opt = name: type: - mkOption { - type = types.nullOr type; - default = null; - visible = false; - }; - in mapAttrs opt knownSettings; - }; +let cfg = config.programs.lf; in { meta.maintainers = [ hm.maintainers.owm111 ]; @@ -68,27 +20,19 @@ in { }; settings = mkOption { - type = lfSettingsType; + type = with types; + attrsOf (oneOf [ str int (listOf (either str int)) bool ]); default = { }; example = { tabstop = 4; number = true; - ratios = "1:1:2"; + ratios = [ 1 1 2 ]; }; description = '' - An attribute set of lf settings. The attribute names and corresponding - values must be among the following supported options. - - ${concatStringsSep "\n" (mapAttrsToList (n: v: '' - {var}`${n}` - : ${v.description} - '') knownSettings)} - - See the lf documentation for detailed descriptions of these options. - Use {option}`programs.lf.previewer.*` to set lf's - {var}`previewer` option, and - [](#opt-programs.lf.extraConfig) for any other option not listed above. - All string options are quoted with double quotes. + An attribute set of lf settings. See the lf documentation for + detailed descriptions of these options. Prefer + {option}`programs.lf.previewer.*` for setting lf's {var}`previewer` + option. All string options are quoted with double quotes. ''; }; @@ -181,12 +125,14 @@ in { optionalString (v != null) "set ${ if isBool v then "${optionalString (!v) "no"}${k}" + else if isList v then + ''${k} "${concatStringsSep ":" (map (w: toString w) v)}"'' else "${k} ${if isInt v then toString v else ''"${v}"''}" }"; - settingsStr = concatStringsSep "\n" (remove "" (mapAttrsToList fmtSetting - (builtins.intersectAttrs knownSettings cfg.settings))); + settingsStr = concatStringsSep "\n" + (remove "" (mapAttrsToList fmtSetting cfg.settings)); fmtCmdMap = before: k: v: "${before} ${k}${optionalString (v != null && v != "") " ${v}"}"; diff --git a/tests/modules/programs/lf/all-options.nix b/tests/modules/programs/lf/all-options.nix index 35d7901d6..9632e7cf6 100644 --- a/tests/modules/programs/lf/all-options.nix +++ b/tests/modules/programs/lf/all-options.nix @@ -71,7 +71,7 @@ in { ignorecase = false; icons = true; tabstop = 4; - ratios = "2:2:3"; + ratios = [ 2 2 3 ]; }; };