MCPcopy Create free account
hub / github.com/aws/smithy-go / decodeMap

Method decodeMap

document/cbor/decode.go:222–269  ·  view source on GitHub ↗
(tv cbor.Map, rv reflect.Value)

Source from the content-addressed store, hash-verified

220}
221
222func (d *decoder) decodeMap(tv cbor.Map, rv reflect.Value) error {
223 switch rv.Kind() {
224 case reflect.Map:
225 t := rv.Type()
226 if t.Key().Kind() != reflect.String {
227 return &document.UnmarshalTypeError{Value: "map string key", Type: t.Key()}
228 }
229 if rv.IsNil() {
230 rv.Set(reflect.MakeMap(t))
231 }
232 case reflect.Struct:
233 if rv.CanInterface() && document.IsNoSerde(rv.Interface()) {
234 return &document.UnmarshalTypeError{
235 Value: fmt.Sprintf("unsupported type"),
236 Type: rv.Type(),
237 }
238 }
239 case reflect.Interface:
240 rv.Set(reflect.MakeMap(serde.ReflectTypeOf.MapStringToInterface))
241 rv = rv.Elem()
242 default:
243 return &document.UnmarshalTypeError{Value: "map", Type: rv.Type()}
244 }
245
246 if rv.Kind() == reflect.Map {
247 for k, kv := range tv {
248 key := reflect.New(rv.Type().Key()).Elem()
249 key.SetString(k)
250 elem := reflect.New(rv.Type().Elem()).Elem()
251 if err := d.decode(kv, elem, serde.Tag{}); err != nil {
252 return err
253 }
254 rv.SetMapIndex(key, elem)
255 }
256 } else if rv.Kind() == reflect.Struct {
257 fields := serde.GetStructFields(rv.Type())
258 for k, kv := range tv {
259 if f, ok := fields.FieldByName(k); ok {
260 fv := serde.DecoderFieldByIndex(rv, f.Index)
261 if err := d.decode(kv, fv, f.Tag); err != nil {
262 return err
263 }
264 }
265 }
266 }
267
268 return nil
269}
270
271func (d *decoder) decodeTag(tv *cbor.Tag, rv reflect.Value) error {
272 rvt := rv.Type()

Callers 1

decodeMethod · 0.95

Calls 7

decodeMethod · 0.95
IsNoSerdeFunction · 0.92
GetStructFieldsFunction · 0.92
DecoderFieldByIndexFunction · 0.92
KeyMethod · 0.80
FieldByNameMethod · 0.80
SetMethod · 0.45

Tested by

no test coverage detected