diff options
| author | Robert Hensing <roberth@users.noreply.github.com> | 2022-05-17 22:22:21 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-17 22:22:21 +0200 |
| commit | 2d1a34b8cc4a28adcdb97fb2872e303a9b8ded57 (patch) | |
| tree | 50a07eef12927168c31e66b3cb81553c7fc84d2d /lib | |
| parent | Merge pull request #173293 from MayNiklas/patch-5 (diff) | |
| parent | nixosOptionsDoc: refactor (diff) | |
| download | nixpkgs-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-x | lib/tests/modules.sh | 2 | ||||
| -rw-r--r-- | lib/tests/modules/functionTo/submodule-options.nix | 61 | ||||
| -rw-r--r-- | lib/types.nix | 4 |
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. |
