Как мне сделать кодек [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)
  })
Другие вопросы по тегам