summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorRobert Hensing <roberth@users.noreply.github.com>2022-01-25 14:13:24 +0100
committerGitHub <noreply@github.com>2022-01-25 14:13:24 +0100
commit8919495cacf6411bde7b9c14bc4a9d12142a7356 (patch)
treeab1e8c88e5374544563eff047b4ba3dedebfeefd /lib
parent25dc5a5d2dca644390f23ad376119d62468bf57b (diff)
parent48dbe26229124114f26cfe0eec32866a47888452 (diff)
downloadnixpkgs-8919495cacf6411bde7b9c14bc4a9d12142a7356.tar
nixpkgs-8919495cacf6411bde7b9c14bc4a9d12142a7356.tar.gz
nixpkgs-8919495cacf6411bde7b9c14bc4a9d12142a7356.tar.bz2
nixpkgs-8919495cacf6411bde7b9c14bc4a9d12142a7356.tar.lz
nixpkgs-8919495cacf6411bde7b9c14bc4a9d12142a7356.tar.xz
nixpkgs-8919495cacf6411bde7b9c14bc4a9d12142a7356.tar.zst
nixpkgs-8919495cacf6411bde7b9c14bc4a9d12142a7356.zip
Merge pull request #156503 from hercules-ci/nixos-add-system.build-options
nixos: Add `system.build.`{`toplevel`,`installBootLoader`}, improve error message
Diffstat (limited to 'lib')
-rw-r--r--lib/default.nix5
-rw-r--r--lib/options.nix12
-rw-r--r--lib/types.nix15
3 files changed, 24 insertions, 8 deletions
diff --git a/lib/default.nix b/lib/default.nix
index 2dfe62e82a8..26842253880 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -122,8 +122,9 @@ let
       mkRenamedOptionModule mkMergedOptionModule mkChangedOptionModule
       mkAliasOptionModule mkDerivedConfig doRename;
     inherit (self.options) isOption mkEnableOption mkSinkUndeclaredOptions
-      mergeDefaultOption mergeOneOption mergeEqualOption getValues
-      getFiles optionAttrSetToDocList optionAttrSetToDocList'
+      mergeDefaultOption mergeOneOption mergeEqualOption mergeUniqueOption
+      getValues getFiles
+      optionAttrSetToDocList optionAttrSetToDocList'
       scrubOptionValue literalExpression literalExample literalDocBook
       showOption showFiles unknownModule mkOption;
     inherit (self.types) isType setType defaultTypeMerge defaultFunctor
diff --git a/lib/options.nix b/lib/options.nix
index 794ca5e3394..627aac24d2f 100644
--- a/lib/options.nix
+++ b/lib/options.nix
@@ -172,11 +172,13 @@ rec {
     else if all isInt list && all (x: x == head list) list then head list
     else throw "Cannot merge definitions of `${showOption loc}'. Definition values:${showDefs defs}";
 
-  mergeOneOption = loc: defs:
-    if defs == [] then abort "This case should never happen."
-    else if length defs != 1 then
-      throw "The unique option `${showOption loc}' is defined multiple times. Definition values:${showDefs defs}"
-    else (head defs).value;
+  mergeOneOption = mergeUniqueOption { message = ""; };
+
+  mergeUniqueOption = { message }: loc: defs:
+    if length defs == 1
+    then (head defs).value
+    else assert length defs > 1;
+      throw "The option `${showOption loc}' is defined multiple times.\n${message}\nDefinition values:${showDefs defs}";
 
   /* "Merge" option definitions by checking that they all have the same value. */
   mergeEqualOption = loc: defs:
diff --git a/lib/types.nix b/lib/types.nix
index cc3ac5fdf6f..f2f9b2bca98 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -32,7 +32,6 @@ let
     last
     length
     tail
-    unique
     ;
   inherit (lib.attrsets)
     attrNames
@@ -48,6 +47,7 @@ let
     mergeDefaultOption
     mergeEqualOption
     mergeOneOption
+    mergeUniqueOption
     showFiles
     showOption
     ;
@@ -470,6 +470,18 @@ rec {
       nestedTypes.elemType = elemType;
     };
 
+    unique = { message }: type: mkOptionType rec {
+      name = "unique";
+      inherit (type) description check;
+      merge = mergeUniqueOption { inherit message; };
+      emptyValue = type.emptyValue;
+      getSubOptions = type.getSubOptions;
+      getSubModules = type.getSubModules;
+      substSubModules = m: uniq (type.substSubModules m);
+      functor = (defaultFunctor name) // { wrapped = type; };
+      nestedTypes.elemType = type;
+    };
+
     # Null or value of ...
     nullOr = elemType: mkOptionType rec {
       name = "nullOr";
@@ -599,6 +611,7 @@ rec {
     # A value from a set of allowed ones.
     enum = values:
       let
+        inherit (lib.lists) unique;
         show = v:
                if builtins.isString v then ''"${v}"''
           else if builtins.isInt v then builtins.toString v