(bz []byte, rv reflect.Value)
| 99 | } |
| 100 | |
| 101 | func decodeReflectList(bz []byte, rv reflect.Value) error { |
| 102 | if !rv.CanAddr() { |
| 103 | return errors.New("list value is not addressable") |
| 104 | } |
| 105 | |
| 106 | switch rv.Type().Elem().Kind() { |
| 107 | // Decode base64-encoded bytes using stdlib decoder, via byte slice for arrays. |
| 108 | case reflect.Uint8: |
| 109 | if rv.Type().Kind() == reflect.Array { |
| 110 | var buf []byte |
| 111 | if err := json.Unmarshal(bz, &buf); err != nil { |
| 112 | return err |
| 113 | } |
| 114 | if len(buf) != rv.Len() { |
| 115 | return fmt.Errorf("got %v bytes, expected %v", len(buf), rv.Len()) |
| 116 | } |
| 117 | reflect.Copy(rv, reflect.ValueOf(buf)) |
| 118 | |
| 119 | } else if err := decodeStdlib(bz, rv); err != nil { |
| 120 | return err |
| 121 | } |
| 122 | |
| 123 | // Decode anything else into a raw JSON slice, and decode values recursively. |
| 124 | default: |
| 125 | var rawSlice []json.RawMessage |
| 126 | if err := json.Unmarshal(bz, &rawSlice); err != nil { |
| 127 | return err |
| 128 | } |
| 129 | if rv.Type().Kind() == reflect.Slice { |
| 130 | rv.Set(reflect.MakeSlice(reflect.SliceOf(rv.Type().Elem()), len(rawSlice), len(rawSlice))) |
| 131 | } |
| 132 | if rv.Len() != len(rawSlice) { // arrays of wrong size |
| 133 | return fmt.Errorf("got list of %v elements, expected %v", len(rawSlice), rv.Len()) |
| 134 | } |
| 135 | for i, bz := range rawSlice { |
| 136 | if err := decodeReflect(bz, rv.Index(i)); err != nil { |
| 137 | return err |
| 138 | } |
| 139 | } |
| 140 | } |
| 141 | |
| 142 | // Replace empty slices with nil slices, for Amino compatibility |
| 143 | if rv.Type().Kind() == reflect.Slice && rv.Len() == 0 { |
| 144 | rv.Set(reflect.Zero(rv.Type())) |
| 145 | } |
| 146 | |
| 147 | return nil |
| 148 | } |
| 149 | |
| 150 | func decodeReflectMap(bz []byte, rv reflect.Value) error { |
| 151 | if !rv.CanAddr() { |
no test coverage detected