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

58 lines
2.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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を先に判定重いパーサを避ける
// For this smoke, inputs are already normalized; avoid trim() to bypass
// legacy subtract path in builder. Parser handles spaces precisely.
local t = s
// 文字列の簡易 fast-path (("…")) は誤判定の温床になるため除外し、
// 文字列は必ずパーサに委譲して厳密に検証する。
// is_integer(t) は先頭が '-' または数字の時のみ評価(不要な分岐での算術を避ける)
local t0 = t.substring(0, 1)
if (t == "null" or t == "true" or t == "false" or ((t0 == "-" or StringUtils.is_digit(t0)) and StringUtils.is_integer(t))) {
print("OK")
} 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
}
}