adding lookup procs to make error handling a bit simpler

This commit is contained in:
Jaremy Creechley 2023-08-01 17:50:52 -07:00
parent 7efa9177df
commit b80a715993
No known key found for this signature in database
GPG Key ID: 4E66FB67B21D3300
3 changed files with 52 additions and 50 deletions

View File

@ -14,7 +14,7 @@ import pkg/upraises
push: {.upraises: [].}
import pkg/libp2p/[cid, multicodec]
import pkg/libp2p/[cid, multicodec, multihash]
import pkg/stew/byteutils
import pkg/questionable
import pkg/questionable/results
@ -37,11 +37,10 @@ type
cid*: Cid
data*: seq[byte]
template EmptyCid*: untyped =
var
EmptyCid {.global, threadvar.}:
array[CIDv0..CIDv1, Table[MultiCodec, Cid]]
var
EmptyCid {.threadvar.}: array[CIDv0..CIDv1, Table[MultiCodec, Cid]]
template emptyCid*(version: CidVersion, codex: MultiCodec): ?!Cid =
once:
EmptyCid = [
CIDv0: {
@ -56,55 +55,61 @@ template EmptyCid*: untyped =
}.toTable,
]
EmptyCid
try:
success EmptyCid[version][codex]
except CatchableError as exc:
err(exc)
template EmptyDigests*: untyped =
var
EmptyDigests {.global, threadvar.}:
array[CIDv0..CIDv1, Table[MultiCodec, MultiHash]]
var
EmptyDigests {.threadvar.}: array[CIDv0..CIDv1, Table[MultiCodec, MultiHash]]
proc emptyDigest*(version: CidVersion, codex: MultiCodec): ?!MultiHash =
once:
EmptyDigests = [
CIDv0: {
multiCodec("sha2-256"): EmptyCid[CIDv0]
.catch
.get()[multiCodec("sha2-256")]
.catch
.get()
.mhash
.get()
}.toTable,
CIDv1: {
multiCodec("sha2-256"): EmptyCid[CIDv1]
.catch
.get()[multiCodec("sha2-256")]
.catch
.get()
.mhash
.get()
}.toTable,
]
CIDv0: {
multiCodec("sha2-256"): EmptyCid[CIDv0]
.catch
.get()[multiCodec("sha2-256")]
.catch
.get()
.mhash
.get()
}.toTable,
CIDv1: {
multiCodec("sha2-256"): EmptyCid[CIDv1]
.catch
.get()[multiCodec("sha2-256")]
.catch
.get()
.mhash
.get()
}.toTable,
]
EmptyDigests
try:
success EmptyDigests[version][codex]
except CatchableError as exc:
err(exc)
template EmptyBlock*: untyped =
var
EmptyBlock {.global, threadvar.}:
array[CIDv0..CIDv1, Table[MultiCodec, Block]]
var
EmptyBlock {.threadvar.}: array[CIDv0..CIDv1, Table[MultiCodec, Block]]
proc emptyBlock*(version: CidVersion, codex: MultiCodec): ?!Block =
once:
let cid = ? EmptyCid[CIDv0].catch
let sha2 = ? cid[multiCodec("sha2-256")].catch
let blk = Block(cid: sha2)
EmptyBlock = [
CIDv0: {
multiCodec("sha2-256"): Block(
cid: EmptyCid[CIDv0][multiCodec("sha2-256")])
}.toTable,
CIDv1: {
multiCodec("sha2-256"): Block(
cid: EmptyCid[CIDv1][multiCodec("sha2-256")])
}.toTable,
CIDv0: { multiCodec("sha2-256"): blk }.toTable,
CIDv1: { multiCodec("sha2-256"): blk }.toTable,
]
EmptyBlock
try:
success EmptyBlock[version][codex]
except CatchableError as exc:
err(exc)
proc isEmpty*(cid: Cid): bool =
cid == EmptyCid[cid.cidver]

View File

@ -190,7 +190,7 @@ proc makeRoot*(self: Manifest): ?!void =
stack.add(mh)
if stack.len == 1:
let digest = ? EmptyDigests[self.version][self.hcodec].catch
let digest = ? emptyDigest(self.version, self.hcodec)
let cid = ? Cid.init(self.version, self.codec, digest).mapFailure
self.rootHash = cid.some
@ -266,11 +266,7 @@ proc new*(
if i < manifest.len:
self.blocks[i] = manifest[i]
else:
self.blocks[i] = EmptyCid[manifest.version]
.catch
.get()[manifest.hcodec]
.catch
.get()
self.blocks[i] = emptyCid(manifest.version, manifest.hcodec).get()
? self.verify()
self.success

View File

@ -63,6 +63,7 @@ else:
# ("-fno-asynchronous-unwind-tables" breaks Nim's exception raising, sometimes)
switch("passC", "-mno-avx512vl")
--gc:orc
--tlsEmulation:off
--threads:on
--opt:speed
@ -70,7 +71,7 @@ else:
# enable metric collection
--define:metrics
# for heap-usage-by-instance-type metrics and object base-type strings
--define:nimTypeNames
# --define:nimTypeNames
--styleCheck:usages
--styleCheck:error