Кодирование / декодирование бесформенных записей с помощью Circe

Обновление Circe с 0.4.1 до 0.7.0 сломало следующий код:

import shapeless._
import syntax.singleton._
import io.circe.generic.auto._

.run[Record.`'transaction_id -> Int`.T](transport)

def run[A](transport: Json => Future[Json])(implicit decoder: Decoder[A], exec: ExecutionContext): Future[A]

Со следующей ошибкой:

 could not find implicit value for parameter decoder: io.circe.Decoder[shapeless.::[Int with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("transaction_id")],Int],shapeless.HNil]]
[error]       .run[Record.`'transaction_id -> Int`.T](transport)
[error]                                              ^

Я пропускаю какой-то импорт или эти кодеры / декодеры больше не доступны в circe?

1 ответ

Решение

Экземпляры для списков, записей и т. Д. Shapeless были перенесены в отдельный модуль circe-shape в выпуске circe 0.6.0. Если вы добавите этот модуль в вашу сборку, следующее должно просто работать:

import io.circe.jawn.decode, io.circe.shapes._
import shapeless._, record.Record, syntax.singleton._

val doc = """{ "transaction_id": 1 }"""

val res = decode[Record.`'transaction_id -> Int`.T](doc)

Мотивация для перемещения этих экземпляров заключалась в том, что улучшенный обобщенный деривация, введенный в 0.6, означал, что они больше не нужны, а сохранение их вне неявной области действия, когда они не нужны, является более чистым и потенциально поддерживает более быстрое время компиляции. Новый модуль circe-shape также включает функции, которые не были доступны в circe-generic, такие как экземпляры для сопутствующих продуктов.

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