lib/options: add more defaultNullOpts 'variants

All `defaultNullOpts` functions now have a prime variant.
This commit is contained in:
Matt Sturgeon 2024-06-02 03:15:31 +01:00
parent d136c08f3a
commit a2443ac0d6
No known key found for this signature in database
GPG key ID: 4F91844CED1A8299

View file

@ -76,7 +76,21 @@ rec {
); );
mkNullOrStrLuaFnOr = type: description: mkNullOrStrLuaFnOr' { inherit type description; }; mkNullOrStrLuaFnOr = type: description: mkNullOrStrLuaFnOr' { inherit type description; };
defaultNullOpts = rec { defaultNullOpts =
let
# Convert `defaultNullOpts`-style arguments into normal `mkOption`-style arguments,
# i.e. moves `default` into `description` using `defaultNullOpts.mkDesc`
convertArgs =
{ default, description, ... }@args:
(
args
// {
default = null;
description = defaultNullOpts.mkDesc default description;
}
);
in
rec {
/** /**
Build a description with a plugin default. Build a description with a plugin default.
@ -127,15 +141,7 @@ rec {
${defaultDesc} ${defaultDesc}
''; '';
mkNullable' = mkNullable' = { default, description, ... }@args: mkNullOrOption' (convertArgs args);
{ default, description, ... }@args:
mkNullOrOption' (
args
// {
default = null;
description = mkDesc default description;
}
);
mkNullable = mkNullable =
type: default: description: type: default: description:
mkNullable' { inherit type default description; }; mkNullable' { inherit type default description; };
@ -146,29 +152,45 @@ 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 = mkStrLuaOr =
type: default: desc: type: default: description:
mkNullOrStrLuaOr type (mkDesc default desc); mkStrLuaOr' { inherit type default description; };
mkStrLuaFnOr' = { default, description, ... }@args: mkNullOrStrLuaFnOr' (convertArgs args);
mkStrLuaFnOr = mkStrLuaFnOr =
type: default: desc: type: default: description:
mkNullOrStrLuaFnOr type (mkDesc default desc); mkStrLuaFnOr' { inherit type default description; };
mkLua = default: desc: mkNullOrLua (mkDesc default desc); mkLua' = { default, description, ... }@args: mkNullOrLua' (convertArgs args);
mkLua = default: description: mkLua' { inherit default description; };
mkLuaFn = default: desc: mkNullOrLuaFn (mkDesc default desc); mkLuaFn' = { default, description, ... }@args: mkNullOrLuaFn' (convertArgs args);
mkLuaFn = default: description: mkLuaFn' { inherit default description; };
mkNum = mkNullableWithRaw types.number; mkNum' = args: mkNullableWithRaw' (args // { type = types.number; });
mkInt = mkNullableWithRaw types.int; mkNum = default: description: mkNum' { inherit default description; };
mkInt' = args: mkNullableWithRaw' (args // { type = types.int; });
mkInt = default: description: mkNum' { inherit default description; };
# Positive: >0 # Positive: >0
mkPositiveInt = mkNullableWithRaw types.ints.positive; mkPositiveInt' = args: mkNullableWithRaw' (args // { type = types.ints.positive; });
mkPositiveInt = default: description: mkPositiveInt' { inherit default description; };
# Unsigned: >=0 # Unsigned: >=0
mkUnsignedInt = mkNullableWithRaw types.ints.unsigned; mkUnsignedInt' = args: mkNullableWithRaw' (args // { type = types.ints.unsigned; });
mkBool = mkNullableWithRaw types.bool; mkUnsignedInt = default: description: mkUnsignedInt' { inherit default description; };
mkStr = mkBool' = args: mkNullableWithRaw' (args // { type = types.bool; });
# TODO we should delegate rendering quoted string to `mkDefaultDesc`, mkBool = default: description: mkBool' { inherit default description; };
# once we remove its special case for strings. mkStr' =
default: mkNullableWithRaw types.str (generators.toPretty { } default); { default, ... }@args:
mkNullableWithRaw' (
args
// {
# TODO we should remove this once `mkDesc` no longer has a special case
default = generators.toPretty { } default;
type = types.str;
}
);
mkStr = default: description: mkStr' { inherit default description; };
mkAttributeSet' = args: mkNullable' (args // { type = nixvimTypes.attrs; }); mkAttributeSet' = args: mkNullable' (args // { type = nixvimTypes.attrs; });
mkAttributeSet = default: description: mkAttributeSet' { inherit default description; }; mkAttributeSet = default: description: mkAttributeSet' { inherit default description; };
@ -185,63 +207,103 @@ rec {
type: default: description: type: default: description:
mkAttrsOf' { inherit type default description; }; mkAttrsOf' { inherit type default description; };
mkEnum' =
{
values,
default ? head values,
...
}@args:
mkNullableWithRaw' (
(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;
}
);
mkEnum = mkEnum =
enumValues: default: values: default: description:
mkNullableWithRaw (types.enum enumValues) ( mkEnum' { inherit values default description; };
# TODO we should remove this once `mkDefaultDesc` no longer has a special case mkEnumFirstDefault = values: description: mkEnum' { inherit values description; };
if isString default then generators.toPretty { } default else default
mkBorder' =
{
name,
description ? "",
...
}@args:
mkNullableWithRaw' (
(filterAttrs (n: v: n != "name") args)
// {
type = nixvimTypes.border;
description = concatStringsSep "\n" (
filter (s: s != "") [
description
"Defines the border to use for ${name}."
"Accepts same border values as `nvim_open_win()`. See `:help nvim_open_win()` for more info."
]
);
}
); );
mkEnumFirstDefault = enumValues: mkEnum enumValues (head enumValues);
mkBorder = mkBorder =
default: name: desc: default: name: description:
mkNullableWithRaw nixvimTypes.border default ( mkBorder' { inherit default name description; };
let
defaultDesc = '' mkSeverity' =
Defines the border to use for ${name}. args:
Accepts same border values as `nvim_open_win()`. See `:help nvim_open_win()` for more info. mkNullOrOption' (
''; args
in // {
if desc == "" then
defaultDesc
else
''
${desc}
${defaultDesc}
''
);
mkSeverity =
default: desc:
mkOption {
type = type =
with types; with types;
nullOr (
either ints.unsigned (enum [ either ints.unsigned (enum [
"error" "error"
"warn" "warn"
"info" "info"
"hint" "hint"
]) ]);
);
default = null;
apply = mapNullable ( apply = mapNullable (
value: if isInt value then value else mkRaw "vim.diagnostic.severity.${strings.toUpper value}" value: if isInt value then value else mkRaw "vim.diagnostic.severity.${strings.toUpper value}"
); );
description = mkDesc default desc; }
}; );
mkLogLevel = mkSeverity = default: description: mkSeverity' { inherit default description; };
default: desc:
mkOption { mkLogLevel' =
type = with types; nullOr (either ints.unsigned nixvimTypes.logLevel); args:
default = null; mkNullOrOption' (
args
// {
type = with nixvimTypes; either ints.unsigned logLevel;
apply = mapNullable ( apply = mapNullable (
value: if isInt value then value else mkRaw "vim.log.levels.${strings.toUpper value}" value: if isInt value then value else mkRaw "vim.log.levels.${strings.toUpper value}"
); );
description = mkDesc default desc; }
}; );
mkLogLevel = default: description: mkLogLevel' { inherit default description; };
mkHighlight' =
{
description ? "Highlight settings.",
...
}@args:
mkNullable' (
args
// {
type = nixvimTypes.highlight;
inherit description;
}
);
# FIXME `name` argument is ignored
# TODO deprecate in favor of `mkHighlight'`?
mkHighlight = mkHighlight =
default: name: desc: default: name: description:
mkNullable nixvimTypes.highlight default (if desc == "" then "Highlight settings." else desc); mkHighlight' (
{
inherit default;
}
// (optionalAttrs (description != null && description != "") { inherit description; })
);
}; };
mkPackageOption = mkPackageOption =