diff --git a/datastore/threadbackend.nim b/datastore/threadbackend.nim index 476ebfe..47c7729 100644 --- a/datastore/threadbackend.nim +++ b/datastore/threadbackend.nim @@ -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()