2024-01-25 15:43:06 +01:00
|
|
|
{
|
|
|
|
lib,
|
|
|
|
nixvimTypes,
|
2024-01-25 16:58:58 +01:00
|
|
|
nixvimUtils,
|
2024-01-25 15:43:06 +01:00
|
|
|
}:
|
2024-01-25 16:58:58 +01:00
|
|
|
with lib;
|
2024-05-05 19:39:35 +02:00
|
|
|
with nixvimUtils;
|
|
|
|
rec {
|
2024-01-25 15:43:06 +01:00
|
|
|
# Creates an option with a nullable type that defaults to null.
|
2024-05-05 19:39:35 +02:00
|
|
|
mkNullOrOption =
|
|
|
|
type: desc:
|
2024-01-25 15:43:06 +01:00
|
|
|
lib.mkOption {
|
|
|
|
type = lib.types.nullOr type;
|
|
|
|
default = null;
|
|
|
|
description = desc;
|
|
|
|
};
|
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkCompositeOption = desc: options: mkNullOrOption (types.submodule { inherit options; }) desc;
|
2024-01-25 15:43:06 +01:00
|
|
|
|
|
|
|
mkNullOrStr = mkNullOrOption (with nixvimTypes; maybeRaw str);
|
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkNullOrLua =
|
|
|
|
desc:
|
2024-01-25 15:43:06 +01:00
|
|
|
lib.mkOption {
|
|
|
|
type = lib.types.nullOr nixvimTypes.strLua;
|
|
|
|
default = null;
|
|
|
|
description = desc;
|
|
|
|
apply = mkRaw;
|
|
|
|
};
|
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkNullOrLuaFn =
|
|
|
|
desc:
|
2024-01-25 15:43:06 +01:00
|
|
|
lib.mkOption {
|
|
|
|
type = lib.types.nullOr nixvimTypes.strLuaFn;
|
|
|
|
default = null;
|
|
|
|
description = desc;
|
|
|
|
apply = mkRaw;
|
|
|
|
};
|
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkNullOrStrLuaOr =
|
|
|
|
ty: desc:
|
2024-01-25 15:43:06 +01:00
|
|
|
lib.mkOption {
|
|
|
|
type = lib.types.nullOr (types.either nixvimTypes.strLua ty);
|
|
|
|
default = null;
|
|
|
|
description = desc;
|
2024-05-05 19:39:35 +02:00
|
|
|
apply = v: if builtins.isString v then mkRaw v else v;
|
2024-01-25 15:43:06 +01:00
|
|
|
};
|
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkNullOrStrLuaFnOr =
|
|
|
|
ty: desc:
|
2024-01-25 15:43:06 +01:00
|
|
|
lib.mkOption {
|
|
|
|
type = lib.types.nullOr (types.either nixvimTypes.strLuaFn ty);
|
|
|
|
default = null;
|
|
|
|
description = desc;
|
2024-05-05 19:39:35 +02:00
|
|
|
apply = v: if builtins.isString v then mkRaw v else v;
|
2024-01-25 15:43:06 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
defaultNullOpts = rec {
|
2024-05-17 10:30:31 +02:00
|
|
|
# Description helpers
|
2024-05-17 10:31:16 +02:00
|
|
|
mkDefaultDesc = defaultValue: "Plugin default: `${toString defaultValue}`";
|
2024-05-17 10:30:31 +02:00
|
|
|
mkDesc =
|
|
|
|
default: desc:
|
|
|
|
let
|
|
|
|
defaultDesc = mkDefaultDesc default;
|
|
|
|
in
|
|
|
|
if desc == "" then
|
|
|
|
defaultDesc
|
|
|
|
else
|
|
|
|
''
|
|
|
|
${desc}
|
|
|
|
|
|
|
|
${defaultDesc}
|
|
|
|
'';
|
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkNullable =
|
|
|
|
type: default: desc:
|
2024-05-17 10:30:31 +02:00
|
|
|
mkNullOrOption type (mkDesc default desc);
|
2024-01-25 15:43:06 +01:00
|
|
|
|
2024-05-16 12:33:29 +02:00
|
|
|
mkNullableWithRaw = type: mkNullable (nixvimTypes.maybeRaw type);
|
2024-01-25 15:43:06 +01:00
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkStrLuaOr =
|
|
|
|
type: default: desc:
|
2024-05-17 10:30:31 +02:00
|
|
|
mkNullOrStrLuaOr type (mkDesc default desc);
|
2024-01-25 15:43:06 +01:00
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkStrLuaFnOr =
|
|
|
|
type: default: desc:
|
2024-05-17 10:30:31 +02:00
|
|
|
mkNullOrStrLuaFnOr type (mkDesc default desc);
|
2024-01-25 15:43:06 +01:00
|
|
|
|
2024-05-17 10:30:31 +02:00
|
|
|
mkLua = default: desc: mkNullOrLua (mkDesc default desc);
|
2024-01-25 15:43:06 +01:00
|
|
|
|
2024-05-17 10:30:31 +02:00
|
|
|
mkLuaFn = default: desc: mkNullOrLuaFn (mkDesc default desc);
|
2024-01-25 15:43:06 +01:00
|
|
|
|
2024-05-16 12:33:29 +02:00
|
|
|
mkNum = default: mkNullableWithRaw types.number (toString default);
|
|
|
|
mkInt = default: mkNullableWithRaw types.int (toString default);
|
2024-01-25 15:43:06 +01:00
|
|
|
# Positive: >0
|
2024-05-16 12:33:29 +02:00
|
|
|
mkPositiveInt = default: mkNullableWithRaw types.ints.positive (toString default);
|
2024-01-25 15:43:06 +01:00
|
|
|
# Unsigned: >=0
|
2024-05-16 12:33:29 +02:00
|
|
|
mkUnsignedInt = default: mkNullableWithRaw types.ints.unsigned (toString default);
|
|
|
|
mkBool = default: mkNullableWithRaw types.bool (if default then "true" else "false");
|
|
|
|
mkStr = default: mkNullableWithRaw types.str ''${builtins.toString default}'';
|
2024-01-25 15:43:06 +01:00
|
|
|
mkAttributeSet = default: mkNullable nixvimTypes.attrs ''${default}'';
|
|
|
|
mkListOf = ty: default: mkNullable (with nixvimTypes; listOf (maybeRaw ty)) default;
|
|
|
|
mkAttrsOf = ty: default: mkNullable (with nixvimTypes; attrsOf (maybeRaw ty)) default;
|
2024-05-16 12:33:29 +02:00
|
|
|
mkEnum = enumValues: default: mkNullableWithRaw (types.enum enumValues) ''"${default}"'';
|
2024-01-25 15:43:06 +01:00
|
|
|
mkEnumFirstDefault = enumValues: mkEnum enumValues (head enumValues);
|
2024-05-05 19:39:35 +02:00
|
|
|
mkBorder =
|
|
|
|
default: name: desc:
|
2024-05-16 12:33:29 +02:00
|
|
|
mkNullableWithRaw nixvimTypes.border default (
|
2024-05-05 19:39:35 +02:00
|
|
|
let
|
|
|
|
defaultDesc = ''
|
|
|
|
Defines the border to use for ${name}.
|
|
|
|
Accepts same border values as `nvim_open_win()`. See `:help nvim_open_win()` for more info.
|
|
|
|
'';
|
|
|
|
in
|
|
|
|
if desc == "" then
|
|
|
|
defaultDesc
|
|
|
|
else
|
|
|
|
''
|
|
|
|
${desc}
|
|
|
|
${defaultDesc}
|
|
|
|
''
|
|
|
|
);
|
|
|
|
mkSeverity =
|
|
|
|
default: desc:
|
2024-01-25 15:43:06 +01:00
|
|
|
mkOption {
|
2024-05-05 19:39:35 +02:00
|
|
|
type =
|
|
|
|
with types;
|
|
|
|
nullOr (
|
|
|
|
either ints.unsigned (enum [
|
|
|
|
"error"
|
|
|
|
"warn"
|
|
|
|
"info"
|
|
|
|
"hint"
|
|
|
|
])
|
2024-01-25 15:43:06 +01:00
|
|
|
);
|
|
|
|
default = null;
|
2024-05-05 19:39:35 +02:00
|
|
|
apply = mapNullable (
|
|
|
|
value: if isInt value then value else mkRaw "vim.diagnostic.severity.${strings.toUpper value}"
|
|
|
|
);
|
2024-05-17 10:30:31 +02:00
|
|
|
description = mkDesc default desc;
|
2024-01-25 15:43:06 +01:00
|
|
|
};
|
2024-05-05 19:39:35 +02:00
|
|
|
mkLogLevel =
|
|
|
|
default: desc:
|
2024-01-25 15:43:06 +01:00
|
|
|
mkOption {
|
2024-05-05 19:39:35 +02:00
|
|
|
type = with types; nullOr (either ints.unsigned nixvimTypes.logLevel);
|
2024-01-25 15:43:06 +01:00
|
|
|
default = null;
|
2024-05-05 19:39:35 +02:00
|
|
|
apply = mapNullable (
|
|
|
|
value: if isInt value then value else mkRaw "vim.log.levels.${strings.toUpper value}"
|
|
|
|
);
|
2024-05-17 10:30:31 +02:00
|
|
|
description = mkDesc default desc;
|
2024-01-25 15:43:06 +01:00
|
|
|
};
|
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkHighlight =
|
|
|
|
default: name: desc:
|
|
|
|
mkNullable nixvimTypes.highlight default (if desc == "" then "Highlight settings." else desc);
|
2024-01-25 15:43:06 +01:00
|
|
|
};
|
|
|
|
|
2024-05-17 14:09:20 +02:00
|
|
|
mkPluginPackageOption =
|
2024-05-05 19:39:35 +02:00
|
|
|
name: default:
|
2024-01-25 15:43:06 +01:00
|
|
|
mkOption {
|
|
|
|
type = types.package;
|
|
|
|
inherit default;
|
2024-05-17 14:09:20 +02:00
|
|
|
description = "Which package to use for the ${name} plugin.";
|
2024-01-25 15:43:06 +01:00
|
|
|
};
|
2024-02-12 16:11:34 +01:00
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkSettingsOption =
|
|
|
|
{
|
|
|
|
options ? { },
|
|
|
|
description,
|
|
|
|
example ? null,
|
|
|
|
}:
|
2024-02-12 16:11:34 +01:00
|
|
|
mkOption {
|
2024-05-05 19:39:35 +02:00
|
|
|
type =
|
|
|
|
with types;
|
2024-02-12 16:11:34 +01:00
|
|
|
submodule {
|
2024-02-13 00:03:07 +01:00
|
|
|
freeformType = attrsOf anything;
|
2024-02-12 16:11:34 +01:00
|
|
|
inherit options;
|
|
|
|
};
|
2024-05-05 19:39:35 +02:00
|
|
|
default = { };
|
2024-02-12 16:11:34 +01:00
|
|
|
inherit description;
|
|
|
|
example =
|
2024-05-05 19:39:35 +02:00
|
|
|
if example == null then
|
|
|
|
{
|
|
|
|
foo_bar = 42;
|
|
|
|
hostname = "localhost:8080";
|
|
|
|
callback.__raw = ''
|
|
|
|
function()
|
|
|
|
print('nixvim')
|
|
|
|
end
|
|
|
|
'';
|
|
|
|
}
|
|
|
|
else
|
|
|
|
example;
|
2024-02-12 16:11:34 +01:00
|
|
|
};
|
2024-01-25 15:43:06 +01:00
|
|
|
}
|