encodeObject encodes an object.
(obj reflect.Value, how encodeStrategy, dest *wire.Object)
| 675 | |
| 676 | // encodeObject encodes an object. |
| 677 | func (es *encodeState) encodeObject(obj reflect.Value, how encodeStrategy, dest *wire.Object) { |
| 678 | if how == encodeDefault && isPrimitiveZero(obj.Type()) && obj.IsZero() { |
| 679 | *dest = wire.Nil{} |
| 680 | return |
| 681 | } |
| 682 | switch obj.Kind() { |
| 683 | case reflect.Ptr: // Fast path: first. |
| 684 | r := new(wire.Ref) |
| 685 | *dest = r |
| 686 | if obj.IsNil() { |
| 687 | // May be in an array or elsewhere such that a value is |
| 688 | // required. So we encode as a reference to the zero |
| 689 | // object, which does not exist. Note that this has to |
| 690 | // be handled correctly in the decode path as well. |
| 691 | return |
| 692 | } |
| 693 | es.resolve(obj, r) |
| 694 | case reflect.Bool: |
| 695 | *dest = wire.Bool(obj.Bool()) |
| 696 | case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: |
| 697 | *dest = wire.Int(obj.Int()) |
| 698 | case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: |
| 699 | *dest = wire.Uint(obj.Uint()) |
| 700 | case reflect.Float32: |
| 701 | *dest = wire.Float32(obj.Float()) |
| 702 | case reflect.Float64: |
| 703 | *dest = wire.Float64(obj.Float()) |
| 704 | case reflect.Complex64: |
| 705 | c := wire.Complex64(obj.Complex()) |
| 706 | *dest = &c // Needs alloc. |
| 707 | case reflect.Complex128: |
| 708 | c := wire.Complex128(obj.Complex()) |
| 709 | *dest = &c // Needs alloc. |
| 710 | case reflect.String: |
| 711 | s := wire.String(obj.String()) |
| 712 | *dest = &s // Needs alloc. |
| 713 | case reflect.Array: |
| 714 | es.encodeArray(obj, dest) |
| 715 | case reflect.Slice: |
| 716 | s := &wire.Slice{ |
| 717 | Capacity: wire.Uint(obj.Cap()), |
| 718 | Length: wire.Uint(obj.Len()), |
| 719 | } |
| 720 | *dest = s |
| 721 | // Note that we do need to provide a wire.Slice type here as |
| 722 | // how is not encodeDefault. If this were the case, then it |
| 723 | // would have been caught by the IsZero check above and we |
| 724 | // would have just used wire.Nil{}. |
| 725 | if obj.IsNil() { |
| 726 | return |
| 727 | } |
| 728 | // Slices need pointer resolution. |
| 729 | es.resolve(arrayFromSlice(obj), &s.Ref) |
| 730 | case reflect.Interface: |
| 731 | es.encodeInterface(obj, dest) |
| 732 | case reflect.Struct: |
| 733 | es.encodeStruct(obj, dest) |
| 734 | case reflect.Map: |
no test coverage detected