BufferedDecoder: return Option[Value] from decode
This commit is contained in:
parent
aa5c7f4683
commit
ba0857c32b
|
@ -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"
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue