Как мне сделать кодек [Option[T]], управляемый префиксом?
Я пытаюсь реализовать кодек для формата PSQL COPY BINARY. Подробности в разделе Tuple
Поля 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]] для такой ситуации?
1 ответ
Решение
Лучшее, что я мог придумать, это
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)
})