query
On this page

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;
        };