libp2p-dht/libp2pdht/dht/value_encoding.nim

98 lines
2.0 KiB
Nim

import
../discv5/[node],
libp2p/protobuf/minprotobuf,
./value_messages
func getField(pb: ProtoBuffer, field: int,
nid: var NodeId): ProtoResult[bool] {.inline.} =
## Read ``NodeId`` from ProtoBuf's message and validate it
var buffer: seq[byte]
let res = ? pb.getField(field, buffer)
if not(res):
ok(false)
else:
nid = readUintBE[256](buffer)
ok(true)
func write(pb: var ProtoBuffer, field: int, nid: NodeId) =
## Write NodeId value ``nodeid`` to object ``pb`` using ProtoBuf's encoding.
write(pb, field, nid.toBytesBE())
proc decode*(
T: typedesc[AddValueMessage],
buffer: openArray[byte]): Result[AddValueMessage, ProtoError] =
let pb = initProtoBuffer(buffer)
var msg = AddValueMessage()
? pb.getRequiredField(1, msg.cId)
? pb.getRequiredField(2, msg.value)
ok(msg)
proc encode*(msg: AddValueMessage): seq[byte] =
var pb = initProtoBuffer()
pb.write(1, msg.cId)
pb.write(2, msg.value)
pb.finish()
pb.buffer
proc decode*(
T: typedesc[GetValueMessage],
buffer: openArray[byte]): Result[GetValueMessage, ProtoError] =
let pb = initProtoBuffer(buffer)
var msg = GetValueMessage()
? pb.getRequiredField(1, msg.cId)
ok(msg)
proc encode*(msg: GetValueMessage): seq[byte] =
var pb = initProtoBuffer()
pb.write(1, msg.cId)
pb.finish()
pb.buffer
proc decode*(
T: typedesc[ValueMessage],
buffer: openArray[byte]): Result[ValueMessage, ProtoError] =
let pb = initProtoBuffer(buffer)
var msg = ValueMessage()
? pb.getRequiredField(1, msg.value)
ok(msg)
proc encode*(msg: ValueMessage): seq[byte] =
var pb = initProtoBuffer()
pb.write(1, msg.value)
pb.finish()
pb.buffer
proc decode*(
T: typedesc[FindValueMessage],
buffer: openArray[byte]): Result[FindValueMessage, ProtoError] =
let pb = initProtoBuffer(buffer)
var msg = FindValueMessage()
? pb.getRequiredField(1, msg.cId)
ok(msg)
proc encode*(msg: FindValueMessage): seq[byte] =
var pb = initProtoBuffer()
pb.write(1, msg.cId)
pb.finish()
pb.buffer