WriteData serializes union payload (case_id + case_value).
(ctx *WriteContext, value reflect.Value)
| 166 | |
| 167 | // WriteData serializes union payload (case_id + case_value). |
| 168 | func (s *UnionSerializer) WriteData(ctx *WriteContext, value reflect.Value) { |
| 169 | if ctx.HasError() { |
| 170 | return |
| 171 | } |
| 172 | if err := s.initialize(ctx.TypeResolver()); err != nil { |
| 173 | ctx.SetError(SerializationErrorf("union serializer init failed: %v", err)) |
| 174 | return |
| 175 | } |
| 176 | |
| 177 | caseID, caseValue, err := getUnionCaseValue(value) |
| 178 | if err != nil { |
| 179 | ctx.SetError(SerializationErrorf("union value access failed: %v", err)) |
| 180 | return |
| 181 | } |
| 182 | info, ok := s.caseByID[caseID] |
| 183 | if !ok { |
| 184 | ctx.SetError(SerializationErrorf("unknown union case id: %d", caseID)) |
| 185 | return |
| 186 | } |
| 187 | |
| 188 | ctx.Buffer().WriteVarUint32(uint32(caseID)) |
| 189 | if info.declaredValue { |
| 190 | writeUnionDeclaredValue(ctx, info, reflect.ValueOf(caseValue)) |
| 191 | } else if info.needsOverride { |
| 192 | writeUnionOverrideValue(ctx, info, reflect.ValueOf(caseValue)) |
| 193 | } else { |
| 194 | ctx.WriteValue(reflect.ValueOf(caseValue), RefModeTracking, true) |
| 195 | } |
| 196 | } |
| 197 | |
| 198 | // Read is the entry point for union deserialization. |
| 199 | func (s *UnionSerializer) Read(ctx *ReadContext, refMode RefMode, readType bool, hasGenerics bool, value reflect.Value) { |
no test coverage detected