Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,25 @@ void main() {
}
```

#### Handling the Result with `getBoth` (from Dart 3)

Returns a record containing both success and error values,
with one of them being null.
This allows for easy destructuring using Dart 3's record patterns.

```dart
void main() {
final result = getSomethingPretty();
final (:success, :error) = result.getBoth();

if (success != null) {
print('Operation succeeded with: $success');
} else {
print('Operation failed with: $error');
}
}
```

### Transforming a Result

#### Mapping success value with `map`
Expand Down Expand Up @@ -491,7 +510,7 @@ e 🚧 para o que está sendo trabalhado ---->
## Features

- ✅ Result implementation.
- ✅ Result`s operators(map, flatMap, mapError, flatMapError, swap, when, fold, getOrNull, exceptionOrNull, isSuccess, isError).
- ✅ Result`s operators(map, flatMap, mapError, flatMapError, swap, when, fold, getOrNull, exceptionOrNull, isSuccess, isError, getBoth).
- ✅ AsyncResult implementation.
- ✅ AsyncResult`s operators(map, flatMap, mapError, flatMapError, swap, when, fold, getOrNull, exceptionOrNull, isSuccess, isError).
- ✅ Auxiliar functions (id, identity, success, failure).
Expand Down
19 changes: 19 additions & 0 deletions lib/src/result_dart_base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,15 @@ sealed class ResultDart<S extends Object, F extends Object> {
G Function(S success) onSuccess,
W Function(F failure) onFailure,
);

/// Returns a record containing both success and error values,
/// with one of them being null.
///
/// This allows for easy destructuring using Dart 3's record patterns.
///
/// Example:
/// final (:success, :error) = result.getBoth();
({S? success, F? error}) getBoth();
}

/// Success Result.
Expand Down Expand Up @@ -259,6 +268,11 @@ final class Success<S extends Object, F extends Object> //
(f) => Failure(failure),
);
}

@override
({S? success, F? error}) getBoth() {
return (success: _success, error: null);
}
}

/// Error Result.
Expand Down Expand Up @@ -405,4 +419,9 @@ final class Failure<S extends Object, F extends Object> //
(f) => Failure(failure),
);
}

@override
({S? success, F? error}) getBoth() {
return (success: null, error: _failure);
}
}
18 changes: 18 additions & 0 deletions test/src/result_dart_base_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,22 @@ void main() {
expect(result, isA<Success<int, String>>());
expect(result.getOrThrow(), 1);
});
group('getBoth', () {
test('should return a record with success value and null error on Success',
() {
final result = Success<String, Exception>('success');
final (:success, :error) = result.getBoth();
expect(success, 'success');
expect(error, isNull);
});

test('should return a record with null success and error value on Failure',
() {
final exception = Exception('failure');
final result = Failure<String, Exception>(exception);
final (:success, :error) = result.getBoth();
expect(success, isNull);
expect(error, exception);
});
});
}