Использование вложенных классов case с scodec

При определении моих сообщений с помощью scodec я хотел бы использовать вложенные классы case. Например:

case class Foo(x: Int, y: Int)
object Foo {
  def baseCodec = uint16 :: uint16
  def codec = baseCodec.as[Foo]
}

case class Bar(a: Int, foo: Foo, b: Int)
object Bar {
  val baseCodec = uint8 :: Foo.baseCodec :: uint16
  val codec = baseCodec.as[Bar]
}

Тем не менее, при попытке скомпилировать это я получаю следующее:

 error: Could not prove that shapeless.::[Int,shapeless.::[shapeless.::[Int,shapeless.::[Int,shapeless.HNil]],shapeless.::[Int,shapeless.HNil]]] can be converted to/from Bar.
         val codec = baseCodec.as[Bar]
                                 ^

Есть ли способ сделать это? (В моем реальном коде иногда вложенный класс case появляется в начале списка параметров содержащего класса, иногда в середине, а иногда в конце).

1 ответ

Решение

Я понял. Вам нужно использовать кодек, а не HList. Это работает:

object Bar {
  //Foo.codec instead of Foo.baseCodec
  val baseCodec = uint8 :: Foo.codec :: uint16
  val codec = baseCodec.as[Bar]
}
Другие вопросы по тегам