From 8737d1783f8a8e0c219ec00dd995e8851fd65b3b Mon Sep 17 00:00:00 2001 From: Shea Levy Date: Thu, 1 May 2014 18:13:06 -0400 Subject: [PATCH] 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. --- lib/types.nix | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/types.nix b/lib/types.nix index 58fb05b9f0e..a5b9d59e30f 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 ++ [""]); getSubModules = elemType.getSubModules; substSubModules = m: attrsOf (elemType.substSubModules m);