代码之家  ›  专栏  ›  技术社区  ›  expert

如何使前缀驱动的编解码器[选项[T]]?

  •  0
  • expert  · 技术社区  · 6 年前

    我正在尝试为psql复制二进制格式实现编解码器。详情见 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)
    

    但要对空值进行编码,它们在长度字段中使用-1。

    你能给我建议一下如何在这种情况下实现编解码器吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   expert    6 年前

    我能想到的最好办法是

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