Как определить значение дискриминатора для кодеков, которые производятся совместно?

Не могли бы вы объяснить, как на самом деле работают побочные продукты? Вот мой код

sealed trait ArdbData

case class ArdbDataString(value: String) extends ArdbData

case class ArdbDataLong(value: Long) extends ArdbData

case class ArdbDataDouble(value: Double) extends ArdbData

object ArdbDataString {
  implicit val codec: Codec[ArdbDataString] = // ... some codec here
  implicit val discriminator: Discriminator[ArdbData, ArdbDataString, Int] = Discriminator(6)
}

object ArdbDataLong {

  implicit val codec: Codec[ArdbDataLong] = // ... some codec here
  implicit val discriminator: Discriminator[ArdbData, ArdbDataLong, Int] = Discriminator(1)
}

object ArdbDataDouble {
  implicit val codec: Codec[ArdbDataDouble] = // ... some codec here
  implicit val discriminator: Discriminator[ArdbData, ArdbDataDouble, Int] = Discriminator(2)
}

object ArdbData {
  implicit val discriminated: Discriminated[ArdbData, Int] = Discriminated(uint8)

  import shapeless.syntax.singleton._

//  implicit val codec: Codec[ArdbData] = Codec.coproduct[ArdbData].discriminatedBy(uint8).using(
//    'ArdbDataString ->> 4 :: 'ArdbDataLong ->> 1 :: 'ArdbDataDouble ->> 2 :: HNil)
}

Я думал, что я должен определить кодек для совместного производства ArdbData как показано в этом тесте. Также мне нужно использовать конкретные идентификаторы для каждого подтипа, который я определил в discriminatedBy.using(), Когда я начал тестировать его, я внезапно нашел ключи от .using не используются. Вместо ID от каждого Discriminator экземпляр используется. Затем я закомментировал Codec.coproduct[ArdbData] и он все еще компилируется! Почему он компилируется? Как правильно определить значение дискриминатора?

0 ответов

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