fluent_result

pub package codecov likes style: lint Dart

fluent_result is a lightweight Dart library developed to solve a common problem. It returns an object indicating success or failure of an operation instead of throwing/using exceptions.

Usage

Simple Non-Generic Result

Result result = Result.success();
Result result = Result.fail(ResultError('a fail reason'));
Result result = Result.withErrorMessage('a fail reason');
Result result = Result.withException(MyException('exception description'));

Generic Result

ResultOf<MyObject> result = ResultOf.success(MyObject());
MyObject value = result.value;
ResultOf<MyObject> result = ResultOf.fail<MyObject>(ResultError('a fail reason'));
MyObject value = result.value;
Result result = ResultOf.withErrorMessage<MyObject>('a fail reason');
Result result = ResultOf.withException(MyException<MyObject>('exception description'));

Converting Result to another

To convert one success result to another success result has to be provided a valueConverter

final anotherResult =
    result.toResult(valueConverter: (customer) => User(customer.id));

To convert one fail result to another fail result

final anotherResult = failResult.toResult<Customer>();

Custom errors

To make your codebase more robust. Create your own error collection of the App by extending ResultError.
ResultError has key property which you can use for localization.


class InvalidPasswordError extends ResultError {
  const InvalidPasswordError(String message)
      : super(message, key: 'InvalidPasswordError');
}

class CustomerNotFound extends ResultError {
  const CustomerNotFound({
    required this.customerId,
  }) : super('Customer not found with ID $customerId');

  final int customerId;

  @override
  String toString() => message;
}

Collect errors

For example, easy to work with errors which comes from HTTP API.

final err1 = CustomerNotFound(customerId: 1);
final res = Result.fail(err1);

final err2 = InvalidPasswordError('The password 123456 is invalid');
res.add(err2);

res.contains<InvalidPasswordError>(); // true
res.get<InvalidPasswordError>().should.not.beNull();

Contributing

We accept the following contributions:

  • Improving documentation
  • Reporting issues
  • Fixing bugs

Maintainers

Libraries

fluent_result