8 var valueEncoders []encoderFunc
11 valueEncoders = []encoderFunc{
12 reflect.Bool: encodeBoolValue,
13 reflect.Int: encodeInt64CondValue,
14 reflect.Int8: encodeInt8CondValue,
15 reflect.Int16: encodeInt16CondValue,
16 reflect.Int32: encodeInt32CondValue,
17 reflect.Int64: encodeInt64CondValue,
18 reflect.Uint: encodeUint64CondValue,
19 reflect.Uint8: encodeUint8CondValue,
20 reflect.Uint16: encodeUint16CondValue,
21 reflect.Uint32: encodeUint32CondValue,
22 reflect.Uint64: encodeUint64CondValue,
23 reflect.Float32: encodeFloat32Value,
24 reflect.Float64: encodeFloat64Value,
25 reflect.Complex64: encodeUnsupportedValue,
26 reflect.Complex128: encodeUnsupportedValue,
27 reflect.Array: encodeArrayValue,
28 reflect.Chan: encodeUnsupportedValue,
29 reflect.Func: encodeUnsupportedValue,
30 reflect.Interface: encodeInterfaceValue,
31 reflect.Map: encodeMapValue,
32 reflect.Ptr: encodeUnsupportedValue,
33 reflect.Slice: encodeSliceValue,
34 reflect.String: encodeStringValue,
35 reflect.Struct: encodeStructValue,
36 reflect.UnsafePointer: encodeUnsupportedValue,
40 func getEncoder(typ reflect.Type) encoderFunc {
41 if encoder, ok := typEncMap[typ]; ok {
45 if typ.Implements(customEncoderType) {
46 return encodeCustomValue
48 if typ.Implements(marshalerType) {
54 // Addressable struct field value.
55 if kind != reflect.Ptr {
56 ptr := reflect.PtrTo(typ)
57 if ptr.Implements(customEncoderType) {
58 return encodeCustomValuePtr
60 if ptr.Implements(marshalerType) {
61 return marshalValuePtr
66 return encodeErrorValue
71 return ptrEncoderFunc(typ)
73 if typ.Elem().Kind() == reflect.Uint8 {
74 return encodeByteSliceValue
77 if typ.Elem().Kind() == reflect.Uint8 {
78 return encodeByteArrayValue
81 if typ.Key() == stringType {
84 return encodeMapStringStringValue
86 return encodeMapStringInterfaceValue
90 return valueEncoders[kind]
93 func ptrEncoderFunc(typ reflect.Type) encoderFunc {
94 encoder := getEncoder(typ.Elem())
95 return func(e *Encoder, v reflect.Value) error {
99 return encoder(e, v.Elem())
103 func encodeCustomValuePtr(e *Encoder, v reflect.Value) error {
105 return fmt.Errorf("msgpack: Encode(non-addressable %T)", v.Interface())
107 encoder := v.Addr().Interface().(CustomEncoder)
108 return encoder.EncodeMsgpack(e)
111 func encodeCustomValue(e *Encoder, v reflect.Value) error {
113 case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
119 encoder := v.Interface().(CustomEncoder)
120 return encoder.EncodeMsgpack(e)
123 func marshalValuePtr(e *Encoder, v reflect.Value) error {
125 return fmt.Errorf("msgpack: Encode(non-addressable %T)", v.Interface())
127 return marshalValue(e, v.Addr())
130 func marshalValue(e *Encoder, v reflect.Value) error {
132 case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
138 marshaler := v.Interface().(Marshaler)
139 b, err := marshaler.MarshalMsgpack()
143 _, err = e.w.Write(b)
147 func encodeBoolValue(e *Encoder, v reflect.Value) error {
148 return e.EncodeBool(v.Bool())
151 func encodeInterfaceValue(e *Encoder, v reflect.Value) error {
155 return e.EncodeValue(v.Elem())
158 func encodeErrorValue(e *Encoder, v reflect.Value) error {
162 return e.EncodeString(v.Interface().(error).Error())
165 func encodeUnsupportedValue(e *Encoder, v reflect.Value) error {
166 return fmt.Errorf("msgpack: Encode(unsupported %s)", v.Type())