WriteValue writes a polymorphic value with configurable reference tracking and type info. This is used when the concrete type is not known at compile time. Parameters: - refMode: controls reference tracking behavior (RefModeNone, RefModeTracking, RefModeNullOnly) - writeType: if true, writes type in
(value reflect.Value, refMode RefMode, writeType bool)
| 617 | // - refMode: controls reference tracking behavior (RefModeNone, RefModeTracking, RefModeNullOnly) |
| 618 | // - writeType: if true, writes type info before the value |
| 619 | func (c *WriteContext) WriteValue(value reflect.Value, refMode RefMode, writeType bool) { |
| 620 | // Handle interface values by getting their concrete element |
| 621 | if value.Kind() == reflect.Interface { |
| 622 | if !value.IsValid() || value.IsNil() { |
| 623 | c.buffer.WriteInt8(NullFlag) |
| 624 | return |
| 625 | } |
| 626 | value = value.Elem() |
| 627 | } |
| 628 | |
| 629 | // Handle invalid values (nil interface) |
| 630 | if !value.IsValid() { |
| 631 | c.buffer.WriteInt8(NullFlag) |
| 632 | return |
| 633 | } |
| 634 | |
| 635 | // Check for pointer to reference type (not allowed) |
| 636 | if value.Kind() == reflect.Ptr { |
| 637 | switch value.Elem().Kind() { |
| 638 | case reflect.Ptr, reflect.Map, reflect.Slice, reflect.Interface: |
| 639 | c.SetError(SerializationErrorf("pointer to reference type %s is not allowed", value.Type())) |
| 640 | return |
| 641 | } |
| 642 | } |
| 643 | |
| 644 | // For array types, pre-convert the value to slice |
| 645 | if value.Kind() == reflect.Array { |
| 646 | length := value.Len() |
| 647 | sliceType := reflect.SliceOf(value.Type().Elem()) |
| 648 | slice := reflect.MakeSlice(sliceType, length, length) |
| 649 | reflect.Copy(slice, value) |
| 650 | value = slice |
| 651 | } |
| 652 | |
| 653 | // Get type information and serializer for the value |
| 654 | typeInfo, err := c.typeResolver.getTypeInfo(value, true) |
| 655 | if err != nil { |
| 656 | c.SetError(SerializationErrorf("cannot get typeinfo for value %v: %v", value, err)) |
| 657 | return |
| 658 | } |
| 659 | |
| 660 | // Use serializer's Write method which handles ref tracking and type info internally |
| 661 | typeInfo.Serializer.Write(c, refMode, writeType, false, value) |
| 662 | } |
no test coverage detected