简体   繁体   English

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

[英]How do I make Codec[Option[T]] that is driven by prefix?

I'm trying to implement codec for PSQL COPY BINARY format. 我正在尝试为PSQL COPY BINARY格式实现编解码器。 Details are at Tuple section 详细信息在元组部分

Int, Bool, String fields are encoded as <4 byte length><var length payload> Int,Bool,String字段编码为<4 byte length><var length payload>

I implemented them like this 我这样实现它们

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)

But to encode NULL they use -1 in length field. 但是要对NULL编码,他们在长度字段中使用-1。

Could you please suggest how I can implement Codec[Option[T]] for such situation ? 您能否建议在这种情况下如何实现Codec [Option [T]]?

The best I could come up with is 我能想到的最好的是

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM