如何制作由前缀驱动的Codec [Option [T]]?

时间:2018-06-09 21:59:22

标签: scala scodec

我正在尝试为PSQL COPY BINARY格式实现编解码器。详细信息位于Tuple section

Int,Bool,字符串字段编码为<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]]?

1 个答案:

答案 0 :(得分:0)

我能想到的最好的是

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