Circe: Erro de compilação inútil enquanto falta codificador/decodificador

Criado em 15 ago. 2015  ·  3Comentários  ·  Fonte: circe/circe

Se não houver codificação para a data, o compilador reclamará

 [error] /home/jilen/workspace/jfc-test/src/main/scala/Foo.scala:26: diverging implicit expansion for type io.circe.Encoder.Secondary[this.Out]
[error] starting with method encodeCaseClass in trait GenericInstances

Existe alguma chance de melhorar o relatório de erros?

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

import java.util.Date
case class Foo(
  date: Date,
  number: Int,
  str: String)

object App {

  def encodesDate(fmt: String): Encoder[Date] = new Encoder[Date] {
    def apply(a: Date) = {
      val sdf = new java.text.SimpleDateFormat(fmt)
      Json.string(sdf.format(a))
    }
  }



  def main(args: Array[String])  {
    //implicit val DateEncodes = encodesDate("yyyy-MM-dd HH:mm:ss")
    val f = Foo(new Date, 1, "fff")
    println(f.asJson.noSpaces)
  }
}

Comentários muito úteis

+1 para usar implicitNotFound !
Para decodificar e codificar data, apenas implícita

  implicit val dateTimeEncoder: Encoder[DateTime] = Encoder.instance(a => a.getMillis.asJson)
  implicit val dateTimeDecoder: Decoder[DateTime] = Decoder.instance(a => a.as[Long].map(new DateTime(_)))

Como a data tem muitos formatos, sugiro que a defina na documentação e não adicione um formato padrão no jfc.

Todos 3 comentários

Sim, essa é uma mensagem de erro terrível - obrigado por apontar isso.

A implementação do mecanismo de derivação genérico será alterada com o nº 30, que espero terminar amanhã, então depois que a poeira baixar vou revisitar este e o nº 34, já que as coisas podem estar um pouco diferentes até lá. Devemos ser capazes de usar @implicitNotFound em alguns lugares para melhorar muito essas mensagens (veja por exemplo esta mensagem em Finch).

+1 para usar implicitNotFound !
Para decodificar e codificar data, apenas implícita

  implicit val dateTimeEncoder: Encoder[DateTime] = Encoder.instance(a => a.getMillis.asJson)
  implicit val dateTimeDecoder: Decoder[DateTime] = Decoder.instance(a => a.as[Long].map(new DateTime(_)))

Como a data tem muitos formatos, sugiro que a defina na documentação e não adicione um formato padrão no jfc.

Vou seguir em frente e fechar isso, pois o seguinte é uma grande melhoria:

<console>:59: error: could not find implicit value for parameter e: io.circe.Encoder[Foo]
           println(f.asJson.noSpaces)
                     ^

Na verdade, não tenho certeza se há muitas informações úteis adicionais que poderíamos adicionar com @implicitNotFound neste caso, além de talvez um ponteiro para os documentos.

Esta página foi útil?
0 / 5 - 0 avaliações