aboutsummaryrefslogtreecommitdiff
path: root/core/encoding/json
diff options
context:
space:
mode:
authorjkenda <kenda.jakob@gmail.com>2025-02-01 10:32:07 +0100
committerjkenda <kenda.jakob@gmail.com>2025-02-01 10:32:07 +0100
commit51b80c5a2027270c634a6c4a41e8fed0216ae4c1 (patch)
treefbf0f8c071434776ec7d28362e6b6cfecb13690c /core/encoding/json
parenta219da14ce8bbd15fec4ea962fd0ec175da0f0aa (diff)
encoding/json: marshal enumerated arrays to objects with key-value pairs
Diffstat (limited to 'core/encoding/json')
-rw-r--r--core/encoding/json/marshal.odin16
1 files changed, 13 insertions, 3 deletions
diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin
index f0f0927a1..020facd14 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..<info.count {
+ value := cast(runtime.Type_Info_Enum_Value)i
+ index, found := slice.linear_search(enum_type.values, value)
+ if !found {
+ continue
+ }
+
opt_write_iteration(w, opt, i == 0) or_return
+ opt_write_key(w, opt, enum_type.names[index]) or_return
data := uintptr(v.data) + uintptr(i*info.elem_size)
marshal_to_writer(w, any{rawptr(data), info.elem.id}, opt) or_return
}
- opt_write_end(w, opt, ']') or_return
+ opt_write_end(w, opt, '}') or_return
case runtime.Type_Info_Dynamic_Array:
opt_write_start(w, opt, '[') or_return
@@ -667,4 +677,4 @@ cast_any_int_to_u128 :: proc(any_int_value: any) -> u128 {
}
return u
-} \ No newline at end of file
+}