result_handler 1.3.0 copy "result_handler: ^1.3.0" to clipboard
result_handler: ^1.3.0 copied to clipboard

A simple and powerful library for handling results (successes and failures) in Dart, inspired by Either from functional programming libraries like dartz.

example/result_handler_example.dart

import 'package:result_handler/result_handler.dart';

void main() {
  // Unit Type
  const successNoValue = Success<String, Unit>(Unit());
  print(successNoValue); // Output: Success(Unit())

  // isSuccess / isFailure
  final Result<String, int> successResult = Success(10);
  final Result<String, int> failureResult = Failure("Something went wrong");
  print('successResult.isSuccess: ${successResult.isSuccess}'); // true
  print('successResult.isFailure: ${successResult.isFailure}'); // false
  print('failureResult.isSuccess: ${failureResult.isSuccess}'); // false
  print('failureResult.isFailure: ${failureResult.isFailure}'); // true

  // getOrNull / getErrorOrNull
  print('successResult.getOrNull: ${successResult.getOrNull()}'); // 10
  print(
      'successResult.getErrorOrNull: ${successResult.getErrorOrNull()}'); // null
  print('failureResult.getOrNull: ${failureResult.getOrNull()}'); // null
  print(
      'failureResult.getErrorOrNull: ${failureResult.getErrorOrNull()}'); // Something went wrong

  // tap / tapError
  Success(100)
      .tap((value) =>
          print('Tapped success: $value')) // Prints: Tapped success: 100
      .tapError((err) => print('This should not print'));

  Failure<String, int>("Error 404")
      .tap((value) => print('This should not print'))
      .tapError((err) =>
          print('Tapped error: $err')); // Prints: Tapped error: Error 404

  // orElse
  Result<String, int> recovered =
      Failure<String, int>("Initial Error").orElse((error) {
    print('orElse recovery attempt for: $error');
    return Success(0); // Attempt to recover with a default value
  });
  print('Recovered result: ${recovered.getOrNull()}'); // 0

  Result<String, int> notRecovered = Success<String, int>(5).orElse((error) {
    print('This orElse should not be called');
    return Failure("Should not happen");
  });
  print('Not-recovered result: ${notRecovered.getOrNull()}'); // 5

  // filterOrElse
  Result<String, int> validResult = Success<String, int>(10).filterOrElse(
    (value) => value > 5,
    (value) => "Value $value is not greater than 5",
  );
  print('Valid filter: ${validResult.getOrNull()}'); // 10

  Result<String, int> invalidResult = Success<String, int>(3).filterOrElse(
    (value) => value > 5,
    (value) => "Value $value is not greater than 5",
  );
  print(
      'Invalid filter: ${invalidResult.getErrorOrNull()}'); // Value 3 is not greater than 5

  // Result.tryCatch
  Result<String, int> trySuccess = Result.tryCatch(
    () => int.parse("123"),
    (e, s) => "Parse error: $e",
  );
  print('tryCatch success: ${trySuccess.getOrNull()}'); // 123

  Result<String, int> tryFailure = Result.tryCatch(
    () => int.parse("abc"),
    (e, s) => "Parse error: $e",
  );
  print(
      'tryCatch failure: ${tryFailure.getErrorOrNull()}'); // Parse error: FormatException: abc

  // Result.fromNullable
  Result<String, String> nonNull =
      Result.fromNullable("Hello", () => "Value was null");
  print('fromNullable non-null: ${nonNull.getOrNull()}'); // Hello

  String? nullableValue;
  Result<String, String> isNull =
      Result.fromNullable(nullableValue, () => "Value was null");
  print('fromNullable null: ${isNull.getErrorOrNull()}'); // Value was null

  // zipWith
  final Result<String, int> r1 = Success(10);
  final Result<String, String> r2 = Success(" apples");
  final Result<String, int> r3 = Failure("r3 failed");

  Result<String, String> zipSuccess =
      r1.zipWith(r2, (number, fruit) => "$number$fruit");
  print('zipSuccess: ${zipSuccess.getOrNull()}'); // "10 apples"

  Result<String, String> zipFailure1 =
      r3.zipWith(r2, (number, fruit) => "$number$fruit");
  print('zipFailure1: ${zipFailure1.getErrorOrNull()}'); // "r3 failed"

  Result<String, String> zipFailure2 = r1.zipWith(
      Failure<String, String>("r2 failed"), (number, fruit) => "$number$fruit");
  print('zipFailure2: ${zipFailure2.getErrorOrNull()}'); // "r2 failed"

  // Result.sequence
  final list1 = <Result<String, int>>[Success(1), Success(2), Success(3)];
  final seq1 = Result.sequence(list1);
  seq1.when(
    success: (data) => print('Sequence 1 success: $data'), // [1, 2, 3]
    failure: (error) => print('Sequence 1 failure: $error'),
  );

  final list2 = <Result<String, int>>[
    Success(1),
    Failure("Error in list"),
    Success(3)
  ];
  final seq2 = Result.sequence(list2);
  seq2.when(
    success: (data) => print('Sequence 2 success: $data'),
    failure: (error) => print('Sequence 2 failure: $error'), // Error in list
  );

  final list3 = <Result<String, int>>[];
  final seq3 = Result.sequence(list3);
  seq3.when(
    success: (data) => print('Sequence 3 success: $data'), // []
    failure: (error) => print('Sequence 3 failure: $error'),
  );
}
2
likes
160
points
44
downloads

Publisher

verified publishermahmoud-saeed.space

Weekly Downloads

A simple and powerful library for handling results (successes and failures) in Dart, inspired by Either from functional programming libraries like dartz.

Homepage
Repository (GitHub)
View/report issues

Topics

#result #success #failure #either #functional-programming

Documentation

API reference

License

MIT (license)

More

Packages that depend on result_handler