/***
+= "io.argonaut" %% "argonaut-scalaz" % "6.2"
libraryDependencies */
import argonaut._
import argonaut.Argonaut._
import scalaz._
import scalaz.Scalaz._
sealed trait EmailTag
type Email = String @@ EmailTag
val email: Email = Tag[String, EmailTag]("james@earldouglas.com")
implicit val encodeEmail: EncodeJson[Email] =
{ x: Email => jString(Tag.unwrap(x)) }
EncodeJson
val encodedEmail: String = email.asJson.spaces2
println(s"\nencoded Email:\n$encodedEmail")
implicit val decodeEmail: DecodeJson[Email] =
{ _.as[String] map { Tag[String, EmailTag](_) } }
DecodeJson
val decodedEmail: Either[String, Email] =
"\"james@earldouglas.com\"".decodeEither[Email]
println(s"\ndecoded Email:\n$decodedEmail")
This file is literate Scala, and can be run using Codedown:
$ curl https://earldouglas.com/scala/argonaut/tagged.md |
codedown scala > script.scala
$ sbt -Dsbt.main.class=sbt.ScriptMain script.scala
encoded Email:
"james@earldouglas.com"
decoded Email:
Right(james@earldouglas.com)