···
···
# definition values and locations (e.g. [ { file = "/foo.nix";
# value = 1; } { file = "/bar.nix"; value = 2 } ]).
merge ? mergeDefaultOption,
209
+
# This field does not have a default implementation, so that users' changes
210
+
# to `check` and `merge` are propagated.
211
+
checkAndMerge ? null,
# Whether this type has a value representing nothingness. If it does,
# this should be a value of the form { value = <the nothing value>; }
# If it doesn't, this should be {}
···
if functor ? wrappedDeprecationMessage then
···
descriptionClass = "composite";
714
+
merge = loc: defs: (checkAndMerge loc defs).value;
711
-
filter (x: x ? value) (
718
+
evals = filter (x: x.optionalValue ? value) (
···
736
+
value = map (x: x.optionalValue.value or x.mergedValue) evals;
737
+
valueMeta.list = map (v: v.checkedAndMerged.valueMeta) evals;
···
743
-
list = addCheck (types.listOf elemType) (l: l != [ ]);
754
+
list = types.listOf elemType;
747
-
description = "non-empty ${optionDescriptionPhrase (class: class == "noun") list}";
748
-
emptyValue = { }; # no .value attr, meaning unset
749
-
substSubModules = m: nonEmptyListOf (elemType.substSubModules m);
759
+
description = "non-empty ${optionDescriptionPhrase (class: class == "noun") list}";
760
+
emptyValue = { }; # no .value attr, meaning unset
761
+
substSubModules = m: nonEmptyListOf (elemType.substSubModules m);
attrsOf = elemType: attrsWith { inherit elemType; };
···
name = if lazy then "lazyAttrsOf" else "attrsOf";
(if lazy then "lazy attribute set" else "attribute set")
+ " of ${optionDescriptionPhrase (class: class == "noun" || class == "composite") elemType}";
descriptionClass = "composite";
814
-
# Lazy merge Function
820
-
merged = mergeDefinitions (loc ++ [ name ]) elemType defs;
821
-
# mergedValue will trigger an appropriate error when accessed
823
-
merged.optionalValue.value or elemType.emptyValue.value or merged.mergedValue
825
-
# Push down position info.
826
-
(pushPositions defs)
830
-
# Non-lazy merge Function
832
-
mapAttrs (n: v: v.value) (
833
-
filterAttrs (n: v: v ? value) (
834
-
zipAttrsWith (name: defs: (mergeDefinitions (loc ++ [ name ]) elemType (defs)).optionalValue)
835
-
# Push down position info.
836
-
(pushPositions defs)
824
+
merge = loc: defs: (checkAndMerge loc defs).value;
830
+
zipAttrsWith (name: defs: mergeDefinitions (loc ++ [ name ]) elemType defs) (pushPositions defs)
832
+
# Filtering makes the merge function more strict
833
+
# Meaning it is less lazy
834
+
filterAttrs (n: v: v.optionalValue ? value) (
835
+
zipAttrsWith (name: defs: mergeDefinitions (loc ++ [ name ]) elemType defs) (pushPositions defs)
842
+
v.optionalValue.value or elemType.emptyValue.value or v.mergedValue
844
+
v.optionalValue.value
846
+
valueMeta.attrs = mapAttrs (n: v: v.checkedAndMerged.valueMeta) evals;
···
modules = [ { _module.args.name = last loc; } ] ++ allModules defs;
1251
+
configuration = base.extendModules {
1252
+
modules = [ { _module.args.name = last loc; } ] ++ allModules defs;
1257
+
value = configuration.config;
1258
+
valueMeta = configuration;
···
nestedTypes.coercedType = coercedType;
nestedTypes.finalType = finalType;
Augment the given type with an additional type check function.
···
Fixing is not trivial, we appreciate any help!
1462
-
addCheck = elemType: check: elemType // { check = x: elemType.check x && check x; };
1488
+
check = x: elemType.check x && check x;
1490
+
// (lib.optionalAttrs (elemType.checkAndMerge != null) {
1494
+
v = (elemType.checkAndMerge loc defs);
1496
+
if all (def: elemType.check def.value && check def.value) defs then
1500
+
allInvalid = filter (def: !elemType.check def.value || !check def.value) defs;
1502
+
throw "A definition for option `${showOption loc}' is not of type `${elemType.description}'. Definition values:${showDefs allInvalid}";