nvf/lib/languages.nix
NotAShelf bd2743fb45
lib/languages: add mkLspConfig
mkLspConfig generates lspConfig attribute for languagae modules from structured arguments.
2024-10-16 05:30:28 +03:00

68 lines
1.8 KiB
Nix

# From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/booleans.nix
{lib}: let
inherit (builtins) isString getAttr;
inherit (lib.options) mkOption;
inherit (lib.types) bool;
inherit (lib.meta) getExe;
inherit (lib.lists) isList optionals;
inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.attrsets) mapListToAttrs;
inherit (lib.nvim.lua) toLuaObject;
in {
# A wrapper around `mkOption` to create a boolean option that is
# used for Language Server modules.
mkEnable = desc:
mkOption {
description = "Turn on ${desc} for enabled languages by default";
type = bool;
default = false;
};
# Converts a boolean to a yes/no string. This is used in lots of
# configuration formats.
diagnosticsToLua = {
lang,
config,
diagnosticsProviders,
}:
mapListToAttrs
(v: let
type =
if isString v
then v
else getAttr v.type;
package =
if isString v
then diagnosticsProviders.${type}.package
else v.package;
in {
name = "${lang}-diagnostics-${type}";
value = diagnosticsProviders.${type}.nullConfig package;
})
config;
# `mkLspConfig` is a helper function that generates a LspConfig configuration
# from at least a name and a package, optionally also `capabilities`, and
# `on_attach`.
# TODO: nixpkgs-like doc comments from that one RFC
mkLspConfig = {
name,
package,
args ? [],
cmd ? [(getExe package)] ++ lib.optionals (args != []) args,
capabilities ? "capabilities",
on_attach ? "on_attach",
}: let
generatedConfig = {
inherit cmd;
capabilities = mkLuaInline capabilities;
on_attach = mkLuaInline on_attach;
};
in {
inherit package;
lspConfig = ''
lspconfig.${name}.setup(${toLuaObject generatedConfig})
'';
};
}