readArrayRefAndType handles reference and type reading for array serializers. Returns true if a reference was resolved (value already set), false if data should be read.
(ctx *ReadContext, refMode RefMode, readType bool, value reflect.Value)
| 38 | // readArrayRefAndType handles reference and type reading for array serializers. |
| 39 | // Returns true if a reference was resolved (value already set), false if data should be read. |
| 40 | func readArrayRefAndType(ctx *ReadContext, refMode RefMode, readType bool, value reflect.Value) bool { |
| 41 | buf := ctx.Buffer() |
| 42 | err := ctx.Err() |
| 43 | if refMode != RefModeNone { |
| 44 | refID, refErr := ctx.RefResolver().TryPreserveRefId(buf) |
| 45 | if refErr != nil { |
| 46 | ctx.SetError(FromError(refErr)) |
| 47 | return false |
| 48 | } |
| 49 | if refID < int32(NotNullValueFlag) { |
| 50 | obj := ctx.RefResolver().GetReadObject(refID) |
| 51 | if obj.IsValid() { |
| 52 | value.Set(obj) |
| 53 | } |
| 54 | return true |
| 55 | } |
| 56 | } |
| 57 | if readType { |
| 58 | typeID := uint32(buf.ReadUint8(err)) |
| 59 | if ctx.HasError() { |
| 60 | return false |
| 61 | } |
| 62 | if typeID != uint32(LIST) { |
| 63 | ctx.SetError(DeserializationErrorf("array type mismatch: expected LIST (%d), got %d", LIST, typeID)) |
| 64 | return false |
| 65 | } |
| 66 | } |
| 67 | return false |
| 68 | } |
| 69 | |
| 70 | // Array serializers |
| 71 |
no test coverage detected