refactor!(subscriptions): remove ?! from callbacks

This commit is contained in:
Mark Spanbroek 2025-09-10 10:29:49 +02:00
parent c4b3130213
commit 248965f7f6
7 changed files with 22 additions and 36 deletions

View File

@ -137,11 +137,8 @@ You can now subscribe to Transfer events by calling `subscribe` on the contract
instance.
```nim
proc handleTransfer(transferResult: ?!Transfer) =
if transferResult.isOk:
echo "received transfer: ", transferResult.value
else:
echo "error during transfer: ", transferResult.error.msg
proc handleTransfer(transferResult: Transfer) =
echo "received transfer: ", transferResult.value
let subscription = await token.subscribe(Transfer, handleTransfer)
```

View File

@ -6,7 +6,7 @@ import ./contract
import ./events
import ./fields
type EventHandler*[E: Event] = proc(event: ?!E) {.gcsafe, raises:[].}
type EventHandler*[E: Event] = proc(event: E) {.gcsafe, raises:[].}
proc subscribe*[E: Event](contract: Contract,
_: type E,
@ -16,13 +16,9 @@ proc subscribe*[E: Event](contract: Contract,
let topic = topic($E, E.fieldTypes).toArray
let filter = EventFilter(address: contract.address, topics: @[topic])
proc logHandler(logResult: ?!Log) {.raises: [].} =
without log =? logResult, error:
handler(failure(E, error))
return
proc logHandler(log: Log) {.raises: [].} =
if event =? E.decode(log.data, log.topics):
handler(success(event))
handler(event)
contract.provider.subscribe(filter, logHandler)

View File

@ -57,8 +57,8 @@ type
effectiveGasPrice*: ?UInt256
status*: TransactionStatus
transactionType* {.serialize("type"), deserialize("type").}: TransactionType
LogHandler* = proc(log: ?!Log) {.gcsafe, raises:[].}
BlockHandler* = proc(blck: ?!Block) {.gcsafe, raises:[].}
LogHandler* = proc(log: Log) {.gcsafe, raises:[].}
BlockHandler* = proc(blck: Block) {.gcsafe, raises:[].}
Topic* = array[32, byte]
Block* {.serialize.} = object
number*: ?BlockNumber
@ -239,8 +239,8 @@ proc confirm*(
let blockEvent = newAsyncEvent()
blockEvent.fire()
proc onBlock(blckResult: ?!Block) =
if blck =? blckResult and number =? blck.number:
proc onBlock(blck: Block) =
if number =? blck.number:
blockNumber = number
blockEvent.fire()

View File

@ -92,11 +92,11 @@ proc processBlock(
return false
let logs = await subscriptions.getLogs(blck)
for handler in subscriptions.blockSubscriptions.values:
handler(success blck)
handler(blck)
for (id, logs) in logs.pairs:
if (_, handler) =? subscriptions.logSubscriptions.?[id]:
for log in logs:
handler(success log)
handler(log)
return true
except ProviderError:
return false

View File

@ -49,7 +49,7 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]:
let oldBlock = !await provider.getBlock(BlockTag.latest)
discard await provider.send("evm_mine")
var newBlock: Block
let blockHandler = proc(blck: ?!Block) {.raises:[].}= newBlock = blck.value
let blockHandler = proc(blck: Block) = newBlock = blck
let subscription = await provider.subscribe(blockHandler)
discard await provider.send("evm_mine")
check eventually newBlock.number.isSome

View File

@ -1,6 +1,5 @@
import std/os
import pkg/asynctest/chronos/unittest
import pkg/serde
import pkg/json_rpc/rpcclient
import pkg/json_rpc/rpcserver
import ethers/providers/jsonrpc
@ -20,8 +19,8 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]:
test "subscribes to new blocks":
var latestBlock: Block
proc callback(blck: ?!Block) =
latestBlock = blck.value
proc callback(blck: Block) =
latestBlock = blck
let subscription = await provider.subscribe(callback)
discard await provider.send("evm_mine")
check eventually latestBlock.number.isSome
@ -31,9 +30,8 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]:
test "stops listening to new blocks when unsubscribed":
var count = 0
proc callback(blck: ?!Block) =
if blck.isOk:
inc count
proc callback(blck: Block) =
inc count
let subscription = await provider.subscribe(callback)
discard await provider.send("evm_mine")
check eventually count > 0
@ -44,16 +42,15 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]:
check count == 0
test "duplicate unsubscribe is harmless":
proc callback(blck: ?!Block) = discard
proc callback(blck: Block) = discard
let subscription = await provider.subscribe(callback)
await subscription.unsubscribe()
await subscription.unsubscribe()
test "stops listening to new blocks when provider is closed":
var count = 0
proc callback(blck: ?!Block) =
if blck.isOk:
inc count
proc callback(blck: Block) =
inc count
discard await provider.subscribe(callback)
discard await provider.send("evm_mine")
check eventually count > 0

View File

@ -157,10 +157,7 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]:
test "receives events when subscribed":
var transfers: seq[Transfer]
proc handleTransfer(transferRes: ?!Transfer) =
without transfer =? transferRes, error:
echo error.msg
proc handleTransfer(transfer: Transfer) =
transfers.add(transfer)
let signer0 = provider.getSigner(accounts[0])
@ -182,9 +179,8 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]:
test "stops receiving events when unsubscribed":
var transfers: seq[Transfer]
proc handleTransfer(transferRes: ?!Transfer) =
if transfer =? transferRes:
transfers.add(transfer)
proc handleTransfer(transfer: Transfer) =
transfers.add(transfer)
let signer0 = provider.getSigner(accounts[0])