aboutsummaryrefslogtreecommitdiff
path: root/yamlesque-spray/src/main/scala/formats.scala
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2018-04-08 16:24:00 -0700
committerJakob Odersky <jakob@odersky.com>2018-04-08 16:24:00 -0700
commit3fe7b06c5f357f34a5c227bc040effcbb259aef2 (patch)
tree1f83c575a6f59340403c7cfdd77969d61467f817 /yamlesque-spray/src/main/scala/formats.scala
parentf1fe50cba0c07d27f109a727c480b02639d140e0 (diff)
downloadyamlesque-3fe7b06c5f357f34a5c227bc040effcbb259aef2.tar.gz
yamlesque-3fe7b06c5f357f34a5c227bc040effcbb259aef2.tar.bz2
yamlesque-3fe7b06c5f357f34a5c227bc040effcbb259aef2.zip
Add spray compatibility layer
Diffstat (limited to 'yamlesque-spray/src/main/scala/formats.scala')
-rw-r--r--yamlesque-spray/src/main/scala/formats.scala40
1 files changed, 40 insertions, 0 deletions
diff --git a/yamlesque-spray/src/main/scala/formats.scala b/yamlesque-spray/src/main/scala/formats.scala
new file mode 100644
index 0000000..4434347
--- /dev/null
+++ b/yamlesque-spray/src/main/scala/formats.scala
@@ -0,0 +1,40 @@
+package yamlesque
+
+import spray.json._
+
+trait JsonYamlFormats {
+
+ implicit def jsonToYamlReader[A](implicit jsReader: JsonReader[A]): YamlReader[A] = new YamlReader[A] {
+ override def read(yaml: YamlValue): A = jsReader.read(JsonFormats.yamlToJson(yaml))
+ }
+
+ implicit def jsonToYamlWriter[A](implicit jsWriter: JsonWriter[A]): YamlWriter[A] = new YamlWriter[A] {
+ override def write(a: A): YamlValue = JsonFormats.jsonToYaml(jsWriter.write(a))
+ }
+
+}
+
+object JsonFormats {
+
+ def jsonToYaml(js: JsValue): YamlValue = js match {
+ case JsNull => YamlScalar.Empty
+ case JsNumber(number) => YamlScalar(number.toString)
+ case JsBoolean(value) => YamlScalar(value.toString)
+ case JsString(value) => YamlScalar(value)
+ case JsArray(elements) => YamlSequence(elements.map(jsonToYaml _ ))
+ case JsObject(fields) => YamlMapping(fields.mapValues(jsonToYaml _ ))
+ }
+
+ val JsNumberPattern = """([-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)""".r
+
+ def yamlToJson(yaml: YamlValue): JsValue = yaml match {
+ case YamlScalar.Empty => JsNull
+ case YamlScalar("true") => JsTrue
+ case YamlScalar("false") => JsFalse
+ case YamlScalar(JsNumberPattern(x)) => JsNumber(x.toDouble)
+ case YamlScalar(x) => JsString(x)
+ case YamlSequence(elements) => JsArray(elements.map(yamlToJson))
+ case YamlMapping(fields) => JsObject(fields.mapValues(yamlToJson))
+ }
+
+}