Created
January 3, 2014 03:05
-
-
Save markhibberd/8231912 to your computer and use it in GitHub Desktop.
argonaut union type example
This file contains 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 argonaut.example | |
import argonaut._, Argonaut._ | |
import scalaz._, Scalaz._ | |
object UnionExample extends { | |
sealed trait Thing | |
final case class One(n: String, i: Int) extends Thing | |
final case class Two(n: String) extends Thing | |
case object Three extends Thing | |
implicit def ThingEncodeJson: EncodeJson[Thing] = | |
EncodeJson(_ match { | |
case One(n, i) => Json("one" := Json("name" := n, "age" := i)) | |
case Two(n) => Json("two" := Json("name" := n)) | |
case Three => Json("three" := ()) | |
}) | |
implicit def ThingDecodeJson: DecodeJson[Thing] = | |
DecodeJson(c => | |
tagged("one", c, jdecode2L(One.apply)("name", "age")) ||| | |
tagged("two", c, jdecode1L(Two.apply)("name")) ||| | |
tagged("three", c, implicitly[DecodeJson[Unit]].map(_ => Three))) | |
def tagged[A](tag: String, c: HCursor, decoder: DecodeJson[A]): DecodeResult[A] = | |
(c --\ tag).hcursor.fold(DecodeResult.fail[A]("Invalid tagged type", c.history))(decoder.decode) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi @toby5box... do you happen to have an updated example on how you got the gist working?