mirror of
https://github.com/logos-storage/logos-storage-nim.git
synced 2026-01-03 05:53:07 +00:00
49 lines
973 B
Nim
49 lines
973 B
Nim
import std/sequtils
|
|
|
|
import pkg/chronos
|
|
|
|
import pkg/codex/chunker
|
|
import pkg/codex/rng
|
|
|
|
export chunker
|
|
|
|
type RandomChunker* = Chunker
|
|
|
|
proc new*(
|
|
T: type RandomChunker,
|
|
rng: Rng,
|
|
chunkSize: int | NBytes,
|
|
size: int | NBytes,
|
|
pad = false,
|
|
): RandomChunker =
|
|
## Create a chunker that produces random data
|
|
##
|
|
|
|
let
|
|
size = size.int
|
|
chunkSize = chunkSize.NBytes
|
|
|
|
var consumed = 0
|
|
proc reader(
|
|
data: ChunkBuffer, len: int
|
|
): Future[int] {.async: (raises: [ChunkerError, CancelledError]), gcsafe.} =
|
|
var alpha = toSeq(byte('A') .. byte('z'))
|
|
|
|
if consumed >= size:
|
|
return 0
|
|
|
|
var read = 0
|
|
while read < len and (pad or read < size - consumed):
|
|
rng.shuffle(alpha)
|
|
for a in alpha:
|
|
if read >= len or (not pad and read >= size - consumed):
|
|
break
|
|
|
|
data[read] = a
|
|
read.inc
|
|
|
|
consumed += read
|
|
return read
|
|
|
|
Chunker.new(reader = reader, pad = pad, chunkSize = chunkSize)
|