summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2014-02-11 14:59:24 -0500
committerShea Levy <shea@shealevy.com>2014-02-11 14:59:24 -0500
commit3f70dabad320b115d586a59db8cca05c7f3b7c75 (patch)
treefd1481aa01185ee013cb9f45a94873ee7a788a36 /lib
parent8764758044b0425de54228d87cc68a4ed6d4d414 (diff)
downloadnixlib-3f70dabad320b115d586a59db8cca05c7f3b7c75.tar
nixlib-3f70dabad320b115d586a59db8cca05c7f3b7c75.tar.gz
nixlib-3f70dabad320b115d586a59db8cca05c7f3b7c75.tar.bz2
nixlib-3f70dabad320b115d586a59db8cca05c7f3b7c75.tar.lz
nixlib-3f70dabad320b115d586a59db8cca05c7f3b7c75.tar.xz
nixlib-3f70dabad320b115d586a59db8cca05c7f3b7c75.tar.zst
nixlib-3f70dabad320b115d586a59db8cca05c7f3b7c75.zip
Add heterogeneousAttrsOf option type
It is parameterized by a function that takes a name and evaluates to the
option type for the attribute of that name. Together with
submoduleWithExtraArgs, this subsumes nixosSubmodule.
Diffstat (limited to 'lib')
-rw-r--r--lib/types.nix30
1 files changed, 11 insertions, 19 deletions
diff --git a/lib/types.nix b/lib/types.nix
index 77957a7763ba..e9302688d5c3 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -124,6 +124,17 @@ rec {
       getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["<name>"]);
     };
 
+    heterogeneousAttrsOf = elemTypeFn: mkOptionType {
+      name = "attribute set of values of many types, including ${(elemTypeFn "<name>").name}";
+      check = x: isAttrs x && all (name: (elemTypeFn name).check (getAttr name x)) (attrNames x);
+      merge = loc: defs:
+        zipAttrsWith (name: (elemTypeFn name).merge (loc ++ [name]))
+          # Push down position info.
+          (map (def: listToAttrs (mapAttrsToList (n: def':
+            { name = n; value = { inherit (def) file; value = def'; }; }) def.value)) defs);
+      getSubOptions = prefix: (elemTypeFn "<name>").getSubOptions (prefix ++ ["<name>"]);
+    };
+
     # List or attribute set of ...
     loaOf = elemType:
       let
@@ -198,25 +209,6 @@ rec {
 
     submodule = submoduleWithExtraArgs {};
 
-    nixosSubmodule = nixos: args: mkOptionType rec {
-      name = "submodule containing a NixOS config";
-      check = x: isAttrs x || isFunction x;
-      merge = loc: defs:
-        let
-          coerce = def: if isFunction def then def else { config = def; };
-        in (import (nixos + "/lib/eval-config.nix") (args // {
-          modules = (args.modules or []) ++
-            map (def: { _file = def.file; imports = [(coerce def.value)]; }) defs;
-
-          prefix = loc;
-        })).config;
-      getSubOptions = prefix: (import (nixos + "/lib/eval-config.nix") (args // {
-        modules = (args.modules or []);
-
-        inherit prefix;
-      })).options;
-    };
-
     # Obsolete alternative to configOf.  It takes its option
     # declarations from the ‘options’ attribute of containing option
     # declaration.