From 8ca3a1e1accaa0a745883802598b1580353516ca Mon Sep 17 00:00:00 2001 From: Soliprem Date: Tue, 3 Dec 2024 14:53:07 +0100 Subject: [PATCH] modules/gleam: init --- configuration.nix | 1 + modules/plugins/languages/default.nix | 1 + modules/plugins/languages/gleam.nix | 111 ++++++++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 modules/plugins/languages/gleam.nix diff --git a/configuration.nix b/configuration.nix index 3b8e3d25..3ce224cc 100644 --- a/configuration.nix +++ b/configuration.nix @@ -64,6 +64,7 @@ isMaximal: { python.enable = isMaximal; dart.enable = isMaximal; bash.enable = isMaximal; + gleam.enable = true; r.enable = isMaximal; tailwind.enable = isMaximal; typst.enable = isMaximal; diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 58662354..8c124648 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -8,6 +8,7 @@ in { ./clang.nix ./css.nix ./elixir.nix + ./gleam.nix ./go.nix ./hcl.nix ./kotlin.nix diff --git a/modules/plugins/languages/gleam.nix b/modules/plugins/languages/gleam.nix new file mode 100644 index 00000000..c2f810dc --- /dev/null +++ b/modules/plugins/languages/gleam.nix @@ -0,0 +1,111 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkEnableOption mkOption; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.lists) isList; + inherit (lib.types) enum either listOf package str; + inherit (lib.nvim.lua) expToLua; + + cfg = config.vim.languages.gleam; + + defaultServer = "gleam"; + servers = { + gleam = { + package = pkgs.gleam; + lspConfig = '' + lspconfig.basedpyright.setup{ + capabilities = capabilities, + on_attach = default_on_attach, + cmd = ${ + if isList cfg.lsp.package + then expToLua cfg.lsp.package + else ''{"${cfg.lsp.package}/bin/gleam", "lsp"}'' + } + } + ''; + }; + }; + + defaultFormat = "gleam_format"; + formats = { + gleam_format = { + package = pkgs.gleam; + nullConfig = '' + table.insert( + ls_sources, + null_ls.builtins.formatting.gleam_format.with({ + command = "${cfg.format.package}/bin/gleam", + }) + ) + ''; + }; + }; + +in { + options.vim.languages.gleam = { + enable = mkEnableOption "Gleam language support"; + + treesitter = { + enable = mkEnableOption "Gleam treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = mkOption { + type = package; + default = pkgs.vimPlugins.nvim-treesitter.builtGrammars.gleam; + description = "Gleam treesitter grammar to use"; + }; + }; + + lsp = { + enable = mkEnableOption "Gleam LSP support" // {default = config.vim.languages.enableLSP;}; + + server = mkOption { + type = enum (attrNames servers); + default = defaultServer; + description = "Gleam LSP server to use"; + }; + + package = mkOption { + type = either package (listOf str); + default = servers.${cfg.lsp.server}.package; + description = "gleam LSP server package, or the command to run as a list of strings"; + }; + }; + + format = { + enable = mkEnableOption "Gleam formatting" // {default = config.vim.languages.enableFormat;}; + + type = mkOption { + type = enum (attrNames formats); + default = defaultFormat; + description = "Gleam formatter to use"; + }; + + package = mkOption { + type = package; + default = formats.${cfg.format.type}.package; + description = "Gleam formatter package"; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [cfg.treesitter.package]; + }) + + (mkIf cfg.lsp.enable { + vim.lsp.lspconfig.enable = true; + vim.lsp.lspconfig.sources.gleam-lsp = servers.${cfg.lsp.server}.lspConfig; + }) + + (mkIf cfg.format.enable { + vim.lsp.null-ls.enable = true; + vim.lsp.null-ls.sources.gleam-format = formats.${cfg.format.type}.nullConfig; + }) + ]); +}