lib/modules: add nested 'headError.message'

This should make headError extensible other information needs to be passed
This seems to improve performance slightly

Changed files
+6 -4
lib
+1 -1
lib/modules.nix
···
# check and merge share the same closure
# .headError is either non-present null or an error describing string
if checkedAndMerged.headError or null != null then
-
throw "A definition for option `${showOption loc}' is not of type `${type.description}'. TypeError: ${checkedAndMerged.headError}"
+
throw "A definition for option `${showOption loc}' is not of type `${type.description}'. TypeError: ${checkedAndMerged.headError.message}"
else
checkedAndMerged.value
else if all (def: type.check def.value) defsFinal then
+5 -3
lib/types.nix
···
let
invalidDefs = filter (def: !check def.value) defs;
in
-
if invalidDefs != [ ] then "Definition values: ${showDefs invalidDefs}" else null;
+
if invalidDefs != [ ] then { message = "Definition values: ${showDefs invalidDefs}"; } else null;
outer_types = rec {
isType = type: x: (x._type or "") == type;
···
valueMeta = {
inherit headError;
};
-
headError = "The option `${showOption loc}` is neither a value of type `${t1.description}` nor `${t2.description}`, Definition values: ${showDefs defs}";
-
value = null;
+
headError = {
+
message = "The option `${showOption loc}` is neither a value of type `${t1.description}` nor `${t2.description}`, Definition values: ${showDefs defs}";
+
};
+
value = abort "(t.merge.v2 defs).value must only be accessed when `.headError == null`. This is a bug in code that consumes a module system type.";
};
in
checkedAndMerged;