From 51b80c5a2027270c634a6c4a41e8fed0216ae4c1 Mon Sep 17 00:00:00 2001 From: jkenda Date: Sat, 1 Feb 2025 10:32:07 +0100 Subject: [PATCH] encoding/json: marshal enumerated arrays to objects with key-value pairs --- core/encoding/json/marshal.odin | 16 +++++-- tests/core/encoding/json/test_core_json.odin | 48 +++++++++++++++++++- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index f0f0927a124..020facd1467 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -209,13 +209,23 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: opt_write_end(w, opt, ']') or_return case runtime.Type_Info_Enumerated_Array: - opt_write_start(w, opt, '[') or_return + index_type := reflect.type_info_base(info.index) + enum_type := index_type.variant.(reflect.Type_Info_Enum) + + opt_write_start(w, opt, '{') or_return for i in 0.. u128 { } return u -} \ No newline at end of file +} diff --git a/tests/core/encoding/json/test_core_json.odin b/tests/core/encoding/json/test_core_json.odin index 27cce7faa46..5fcdc7a27a9 100644 --- a/tests/core/encoding/json/test_core_json.odin +++ b/tests/core/encoding/json/test_core_json.odin @@ -482,4 +482,50 @@ map_with_integer_keys :: proc(t: ^testing.T) { testing.expectf(t, runtime.string_eq(item, my_map2[key]), "Expected value %s to be present in unmarshaled map", key) } } -} \ No newline at end of file +} + +@test +enumerated_array :: proc(t: ^testing.T) { + Fruit :: enum { Apple, Banana, Pear } + Fruit_Stock :: [Fruit]uint { + .Apple = 14, + .Banana = 3, + .Pear = 513, + } + + { // test unmarshaling from array + marshaled := "[14,3,513]" + + unmarshaled: [Fruit]uint + err := json.unmarshal_string(marshaled, &unmarshaled) + testing.expect_value(t, err, nil) + testing.expect_value(t, unmarshaled, Fruit_Stock) + } + + Sparse_Fruit :: enum { Apple, Banana, Cherry = 23, Pear } + Sparse_Fruit_Stock :: #partial #sparse [Sparse_Fruit]uint { + .Apple = 14, + .Banana = 3, + .Pear = 513, + } + + { // test unmarshaling from object + marshaled := `{"Apple":14,"Banana":3,"Cherry":0,"Pear":513}` + + unmarshaled: #sparse [Sparse_Fruit]uint + err := json.unmarshal_string(marshaled, &unmarshaled) + testing.expect_value(t, err, nil) + testing.expect_value(t, unmarshaled, Sparse_Fruit_Stock) + } + + { // test marshal -> unmarshal + marshaled, err_marshal := json.marshal(Sparse_Fruit_Stock) + defer delete(marshaled) + testing.expect_value(t, err_marshal, nil) + + unmarshaled: #sparse [Sparse_Fruit]uint + err_unmarshal := json.unmarshal(marshaled, &unmarshaled) + testing.expect_value(t, err_unmarshal, nil) + testing.expect_value(t, unmarshaled, Sparse_Fruit_Stock) + } +}