nix-community.nixvim/lib/options.nix

264 lines
6.3 KiB
Nix
Raw Normal View History

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-05 19:39:35 +02:00
mkNullable =
type: default: desc:
2024-01-25 15:43:06 +01:00
mkNullOrOption type (
let
defaultDesc = "default: `${default}`";
in
2024-05-05 19:39:35 +02:00
if desc == "" then
defaultDesc
else
''
2024-01-25 15:43:06 +01:00
${desc}
${defaultDesc}
''
);
mkNullableWithRaw = type: mkNullable (maybeRaw type);
2024-05-05 19:39:35 +02:00
mkStrLuaOr =
type: default: desc:
mkNullOrStrLuaOr type (
let
defaultDesc = "default: `${default}`";
in
if desc == "" then
defaultDesc
else
''
${desc}
2024-01-25 15:43:06 +01:00
2024-05-05 19:39:35 +02:00
${defaultDesc}
''
);
2024-01-25 15:43:06 +01:00
2024-05-05 19:39:35 +02:00
mkStrLuaFnOr =
type: default: desc:
mkNullOrStrLuaFnOr type (
let
defaultDesc = "default: `${default}`";
in
if desc == "" then
defaultDesc
else
''
${desc}
2024-01-25 15:43:06 +01:00
2024-05-05 19:39:35 +02:00
${defaultDesc}
''
);
2024-01-25 15:43:06 +01:00
2024-05-05 19:39:35 +02:00
mkLua =
default: desc:
mkNullOrLua (
2024-01-25 15:43:06 +01:00
(optionalString (desc != "") ''
${desc}
'')
+ ''
default: `${default}`
''
);
2024-05-05 19:39:35 +02:00
mkLuaFn =
default: desc:
let
defaultDesc = "default: `${default}`";
in
mkNullOrLuaFn (
if desc == "" then
defaultDesc
else
''
${desc}
2024-01-25 15:43:06 +01:00
2024-05-05 19:39:35 +02:00
${defaultDesc}
''
2024-01-25 15:43:06 +01:00
);
mkNum = default: mkNullable (with nixvimTypes; maybeRaw number) (toString default);
mkInt = default: mkNullable (with nixvimTypes; maybeRaw int) (toString default);
# Positive: >0
mkPositiveInt = default: mkNullable (with nixvimTypes; maybeRaw ints.positive) (toString default);
# Unsigned: >=0
mkUnsignedInt = default: mkNullable (with nixvimTypes; maybeRaw ints.unsigned) (toString default);
2024-05-05 19:39:35 +02:00
mkBool =
default: mkNullable (with nixvimTypes; maybeRaw bool) (if default then "true" else "false");
2024-01-25 15:43:06 +01:00
mkStr = default: mkNullable (with nixvimTypes; maybeRaw str) ''${builtins.toString default}'';
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-05 19:39:35 +02:00
mkEnum =
enumValues: default: mkNullable (with nixvimTypes; maybeRaw (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:
mkNullable (with nixvimTypes; maybeRaw border) default (
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}"
);
description =
let
defaultDesc = "default: `${toString default}`";
in
if desc == "" then
defaultDesc
else
''
${desc}
2024-01-25 15:43:06 +01:00
2024-05-05 19:39:35 +02:00
${defaultDesc}
'';
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}"
);
description =
let
defaultDesc = "default: `${toString default}`";
in
if desc == "" then
defaultDesc
else
''
${desc}
2024-01-25 15:43:06 +01:00
2024-05-05 19:39:35 +02:00
${defaultDesc}
'';
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-05 19:39:35 +02:00
mkPackageOption =
name: default:
2024-01-25 15:43:06 +01:00
mkOption {
type = types.package;
inherit default;
description = "Plugin to use for ${name}";
};
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 {
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
}