diff options
author | Mathias <mathias@spray.cc> | 2011-05-23 14:12:53 +0200 |
---|---|---|
committer | Mathias <mathias@spray.cc> | 2011-05-23 14:12:53 +0200 |
commit | 03e9e1a6d50f6afb7848033ad4ca1f5239943a2f (patch) | |
tree | 1605235adc731bb247aa6b81f1da0f09a5b8a398 /src/main | |
parent | 25f696587cedc7aad2053cd50ca9da22e42c3146 (diff) | |
download | spray-json-03e9e1a6d50f6afb7848033ad4ca1f5239943a2f.tar.gz spray-json-03e9e1a6d50f6afb7848033ad4ca1f5239943a2f.tar.bz2 spray-json-03e9e1a6d50f6afb7848033ad4ca1f5239943a2f.zip |
Add predefined JsonFormat for Either type
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/scala/cc/spray/json/StandardFormats.scala | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/main/scala/cc/spray/json/StandardFormats.scala b/src/main/scala/cc/spray/json/StandardFormats.scala index 2a07d6c..20012b4 100644 --- a/src/main/scala/cc/spray/json/StandardFormats.scala +++ b/src/main/scala/cc/spray/json/StandardFormats.scala @@ -17,12 +17,24 @@ package cc.spray.json +import scala.{Left, Right} + /** * Provides the JsonFormats for the non-collection standard types. */ trait StandardFormats { private type JF[T] = JsonFormat[T] // simple alias for reduced verbosity + + def safeReader[A :JsonFormat] = new JsonReader[Either[Exception, A]] { + def read(json: JsValue) = { + try { + Right(json.fromJson) + } catch { + case e: Exception => Left(e) + } + } + } implicit def optionFormat[T :JF] = new JF[Option[T]] { def write(option: Option[T]) = option match { @@ -34,6 +46,19 @@ trait StandardFormats { case x => Some(x.fromJson) } } + + implicit def eitherFormat[A :JF, B :JF] = new JF[Either[A, B]] { + def write(either: Either[A, B]) = either match { + case Right(a) => a.toJson + case Left(b) => b.toJson + } + def read(value: JsValue) = (value.fromJson(safeReader[A]), value.fromJson(safeReader[B])) match { + case (Right(a), _: Left[_, _]) => Left(a) + case (_: Left[_, _], Right(b)) => Right(b) + case (_: Right[_, _], _: Right[_, _]) => throw new DeserializationException("Ambiguous Either value: can be read as both, Left and Right, values") + case (Left(ea), Left(eb)) => throw new DeserializationException("Could not read Either value:\n" + ea + "---------- and ----------\n" + eb) + } + } implicit def tuple1Format[A :JF] = new JF[Tuple1[A]] { def write(t: Tuple1[A]) = t._1.toJson |