only_results 1.0.2 copy "only_results: ^1.0.2" to clipboard
only_results: ^1.0.2 copied to clipboard

A dart implementation of Rusts Result type

This package is yet another Rust like Result implementation. There are already several others and they are basically all the same. This isn't much different. Just pick one you like.

Features #

The Features include the basic functions you would expect:

  • expect
  • unwrap
  • unwrapOr
  • unwrapOrElse
  • andThen
  • orElse

These functions also exist as extension Functions for Futures of Results for Convenience reasons.

One thing that is special about this implementation, is that you can use the andThen and orElse functions to convert a result to a slightly different one. This can be usefull wenn you have multiple function calls in one function that return different Results. For more details on that have a look at the examples.

Getting started #

import "package:only_results/only_results.dart";

var result = Result.catchErrors(() => unsafeFunction());

switch(result) {
    case Ok(:void value): 
        print("it worked =)");
    case Err(:Object error): 
        print("=( $error");
}

Usage #

To use this library you just have to import it into your project and define the return type of your functions according to your needs.


void main() {
    var a = 42;
    var b = 10;
    switch(divide(a, b)) {
        case Ok(:int value): 
            print("$a / $b = $value");
        case Err(:String error):
            print("ERROR: $error");
    }
}

Result<int, String> divide(int a, int b) {
    if(b == 0) {
        return Err("divison by zero is not allowed");
    }
    return Ok(a ~/ b);
}

Just handle the Happy Path #

If you have for example written a function, that you know will, given your specific input, always return an Ok of something, you can use either unwrap or expect.

void main() {
    var result = someFunction("Hallo Welt");

    int value = result.unwrap();
    int value2 = result.expect("Exception Text if result is an Error")
    int value3 = result.unwrapOr(42);
}

Result<int, String> someFunction(String value) {
    ...
}

Handle the Result with andThen / orElse #

As you have already seen you can use a switch-statement to handle the Result object. But you can also use the andThen and orElse function to chain multiple actions together.

void main() {
    fn1("Hallo Welt").andThen(fn2).orElse(errHandler);
    fn1("Hallo Welt").andThen((okValue) => Ok(okValue / 2));
}

Result<int, String> fn1(String str) {
    ...
}

Result<int, String> fn2(int i) {
    ...
}

Result<int, String> errHandler(String str) {
    ...
}

You can also use those functions to convert a result to another type of result.

Result<int, String> findFirst(List<String> words, String word) {
  return Result.catchErrors(() => words.firstWhere((it) => it == word))
    .orElse((Object error) => Err(error.toString()));
}

Additional information #

If you want to see more examples, have a look at the tests.

4
likes
140
pub points
3%
popularity

Publisher

unverified uploader

A dart implementation of Rusts Result type

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

More

Packages that depend on only_results