(ctx *WriteContext, info *unionCaseInfo, value reflect.Value)
| 396 | } |
| 397 | |
| 398 | func writeUnionOverrideValue(ctx *WriteContext, info *unionCaseInfo, value reflect.Value) { |
| 399 | if value.Kind() == reflect.Interface { |
| 400 | if !value.IsValid() || value.IsNil() { |
| 401 | ctx.Buffer().WriteInt8(NullFlag) |
| 402 | return |
| 403 | } |
| 404 | value = value.Elem() |
| 405 | } |
| 406 | if !value.IsValid() { |
| 407 | ctx.Buffer().WriteInt8(NullFlag) |
| 408 | return |
| 409 | } |
| 410 | if value.Kind() == reflect.Ptr { |
| 411 | if value.IsNil() { |
| 412 | ctx.Buffer().WriteInt8(NullFlag) |
| 413 | return |
| 414 | } |
| 415 | if isRefKind(value.Elem().Kind()) { |
| 416 | ctx.SetError(SerializationErrorf("pointer to reference type %s is not allowed", value.Type())) |
| 417 | return |
| 418 | } |
| 419 | } |
| 420 | refWritten, err := ctx.RefResolver().WriteRefOrNull(ctx.Buffer(), value) |
| 421 | if err != nil { |
| 422 | ctx.SetError(FromError(err)) |
| 423 | return |
| 424 | } |
| 425 | if refWritten { |
| 426 | return |
| 427 | } |
| 428 | ctx.Buffer().WriteUint8(uint8(info.typeID)) |
| 429 | if value.Kind() == reflect.Ptr { |
| 430 | value = value.Elem() |
| 431 | } |
| 432 | writeNumericValueByTypeID(ctx, info.typeID, value) |
| 433 | } |
| 434 | |
| 435 | func readUnionOverrideValue(ctx *ReadContext, info *unionCaseInfo) (any, bool) { |
| 436 | buf := ctx.Buffer() |
no test coverage detected