summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2014-03-05 11:27:07 -0500
committerShea Levy <shea@shealevy.com>2014-03-05 11:28:03 -0500
commitccfc2e441559b2b6639af3472e2215ebbe6c4432 (patch)
tree34fed59e7f7f7f0eb65e0d730ad9a16f77f7ed41
parentAdd mkMap property to the module system (diff)
downloadnixpkgs-gitlab.intr/mkMap.tar.gz
innerMerge: Handle empty definition lists after discharging propertiesorigin/mkMapgitlab.intr/mkMap
-rw-r--r--lib/types.nix35
1 files changed, 22 insertions, 13 deletions
diff --git a/lib/types.nix b/lib/types.nix
index b6ec854399b8..e1493700b8a3 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -10,7 +10,9 @@ with import ./strings.nix;
let
inherit (import ./modules.nix) mergeDefinitions evalModules;
- innerMerge = loc: type: defs: (mergeDefinitions loc type defs).mergedValue;
+ innerMerge = loc: type: defs: let
+ inherit (mergeDefinitions loc type defs) mergedValue defsFinal;
+ in if defsFinal == [] then {} else { value = mergedValue; };
in rec {
isType = type: x: (x._type or "") == type;
@@ -120,10 +122,12 @@ in rec {
value = m.value.f x y;
} ]) l))
(map (d: map (x: []) d.value) nonMaps) maps;
- in concatLists (imap (n: def: imap (m: def':
- innerMerge (loc ++ ["[${toString n}-${toString m}]"]) elemType
- ([{ inherit (def) file; value = def'; }] ++ elemAt (elemAt mapResults (n - 1)) (m - 1))
- ) def.value) nonMaps);
+ in map (getAttr "value") (filter (hasAttr "value") (
+ concatLists (imap (n: def: imap (m: def':
+ innerMerge (loc ++ ["[${toString n}-${toString m}]"]) elemType
+ ([{ inherit (def) file; value = def'; }] ++ elemAt (elemAt mapResults (n - 1)) (m - 1))
+ ) def.value) nonMaps)
+ ));
getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["*"]);
mappable = true;
};
@@ -140,12 +144,14 @@ in rec {
inherit name;
value = map (m: { inherit (m) file; value = m.value.f name; }) maps;
}) names);
- in zipAttrsWith (name: defs:
- innerMerge (loc ++ [name]) elemType (defs ++ getAttr name mapResults)
- )
- # Push down position info.
- (map (def: listToAttrs (mapAttrsToList (n: def':
- { name = n; value = { inherit (def) file; value = def'; }; }) def.value)) nonMaps);
+ in mapAttrs (n: getAttr "value") (filterAttrs (n: hasAttr "value") (
+ zipAttrsWith (name: defs:
+ innerMerge (loc ++ [name]) elemType (defs ++ getAttr name mapResults)
+ )
+ # Push down position info.
+ (map (def: listToAttrs (mapAttrsToList (n: def':
+ { name = n; value = { inherit (def) file; value = def'; }; }) def.value)) nonMaps)
+ ));
getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["<name>"]);
mappable = true;
};
@@ -196,8 +202,11 @@ in rec {
functionTo = elemType: mkOptionType {
name = "function that evaluates to a(n) ${elemType.name}";
check = isFunction;
- merge = loc: defs:
- fnArgs: innerMerge loc elemType (map (fn: { inherit (fn) file; value = fn.value fnArgs; }) defs);
+ merge = loc: defs: fnArgs:
+ (innerMerge loc elemType (map (fn:
+ { inherit (fn) file; value = fn.value fnArgs; }
+ ) defs)).value or (throw
+ "The option `${showOption loc}' is defined as a function that doesn't return any value (using mkIf or mkMerge), in ${showFiles (getFiles defs)}");
getSubOptions = elemType.getSubOptions;
};