Как мне сделать кодек [Option [T]], управляемый префиксом? - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь реализовать кодек для формата 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.

Не могли бы вы подсказать, как я могу реализовать кодек [Option [T]] для такой ситуации?

1 Ответ

0 голосов
/ 11 июня 2018

Лучшее, что я мог придумать, это

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)
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...