Circe: Error de compilación inútil al carecer de codificador/decodificador

Creado en 15 ago. 2015  ·  3Comentarios  ·  Fuente: circe/circe

Si no hay codificación para la fecha, el compilador se queja

 [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

¿Hay alguna posibilidad de mejorar el informe de errores?

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

Comentario más útil

+1 para usar implícitoNotFound!
Para decodificar y codificar la fecha, simplemente implícito

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

Debido a que la fecha tiene muchos formatos, sugiero que la defina en la documentación y no agregue un formato predeterminado en el jfc.

Todos 3 comentarios

Sí, ese es un mensaje de error bastante terrible, gracias por señalarlo.

La implementación del mecanismo de derivación genérica cambiará con el n.º 30, que espero terminar mañana, así que después de que se asiente el polvo, revisaré este y el n.º 34, ya que las cosas podrían ser un poco diferentes para entonces. Deberíamos poder usar @implicitNotFound en algunos lugares para mejorar mucho estos mensajes (ver por ejemplo este mensaje en Finch).

+1 para usar implícitoNotFound!
Para decodificar y codificar la fecha, simplemente implícito

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

Debido a que la fecha tiene muchos formatos, sugiero que la defina en la documentación y no agregue un formato predeterminado en el jfc.

Voy a seguir adelante y cerrar esto ya que lo siguiente es una gran mejora:

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

En realidad, no estoy seguro de que haya mucha información útil adicional que podamos agregar con @implicitNotFound en este caso, además de quizás un puntero a los documentos.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

LukaJCB picture LukaJCB  ·  7Comentarios

calippo picture calippo  ·  3Comentarios

travisbrown picture travisbrown  ·  4Comentarios

aiya000 picture aiya000  ·  3Comentarios

oscar-broman picture oscar-broman  ·  7Comentarios