scodec игнорирует последнее значение в преобразовании кодека между hlist и case-классом

Я только начинаю с библиотекой "scodec" на уровне: https://github.com/scodec/scodec

Я обнаружил, что я часто использую следующую функцию:

/**
 * When called on a `Codec[L]` for some `L <: HList`, returns a new codec that encodes/decodes
 * `B :: L` but only returns `L`.  HList equivalent of `~>`.
 * @group hlist
 */
def :~>:[B](codec: Codec[B])(implicit ev: Unit =:= B): Codec[L] = codec.dropLeft(self)

Это полезно, если у меня есть класс case, в котором я не хочу использовать каждое значение спецификации:

case class Example(value1: Int, value3)
implicit val exampleCodec: Codec[Example] = (
("value1" | uint8) :: 
("value2" | uint8) :~>: // decode/encode, but dont pass this in when converting from hlist to case class
("value3" | uint8)
).as[Example]

Это хорошо работает, если значение, которое я хочу игнорировать, не является последним в списке. Кто-нибудь знает, как изменить кодек, если бы вместо этого я хотел, чтобы мой класс дел был:

case class Example (value1: Int, value2: Int) // игнорировать значение3

Любая помощь приветствуется - спасибо!

1 ответ

Решение

Вы можете просто использовать <~так что вместо этого:

implicit val exampleCodec: Codec[Example] = (
  ("value1" | uint8) :: 
  ("value2" | uint8).unit(0) :~>:
  ("value3" | uint8)
).as[Example]

Вы бы написали это:

implicit val exampleCodec: Codec[Example] = (
  ("value1" | uint8) :: 
  ("value3" | uint8) <~
  ("value2" | uint8).unit(0)
).as[Example]

Обратите внимание, что вы явно должны сделать кодек Codec[Unit]-Я использую .unit(0) здесь ради примера.

Другие вопросы по тегам