40 lines
1.1 KiB
Dart
40 lines
1.1 KiB
Dart
/// Einfaches Ergebnis-Typ für erwartbare Fehler (kein zusätzliches Paket).
|
|
sealed class Result<T, E> {
|
|
const Result();
|
|
|
|
const factory Result.success(T value) = Success<T, E>;
|
|
const factory Result.failure(E error) = Failure<T, E>;
|
|
|
|
bool get isSuccess => this is Success<T, E>;
|
|
bool get isFailure => this is Failure<T, E>;
|
|
|
|
/// Wert bei Erfolg, sonst `null`.
|
|
T? get valueOrNull => switch (this) {
|
|
Success<T, E>(:final value) => value,
|
|
Failure<T, E>() => null,
|
|
};
|
|
|
|
/// Fehler bei Misserfolg, sonst `null`.
|
|
E? get errorOrNull => switch (this) {
|
|
Success<T, E>() => null,
|
|
Failure<T, E>(:final error) => error,
|
|
};
|
|
|
|
R when<R>({
|
|
required R Function(T value) success,
|
|
required R Function(E error) failure,
|
|
}) => switch (this) {
|
|
Success<T, E>(:final value) => success(value),
|
|
Failure<T, E>(:final error) => failure(error),
|
|
};
|
|
}
|
|
|
|
final class Success<T, E> extends Result<T, E> {
|
|
const Success(this.value);
|
|
final T value;
|
|
}
|
|
|
|
final class Failure<T, E> extends Result<T, E> {
|
|
const Failure(this.error);
|
|
final E error;
|
|
}
|