either
lib.types.either
Docs pulled from | This Revision | about 2 hours ago
Either value of type t1
or t2
.
Noogle detected
Implementation
The following is the current implementation of this function.
either =
t1: t2:
mkOptionType rec {
name = "either";
description =
if t1.descriptionClass or null == "nonRestrictiveClause" then
# Plain, but add comma
"${t1.description}, or ${
optionDescriptionPhrase (class: class == "noun" || class == "conjunction") t2
}"
else
"${optionDescriptionPhrase (class: class == "noun" || class == "conjunction") t1} or ${
optionDescriptionPhrase (
class: class == "noun" || class == "conjunction" || class == "composite"
) t2
}";
descriptionClass = "conjunction";
check = x: t1.check x || t2.check x;
merge = {
__functor =
self: loc: defs:
(self.v2 { inherit loc defs; }).value;
v2 =
{ loc, defs }:
let
t1CheckedAndMerged =
if t1.merge ? v2 then
t1.merge.v2 { inherit loc defs; }
else
{
value = t1.merge loc defs;
headError = checkDefsForError t1.check loc defs;
valueMeta = { };
};
t2CheckedAndMerged =
if t2.merge ? v2 then
t2.merge.v2 { inherit loc defs; }
else
{
value = t2.merge loc defs;
headError = checkDefsForError t2.check loc defs;
valueMeta = { };
};
checkedAndMerged =
if t1CheckedAndMerged.headError == null then
t1CheckedAndMerged
else if t2CheckedAndMerged.headError == null then
t2CheckedAndMerged
else
rec {
valueMeta = {
inherit headError;
};
headError = {
message = "The option `${showOption loc}` is neither a value of type `${t1.description}` nor `${t2.description}`, Definition values: ${showDefs defs}";
};
value = lib.warn ''
One or more definitions did not pass the type-check of the 'either' type.
${headError.message}
If `either`, `oneOf` or similar is used in freeformType, ensure that it is preceded by an 'attrsOf' such as: `freeformType = types.attrsOf (types.either t1 t2)`.
Otherwise consider using the correct type for the option `${showOption loc}`. This will be an error in Nixpkgs 26.06.
'' (mergeOneOption loc defs);
};
in
checkedAndMerged;
};
typeMerge =
f':
let
mt1 = t1.typeMerge (elemAt f'.payload.elemType 0).functor;
mt2 = t2.typeMerge (elemAt f'.payload.elemType 1).functor;
in
if (name == f'.name) && (mt1 != null) && (mt2 != null) then functor.type mt1 mt2 else null;
functor = elemTypeFunctor name {
elemType = [
t1
t2
];
};
nestedTypes.left = t1;
nestedTypes.right = t2;
};