Skip to content

Commit

Permalink
*New* Add parseYaml() Function
Browse files Browse the repository at this point in the history
Signed-off-by: Rohit Agrawal <rohit.agrawal@databricks.com>
  • Loading branch information
agrawroh committed Jan 15, 2022
1 parent 0b8ce80 commit ba2731a
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 3 deletions.
2 changes: 2 additions & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ lazy val main = (project in file("sjsonnet"))
"com.lihaoyi" %% "scalatags" % "0.9.3",
"com.lihaoyi" %% "os-lib" % "0.7.2",
"com.lihaoyi" %% "mainargs" % "0.2.0",
"org.json" % "json" % "20211205",
"org.scala-lang.modules" %% "scala-collection-compat" % "2.4.0",
"org.tukaani" % "xz" % "1.8",
"org.yaml" % "snakeyaml" % "1.30",
),
libraryDependencies ++= Seq(
"com.lihaoyi" %% "utest" % "0.7.7",
Expand Down
4 changes: 3 additions & 1 deletion build.sc
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,9 @@ class SjsonnetModule(val crossScalaVersion: String) extends Module {
millSourcePath / "src-jvm-js"
)
def ivyDeps = super.ivyDeps() ++ Agg(
ivy"org.tukaani:xz::1.8"
ivy"org.json:json:20211205",
ivy"org.tukaani:xz::1.8",
ivy"org.yaml:snakeyaml::1.30"
)
def scalacOptions = Seq("-opt:l:inline", "-opt-inline-from:sjsonnet.**")
//def compileIvyDeps = Agg( ivy"com.lihaoyi::acyclic:0.2.0")
Expand Down
18 changes: 16 additions & 2 deletions sjsonnet/src/sjsonnet/Std.scala
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package sjsonnet

import org.json.JSONObject
import org.yaml.snakeyaml.Yaml
import org.yaml.snakeyaml.constructor.Constructor

import java.io.StringWriter
import java.nio.charset.StandardCharsets.UTF_8
import java.util.Base64
import java.util
import java.util.regex.Pattern

import sjsonnet.Expr.Member.Visibility
import sjsonnet.Expr.BinaryOp
import sjsonnet.ArrayOps._

import scala.collection.mutable
import scala.util.matching.Regex
Expand Down Expand Up @@ -581,6 +583,17 @@ object Std {
ujson.StringParser.transform(str.asString, new ValVisitor(pos))
}

private object ParseYaml extends Val.Builtin1("str") {
def evalRhs(str: Val, ev: EvalScope, pos: Position): Val = {
try {
val yaml: java.util.LinkedHashMap[String, Object] = new Yaml(new Constructor(classOf[java.util.LinkedHashMap[String, Object]])).load(str.asString)
ujson.StringParser.transform(new JSONObject(yaml).toString(), new ValVisitor(pos))
} catch {
case _: Exception => null
}
}
}

private object Set_ extends Val.Builtin2("arr", "keyF", Array(null, Val.False(dummyPos))) {
def evalRhs(arr: Val, keyF: Val, ev: EvalScope, pos: Position): Val = {
uniqArr(pos, ev, sortArr(pos, ev, arr, keyF), keyF)
Expand Down Expand Up @@ -1137,6 +1150,7 @@ object Std {
"parseOctal" -> ParseOctal,
"parseHex" -> ParseHex,
"parseJson" -> ParseJson,
"parseYaml" -> ParseYaml,
"md5" -> MD5,
builtin("prune", "x"){ (pos, ev, s: Val) =>
def filter(x: Val) = x match{
Expand Down
15 changes: 15 additions & 0 deletions sjsonnet/test/src-jvm/sjsonnet/ParseYamlTests.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package sjsonnet

import sjsonnet.TestUtils.eval
import utest._

object ParseYamlTests extends TestSuite {
def tests: Tests = Tests {
test {
eval("std.parseYaml('foo: bar')") ==> ujson.Value("""{"foo":"bar"}""")
}
test {
eval("std.parseYaml('')") ==> ujson.Value("""{}""")
}
}
}

0 comments on commit ba2731a

Please sign in to comment.