summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorDmitry Kalinkin <dmitry.kalinkin@gmail.com>2022-01-27 00:54:10 -0500
committerDmitry Kalinkin <dmitry.kalinkin@gmail.com>2022-01-27 00:54:10 -0500
commit0693fd77f772c9b65fe819f383321035323ffd0d (patch)
tree92adbbb6683e7d814d772026355ee5bdc2e44735 /lib
parentb20ad47fa3fe642a15a6a56250af62d19228d051 (diff)
parentb32ed60c942b8b039b25e0a44fea32d58fb894db (diff)
downloadnixpkgs-0693fd77f772c9b65fe819f383321035323ffd0d.tar
nixpkgs-0693fd77f772c9b65fe819f383321035323ffd0d.tar.gz
nixpkgs-0693fd77f772c9b65fe819f383321035323ffd0d.tar.bz2
nixpkgs-0693fd77f772c9b65fe819f383321035323ffd0d.tar.lz
nixpkgs-0693fd77f772c9b65fe819f383321035323ffd0d.tar.xz
nixpkgs-0693fd77f772c9b65fe819f383321035323ffd0d.tar.zst
nixpkgs-0693fd77f772c9b65fe819f383321035323ffd0d.zip
Merge branch 'staging-next' into staging
 Conflicts:
	nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
	nixos/doc/manual/release-notes/rl-2205.section.md
	pkgs/development/python-modules/aioesphomeapi/default.nix
	pkgs/development/python-modules/mat2/default.nix
	pkgs/development/python-modules/pydevccu/default.nix
	pkgs/development/python-modules/pywlroots/default.nix
	pkgs/development/python-modules/rokuecp/default.nix
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