From 1ad83adc9df257e4b5507c73f0d17abfdd534419 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Mon, 8 Mar 2021 17:48:07 +0100 Subject: [PATCH] Convert Result to Option --- Readme.md | 8 ++++++++ questionable/results.nim | 7 +++++++ testmodules/result/test.nim | 5 +++++ 3 files changed, 20 insertions(+) diff --git a/Readme.md b/Readme.md index 11d8a88..93e0848 100644 --- a/Readme.md +++ b/Readme.md @@ -179,6 +179,14 @@ let x = parseInt("42").catch # equals 42.success let y = parseInt("XX").catch # equals int.failure(..) ``` +### Conversion to Option + +Any Result can be converted to an Option: + +```nim +let converted = works().toOption # equals @[1, 1, 2, 2, 2].some +``` + Banning Errors -------------- diff --git a/questionable/results.nim b/questionable/results.nim index fee6acc..98eaf86 100644 --- a/questionable/results.nim +++ b/questionable/results.nim @@ -1,3 +1,4 @@ +import ./options import ./resultsbase include ./errorban @@ -27,6 +28,12 @@ template `=?`*[T](name: untyped{nkIdent}, value: ?!T): bool = template name: T {.used.} = value.unsafeGet() value.isOk +proc toOption*[T,E](value: Result[T,E]): ?T = + if value.isOk: + value.unsafeGet.some + else: + T.none + template liftUnary(_: type Result, operator: untyped) = template `operator`*(a: ?!typed): ?!typed = diff --git a/testmodules/result/test.nim b/testmodules/result/test.nim index e91f1a5..630a7c5 100644 --- a/testmodules/result/test.nim +++ b/testmodules/result/test.nim @@ -1,6 +1,7 @@ import std/unittest import std/sequtils import std/strutils +import pkg/questionable import pkg/questionable/results suite "result": @@ -94,6 +95,10 @@ suite "result": check (40.success >= 42 == false.success) check (40.success > 42 == false.success) + test "Result can be converted to Option": + check 42.success.toOption == 42.some + check int.failure(error).toOption == int.none + test "examples from readme work": proc works: ?!seq[int] =