readSingleValue reads a single key or value with proper ref/type handling
(ctx *ReadContext, buf *ByteBuffer, ctxErr *Error, isDeclared, trackRef bool, staticType reflect.Type, declaredSer Serializer, resolver *TypeResolver, refResolver *RefResolver)
| 399 | |
| 400 | // readSingleValue reads a single key or value with proper ref/type handling |
| 401 | func (s mapSerializer) readSingleValue(ctx *ReadContext, buf *ByteBuffer, ctxErr *Error, isDeclared, trackRef bool, staticType reflect.Type, declaredSer Serializer, resolver *TypeResolver, refResolver *RefResolver) reflect.Value { |
| 402 | // When ref tracking AND not declared, ref flag comes before type info |
| 403 | if trackRef && !isDeclared { |
| 404 | refID, err := refResolver.TryPreserveRefId(buf) |
| 405 | if err != nil { |
| 406 | ctx.SetError(FromError(err)) |
| 407 | return reflect.Value{} |
| 408 | } |
| 409 | if refID < int32(NotNullValueFlag) { |
| 410 | return refResolver.GetReadObject(refID) |
| 411 | } |
| 412 | |
| 413 | // Read type info and data |
| 414 | ti := resolver.ReadTypeInfo(buf, ctxErr) |
| 415 | if ctxErr.HasError() { |
| 416 | return reflect.Value{} |
| 417 | } |
| 418 | |
| 419 | ser := ti.Serializer |
| 420 | valType := ti.Type |
| 421 | if valType == nil { |
| 422 | valType = staticType |
| 423 | } |
| 424 | valType, ser = wrapMapSerializerIfNeeded(staticType, valType, ser) |
| 425 | v := reflect.New(valType).Elem() |
| 426 | ser.ReadData(ctx, v) |
| 427 | if ctx.HasError() { |
| 428 | return reflect.Value{} |
| 429 | } |
| 430 | if _, ok := ser.(*ptrToValueSerializer); !ok { |
| 431 | refResolver.Reference(v) |
| 432 | } |
| 433 | return v |
| 434 | } |
| 435 | |
| 436 | // Read type info if not declared |
| 437 | var typeInfo *TypeInfo |
| 438 | var ser Serializer |
| 439 | valType := staticType |
| 440 | |
| 441 | if !isDeclared { |
| 442 | typeInfo = resolver.ReadTypeInfo(buf, ctxErr) |
| 443 | if ctxErr.HasError() { |
| 444 | return reflect.Value{} |
| 445 | } |
| 446 | ser = typeInfo.Serializer |
| 447 | valType = typeInfo.Type |
| 448 | valType, ser = wrapMapSerializerIfNeeded(staticType, valType, ser) |
| 449 | } else { |
| 450 | ser = declaredSer |
| 451 | if ser == nil { |
| 452 | ser, _ = resolver.getSerializerByType(staticType, false) |
| 453 | } |
| 454 | } |
| 455 | |
| 456 | if valType == nil { |
| 457 | valType = staticType |
| 458 | } |
no test coverage detected