(ctx *WriteContext, refMode RefMode, value reflect.Value, typeInfo *TypeInfo)
| 95 | } |
| 96 | |
| 97 | func (s *ptrToValueSerializer) writeWithTypeInfo(ctx *WriteContext, refMode RefMode, value reflect.Value, typeInfo *TypeInfo) { |
| 98 | switch refMode { |
| 99 | case RefModeTracking: |
| 100 | if value.IsNil() { |
| 101 | ctx.Buffer().WriteInt8(NullFlag) |
| 102 | return |
| 103 | } |
| 104 | refWritten, err := ctx.RefResolver().WriteRefOrNull(ctx.Buffer(), value) |
| 105 | if err != nil { |
| 106 | ctx.SetError(FromError(err)) |
| 107 | return |
| 108 | } |
| 109 | if refWritten { |
| 110 | return |
| 111 | } |
| 112 | case RefModeNullOnly: |
| 113 | if value.IsNil() { |
| 114 | ctx.Buffer().WriteInt8(NullFlag) |
| 115 | return |
| 116 | } |
| 117 | ctx.Buffer().WriteInt8(NotNullValueFlag) |
| 118 | case RefModeNone: |
| 119 | if value.IsNil() { |
| 120 | zeroValue := reflect.New(value.Type().Elem()).Elem() |
| 121 | if typeInfo == nil { |
| 122 | s.Write(ctx, refMode, true, false, value) |
| 123 | return |
| 124 | } |
| 125 | ctx.TypeResolver().WriteTypeInfo(ctx.Buffer(), typeInfo, ctx.Err()) |
| 126 | s.valueSerializer.WriteData(ctx, zeroValue) |
| 127 | return |
| 128 | } |
| 129 | } |
| 130 | if typeInfo == nil { |
| 131 | s.Write(ctx, refMode, true, false, value) |
| 132 | return |
| 133 | } |
| 134 | ctx.TypeResolver().WriteTypeInfo(ctx.Buffer(), typeInfo, ctx.Err()) |
| 135 | s.WriteData(ctx, value) |
| 136 | } |
| 137 | |
| 138 | func (s *ptrToValueSerializer) ReadData(ctx *ReadContext, value reflect.Value) { |
| 139 | // Check if value is already allocated (for circular reference handling) |
nothing calls this directly
no test coverage detected