postgresqlscalacircedoobie

How to read JSON out of Doobie Scala PostgreSQL Database with Circe?


I've tried creating the below implicit so that I can GET/read data from the postgreSQL database. I've tried add in the recommended implicits but they turn grey and seem to be unused.

implicit val get: Get[JobPostDetails] =
 Get[Json].temap(_.as[JobPostDetails].leftMap(_.show))

  def createTable: doobie.Update0 = {
    sql"""
         |CREATE TABLE IF NOT EXISTS jobs (
         |  id TEXT PRIMARY KEY,
         |  details JSON NOT NULL
         |)
       """.stripMargin
      .update
  }

case class JobPost(id: String, details: JobPostDetails)

case class JobPostDetails(title: String, description: String, salary: Double, employmentType: String, employer: String)

[warn] insecure HTTP request is deprecated 'http://repo.typesafe.com/typesafe/releases/'; switch to HTTPS or opt-in as ("Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/").withAllowInsecureProtocol(true)
[info] Compiling 1 Scala source to /Users/ryanmcavoy/fullStackRyan/job-board/target/scala-2.13/classes ...
[error] /Users/ryanmcavoy/fullStackRyan/job-board/src/main/scala/io/github/jobboard/model/JobPost.scala:31:44: value leftMap is not a member of io.circe.Decoder.Result[io.github.jobboard.model.JobPostDetails]
[error]       Get[Json].temap(_.as[JobPostDetails].leftMap(_.show))
[error]                                            ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 1 s, completed 3 Sep 2020, 16:41:02
sbt:job-board> 


[![enter image description here][1]][1]

[![enter image description here][2]][2]


  [1]: https://i.sstatic.net/PvKHJ.png
  [2]: https://i.sstatic.net/9QPz6.png

Solution

  • Older versions of Scala provided .leftMap to Either (because this is what Circe Result aliases to), which might have been mentioned in the source that you used.

    However, newer versions cleaned up API a bit to they used .left and .right to aggregate many of the methods. So .leftMap became .left.map, but you have also .left.flatMap etc, so that you can use Either easily not only in use cases that align with Either being Right-biased.

    So long story short - replace .leftMap with .left.map in newer versions of Scala.