mirror of
https://github.com/bearlanguageorg/bear.git
synced 2026-08-26 14:57:18 +00:00
Added default json, etc.
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
// json.vr — the stdlib JSON + formatting builtins.
|
||||
// vr run examples/json.vr
|
||||
|
||||
fn main() {
|
||||
// --- encode: structs -> objects, arrays -> arrays, none -> null ---
|
||||
let user = {
|
||||
name: "amy",
|
||||
age: 30,
|
||||
active: 1,
|
||||
score: 87.5,
|
||||
tags: ["admin", "beta"],
|
||||
meta: { last_seen: none }
|
||||
}
|
||||
println(json_encode(user))
|
||||
// {"name":"amy","age":30,"active":1,"score":87.5,"tags":["admin","beta"],"meta":{"last_seen":null}}
|
||||
|
||||
// --- decode: objects become structs, numbers become ints when integral ---
|
||||
let parsed = json_decode("{\"name\": \"bob\", \"age\": 42, \"scores\": [1, 2.5, 3]}")
|
||||
println(parsed.name)
|
||||
println(parsed.age)
|
||||
println(parsed.scores[1])
|
||||
println(json_encode(parsed))
|
||||
|
||||
// null decodes to `none` — test with ==
|
||||
let maybe = json_decode("{\"value\": null}")
|
||||
if maybe.value == none {
|
||||
println("field is none")
|
||||
}
|
||||
|
||||
// --- format: printf-style ---
|
||||
println(format(3.14159, "%.2f")) // 3.14
|
||||
println(format(42, "%05d")) // 00042
|
||||
println(format(255, "%X")) // FF
|
||||
println(format("right", "%10s")) // right
|
||||
println(format("left", "%-10s") + "|") // left |
|
||||
|
||||
// --- string tools ---
|
||||
println("hello world".replace("l", "L"))
|
||||
println(len(split_lines("a\nb\nc")))
|
||||
println(pad_left("42", 5) + "|")
|
||||
println("ab".repeat(3))
|
||||
|
||||
// --- json + formatting together ---
|
||||
let total = 1234.5
|
||||
println("total: " + format(total, "%.2f"))
|
||||
}
|
||||
@@ -226,6 +226,87 @@ fn test_structs() {
|
||||
assert a != c
|
||||
}
|
||||
|
||||
fn test_json() {
|
||||
// encoding
|
||||
assert json_encode(42) == "42"
|
||||
assert json_encode(3.14) == "3.14"
|
||||
assert json_encode(1.0) == "1"
|
||||
assert json_encode("hi") == "\"hi\""
|
||||
assert json_encode([1, "two", 3.5]) == "[1,\"two\",3.5]"
|
||||
let rec = { name: "amy", age: 30 }
|
||||
assert json_encode(rec) == "{\"name\":\"amy\",\"age\":30}"
|
||||
assert json_encode(none) == "null"
|
||||
|
||||
// decoding
|
||||
assert json_decode("42") == 42
|
||||
assert json_decode("3.14") == 3.14
|
||||
assert json_decode("\"hi\"") == "hi"
|
||||
assert json_decode("true") == 1
|
||||
assert json_decode("null") == none
|
||||
let obj = json_decode("{\"x\": 1, \"y\": [1, 2], \"z\": {\"deep\": true}}")
|
||||
assert obj.x == 1
|
||||
assert obj.y[1] == 2
|
||||
assert obj.z.deep == 1
|
||||
|
||||
// round-trip
|
||||
assert json_encode(json_decode("{\"a\": 1, \"b\": [2, 3]}")) == "{\"a\":1,\"b\":[2,3]}"
|
||||
|
||||
// unicode escapes
|
||||
assert json_decode("\"\\u0041\"") == "A"
|
||||
assert json_decode("\"\\ud83d\\ude00\"") == "😀"
|
||||
}
|
||||
|
||||
fn test_format() {
|
||||
assert format(42, "%d") == "42"
|
||||
assert format(42, "%05d") == "00042"
|
||||
assert format(-42, "%05d") == "-0042"
|
||||
assert format(42, "%-5d") == "42 "
|
||||
assert format(3.14159, "%.2f") == "3.14"
|
||||
assert format(3.0, "%.2f") == "3.00"
|
||||
assert format(255, "%X") == "FF"
|
||||
assert format("hi", "%s") == "hi"
|
||||
assert format(7, "%5d") == " 7"
|
||||
}
|
||||
|
||||
fn test_string_tools() {
|
||||
assert replace("hello world", "l", "L") == "heLLo worLd"
|
||||
assert "hello world".replace("o", "0") == "hell0 w0rld"
|
||||
assert len(split_lines("a\nb\nc")) == 3
|
||||
assert "a\nb".split_lines()[1] == "b"
|
||||
assert pad("x", 4) == "x "
|
||||
assert "x".pad(4) == "x "
|
||||
assert pad_left("x", 4) == " x"
|
||||
assert "x".pad_left(4) == " x"
|
||||
assert repeat("ab", 3) == "ababab"
|
||||
assert "ab".repeat(2) == "abab"
|
||||
assert pad("toolong", 2) == "toolong"
|
||||
}
|
||||
|
||||
fn test_none() {
|
||||
assert none == none
|
||||
assert none == 0 == false
|
||||
assert none != 5
|
||||
if none {
|
||||
assert false
|
||||
}
|
||||
assert not (none == 1)
|
||||
}
|
||||
|
||||
fn test_native_errors_are_catchable() {
|
||||
try {
|
||||
read_file("/no/such/file.vr")
|
||||
assert false
|
||||
} catch e {
|
||||
assert len(e) > 0
|
||||
}
|
||||
try {
|
||||
json_decode("not json")
|
||||
assert false
|
||||
} catch e {
|
||||
assert len(e) > 0
|
||||
}
|
||||
}
|
||||
|
||||
fn test_failing() {
|
||||
// this one is meant to fail — shows up in `vr test` output
|
||||
assert 1 == 2
|
||||
|
||||
Reference in New Issue
Block a user