(bz []byte, rv reflect.Value)
| 174 | } |
| 175 | |
| 176 | func decodeReflectStruct(bz []byte, rv reflect.Value) error { |
| 177 | if !rv.CanAddr() { |
| 178 | return errors.New("struct value is not addressable") |
| 179 | } |
| 180 | sInfo := makeStructInfo(rv.Type()) |
| 181 | |
| 182 | // Decode raw JSON values into a string-keyed map. |
| 183 | rawMap := make(map[string]json.RawMessage) |
| 184 | if err := json.Unmarshal(bz, &rawMap); err != nil { |
| 185 | return err |
| 186 | } |
| 187 | for i, fInfo := range sInfo.fields { |
| 188 | if !fInfo.hidden { |
| 189 | frv := rv.Field(i) |
| 190 | bz := rawMap[fInfo.jsonName] |
| 191 | if len(bz) > 0 { |
| 192 | if err := decodeReflect(bz, frv); err != nil { |
| 193 | return err |
| 194 | } |
| 195 | } else if !fInfo.omitEmpty { |
| 196 | frv.Set(reflect.Zero(frv.Type())) |
| 197 | } |
| 198 | } |
| 199 | } |
| 200 | |
| 201 | return nil |
| 202 | } |
| 203 | |
| 204 | func decodeReflectInterface(bz []byte, rv reflect.Value) error { |
| 205 | if !rv.CanAddr() { |
no test coverage detected
searching dependent graphs…