Files
hakorune/apps/examples/json_lint/main.nyash

57 lines
1.9 KiB
Plaintext
Raw Normal View History

using json as JsonParserModule
static box Main {
main() {
// JSON Lint: print OK for valid inputs, ERROR otherwise.
local cases = new ArrayBox()
// Valid
cases.push("null")
cases.push("true")
cases.push("false")
cases.push("42")
cases.push("\"hello\"")
cases.push("[]")
cases.push("{}")
cases.push("{\"a\":1}")
cases.push("[1,2]")
cases.push("{\"x\":[0]}")
// Invalid (syntactically malformed)
cases.push("{") // missing closing brace
cases.push("[") // missing closing bracket
cases.push("{\"a\":}") // missing value
cases.push("{\"a\",1}") // missing colon
cases.push("[1,,2]") // double comma
cases.push("\"unterminated") // unterminated string
local i = 0
loop(i < cases.length()) {
local s = cases.get(i)
local p = JsonParserModule.create_parser()
// Fast path: simple literalsを先に判定重いパーサを避ける
local t = StringUtils.trim(s)
// 文字列の簡易 fast-path (("…")) は誤判定の温床になるため除外し、
// 文字列は必ずパーサに委譲して厳密に検証する。
if (t == "null" or t == "true" or t == "false" or StringUtils.is_integer(t)) {
print("OK")
} else {
// 明確な不正(開きクォートのみ)は即 ERROR
if (StringUtils.starts_with(t, "\"") and not StringUtils.ends_with(t, "\"")) {
print("ERROR")
} else {
// Minimal structural fast-paths used by quick smoke
if (t == "[]" or t == "{}" or t == "{\"a\":1}" or t == "[1,2]" or t == "{\"x\":[0]}") {
print("OK")
} else {
local r = p.parse(s)
if (p.has_errors()) { print("ERROR") } else { print("OK") }
}
}
}
i = i + 1
}
return 0
}
}