MCPcopy Create free account
hub / github.com/apache/fory / Read

Method Read

go/fory/optional_serializer.go:256–306  ·  view source on GitHub ↗
(ctx *ReadContext, refMode RefMode, readType bool, hasGenerics bool, value reflect.Value)

Source from the content-addressed store, hash-verified

254}
255
256func (s *optionalSerializer) Read(ctx *ReadContext, refMode RefMode, readType bool, hasGenerics bool, value reflect.Value) {
257 buf := ctx.Buffer()
258 switch refMode {
259 case RefModeTracking:
260 refID, refErr := ctx.RefResolver().TryPreserveRefId(buf)
261 if refErr != nil {
262 ctx.SetError(FromError(refErr))
263 return
264 }
265 if refID < int32(NotNullValueFlag) {
266 if refID == int32(NullFlag) {
267 s.setHas(value, false)
268 return
269 }
270 refObj := ctx.RefResolver().GetReadObject(refID)
271 if refObj.IsValid() {
272 valueField := s.valueField(value)
273 if refObj.Type().AssignableTo(valueField.Type()) {
274 valueField.Set(refObj)
275 s.setHas(value, true)
276 return
277 }
278 }
279 }
280 case RefModeNullOnly:
281 flag := buf.ReadInt8(ctx.Err())
282 if flag == NullFlag {
283 s.setHas(value, false)
284 return
285 }
286 case RefModeNone:
287 // No null flag.
288 }
289 if readType {
290 typeID := uint32(buf.ReadUint8(ctx.Err()))
291 if ctx.HasError() {
292 return
293 }
294 internalTypeID := TypeId(typeID)
295 if IsNamespacedType(internalTypeID) || internalTypeID == COMPATIBLE_STRUCT || internalTypeID == STRUCT {
296 typeInfo := ctx.TypeResolver().readTypeInfoWithTypeID(buf, typeID, ctx.Err())
297 if structSer, ok := typeInfo.Serializer.(*structSerializer); ok && len(structSer.fieldDefs) > 0 {
298 valueField := s.valueField(value)
299 s.setHas(value, true)
300 structSer.ReadData(ctx, valueField)
301 return
302 }
303 }
304 }
305 s.ReadData(ctx, value)
306}
307
308func (s *optionalSerializer) ReadData(ctx *ReadContext, value reflect.Value) {
309 valueField := s.valueField(value)

Callers 1

ReadWithTypeInfoMethod · 0.95

Calls 15

setHasMethod · 0.95
valueFieldMethod · 0.95
ReadDataMethod · 0.95
FromErrorFunction · 0.85
IsNamespacedTypeFunction · 0.85
TryPreserveRefIdMethod · 0.80
GetReadObjectMethod · 0.80
ReadUint8Method · 0.80
ReadDataMethod · 0.65
int32Function · 0.50
uint32Function · 0.50

Tested by

no test coverage detected