lib/options: defaultNullOpts don't require having a default

Made the `default` and `description` arguments optional for all prime
variants of `defaultNullOpts` functions.

If neither `default` nor `description` are provided, the option will
have no description.

The "Plugin default" line is only added when a `default` argument is
present (`args ? default`).
This commit is contained in:
Matt Sturgeon 2024-06-07 17:34:46 +01:00
parent 94a452074f
commit ade4539b3f
No known key found for this signature in database
GPG key ID: 4F91844CED1A8299

View file

@ -80,14 +80,18 @@ rec {
let let
# Convert `defaultNullOpts`-style arguments into normal `mkOption`-style arguments, # Convert `defaultNullOpts`-style arguments into normal `mkOption`-style arguments,
# i.e. moves `default` into `description` using `defaultNullOpts.mkDesc` # i.e. moves `default` into `description` using `defaultNullOpts.mkDesc`
#
# "Plugin default" is only added if `args` has a `default` attribute
convertArgs = convertArgs =
{ default, description, ... }@args: args:
( (
args args
// { // {
default = null; default = null;
description = defaultNullOpts.mkDesc default description;
} }
// (optionalAttrs (args ? default) {
description = defaultNullOpts.mkDesc args.default (args.description or "");
})
); );
in in
rec { rec {
@ -141,7 +145,7 @@ rec {
${defaultDesc} ${defaultDesc}
''; '';
mkNullable' = { default, description, ... }@args: mkNullOrOption' (convertArgs args); mkNullable' = args: mkNullOrOption' (convertArgs args);
mkNullable = mkNullable =
type: default: description: type: default: description:
mkNullable' { inherit type default description; }; mkNullable' { inherit type default description; };
@ -152,20 +156,20 @@ rec {
type: default: description: type: default: description:
mkNullableWithRaw' { inherit type default description; }; mkNullableWithRaw' { inherit type default description; };
mkStrLuaOr' = { default, description, ... }@args: mkNullOrStrLuaOr' (convertArgs args); mkStrLuaOr' = args: mkNullOrStrLuaOr' (convertArgs args);
mkStrLuaOr = mkStrLuaOr =
type: default: description: type: default: description:
mkStrLuaOr' { inherit type default description; }; mkStrLuaOr' { inherit type default description; };
mkStrLuaFnOr' = { default, description, ... }@args: mkNullOrStrLuaFnOr' (convertArgs args); mkStrLuaFnOr' = args: mkNullOrStrLuaFnOr' (convertArgs args);
mkStrLuaFnOr = mkStrLuaFnOr =
type: default: description: type: default: description:
mkStrLuaFnOr' { inherit type default description; }; mkStrLuaFnOr' { inherit type default description; };
mkLua' = { default, description, ... }@args: mkNullOrLua' (convertArgs args); mkLua' = args: mkNullOrLua' (convertArgs args);
mkLua = default: description: mkLua' { inherit default description; }; mkLua = default: description: mkLua' { inherit default description; };
mkLuaFn' = { default, description, ... }@args: mkNullOrLuaFn' (convertArgs args); mkLuaFn' = args: mkNullOrLuaFn' (convertArgs args);
mkLuaFn = default: description: mkLuaFn' { inherit default description; }; mkLuaFn = default: description: mkLuaFn' { inherit default description; };
mkNum' = args: mkNullableWithRaw' (args // { type = types.number; }); mkNum' = args: mkNullableWithRaw' (args // { type = types.number; });
@ -181,14 +185,14 @@ rec {
mkBool' = args: mkNullableWithRaw' (args // { type = types.bool; }); mkBool' = args: mkNullableWithRaw' (args // { type = types.bool; });
mkBool = default: description: mkBool' { inherit default description; }; mkBool = default: description: mkBool' { inherit default description; };
mkStr' = mkStr' =
{ default, ... }@args: args:
mkNullableWithRaw' ( mkNullableWithRaw' (
args args
// { // {
# TODO we should remove this once `mkDesc` no longer has a special case
default = generators.toPretty { } default;
type = types.str; type = types.str;
} }
# TODO we should remove this once `mkDesc` no longer has a special case
// (optionalAttrs (args ? default) { default = generators.toPretty { } args.default; })
); );
mkStr = default: description: mkStr' { inherit default description; }; mkStr = default: description: mkStr' { inherit default description; };
@ -208,26 +212,27 @@ rec {
mkAttrsOf' { inherit type default description; }; mkAttrsOf' { inherit type default description; };
mkEnum' = mkEnum' =
{ { values, ... }@args:
values, # `values` is a list. If `default` is present, then it is either null or one of `values`
default ? head values,
...
}@args:
# `values` is a list and `default` is one of the values (or null)
assert isList values; assert isList values;
assert default == null || elem default values; assert args ? default -> (args.default == null || elem args.default values);
mkNullableWithRaw' ( mkNullableWithRaw' (
(filterAttrs (n: v: n != "values") args) (filterAttrs (n: v: n != "values") args)
// { // {
# TODO we should remove this once `mkDesc` no longer has a special case
default = if isString default then generators.toPretty { } default else default;
type = types.enum values; type = types.enum values;
} }
# TODO we should remove this once `mkDesc` no longer has a special case
// (optionalAttrs (args ? default) { default = generators.toPretty { } args.default; })
); );
mkEnum = mkEnum =
values: default: description: values: default: description:
mkEnum' { inherit values default description; }; mkEnum' { inherit values default description; };
mkEnumFirstDefault = values: description: mkEnum' { inherit values description; }; mkEnumFirstDefault =
values: description:
mkEnum' {
inherit values description;
default = head values;
};
mkBorder' = mkBorder' =
{ {
@ -240,8 +245,8 @@ rec {
// { // {
type = nixvimTypes.border; type = nixvimTypes.border;
description = concatStringsSep "\n" ( description = concatStringsSep "\n" (
filter (s: s != "") [ (optional (description != "") description)
description ++ [
"Defines the border to use for ${name}." "Defines the border to use for ${name}."
"Accepts same border values as `nvim_open_win()`. See `:help nvim_open_win()` for more info." "Accepts same border values as `nvim_open_win()`. See `:help nvim_open_win()` for more info."
] ]
@ -310,24 +315,20 @@ rec {
}; };
mkPackageOption = mkPackageOption =
{ args:
name ? null, # Can be omitted if a custom description is given. # A default package is required
description ? null, assert args ? default;
default, # `default` is not optional # `name` must be present if `description` is missing
... assert (!args ? description) -> args ? name;
}@args:
mkNullOrOption' ( mkNullOrOption' (
(filterAttrs (n: _: n != "name") args) (filterAttrs (n: _: n != "name") args)
// { // {
type = types.package; type = types.package;
description = description =
if description == null then args.description or ''
'' Which package to use for `${args.name}`.
Which package to use for `${name}`.
Set to `null` to disable its automatic installation. Set to `null` to disable its automatic installation.
'' '';
else
description;
} }
); );