(ctx *WriteContext, refMode RefMode, writeType bool, hasGenerics bool, value reflect.Value)
| 81 | } |
| 82 | |
| 83 | func (s *structSerializer) Write(ctx *WriteContext, refMode RefMode, writeType bool, hasGenerics bool, value reflect.Value) { |
| 84 | switch refMode { |
| 85 | case RefModeTracking: |
| 86 | if value.Kind() == reflect.Ptr && value.IsNil() { |
| 87 | ctx.buffer.WriteInt8(NullFlag) |
| 88 | return |
| 89 | } |
| 90 | refWritten, err := ctx.RefResolver().WriteRefOrNull(ctx.buffer, value) |
| 91 | if err != nil { |
| 92 | ctx.SetError(FromError(err)) |
| 93 | return |
| 94 | } |
| 95 | if refWritten { |
| 96 | return |
| 97 | } |
| 98 | case RefModeNullOnly: |
| 99 | if value.Kind() == reflect.Ptr && value.IsNil() { |
| 100 | ctx.buffer.WriteInt8(NullFlag) |
| 101 | return |
| 102 | } |
| 103 | ctx.buffer.WriteInt8(NotNullValueFlag) |
| 104 | } |
| 105 | if writeType { |
| 106 | // Structs have dynamic type IDs, need to look up from TypeResolver |
| 107 | typeInfo, err := ctx.TypeResolver().getTypeInfo(value, true) |
| 108 | if err != nil { |
| 109 | ctx.SetError(FromError(err)) |
| 110 | return |
| 111 | } |
| 112 | ctx.TypeResolver().WriteTypeInfo(ctx.buffer, typeInfo, ctx.Err()) |
| 113 | } |
| 114 | s.WriteData(ctx, value) |
| 115 | } |
| 116 | |
| 117 | func (s *structSerializer) writeWithTypeInfo(ctx *WriteContext, refMode RefMode, value reflect.Value, typeInfo *TypeInfo) { |
| 118 | switch refMode { |
no test coverage detected