Case class generator

With the help of magnolia, we can instantiate codecs for case classes as velocypack objects (VPackDecoder.gen), or arrays (VPackGeneric) :

import avokka.velocypack._
import scodec.bits._

case class Test(b: Boolean)
implicit val testEncoder: VPackEncoder[Test] = VPackEncoder.derived
// testEncoder: VPackEncoder[Test] = avokka.velocypack.VPackEncoderDerivation$$anon$1@5e57f945
implicit val testDecoder: VPackDecoder[Test] = VPackDecoder.derived
// testDecoder: VPackDecoder[Test] = avokka.velocypack.VPackDecoderDerivation$$Lambda$14954/0x0000000103dcb040@4219dba

Encoding :

val t = Test(true)
// t: Test = Test(true)

t.toVPack      
// res0: VPack = VObject(Map(b -> VTrue))      
t.toVPackBits
// res1: Either[VPackError, BitVector] = Right(BitVector(56 bits, 0x0b070141621a03))

Decoding :

hex"0b070141621903".bits.asVPack[Test]
// res2: Either[VPackError, DecodeResult[Test]] = Right(DecodeResult(Test(false),BitVector(empty)))
hex"0a".bits.asVPack[Test]                                                                                         
// res3: Either[VPackError, DecodeResult[Test]] = Left(avokka.velocypack.VPackError$ObjectFieldAbsent: object field absent b)

Using defaults :

case class TestTrue(b: Boolean = true)                

implicit val testTrueDecoder: VPackDecoder[TestTrue] = VPackDecoder.derived
// testTrueDecoder: VPackDecoder[TestTrue] = avokka.velocypack.VPackDecoderDerivation$$Lambda$14954/0x0000000103dcb040@42c71b17

hex"0b070141621903".bits.asVPack[TestTrue]            
// res4: Either[VPackError, DecodeResult[TestTrue]] = Right(DecodeResult(TestTrue(false),BitVector(empty)))            
hex"0a".bits.asVPack[TestTrue]                                                                                                         
// res5: Either[VPackError, DecodeResult[TestTrue]] = Right(DecodeResult(TestTrue(true),BitVector(empty)))

Automatic encoder and decoder derivation :

case class Element(name: String, value: Int) derives VPackEncoder

case class Group(elements: Vector[Element]) derives VPackEncoder

Group(Vector(Element("a", 1), Element("b", 2))).toVPack
// res6: VPack = VObject(Map(elements -> VArray(Vector(VObject(Map(name -> VString(a), value -> VSmallint(1))), VObject(Map(name -> VString(b), value -> VSmallint(2)))))))