diff options
Diffstat (limited to 'lib/options.nix')
-rw-r--r-- | lib/options.nix | 28 |
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: |