aboutsummaryrefslogtreecommitdiff
path: root/core/encoding
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2023-12-23 18:52:53 +0100
committerLaytan Laats <laytanlaats@hotmail.com>2024-03-04 17:26:19 +0100
commit759d095548e7135bbfeb68ac6b0a21857af49527 (patch)
tree8cab087aacb047ac6d5a8c4331e586779da2bc72 /core/encoding
parent7854aa22d99b2c0340f4352f133ce06fd1b80df6 (diff)
encoding/cbor: ignore struct fields with `cbor:"-"`
Diffstat (limited to 'core/encoding')
-rw-r--r--core/encoding/cbor/marshal.odin37
-rw-r--r--core/encoding/cbor/unmarshal.odin4
2 files changed, 31 insertions, 10 deletions
diff --git a/core/encoding/cbor/marshal.odin b/core/encoding/cbor/marshal.odin
index 898371adf..deb7ba020 100644
--- a/core/encoding/cbor/marshal.odin
+++ b/core/encoding/cbor/marshal.odin
@@ -422,7 +422,13 @@ marshal_into_encoder :: proc(e: Encoder, v: any) -> (err: Marshal_Error) {
case Tag: return err_conv(_encode_tag(e, vv))
}
- err_conv(_encode_u16(e, u16(len(info.names)), .Map)) or_return
+ field_name :: #force_inline proc(info: runtime.Type_Info_Struct, i: int) -> string {
+ if cbor_name := string(reflect.struct_tag_get(reflect.Struct_Tag(info.tags[i]), "cbor")); cbor_name != "" {
+ return cbor_name
+ } else {
+ return info.names[i]
+ }
+ }
marshal_entry :: #force_inline proc(e: Encoder, info: runtime.Type_Info_Struct, v: any, name: string, i: int) -> Marshal_Error {
err_conv(_encode_text(e, name)) or_return
@@ -448,13 +454,14 @@ marshal_into_encoder :: proc(e: Encoder, v: any) -> (err: Marshal_Error) {
return marshal_into(e, field_any)
}
-
- field_name :: #force_inline proc(info: runtime.Type_Info_Struct, i: int) -> string {
- if cbor_name := string(reflect.struct_tag_get(reflect.Struct_Tag(info.tags[i]), "cbor")); cbor_name != "" {
- return cbor_name
- } else {
- return info.names[i]
+
+ n: u64; {
+ for _, i in info.names {
+ if field_name(info, i) != "-" {
+ n += 1
+ }
}
+ err_conv(_encode_u64(e, n, .Map)) or_return
}
if .Deterministic_Map_Sorting in e.flags {
@@ -462,11 +469,16 @@ marshal_into_encoder :: proc(e: Encoder, v: any) -> (err: Marshal_Error) {
name: string,
field: int,
}
- entries := make([dynamic]Name, 0, len(info.names), context.temp_allocator) or_return
+ entries := make([dynamic]Name, 0, n, context.temp_allocator) or_return
defer delete(entries)
for name, i in info.names {
- append(&entries, Name{field_name(info, i), i}) or_return
+ fname := field_name(info, i)
+ if fname == "-" {
+ continue
+ }
+
+ append(&entries, Name{fname, i}) or_return
}
// Sort lexicographic on the bytes of the key.
@@ -479,7 +491,12 @@ marshal_into_encoder :: proc(e: Encoder, v: any) -> (err: Marshal_Error) {
}
} else {
for name, i in info.names {
- marshal_entry(e, info, v, field_name(info, i), i) or_return
+ fname := field_name(info, i)
+ if fname == "-" {
+ continue
+ }
+
+ marshal_entry(e, info, v, fname, i) or_return
}
}
return
diff --git a/core/encoding/cbor/unmarshal.odin b/core/encoding/cbor/unmarshal.odin
index ae7f97c98..9ad25a38d 100644
--- a/core/encoding/cbor/unmarshal.odin
+++ b/core/encoding/cbor/unmarshal.odin
@@ -650,6 +650,10 @@ _unmarshal_map :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header,
{
for field, field_idx in fields {
tag_value := string(reflect.struct_tag_get(field.tag, "cbor"))
+ if tag_value == "-" {
+ continue
+ }
+
if key == tag_value {
use_field_idx = field_idx
break