In the example below, we have:
- Type:
Either<RangedNumberValueFailuresAbstract<int>, int>
- If No Error:
right(number)
- If Error:
left(RangedNumberValueFailuresAbstract.invalidNumber(failedNumberValue: number))
If we need to access the failedNumberValue in (failedNumberValue: number), how would we do it?
@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));
}
The above uses the following abstract class that uses the Freezed package.
@freezed
@immutable
abstract class RangedNumberValueFailuresAbstract<T> extends ValueFailuresAbstract with _$RangedNumberValueFailuresAbstract<T> {
const factory RangedNumberValueFailuresAbstract.invalidNumber({@required T failedNumberValue}) = InvalidNumber<T>;
}