summary refs log tree commit diff
path: root/lib/types.nix
diff options
context:
space:
mode:
authorJan Malakhovski <oxij@oxij.org>2015-08-17 17:55:35 +0000
committerJan Malakhovski <oxij@oxij.org>2015-09-18 18:48:49 +0000
commit33ae3f2fe4baeb4db19d3c90dbb6cd35b9373004 (patch)
tree3315c48510babeec50d8ca84acb41689546e7acd /lib/types.nix
parentc8ea6c07c655ba70cf46c52063276bfcfa5b1643 (diff)
downloadnixpkgs-33ae3f2fe4baeb4db19d3c90dbb6cd35b9373004.tar
nixpkgs-33ae3f2fe4baeb4db19d3c90dbb6cd35b9373004.tar.gz
nixpkgs-33ae3f2fe4baeb4db19d3c90dbb6cd35b9373004.tar.bz2
nixpkgs-33ae3f2fe4baeb4db19d3c90dbb6cd35b9373004.tar.lz
nixpkgs-33ae3f2fe4baeb4db19d3c90dbb6cd35b9373004.tar.xz
nixpkgs-33ae3f2fe4baeb4db19d3c90dbb6cd35b9373004.tar.zst
nixpkgs-33ae3f2fe4baeb4db19d3c90dbb6cd35b9373004.zip
nixos,lib: move environment generation related copy-paste to lib
Diffstat (limited to 'lib/types.nix')
-rw-r--r--lib/types.nix19
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/types.nix b/lib/types.nix
index a7f9bf1946e..7276f9af9fe 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -6,7 +6,7 @@ with import ./attrsets.nix;
 with import ./options.nix;
 with import ./trivial.nix;
 with import ./strings.nix;
-with {inherit (import ./modules.nix) mergeDefinitions; };
+with {inherit (import ./modules.nix) mergeDefinitions filterOverrides; };
 
 rec {
 
@@ -166,6 +166,23 @@ rec {
         substSubModules = m: loaOf (elemType.substSubModules m);
       };
 
+    # List or element of ...
+    loeOf = elemType: mkOptionType {
+      name = "element or list of ${elemType.name}s";
+      check = x: isList x || elemType.check x;
+      merge = loc: defs:
+        let
+          defs' = filterOverrides defs;
+          res = (head defs').value;
+        in
+        if isList res then concatLists (getValues defs')
+        else if lessThan 1 (length defs') then
+          throw "The option `${showOption loc}' is defined multiple times, in ${showFiles (getFiles defs)}."
+        else if !isString res then
+          throw "The option `${showOption loc}' does not have a string value, in ${showFiles (getFiles defs)}."
+        else res;
+    };
+
     uniq = elemType: mkOptionType {
       inherit (elemType) name check;
       merge = mergeOneOption;