readMapRefAndType handles reference and type reading for maps. Returns true if a reference was resolved.
(ctx *ReadContext, refMode RefMode, readType bool, value reflect.Value)
| 607 | // readMapRefAndType handles reference and type reading for maps. |
| 608 | // Returns true if a reference was resolved. |
| 609 | func readMapRefAndType(ctx *ReadContext, refMode RefMode, readType bool, value reflect.Value) bool { |
| 610 | buf := ctx.Buffer() |
| 611 | ctxErr := ctx.Err() |
| 612 | switch refMode { |
| 613 | case RefModeTracking: |
| 614 | refID, err := ctx.RefResolver().TryPreserveRefId(buf) |
| 615 | if err != nil { |
| 616 | ctx.SetError(FromError(err)) |
| 617 | return false |
| 618 | } |
| 619 | if refID < int32(NotNullValueFlag) { |
| 620 | obj := ctx.RefResolver().GetReadObject(refID) |
| 621 | if obj.IsValid() { |
| 622 | value.Set(obj) |
| 623 | } |
| 624 | return true |
| 625 | } |
| 626 | case RefModeNullOnly: |
| 627 | flag := buf.ReadInt8(ctxErr) |
| 628 | if flag == NullFlag { |
| 629 | return true |
| 630 | } |
| 631 | } |
| 632 | if readType { |
| 633 | if !ctx.readExpectedTypeID(MAP) { |
| 634 | return false |
| 635 | } |
| 636 | } |
| 637 | return false |
| 638 | } |
| 639 | |
| 640 | func unwrapInterface(v reflect.Value) reflect.Value { |
| 641 | // For map serialization, we need to unwrap interfaces including nil ones |
no test coverage detected