lib/modules: Move the isDefined check into mergedValue

Without this change, accessing `mergedValue` from `mergeDefinitions` in
case there are no definitions will throw an error like

error: evaluation aborted with the following error message: 'This case should never happen.'

This change makes it throw the appropriate error

error: The option `foo' is used but not defined.

This is fully backwards compatible.

Changed files
+12 -13
lib
+12 -13
lib/modules.nix
···
else
mergeDefinitions loc opt.type defs';
-
-
# The value with a check that it is defined
-
valueDefined = if res.isDefined then res.mergedValue else
-
# (nixos-option detects this specific error message and gives it special
-
# handling. If changed here, please change it there too.)
-
throw "The option `${showOption loc}' is used but not defined.";
-
# Apply the 'apply' function to the merged value. This allows options to
# yield a value computed from the definitions
-
value = if opt ? apply then opt.apply valueDefined else valueDefined;
in opt //
{ value = builtins.addErrorContext "while evaluating the option `${showOption loc}':" value;
···
};
defsFinal = defsFinal'.values;
-
# Type-check the remaining definitions, and merge them.
-
mergedValue = foldl' (res: def:
-
if type.check def.value then res
-
else throw "The option value `${showOption loc}' in `${def.file}' is not of type `${type.description}'.")
-
(type.merge loc defsFinal) defsFinal;
isDefined = defsFinal != [];
···
else
mergeDefinitions loc opt.type defs';
# Apply the 'apply' function to the merged value. This allows options to
# yield a value computed from the definitions
+
value = if opt ? apply then opt.apply res.mergedValue else res.mergedValue;
in opt //
{ value = builtins.addErrorContext "while evaluating the option `${showOption loc}':" value;
···
};
defsFinal = defsFinal'.values;
+
# Type-check the remaining definitions, and merge them. Or throw if no definitions.
+
mergedValue =
+
if isDefined then
+
foldl' (res: def:
+
if type.check def.value then res
+
else throw "The option value `${showOption loc}' in `${def.file}' is not of type `${type.description}'."
+
) (type.merge loc defsFinal) defsFinal
+
else
+
# (nixos-option detects this specific error message and gives it special
+
# handling. If changed here, please change it there too.)
+
throw "The option `${showOption loc}' is used but not defined.";
isDefined = defsFinal != [];