Circe: Erreur de compilation inutile en l'absence d'encodeur/décodeur

Créé le 15 août 2015  ·  3Commentaires  ·  Source: circe/circe

S'il n'y a pas d'encodage pour la date, le compilateur se plaint

 [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

Y a-t-il une possibilité d'améliorer le rapport d'erreur ?

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)
  }
}

Commentaire le plus utile

+1 pour utiliser impliciteNotFound !
Pour décoder et encoder la date, juest implicite

  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(_)))

En raison de la date a de nombreux formats, je suggère de le définir dans la documentation et de ne pas ajouter de format par défaut dans le jfc.

Tous les 3 commentaires

Ouais, c'est un message d'erreur assez terrible - merci de l'avoir signalé.

La mise en œuvre du mécanisme de dérivation générique changera avec le #30, que j'espère terminer demain, donc après que la poussière se soit calmée, je reviendrai sur ce point et sur le #34, car les choses pourraient être un peu différentes d'ici là. Nous devrions pouvoir utiliser @implicitNotFound à quelques endroits pour beaucoup améliorer ces messages (voir par exemple ce message dans Finch).

+1 pour utiliser impliciteNotFound !
Pour décoder et encoder la date, juest implicite

  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(_)))

En raison de la date a de nombreux formats, je suggère de le définir dans la documentation et de ne pas ajouter de format par défaut dans le jfc.

Je vais continuer et fermer ceci car ce qui suit est une énorme amélioration:

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

Je ne suis pas sûr qu'il y ait beaucoup d'informations utiles supplémentaires que nous pourrions ajouter avec @implicitNotFound dans ce cas, à part peut-être un pointeur vers la documentation.

Cette page vous a été utile?
0 / 5 - 0 notes