added: `json.as_any` and `json.encode_string_opt`
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 20 Jan 2024 04:40:24 +0000 (22:40 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 20 Jan 2024 04:40:24 +0000 (22:40 -0600)
CHANGELOG
core/encoding/json/encoder.onyx
tests/json_test
tests/json_test.onyx

index 635ff2ccbd45866e386dc29c0c6dd2658eb16f29..726792a8ec1ed05c201418731cb8d65682446143 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -20,6 +20,8 @@ Additions:
 - `core.list.empty`
 - `core.conv.parse`
 - `core.conv.parse_with_allocator`
+- `core.encoding.json.encode_string_opt`
+- `core.encoding.json.as_any` overload
 
 Removals:
 - Compiler test cases are no longer shipped with toolchain.
index 2182f22774daa7861b252e7ce26a2fbd1a99c9bb..e6fd38c4eb1b20344892e16353e24109f4621b45 100644 (file)
@@ -25,6 +25,15 @@ encode_string :: (v: $T, allocator := context.allocator) -> (str, Encoding_Error
     return s, .None;
 }
 
+encode_string_opt :: (v: $T, allocator := context.allocator) -> ? str {
+    s, err := encode_string(v, allocator);
+    if err != .None {
+        return .None;
+    }
+
+    return s;
+}
+
 //
 // This could be changed to use the "any" type now, which would allow for any type to be
 // represented as a json value. However, this eliminates the control that you get from
@@ -388,6 +397,13 @@ to_any :: as_any
 
 as_any :: #match #local {}
 
+#overload
+as_any :: macro (value: Value, $T: type_expr) -> T {
+    x: T;
+    #this_package.as_any(value, &x);
+    return x;
+}
+
 #overload
 as_any :: macro (value: Value, out: ^$T) {
     #this_package.to_any(value, T, out);
index 2ac867d535d7e1db07861ab46b811f4af55fad68..5c8f0a4c8fdecaad2ec35a234399f1c6c24df99f 100644 (file)
@@ -7,3 +7,4 @@
 main.Union_Test { v1 = None, v2 = Some(123) }
 {"v1":null,"v2":123}
 {"v1":null,"v2":123}
+[ { foo = 1 }, { foo = 2 } ]
index c471c0a70126d78a466d44ad66708044227d9c5e..c9c9c336a8a972bf9e92ba75b233be45b9386afb 100644 (file)
@@ -61,4 +61,10 @@ main :: () {
     core.print("\n");
     json.encode(&core.stdio.print_writer, ut);
     core.print("\n");
+
+    json.as_any(j.root, [] struct {
+        @json.Custom_Key.{"x"}
+        foo: i32
+    })
+    |> core.println();
 }