Skip to content

Instantly share code, notes, and snippets.

@tindzk
Created January 16, 2015 17:40
Show Gist options
  • Save tindzk/51f800c07633e875f917 to your computer and use it in GitHub Desktop.
Save tindzk/51f800c07633e875f917 to your computer and use it in GitHub Desktop.
uPickle implicits for Response
sealed trait Response[+T]
object Response {
case class Failure(error: String) extends Response[Nothing]
case class Success[+T](value: T) extends Response[T]
}
object Picklers {
import Response._
import upickle.Js
import upickle.Aliases._
implicit def FailureR: R[Failure] = R[Failure] {
case Js.Arr(Js.Num(0), x) => Failure(upickle.readJs[String](x))
}
implicit def SuccessR[T: R]: R[Success[T]] = R[Success[T]] {
case Js.Arr(Js.Num(1), x) => Success(upickle.readJs[T](x))
}
implicit def ResponseR[T: R]: R[Response[T]] = R[Response[T]](
SuccessR[T].read orElse FailureR.read
)
implicit def FailureW[T: W]: W[Failure] = W[Failure](ResponseW[T].write)
implicit def SuccessW[T: W]: W[Success[T]] = W[Success[T]](ResponseW[T].write)
implicit def ResponseW[T: W]: W[Response[T]] = W[Response[T]] {
case Failure(s) => Js.Arr(Js.Num(0), upickle.writeJs(s))
case Success(t) => Js.Arr(Js.Num(1), upickle.writeJs(t))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment