46 lines
837 B
Nim
46 lines
837 B
Nim
|
import std/sequtils
|
||
|
|
||
|
import pkg/chronos
|
||
|
|
||
|
import pkg/codex/chunker
|
||
|
import pkg/codex/rng
|
||
|
|
||
|
export chunker
|
||
|
|
||
|
type
|
||
|
MockChunker* = Chunker
|
||
|
|
||
|
proc new*(
|
||
|
T: type MockChunker,
|
||
|
dataset: openArray[byte],
|
||
|
chunkSize: int | NBytes,
|
||
|
pad: bool = false
|
||
|
): MockChunker =
|
||
|
## Create a chunker that produces data
|
||
|
##
|
||
|
|
||
|
let
|
||
|
chunkSize = chunkSize.NBytes
|
||
|
dataset = @dataset
|
||
|
|
||
|
var consumed = 0
|
||
|
proc reader(data: ChunkBuffer, len: int): Future[int] {.async, gcsafe, raises: [Defect].} =
|
||
|
|
||
|
if consumed >= dataset.len:
|
||
|
return 0
|
||
|
|
||
|
var read = 0
|
||
|
while read < len and
|
||
|
read < chunkSize.int and
|
||
|
(consumed + read) < dataset.len:
|
||
|
data[read] = dataset[consumed + read]
|
||
|
read.inc
|
||
|
|
||
|
consumed += read
|
||
|
return read
|
||
|
|
||
|
Chunker.new(
|
||
|
reader = reader,
|
||
|
pad = pad,
|
||
|
chunkSize = chunkSize)
|