This commit is contained in:
Tanguy 2022-06-20 14:30:51 +02:00
parent 8fbf39a60f
commit f4ada730b8
No known key found for this signature in database
GPG Key ID: 7DD8EC6B6CE6C45E
2 changed files with 16 additions and 18 deletions

View File

@ -1,16 +1,12 @@
import std/options import std/options
import std/macros import std/macros
proc option[T](option: Option[T]): Option[T] = template questionableUnpack*(expression: Option): untyped =
option ## Used internally
proc placeholder(T: type): T =
discard
template unpack*(expression: Option): untyped =
let option = expression let option = expression
type T = typeof(option.unsafeGet()) type T = typeof(option.unsafeGet())
let res = if option.isSome: option.unsafeGet() else: placeholder(T) let res = if option.isSome: option.unsafeGet() else: default(T)
(res, option.isSome) (res, option.isSome)
macro `=?`*(name, expression): bool = macro `=?`*(name, expression): bool =
@ -21,13 +17,13 @@ macro `=?`*(name, expression): bool =
name.expectKind({nnkIdent, nnkVarTy}) name.expectKind({nnkIdent, nnkVarTy})
if name.kind == nnkIdent: if name.kind == nnkIdent:
quote do: quote do:
mixin unpack mixin questionableUnpack
let (`name`, isOk) = unpack(`expression`) let (`name`, isOk) = questionableUnpack(`expression`)
isOk isOk
else: else:
let name = name[0] let name = name[0]
quote do: quote do:
mixin unpack mixin questionableUnpack
var (`name`, isOk) = unpack(`expression`) var (`name`, isOk) = questionableUnpack(`expression`)
isOk isOk

View File

@ -99,13 +99,6 @@ template `|?`*[T,E](value: Result[T,E], fallback: T): T =
value.valueOr(fallback) value.valueOr(fallback)
template unpack*(expression: Result): untyped =
let res = expression
when declared(internalWithoutError):
if res.isFailure:
internalWithoutError = res.error
unpack(res.option)
proc option*[T,E](value: Result[T,E]): ?T = proc option*[T,E](value: Result[T,E]): ?T =
## Converts a Result into an Option. ## Converts a Result into an Option.
@ -117,6 +110,15 @@ proc option*[T,E](value: Result[T,E]): ?T =
else: else:
T.none T.none
template questionableUnpack*(expression: Result): untyped =
## Used internally
let res = expression
when declared(internalWithoutError):
if res.isFailure:
internalWithoutError = res.error
questionableUnpack(res.option)
Result.liftUnary(`-`) Result.liftUnary(`-`)
Result.liftUnary(`+`) Result.liftUnary(`+`)
Result.liftUnary(`@`) Result.liftUnary(`@`)