使用带scodec的嵌套case类

时间:2015-04-12 03:31:05

标签: 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 个答案:

答案 0 :(得分:2)

我明白了。您需要使用Codec,而不是HList。这有效:

object Bar {
  //Foo.codec instead of Foo.baseCodec
  val baseCodec = uint8 :: Foo.codec :: uint16
  val codec = baseCodec.as[Bar]
}