From e4bc2592f3c5fa2f05484e7258f99ebb0507d304 Mon Sep 17 00:00:00 2001 From: Shea Levy Date: Thu, 1 May 2014 17:58:16 -0400 Subject: [PATCH] types.listOf: Use mergeDefinitions to handle each element This simplifies typechecking and allows properties to be used inside the lists --- lib/types.nix | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/types.nix b/lib/types.nix index 1e7abf36535f..58fb05b9f0e5 100644 --- a/lib/types.nix +++ b/lib/types.nix @@ -7,7 +7,9 @@ with import ./options.nix; with import ./trivial.nix; with import ./strings.nix; -rec { +let + inherit (import ./modules.nix) mergeDefinitions; +in rec { isType = type: x: (x._type or "") == type; @@ -109,11 +111,14 @@ rec { listOf = elemType: mkOptionType { name = "list of ${elemType.name}s"; - check = value: isList value && all elemType.check value; + check = isList; merge = loc: defs: - concatLists (imap (n: def: imap (m: def': - elemType.merge (loc ++ ["[${toString n}-${toString m}]"]) - [{ inherit (def) file; value = def'; }]) def.value) defs); + map (x: x.value) (filter (x: x ? value) (concatLists (imap (n: def: imap (m: def': + let + inherit (mergeDefinitions (loc ++ ["[definition ${toString n}-entry ${toString m}]"]) + elemType [{ inherit (def) file; value = def'; }] + ) defsFinal mergedValue; + in if defsFinal == [] then {} else { value = mergedValue; }) def.value) defs))); getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["*"]); getSubModules = elemType.getSubModules; substSubModules = m: listOf (elemType.substSubModules m);