Scodec: Coproducts не смог найти неявное значение для параметра auto: scodec.codecs.CoproductBuilderAuto

Я пытаюсь определить кодек-код Scodec для связи с EELink GPS.

Вот код:

import scodec.Codec
import scodec.bits.ByteVector
import scodec.codecs._

trait Message
object Message {
  implicit val discriminated: Discriminated[ Message, Int ] = Discriminated(uint8)
  val codec: Codec[ Message ] = Codec.coproduct[ Message ].discriminatedByIndex(uint8)
}

case class GpsId(value: ByteVector)
object GpsId {
  val codec = bytes(8).as[ GpsId ]
}

case class SerialNumber(value: Int)
object SerialNumber {
  val codec = uint16.as[ SerialNumber ]
}

case class Header(protocolNumber: Int, length: Int, serial: SerialNumber)
object Header {
  val codec = (uint8 :: uint16 :: SerialNumber.codec).as[ Header ]
}

case class Login(header: Header, id: GpsId, language: Int) extends Message
object Login {
  val protocolNumber = 0x01
  implicit val discriminator: Discriminator[ Message, Login, Int ] = Discriminator(protocolNumber)
  implicit val codec: Codec[Login] = (Header.codec :: GpsId.codec :: uint8).as[ Login ]
}

Я получаю следующее:

Error:(14, 48) could not find implicit value for parameter auto: scodec.codecs.CoproductBuilderAuto[com.tecnoguru.ridespark.gps.eelink.messages.Message]
  val codec: Codec[ Message ] = Codec.coproduct[ Message ].discriminatedByIndex(uint8)
                                           ^

Я посмотрел на Scodec - Coproducts не смог найти неявное значение для параметра auto: scodec.codecs.CoproductBuilderAuto, но это не помогло, насколько я вижу, я правильно определяю кодек и дискриминатор.

Я работаю на Scala 2.11.5 с scodec-core 1.7.0 и scodec-bits 1.0.5

1 ответ

Решение

Код, который там сейчас, нуждается в двух небольших изменениях:

  1. Message черта должна быть sealedили иначе Shapeless не обеспечит Generic.Aux[Message, SomeCoproduct] пример.
  2. Призыв к Codec.coproduct[Message] должно быть после того, как все подтипы определены. Перемещение спутника в конец файла достаточно.

С этими двумя изменениями пример успешно компилируется.

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