diff options
Diffstat (limited to 'examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json')
6 files changed, 153 insertions, 0 deletions
diff --git a/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/AbstractJSONImpl.scala b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/AbstractJSONImpl.scala new file mode 100644 index 0000000..ad5d79e --- /dev/null +++ b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/AbstractJSONImpl.scala @@ -0,0 +1,32 @@ +package scala.scalajs.tools.json + +import java.io.{Reader, Writer} + +/** A JSON implementation. Has a representation type and methods to convert + * this type to/from primitives, lists and maps. + * + * Further, it can write/read a value of this type to a string. + */ +private[json] trait AbstractJSONImpl { + + type Repr + + def fromString(x: String): Repr + def fromNumber(x: Number): Repr + def fromBoolean(x: Boolean): Repr + def fromList(x: List[Repr]): Repr + def fromMap(x: Map[String, Repr]): Repr + + def toString(x: Repr): String + def toNumber(x: Repr): Number + def toBoolean(x: Repr): Boolean + def toList(x: Repr): List[Repr] + def toMap(x: Repr): Map[String, Repr] + + def serialize(x: Repr): String + def serialize(x: Repr, writer: Writer): Unit + + def deserialize(str: String): Repr + def deserialize(reader: Reader): Repr + +} diff --git a/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONDeserializer.scala b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONDeserializer.scala new file mode 100644 index 0000000..e854e9a --- /dev/null +++ b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONDeserializer.scala @@ -0,0 +1,30 @@ +package scala.scalajs.tools.json + +trait JSONDeserializer[T] { + def deserialize(x: JSON): T +} + +object JSONDeserializer { + + implicit object stringJSON extends JSONDeserializer[String] { + def deserialize(x: JSON): String = Impl.toString(x) + } + + implicit object intJSON extends JSONDeserializer[Int] { + def deserialize(x: JSON): Int = Impl.toNumber(x).intValue() + } + + implicit object booleanJSON extends JSONDeserializer[Boolean] { + def deserialize(x: JSON): Boolean = Impl.toBoolean(x) + } + + implicit def listJSON[T : JSONDeserializer] = new JSONDeserializer[List[T]] { + def deserialize(x: JSON): List[T] = Impl.toList(x).map(fromJSON[T] _) + } + + implicit def mapJSON[V : JSONDeserializer] = new JSONDeserializer[Map[String, V]] { + def deserialize(x: JSON): Map[String, V] = + Impl.toMap(x).mapValues(fromJSON[V] _) + } + +} diff --git a/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONObjBuilder.scala b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONObjBuilder.scala new file mode 100644 index 0000000..dd98f49 --- /dev/null +++ b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONObjBuilder.scala @@ -0,0 +1,20 @@ +package scala.scalajs.tools.json + +import scala.collection.mutable + +class JSONObjBuilder { + + private val flds = mutable.Map.empty[String, JSON] + + def fld[T : JSONSerializer](name: String, v: T): this.type = { + flds.put(name, v.toJSON) + this + } + + def opt[T : JSONSerializer](name: String, v: Option[T]): this.type = { + v.foreach(v => flds.put(name, v.toJSON)) + this + } + + def toJSON: JSON = Impl.fromMap(flds.toMap) +} diff --git a/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONObjExtractor.scala b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONObjExtractor.scala new file mode 100644 index 0000000..e49f7e4 --- /dev/null +++ b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONObjExtractor.scala @@ -0,0 +1,13 @@ +package scala.scalajs.tools.json + +import scala.collection.mutable + +class JSONObjExtractor(rawData: JSON) { + private val data = Impl.toMap(rawData) + + def fld[T : JSONDeserializer](name: String): T = + fromJSON[T](data(name)) + + def opt[T : JSONDeserializer](name: String): Option[T] = + data.get(name).map(fromJSON[T] _) +} diff --git a/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONSerializer.scala b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONSerializer.scala new file mode 100644 index 0000000..e26c92a --- /dev/null +++ b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONSerializer.scala @@ -0,0 +1,32 @@ +package scala.scalajs.tools.json + +trait JSONSerializer[T] { + def serialize(x: T): JSON +} + +object JSONSerializer { + + implicit object stringJSON extends JSONSerializer[String] { + def serialize(x: String): JSON = Impl.fromString(x) + } + + implicit object intJSON extends JSONSerializer[Int] { + def serialize(x: Int): JSON = Impl.fromNumber(x) + } + + implicit object booleanJSON extends JSONSerializer[Boolean] { + def serialize(x: Boolean): JSON = Impl.fromBoolean(x) + } + + implicit def listJSON[T : JSONSerializer] = new JSONSerializer[List[T]] { + def serialize(x: List[T]): JSON = Impl.fromList(x.map(_.toJSON)) + } + + implicit def mapJSON[V : JSONSerializer] = { + new JSONSerializer[Map[String, V]] { + def serialize(x: Map[String, V]): JSON = + Impl.fromMap(x.mapValues(_.toJSON)) + } + } + +} diff --git a/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/package.scala b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/package.scala new file mode 100644 index 0000000..551893a --- /dev/null +++ b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/package.scala @@ -0,0 +1,26 @@ +package scala.scalajs.tools + +import java.io.{Reader, Writer} + +/** Some type-class lightweight wrappers around simple-json. + * + * They allow to write [[xyz.toJSON]] to obtain classes that can be + * serialized by simple-json and [[fromJSON[T](xyz)]] to get an + * object back. + */ +package object json { + type JSON = Impl.Repr + + implicit class JSONPimp[T : JSONSerializer](x: T) { + def toJSON: JSON = implicitly[JSONSerializer[T]].serialize(x) + } + + def fromJSON[T](x: JSON)(implicit d: JSONDeserializer[T]): T = + d.deserialize(x) + + def writeJSON(x: JSON, writer: Writer): Unit = Impl.serialize(x, writer) + def jsonToString(x: JSON): String = Impl.serialize(x) + def readJSON(str: String): JSON = Impl.deserialize(str) + def readJSON(reader: Reader): JSON = Impl.deserialize(reader) + +} |