如何制作由前缀驱动的 Codec[Option[T]]?
How do I make Codec[Option[T]] that is driven by prefix?
我正在尝试为 PSQL COPY BINARY 格式实现编解码器。详情见 Tuple section
Int、Bool、String 字段编码为 <4 byte length><var length payload>
我是这样实现的
val psqlUtf8: Codec[String] = variableSizeBytes(int32, utf8)
val psqlBool: Codec[Boolean] = variableSizeBytes(int32, byte).xmap[Boolean](_ == 1, v ⇒ if (v) 1 else 0)
val psqlInt: Codec[Int] = variableSizeBytes(int32, int32)
但是为了对 NULL 进行编码,他们在长度字段中使用了 -1。
你能建议我如何在这种情况下实现 Codec[Option[T]] 吗?
我能想到的最好的是
def psqlNullable[T](codec: Codec[T]): Codec[Option[T]] =
fallback(constant(-1), codec).xmap[Option[T]]({
case Left(_) ⇒ None
case Right(v) ⇒ Some(v)
}, {
case None ⇒ Left(())
case Some(v) ⇒ Right(v)
})
我正在尝试为 PSQL COPY BINARY 格式实现编解码器。详情见 Tuple section
Int、Bool、String 字段编码为 <4 byte length><var length payload>
我是这样实现的
val psqlUtf8: Codec[String] = variableSizeBytes(int32, utf8)
val psqlBool: Codec[Boolean] = variableSizeBytes(int32, byte).xmap[Boolean](_ == 1, v ⇒ if (v) 1 else 0)
val psqlInt: Codec[Int] = variableSizeBytes(int32, int32)
但是为了对 NULL 进行编码,他们在长度字段中使用了 -1。
你能建议我如何在这种情况下实现 Codec[Option[T]] 吗?
我能想到的最好的是
def psqlNullable[T](codec: Codec[T]): Codec[Option[T]] =
fallback(constant(-1), codec).xmap[Option[T]]({
case Left(_) ⇒ None
case Right(v) ⇒ Some(v)
}, {
case None ⇒ Left(())
case Some(v) ⇒ Right(v)
})