summaryrefslogtreecommitdiffstats
path: root/lib/options.nix
diff options
context:
space:
mode:
Diffstat (limited to 'lib/options.nix')
-rw-r--r--lib/options.nix28
1 files changed, 23 insertions, 5 deletions
diff --git a/lib/options.nix b/lib/options.nix
index f5012848b05a..0d1d90efe217 100644
--- a/lib/options.nix
+++ b/lib/options.nix
@@ -254,13 +254,31 @@ 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}";
+ /*
+ Require a single definition.
+
+ WARNING: Does not perform nested checks, as this does not run the merge function!
+ */
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 while it's expected to be unique.\n${message}\nDefinition values:${showDefs defs}\n${prioritySuggestion}";
+ /*
+ Require a single definition.
+
+ NOTE: When the type is not checked completely by check, pass a merge function for further checking (of sub-attributes, etc).
+ */
+ mergeUniqueOption = args@{
+ message,
+ # WARNING: the default merge function assumes that the definition is a valid (option) value. You MUST pass a merge function if the return value needs to be
+ # - type checked beyond what .check does (which should be very litte; only on the value head; not attribute values, etc)
+ # - if you want attribute values to be checked, or list items
+ # - if you want coercedTo-like behavior to work
+ merge ? loc: defs: (head defs).value }:
+ loc: defs:
+ if length defs == 1
+ then merge loc defs
+ else
+ assert length defs > 1;
+ throw "The option `${showOption loc}' is defined multiple times while it's expected to be unique.\n${message}\nDefinition values:${showDefs defs}\n${prioritySuggestion}";
/* "Merge" option definitions by checking that they all have the same value. */
mergeEqualOption = loc: defs: