summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRobert Hensing <roberth@users.noreply.github.com>2022-05-17 22:22:21 +0200
committerGitHub <noreply@github.com>2022-05-17 22:22:21 +0200
commit2d1a34b8cc4a28adcdb97fb2872e303a9b8ded57 (patch)
tree50a07eef12927168c31e66b3cb81553c7fc84d2d /lib
parentMerge pull request #173293 from MayNiklas/patch-5 (diff)
parentnixosOptionsDoc: refactor (diff)
downloadnixpkgs-2d1a34b8cc4a28adcdb97fb2872e303a9b8ded57.tar.gz
Merge pull request #172813 from hercules-ci/functionTo-properly
`lib.types.functionTo` type merging and docs
Diffstat (limited to 'lib')
-rwxr-xr-xlib/tests/modules.sh2
-rw-r--r--lib/tests/modules/functionTo/submodule-options.nix61
-rw-r--r--lib/types.nix4
3 files changed, 66 insertions, 1 deletions
diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh
index 82d3dd96e88b..487fcd93641b 100755
--- a/lib/tests/modules.sh
+++ b/lib/tests/modules.sh
@@ -290,6 +290,8 @@ checkConfigOutput '^"a b"$' config.result ./functionTo/merging-list.nix
checkConfigError 'A definition for option .fun.\[function body\]. is not of type .string.. Definition values:\n\s*- In .*wrong-type.nix' config.result ./functionTo/wrong-type.nix
checkConfigOutput '^"b a"$' config.result ./functionTo/list-order.nix
checkConfigOutput '^"a c"$' config.result ./functionTo/merging-attrs.nix
+checkConfigOutput '^"a bee"$' config.result ./functionTo/submodule-options.nix
+checkConfigOutput '^"fun.\[function body\].a fun.\[function body\].b"$' config.optionsResult ./functionTo/submodule-options.nix
# moduleType
checkConfigOutput '^"a b"$' config.resultFoo ./declare-variants.nix ./define-variant.nix
diff --git a/lib/tests/modules/functionTo/submodule-options.nix b/lib/tests/modules/functionTo/submodule-options.nix
new file mode 100644
index 000000000000..b884892efd6a
--- /dev/null
+++ b/lib/tests/modules/functionTo/submodule-options.nix
@@ -0,0 +1,61 @@
+{ lib, config, options, ... }:
+let
+ inherit (lib) types;
+in
+{
+ imports = [
+
+ # fun.<function-body>.a
+ ({ ... }: {
+ options = {
+ fun = lib.mkOption {
+ type = types.functionTo (types.submodule {
+ options.a = lib.mkOption { default = "a"; };
+ });
+ };
+ };
+ })
+
+ # fun.<function-body>.b
+ ({ ... }: {
+ options = {
+ fun = lib.mkOption {
+ type = types.functionTo (types.submodule {
+ options.b = lib.mkOption { default = "b"; };
+ });
+ };
+ };
+ })
+ ];
+
+ options = {
+ result = lib.mkOption
+ {
+ type = types.str;
+ default = lib.concatStringsSep " " (lib.attrValues (config.fun (throw "shouldn't use input param")));
+ };
+
+ optionsResult = lib.mkOption
+ {
+ type = types.str;
+ default = lib.concatStringsSep " "
+ (lib.concatLists
+ (lib.mapAttrsToList
+ (k: v:
+ if k == "_module"
+ then [ ]
+ else [ (lib.showOption v.loc) ]
+ )
+ (
+ (options.fun.type.getSubOptions [ "fun" ])
+ )
+ )
+ );
+ };
+ };
+
+ config.fun = lib.mkMerge
+ [
+ (input: { b = "bee"; })
+ ];
+}
diff --git a/lib/types.nix b/lib/types.nix
index e4b3f358d1c9..2590d3e8710b 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -526,9 +526,11 @@ rec {
check = isFunction;
merge = loc: defs:
fnArgs: (mergeDefinitions (loc ++ [ "[function body]" ]) elemType (map (fn: { inherit (fn) file; value = fn.value fnArgs; }) defs)).mergedValue;
- getSubOptions = elemType.getSubOptions;
+ getSubOptions = prefix: elemType.getSubOptions (prefix ++ [ "[function body]" ]);
getSubModules = elemType.getSubModules;
substSubModules = m: functionTo (elemType.substSubModules m);
+ functor = (defaultFunctor "functionTo") // { wrapped = elemType; };
+ nestedTypes.elemType = elemType;
};
# A submodule (like typed attribute set). See NixOS manual.