Skip to content

Instantly share code, notes, and snippets.

@markhibberd
Created January 3, 2014 03:05
Show Gist options
  • Save markhibberd/8231912 to your computer and use it in GitHub Desktop.
Save markhibberd/8231912 to your computer and use it in GitHub Desktop.
argonaut union type example
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)
}
@mkalish
Copy link

mkalish commented Oct 4, 2016

Hi @toby5box... do you happen to have an updated example on how you got the gist working?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment