Как получить доступ к неудачному значению из любого?

В приведенном ниже примере:

  • Тип: Either<RangedNumberValueFailuresAbstract<int>, int>
  • Если нет ошибки: right(number)
  • Если ошибка: left(RangedNumberValueFailuresAbstract.invalidNumber(failedNumberValue: number))

Если нам нужно получить доступ к failedNumberValue в (failedNumberValue: number), как бы мы это сделали?

Пример:

    @immutable
    class RangedNumberValueObjectLibrary extends ValueObjectAbstract {
      factory RangedNumberValueObjectLibrary({@required int number}) {
        var validatedNumber = RangedNumberValueValidationLibrary.validate(number: number);

        return RangedNumberValueObjectLibrary._(value: validatedNumber);
      }

      @protected
      RangedNumberValueObjectLibrary._({@required value}) : super.private(value: value);
    }
    @immutable
    class RangedNumberValueValidationLibrary extends ValueValidationAbstract {
      @protected
      static const _minimum = 2;
      @protected
      static const _maximum = 4;

      static Either<RangedNumberValueFailuresAbstract<int>, int> validate({@required int number}) => _minimum <= number && number <= _maximum ? right(number) : left(RangedNumberValueFailuresAbstract.invalidNumber(failedNumberValue: number));
    }

Вышеупомянутый использует следующий абстрактный класс, который использует пакет Freezed.

    @freezed
    @immutable
    abstract class RangedNumberValueFailuresAbstract<T> extends ValueFailuresAbstract with _$RangedNumberValueFailuresAbstract<T> {
      const factory RangedNumberValueFailuresAbstract.invalidNumber({@required T failedNumberValue}) = InvalidNumber<T>;
    }

1 ответ

Полный пример с модульными тестами можно найти здесь.

Если углубиться в модульные тесты, они выполняются двумя разными способами:

Либо модульный тест с использованием структуры тестовых случаев, используя результаты слева и справа

Либо модульный тест с использованием инфраструктуры тестовых случаев, используя failedNumberValue для результатов Left

В последнем случае доступ к failedNumberValue осуществляется следующим образом:

    final actual = testClass.getValue.fold(
      (l) => (l as RangedNumberValueFailuresAbstract).failedNumberValue,
      (r) => r,
    );
Другие вопросы по тегам