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
version = "20240114"
version = "20240116"
author = "Emery Hemingway"
description = "data model and serialization format"
license = "Unlicense"

View File

@ -1,7 +1,7 @@
# SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import std/[endians, streams, strutils]
import std/[endians, options, streams, strutils]
import bigints
import ./values
@ -163,15 +163,14 @@ proc feed*[T: byte|char](dec: var BufferedDecoder; data: openarray[T]) =
if data.len > 0:
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
## decoder does not advance.
if dec.appendPosition > 0:
assert(dec.decodePosition < dec.appendPosition)
dec.stream.setPosition(dec.decodePosition)
try:
result[1] = decodePreserves(dec.stream)
result[0] = true
result = dec.stream.decodePreserves.some
dec.decodePosition = dec.stream.getPosition()
if dec.decodePosition == dec.appendPosition:
dec.stream.setPosition(0)

View File

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