Use failure and success instead of ok and err

- Adds `isFailure` and `isSuccess`.
- No longer exports `ok`, `err`, `isErr` and `isOk`.
This commit is contained in:
Mark Spanbroek 2021-04-15 09:39:37 +02:00
parent a2023ae18e
commit 86bfcc1a47
2 changed files with 15 additions and 9 deletions

View File

@ -5,7 +5,7 @@ import ./operators
include ./errorban include ./errorban
export resultsbase export resultsbase except ok, err, isOk, isErr
type ResultFailure* = object of CatchableError type ResultFailure* = object of CatchableError
@ -21,16 +21,22 @@ proc failure*(T: type, error: ref CatchableError): ?!T =
proc failure*(T: type, message: string): ?!T = proc failure*(T: type, message: string): ?!T =
T.failure newException(ResultFailure, message) T.failure newException(ResultFailure, message)
proc isSuccess*[T](value: ?!T): bool =
value.isOk
proc isFailure*[T](value: ?!T): bool =
value.isErr
template `->?`*[T,U](value: ?!T, expression: U): ?!U = template `->?`*[T,U](value: ?!T, expression: U): ?!U =
if value.isErr: if value.isFailure:
U.failure(value.error) U.failure(value.error)
else: else:
expression.success expression.success
template `->?`*[T,U,V](values: (?!T, ?!U), expression: V): ?!V = template `->?`*[T,U,V](values: (?!T, ?!U), expression: V): ?!V =
if values[0].isErr: if values[0].isFailure:
V.failure(values[0].error) V.failure(values[0].error)
elif values[1].isErr: elif values[1].isFailure:
V.failure(values[1].error) V.failure(values[1].error)
else: else:
expression.success expression.success
@ -41,19 +47,19 @@ template `|?`*[T](value: ?!T, fallback: T): T =
template `=?`*[T](name: untyped{nkIdent}, expression: ?!T): bool = template `=?`*[T](name: untyped{nkIdent}, expression: ?!T): bool =
let value = expression let value = expression
template name: T {.used.} = value.unsafeGet() template name: T {.used.} = value.unsafeGet()
value.isOk value.isSuccess
macro `=?`*[T](variable: untyped{nkVarTy}, expression: ?!T): bool = macro `=?`*[T](variable: untyped{nkVarTy}, expression: ?!T): bool =
let name = variable[0] let name = variable[0]
quote do: quote do:
let value = `expression` let value = `expression`
var `name` : typeof(value.unsafeGet()) var `name` : typeof(value.unsafeGet())
if value.isOk: if value.isSuccess:
`name` = value.unsafeGet() `name` = value.unsafeGet()
value.isOk value.isSuccess
proc option*[T,E](value: Result[T,E]): ?T = proc option*[T,E](value: Result[T,E]): ?T =
if value.isOk: if value.isSuccess:
value.unsafeGet.some value.unsafeGet.some
else: else:
T.none T.none

View File

@ -180,7 +180,7 @@ suite "result":
let x = parseInt("42").catch let x = parseInt("42").catch
check (x == 42.success) check (x == 42.success)
let y = parseInt("XX").catch let y = parseInt("XX").catch
check y.isErr check y.isFailure
# Conversion to Option # Conversion to Option