BufferedDecoder: return Option[Value] from decode

This commit is contained in:
Emery Hemingway 2024-01-16 19:58:25 +02:00
parent aa5c7f4683
commit ba0857c32b
3 changed files with 7 additions and 9 deletions

View File

@ -1,6 +1,6 @@
# Package # Package
version = "20240114" version = "20240116"
author = "Emery Hemingway" author = "Emery Hemingway"
description = "data model and serialization format" description = "data model and serialization format"
license = "Unlicense" license = "Unlicense"

View File

@ -1,7 +1,7 @@
# SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense # SPDX-License-Identifier: Unlicense
import std/[endians, streams, strutils] import std/[endians, options, streams, strutils]
import bigints import bigints
import ./values import ./values
@ -163,15 +163,14 @@ proc feed*[T: byte|char](dec: var BufferedDecoder; data: openarray[T]) =
if data.len > 0: if data.len > 0:
dec.feed(unsafeAddr data[0], data.len) dec.feed(unsafeAddr data[0], data.len)
proc decode*(dec: var BufferedDecoder): (bool, Value) = proc decode*(dec: var BufferedDecoder): Option[Value] =
## Decode from `dec`. If decoding fails the internal position of the ## Decode from `dec`. If decoding fails the internal position of the
## decoder does not advance. ## decoder does not advance.
if dec.appendPosition > 0: if dec.appendPosition > 0:
assert(dec.decodePosition < dec.appendPosition) assert(dec.decodePosition < dec.appendPosition)
dec.stream.setPosition(dec.decodePosition) dec.stream.setPosition(dec.decodePosition)
try: try:
result[1] = decodePreserves(dec.stream) result = dec.stream.decodePreserves.some
result[0] = true
dec.decodePosition = dec.stream.getPosition() dec.decodePosition = dec.stream.getPosition()
if dec.decodePosition == dec.appendPosition: if dec.decodePosition == dec.appendPosition:
dec.stream.setPosition(0) dec.stream.setPosition(0)

View File

@ -1,7 +1,7 @@
# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway # SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense # SPDX-License-Identifier: Unlicense
import std/unittest import std/[options, unittest]
import preserves import preserves
suite "BufferedDecoder": suite "BufferedDecoder":
@ -10,7 +10,6 @@ suite "BufferedDecoder":
var var
buf = newBufferedDecoder() buf = newBufferedDecoder()
pr = Value(kind: pkByteString, bytes: newSeq[byte](23)) pr = Value(kind: pkByteString, bytes: newSeq[byte](23))
ok: bool
for i, _ in pr.bytes: for i, _ in pr.bytes:
pr.bytes[i] = byte(i) pr.bytes[i] = byte(i)
let bin = encode(pr) let bin = encode(pr)
@ -19,5 +18,5 @@ suite "BufferedDecoder":
let j = (i+2) and 0xf let j = (i+2) and 0xf
feed(buf, bin[0..<j]) feed(buf, bin[0..<j])
feed(buf, bin[j..bin.high]) feed(buf, bin[j..bin.high])
(ok, pr) = decode(buf) var v = decode(buf)
assert ok check v.isSome