diff --git a/questionable/results.nim b/questionable/results.nim index b15c8ab..082d2da 100644 --- a/questionable/results.nim +++ b/questionable/results.nim @@ -110,6 +110,14 @@ proc option*[T,E](value: Result[T,E]): ?T = else: T.none +proc errorOption*[T, E](value: Result[T, E]): ?E = + ## Returns an Option that contains the error from the Result, if it has one. + + if value.isErr: + value.error.some + else: + E.none + Result.liftUnary(`-`) Result.liftUnary(`+`) Result.liftUnary(`@`) diff --git a/testmodules/result/test.nim b/testmodules/result/test.nim index a6689e1..d39925d 100644 --- a/testmodules/result/test.nim +++ b/testmodules/result/test.nim @@ -326,6 +326,12 @@ suite "result": check 42.success.option == 42.some check int.failure(error).option == int.none + test "Result error can be converted to Option": + check (int.failure(error).errorOption == error.some) + check (42.success.errorOption == (ref CatchableError).none) + check (void.failure(error).errorOption == error.some) + check (success().errorOption == (ref CatchableError).none) + test "failure can be used without type parameter in procs": proc fails: ?!int = failure "some error"