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)))))))