change TResult to case type

This commit is contained in:
Jaremy Creechley 2023-08-29 14:14:55 -07:00 committed by Dmitriy Ryajov
parent 485f2ecaed
commit 9e0b976f38
No known key found for this signature in database
GPG Key ID: DA8C680CE7C657A4

View File

@ -26,10 +26,14 @@ type
Error
ThreadResult*[T: DataBuffer | void | bool | ThreadDatastorePtr] = object
state*: ThreadResultKind
signal*: ThreadSignalPtr
value*: T
error*: CatchableErrorBuffer
case state*: ThreadResultKind
of ThreadResultKind.NotReady:
discard
of ThreadResultKind.Success:
value*: T
of ThreadResultKind.Error:
error*: CatchableErrorBuffer
TResult*[T] = SharedPtr[ThreadResult[T]]
@ -50,25 +54,37 @@ proc newThreadResult*[T](
res[].signal = signal.get()
ok res
proc success*[T](ret: TResult[T], value: T) =
{.cast(uncheckedAssign).}:
ret[].state = ThreadResultKind.Success
ret[].value = value
proc success*[T: void](ret: TResult[T]) =
{.cast(uncheckedAssign).}:
ret[].state = ThreadResultKind.Success
proc failure*[T](ret: TResult[T], err: ref CatchableError) =
{.cast(uncheckedAssign).}:
ret[].state = ThreadResultKind.Error
ret[].error = err.toBuffer()
proc hasTask*(
ret: TResult[bool],
tds: ThreadDatastorePtr,
kb: KeyBuffer,
) =
without key =? kb.toKey(), err:
ret[].state = Error
ret.failure(err)
try:
let res = waitFor tds[].ds.has(key)
if res.isErr:
ret[].state = Error
ret[].error = res.error().toBuffer()
ret.failure(res.error())
else:
ret[].state = Success
ret[].value = res.get()
ret.success(res.get())
discard ret[].signal.fireSync()
except CatchableError as err:
ret[].state = Error
ret[].error = err.toBuffer()
ret.failure(err)
proc has*(
ret: TResult[bool],
@ -88,17 +104,14 @@ proc getTask*(
try:
let res = waitFor tds[].ds.get(key)
if res.isErr:
ret[].state = Error
ret[].error = res.error().toBuffer()
ret.failure(res.error())
else:
let db = DataBuffer.new res.get()
ret[].state = Success
ret[].value = db
ret.success(db)
discard ret[].signal.fireSync()
except CatchableError as err:
ret[].state = Error
ret[].error = err.toBuffer()
ret.failure(err)
proc get*(
ret: TResult[DataBuffer],
@ -123,10 +136,9 @@ proc putTask*(
let res = (waitFor tds[].ds.put(key, data)).catch
# print "thrbackend: putTask: fire", ret[].signal.fireSync().get()
if res.isErr:
ret[].state = Error
ret[].error = res.error().toBuffer()
ret.failure(res.error())
else:
ret[].state = Success
ret.success()
discard ret[].signal.fireSync()
@ -154,10 +166,9 @@ proc deleteTask*(
let res = (waitFor tds[].ds.delete(key)).catch
# print "thrbackend: putTask: fire", ret[].signal.fireSync().get()
if res.isErr:
ret[].state = Error
ret[].error = res.error().toBuffer()
ret.failure(res.error())
else:
ret[].state = Success
ret.success()
discard ret[].signal.fireSync()