(vp valueProvider, rv reflect.Value)
| 135 | } |
| 136 | |
| 137 | func (e *Encoder) encodeStruct(vp valueProvider, rv reflect.Value) error { |
| 138 | if rv.CanInterface() && document.IsNoSerde(rv.Interface()) { |
| 139 | return &document.UnmarshalTypeError{ |
| 140 | Value: fmt.Sprintf("unsupported type"), |
| 141 | Type: rv.Type(), |
| 142 | } |
| 143 | } |
| 144 | |
| 145 | switch { |
| 146 | case rv.Type().ConvertibleTo(serde.ReflectTypeOf.Time): |
| 147 | return &document.InvalidMarshalError{ |
| 148 | Message: fmt.Sprintf("unsupported type %s", rv.Type().String()), |
| 149 | } |
| 150 | case rv.Type().ConvertibleTo(serde.ReflectTypeOf.BigFloat): |
| 151 | fallthrough |
| 152 | case rv.Type().ConvertibleTo(serde.ReflectTypeOf.BigInt): |
| 153 | return e.encodeNumber(vp, rv) |
| 154 | } |
| 155 | |
| 156 | object := vp.GetValue().Object() |
| 157 | defer object.Close() |
| 158 | |
| 159 | fields := serde.GetStructFields(rv.Type()) |
| 160 | for _, f := range fields.All() { |
| 161 | if f.Name == "" { |
| 162 | return &document.InvalidMarshalError{Message: "map key cannot be empty"} |
| 163 | } |
| 164 | |
| 165 | fv, found := serde.EncoderFieldByIndex(rv, f.Index) |
| 166 | if !found { |
| 167 | continue |
| 168 | } |
| 169 | |
| 170 | err := e.encode(jsonObjectKeyProvider{ |
| 171 | Object: object, |
| 172 | Key: f.Name, |
| 173 | }, fv, f.Tag) |
| 174 | if err != nil { |
| 175 | return err |
| 176 | } |
| 177 | } |
| 178 | |
| 179 | return nil |
| 180 | } |
| 181 | |
| 182 | func (e *Encoder) encodeMap(vp valueProvider, rv reflect.Value) error { |
| 183 | object := vp.GetValue().Object() |
no test coverage detected