Skip to content

Latest commit

 

History

History
143 lines (112 loc) · 4.43 KB

Circe.md

File metadata and controls

143 lines (112 loc) · 4.43 KB

Circe module

First import the Circe environment and copy the debug code(link) to your project.

package net.scalax.ohNoMyCirce.test

import java.util.{ Calendar, Date }

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

object TestCirce {

  case class Wrap(id: Long, cal: Calendar, model: Model)
  case class Model(id: Long, name: String, age: Int, describe: String, time: Date)

  //The code will be written here later

}

Then insert the code to the place of the comment.

val wrap: Wrap = ???
wrap.asJson

Oh, no!

[info] compiling 1 Scala source to E:\pro\workspace\ohNoMyCirce\target\scala-2.13\test-classes ...
[error] E:\pro\workspace\ohNoMyCirce\src\test\scala\net\scalax\ohNoMyCirce\test\TestCirce.scala:23:8: could not find implicit value for parameter encoder: io.circe.Encoder[net.scalax.ohNoMyCirce.test.TestCirce.Wrap]
[error]   wrap.asJson
[error]        ^
[error] one error found
[error] (Test / compileIncremental) Compilation failed

And then start debugging.

val wrap: Wrap = ???

val encoderDebugger: TypeClassDebugger[Encoder] = TypeClassDebugger[Encoder]
encoderDebugger.debug[Wrap].count.message

wrap.asJson

Error messages:

[error] E:\pro\workspace\ohNoMyCirce\src\test\scala\net\scalax\ohNoMyCirce\test\TestJson.scala:22:37: could not find implicit value for parameter encoder: io.circe.Encoder[java.util.Calendar]
[error]   encoderDebugger.debug[Wrap].count.message
[error]                                     ^
[error] E:\pro\workspace\ohNoMyCirce\src\test\scala\net\scalax\ohNoMyCirce\test\TestJson.scala:24:8: could not find implicit value for parameter encoder: io.circe.Encoder[net.scalax.ohNoMyCirce.test.TestCirce.Wrap]
[error]   wrap.asJson
[error]        ^
[error] two errors found
[error] (Test / compileIncremental) Compilation failed

Next:

val wrap: Wrap = ???
implicit def i1: Encoder[Calendar] = ???

val encoderDebugger: TypeClassDebugger[Encoder] = TypeClassDebugger[Encoder]
encoderDebugger.debug[Wrap].count.message

wrap.asJson

Error messages:

[error] E:\pro\workspace\ohNoMyCirce\src\test\scala\net\scalax\ohNoMyCirce\test\TestJson.scala:22:37: could not find implicit value for parameter encoder: io.circe.Encoder[net.scalax.ohNoMyCirce.test.TestCirce.Model]
[error]   encoderDebugger.debug[Wrap].count.message
[error]                                     ^
[error] E:\pro\workspace\ohNoMyCirce\src\test\scala\net\scalax\ohNoMyCirce\test\TestJson.scala:24:8: could not find implicit value for parameter encoder: io.circe.Encoder[net.scalax.ohNoMyCirce.test.TestCirce.Wrap]
[error]   wrap.asJson
[error]        ^
[error] two errors found
[error] (Test / compileIncremental) Compilation failed

Next:

val wrap: Wrap = ???
implicit def i1: Encoder[Calendar] = ???

val encoderDebugger: TypeClassDebugger[Encoder] = TypeClassDebugger[Encoder]
encoderDebugger.debug[Model].count.message //type parameter changed

wrap.asJson

Error messages:

[error] E:\pro\workspace\ohNoMyCirce\src\test\scala\net\scalax\ohNoMyCirce\test\TestJson.scala:23:38: could not find implicit value for parameter encoder: io.circe.Encoder[java.util.Date]
[error]   encoderDebugger.debug[Model].count.message
[error]                                      ^
[error] E:\pro\workspace\ohNoMyCirce\src\test\scala\net\scalax\ohNoMyCirce\test\TestJson.scala:24:8: could not find implicit value for parameter encoder: io.circe.Encoder[net.scalax.ohNoMyCirce.test.TestCirce.Wrap]
[error]   wrap.asJson
[error]        ^
[error] two errors found
[error] (Test / compileIncremental) Compilation failed

Next:

val wrap: Wrap = ???
implicit def i1: Encoder[Calendar] = ???
implicit def i2: Encoder[Date] = ???

val encoderDebugger: TypeClassDebugger[Encoder] = TypeClassDebugger[Encoder]
encoderDebugger.debug[Model].count.message //type parameter changed

wrap.asJson

Oh, yes.

[info] Done compiling.

Remove the debug code.

By changing

val encoderDebugger: TypeClassDebugger[Encoder] = TypeClassDebugger[Encoder]

to

val decoderDebugger: TypeClassDebugger[Decoder] = TypeClassDebugger[Decoder]

you can debug io.circe.Decoder similarly.

Yes, it can debug play-json and many other type class based case class generic.

The final version of the code above is here.