diff --git a/lib/pkg-lists.nix b/lib/pkg-lists.nix new file mode 100644 index 00000000..76d49e86 --- /dev/null +++ b/lib/pkg-lists.nix @@ -0,0 +1,23 @@ +# This file isn't (currently) part of `lib.nixvim`, but is used directly by `efmls` and `none-ls` pkg lists +lib: rec { + # Produces an attrset of { ${name} = name; } + topLevel = names: lib.genAttrs names lib.id; + + # Produces an attrset of { ${name} = null; } + nullAttrs = names: lib.genAttrs names (_: null); + + # Produces an attrset of { ${name} = [ scope name ]; } + # Where the "scope" is the (nested) attr names, + # and "name" is the value. + # If the name value is a list, it will be expanded into multiple attrs. + scoped = lib.concatMapAttrs ( + scope: v: + if builtins.isAttrs v then + lib.mapAttrs (_: loc: [ scope ] ++ loc) (scoped v) + else + lib.genAttrs (lib.toList v) (name: [ + scope + name + ]) + ); +} diff --git a/plugins/lsp/language-servers/efmls-configs-pkgs.nix b/plugins/lsp/language-servers/efmls-configs-pkgs.nix index e5703b95..2a99b6be 100644 --- a/plugins/lsp/language-servers/efmls-configs-pkgs.nix +++ b/plugins/lsp/language-servers/efmls-configs-pkgs.nix @@ -1,4 +1,8 @@ -lib: { +lib: +let + inherit (import ../../../lib/pkg-lists.nix lib) topLevel scoped; +in +{ # efmls-configs tools that have no corresponding nixpkgs package unpackaged = [ "blade_formatter" @@ -28,20 +32,6 @@ lib: { # Mapping from a efmls-configs tool name to the corresponding nixpkgs package packaged = - let - # TODO: move these helpers to a shared location so that none-ls can also use them - topLevel = names: lib.genAttrs names lib.id; - scoped = lib.concatMapAttrs ( - scope: v: - if builtins.isAttrs v then - lib.mapAttrs (_: loc: [ scope ] ++ loc) (scoped v) - else - lib.genAttrs (lib.toList v) (name: [ - scope - name - ]) - ); - in # Top-level packages topLevel [ "actionlint" diff --git a/plugins/none-ls/packages.nix b/plugins/none-ls/packages.nix index dcbac9e3..f5cb37c9 100644 --- a/plugins/none-ls/packages.nix +++ b/plugins/none-ls/packages.nix @@ -1,4 +1,8 @@ -lib: { +lib: +let + inherit (import ../../lib/pkg-lists.nix lib) topLevel scoped nullAttrs; +in +{ # builtin sources that don't require a package noPackage = [ "gitrebase" @@ -20,7 +24,7 @@ lib: { # nixpkgs packages for a given source packaged = # Top-level packages - lib.genAttrs [ + topLevel [ "actionlint" "alejandra" "asmfmt" @@ -94,29 +98,20 @@ lib: { "yapf" "zprint" "zsh" - ] lib.id + ] # Scoped packages - // - lib.concatMapAttrs - ( - scope: names: - lib.genAttrs names (name: [ - scope - name - ]) - ) - { - nodePackages = [ - "alex" - "prettier" - ]; - phpPackages = [ - "phpmd" - "phpstan" - ]; - rubyPackages = [ "htmlbeautifier" ]; - ocamlPackages = [ "ocamlformat" ]; - } + // scoped { + nodePackages = [ + "alex" + "prettier" + ]; + phpPackages = [ + "phpmd" + "phpstan" + ]; + rubyPackages = "htmlbeautifier"; + ocamlPackages = "ocamlformat"; + } # Packages where the name is different // { ansiblelint = "ansible-lint"; @@ -229,7 +224,7 @@ lib: { xmllint = "libxml2"; } # builtin sources that are not packaged in nixpkgs - // lib.genAttrs [ + // nullAttrs [ "blade_formatter" "bsfmt" "bslint" @@ -268,5 +263,5 @@ lib: { "textlint" "twigcs" "vacuum" - ] (_: null); + ]; }