summaryrefslogtreecommitdiff
path: root/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json')
-rw-r--r--examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/AbstractJSONImpl.scala32
-rw-r--r--examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONDeserializer.scala30
-rw-r--r--examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONObjBuilder.scala20
-rw-r--r--examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONObjExtractor.scala13
-rw-r--r--examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/JSONSerializer.scala32
-rw-r--r--examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/json/package.scala26
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)
+
+}