Skip to content

Instantly share code, notes, and snippets.

@matfournier
Created September 16, 2019 05:31
Show Gist options
  • Save matfournier/50b040f23dcadf11fb5b7b16f283bbaa to your computer and use it in GitHub Desktop.
Save matfournier/50b040f23dcadf11fb5b7b16f283bbaa to your computer and use it in GitHub Desktop.
refinedDecoder
package mf.refined
import eu.timepit.refined.auto._
import eu.timepit.refined._
import eu.timepit.refined.api.{Refined, RefType}
import eu.timepit.refined.collection._
import eu.timepit.refined.numeric._
import io.circe._, io.circe.generic.semiauto._
import io.circe.syntax._
import cats.implicits._
import cats.syntax.either
import io.circe.{ Decoder, Encoder }
import io.circe.parser.decode
case class UserName(val name: String Refined NonEmpty, val age: Int Refined Positive)
case class SimpleUserName(val name: String, val age: Int)
case object UserName {
// implicit val userNameDecoder: Decoder[UserName] = deriveDecoder[UserName]
// implicit val userNameEncoder: Encoder[UserName] = deriveEncoder[UserName]
implicit val userDecoder: Decoder[UserName] = (hc: HCursor) => {
val nameDecoder = hc.downField("name").as[String]
.flatMap(s => refineV[NonEmpty](s).leftMap(m => DecodingFailure(m, List())))
val ageDecoder = hc.downField("age").as[Int]
.flatMap(i => refineV[Positive](i).leftMap(m => DecodingFailure(m, List())))
for {
n <- nameDecoder
age <- ageDecoder
} yield UserName(n, age)
}
}
case object SimpleUserName {
implicit val simpleUserDecoder: Decoder[SimpleUserName] = (hc: HCursor) => {
val nameDecoder = hc.downField("name").as[String]
val ageDecoder = hc.downField("age").as[Int]
for {
n <- nameDecoder
age <- ageDecoder
} yield SimpleUserName(n, age)
}
}
object Scratch extends App {
val mat = UserName("mat", 24)
// val badmat = UserName("", 24)
// val badmatage = UserName("mat", -4)
val goodJson: String = """
{
"name": "mat",
"age": 7
}
"""
val badJson: String = """
{
"name": "",
"age": 7
}
"""
val badAgeJson: String = """
{
"name": "mat",
"age": -4
}
"""
println(jawn.decode[UserName](goodJson))
println(jawn.decode[SimpleUserName](goodJson))
println(decode[UserName](badJson))
println(decode[SimpleUserName](badJson))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment