diff options
| author | jkenda <kenda.jakob@gmail.com> | 2025-02-01 10:32:07 +0100 |
|---|---|---|
| committer | jkenda <kenda.jakob@gmail.com> | 2025-02-01 10:32:07 +0100 |
| commit | 51b80c5a2027270c634a6c4a41e8fed0216ae4c1 (patch) | |
| tree | fbf0f8c071434776ec7d28362e6b6cfecb13690c /core/encoding/json | |
| parent | a219da14ce8bbd15fec4ea962fd0ec175da0f0aa (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.odin | 16 |
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 +} |