aboutsummaryrefslogtreecommitdiff
path: root/yamlesque/src/Writer.scala
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2019-10-22 00:55:50 -0400
committerJakob Odersky <jakob@odersky.com>2019-11-08 22:34:57 -0500
commit99dfd5a3ececf39ae3fd30cbf9581c2fb5da2ba5 (patch)
tree59dd8a2f5283d436b300478b7197bb8ec9f5164e /yamlesque/src/Writer.scala
parent70141fc60ec3341057627e9a8f5b83a22c74f0ea (diff)
downloadyamlesque-99dfd5a3ececf39ae3fd30cbf9581c2fb5da2ba5.tar.gz
yamlesque-99dfd5a3ececf39ae3fd30cbf9581c2fb5da2ba5.tar.bz2
yamlesque-99dfd5a3ececf39ae3fd30cbf9581c2fb5da2ba5.zip
Major refactor for version 0.2.00.2.0
Diffstat (limited to 'yamlesque/src/Writer.scala')
-rw-r--r--yamlesque/src/Writer.scala74
1 files changed, 74 insertions, 0 deletions
diff --git a/yamlesque/src/Writer.scala b/yamlesque/src/Writer.scala
new file mode 100644
index 0000000..e387ef9
--- /dev/null
+++ b/yamlesque/src/Writer.scala
@@ -0,0 +1,74 @@
+package yamlesque
+
+object Writer {
+
+ def write(nodes: Iterable[Node]): String = {
+ val buffer = new StringBuilder
+ write(nodes, buffer)
+ buffer.result()
+ }
+ def write(nodes: Iterable[Node], buffer: StringBuilder): Unit = {
+ val it = nodes.iterator
+ while (it.hasNext) {
+ writeCompact(buffer, true, 0, it.next())
+ if (it.hasNext) buffer ++= "---\n"
+ }
+ }
+
+ private def writeCompact(
+ buffer: StringBuilder,
+ startOfLine: Boolean,
+ indent: Int,
+ node: Node
+ ): Unit = {
+ node match {
+ case Null =>
+ buffer ++= "null\n"
+ case Bool(true) =>
+ buffer ++= "true\n"
+ case Bool(false) =>
+ buffer ++= "false\n"
+ case Num(num) =>
+ buffer ++= num.toString
+ buffer += '\n'
+ case Str(value) =>
+ buffer ++= value
+ buffer += '\n'
+ case Arr(values) =>
+ var doIndent = startOfLine
+ for (item <- values) {
+ if (doIndent) {
+ buffer ++= " " * indent
+ }
+ doIndent = true
+ item match {
+ case Arr(_) =>
+ buffer ++= "-\n"
+ writeCompact(buffer, true, indent + 1, item)
+ case _ =>
+ buffer ++= "- "
+ writeCompact(buffer, false, indent + 1, item)
+ }
+ }
+ case Obj(values) =>
+ var doIndent = startOfLine
+ for ((key, value) <- values) {
+ if (doIndent) {
+ buffer ++= " " * indent
+ }
+ doIndent = true
+
+ buffer ++= key
+ value match {
+ case Str(_) | Bool(_) | Num(_) | Null =>
+ buffer ++= ": "
+ writeCompact(buffer, false, indent, value)
+ case _ =>
+ buffer ++= ":\n"
+ writeCompact(buffer, true, indent + 1, value)
+ }
+ }
+ }
+ }
+
+}