Кодировщик Circe для общего класса с параметрами по умолчанию - PullRequest
0 голосов
/ 28 января 2019

Я хочу предоставить JSON-кодировщики для следующего класса дел:

import io.circe.generic.extras.Configuration

final case class Hello[T](
    source: String, 
    version: Int = 1,
    data: T
)

object Hello {
  implicit val configuration: Configuration = Configuration.default.withDefaults
}

Я бы обычно вызывал deriveEncoder[A] в сопутствующем объекте, но здесь это не работает, так как нет ссылки илиEncoder для T доступно здесь.

Тип Hello будет предоставлен клиентам в виде библиотеки, поэтому я бы хотел использовать как можно больше шаблонов в этом типе, а не зависеть от кода клиента, предоставляющего кодировщик и декодер.Есть ли идиоматическое решение для этого с circe, чтобы клиенты предоставляли кодер / декодер для T, и это используется для получения кодера / декодера для Hello[T]?

1 Ответ

0 голосов
/ 28 января 2019

Да, вам нужно добавить контекстную границу, требующую наличия неявного кодера для любого типа T:

final case class Hello[T](
  source: String,
  version: Int = 1,
  data: T
)

object Hello {
  implicit def helloEncoder[T: Encoder]: Encoder[Hello[T]] = deriveEncoder
}

, чтобы при создании пользователем собственного типа Hello[Foo] они 'Я должен убедиться, что Foo имеет свой собственный кодер.

...