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.
This commit is contained in:
parent
255f921049
commit
406d34d919
|
@ -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}"}";
|
||||
|
|
|
@ -71,7 +71,7 @@ in {
|
|||
ignorecase = false;
|
||||
icons = true;
|
||||
tabstop = 4;
|
||||
ratios = "2:2:3";
|
||||
ratios = [ 2 2 3 ];
|
||||
};
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue