MCPcopy Create free account
hub / github.com/segmentio/encoding / structCodecOf

Function structCodecOf

proto/struct.go:52–153  ·  view source on GitHub ↗
(t reflect.Type, seen map[reflect.Type]*codec)

Source from the content-addressed store, hash-verified

50}
51
52func structCodecOf(t reflect.Type, seen map[reflect.Type]*codec) *codec {
53 c := &codec{wire: varlen}
54 seen[t] = c
55
56 numField := t.NumField()
57 number := fieldNumber(1)
58 fields := make([]structField, 0, numField)
59
60 for i := range numField {
61 f := t.Field(i)
62
63 if f.PkgPath != "" {
64 continue // unexported
65 }
66
67 field := structField{
68 number: uint16(number),
69 offset: uint32(f.Offset),
70 }
71
72 if tag, ok := f.Tag.Lookup("protobuf"); ok {
73 t, err := parseStructTag(tag)
74 if err == nil {
75 field.number = uint16(t.fieldNumber)
76 if t.repeated {
77 field.flags |= repeated
78 }
79 if t.zigzag {
80 field.flags |= zigzag
81 }
82 switch t.wireType {
83 case Fixed32:
84 switch baseKindOf(f.Type) {
85 case reflect.Uint32:
86 field.codec = &fixed32Codec
87 case reflect.Float32:
88 field.codec = &float32Codec
89 }
90 case Fixed64:
91 switch baseKindOf(f.Type) {
92 case reflect.Uint64:
93 field.codec = &fixed64Codec
94 case reflect.Float64:
95 field.codec = &float64Codec
96 }
97 }
98 }
99 }
100
101 if field.codec == nil {
102 switch baseKindOf(f.Type) {
103 case reflect.Struct:
104 field.flags |= embedded
105 field.codec = codecOf(f.Type, seen)
106
107 case reflect.Slice:
108 elem := f.Type.Elem()
109

Callers 1

codecOfFunction · 0.85

Calls 15

fieldNumberTypeAlias · 0.85
parseStructTagFunction · 0.85
baseKindOfFunction · 0.85
codecOfFunction · 0.85
sliceCodecOfFunction · 0.85
mapCodecOfFunction · 0.85
sizeOfTagFunction · 0.85
wireTypeTypeAlias · 0.85
structSizeFuncOfFunction · 0.85
structEncodeFuncOfFunction · 0.85
structDecodeFuncOfFunction · 0.85
NumFieldMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…