about summary refs log tree commit diff
path: root/lib/types.nix
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2014-05-01 18:13:06 -0400
committerNicolas B. Pierron <nicolas.b.pierron@gmail.com>2015-03-12 23:42:57 +0100
commit8737d1783f8a8e0c219ec00dd995e8851fd65b3b (patch)
tree01069e3c745d2eec4fa125f6659e0d32c1f2185e /lib/types.nix
parente4bc2592f3c5fa2f05484e7258f99ebb0507d304 (diff)
types.attrsOf: Use mergeDefinitions to handle each element
This simplifes typechecking and allows properties to be used inside of
the attribute sets.

This fixes the empty synergy-client and synergy-server services
previously generated on systems with synergy disabled.
Diffstat (limited to 'lib/types.nix')
-rw-r--r--lib/types.nix10
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/types.nix b/lib/types.nix
index 58fb05b9f0e50..a5b9d59e30ffa 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -126,12 +126,16 @@ in rec {
 
     attrsOf = elemType: mkOptionType {
       name = "attribute set of ${elemType.name}s";
-      check = x: isAttrs x && all elemType.check (attrValues x);
+      check = isAttrs;
       merge = loc: defs:
-        zipAttrsWith (name: elemType.merge (loc ++ [name]))
+        mapAttrs (n: v: v.value) (filterAttrs (n: v: v ? value) (zipAttrsWith (name: defs:
+          let
+            inherit (mergeDefinitions (loc ++ [name]) elemType defs)
+              defsFinal mergedValue;
+          in if defsFinal == [] then {} else { value = mergedValue; })
           # Push down position info.
           (map (def: listToAttrs (mapAttrsToList (n: def':
-            { name = n; value = { inherit (def) file; value = def'; }; }) def.value)) defs);
+            { name = n; value = { inherit (def) file; value = def'; }; }) def.value)) defs)));
       getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["<name>"]);
       getSubModules = elemType.getSubModules;
       substSubModules = m: attrsOf (elemType.substSubModules m);