Created
September 16, 2019 05:31
-
-
Save matfournier/50b040f23dcadf11fb5b7b16f283bbaa to your computer and use it in GitHub Desktop.
refinedDecoder
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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