(b []byte, p unsafe.Pointer, st *structType)
| 1136 | } |
| 1137 | |
| 1138 | func (d decoder) decodeStruct(b []byte, p unsafe.Pointer, st *structType) ([]byte, error) { |
| 1139 | if hasNullPrefix(b) { |
| 1140 | return b[4:], nil |
| 1141 | } |
| 1142 | |
| 1143 | if len(b) < 2 || b[0] != '{' { |
| 1144 | return d.inputError(b, st.typ) |
| 1145 | } |
| 1146 | |
| 1147 | var err error |
| 1148 | var k []byte |
| 1149 | var i int |
| 1150 | |
| 1151 | // memory buffer used to convert short field names to lowercase |
| 1152 | var buf [64]byte |
| 1153 | var key []byte |
| 1154 | input := b |
| 1155 | |
| 1156 | b = b[1:] |
| 1157 | for { |
| 1158 | b = skipSpaces(b) |
| 1159 | |
| 1160 | if len(b) != 0 && b[0] == '}' { |
| 1161 | return b[1:], nil |
| 1162 | } |
| 1163 | |
| 1164 | if i != 0 { |
| 1165 | if len(b) == 0 { |
| 1166 | return b, syntaxError(b, "unexpected end of JSON input after object field value") |
| 1167 | } |
| 1168 | if b[0] != ',' { |
| 1169 | return b, syntaxError(b, "expected ',' after object field value but found '%c'", b[0]) |
| 1170 | } |
| 1171 | b = skipSpaces(b[1:]) |
| 1172 | } |
| 1173 | i++ |
| 1174 | |
| 1175 | if hasNullPrefix(b) { |
| 1176 | return b, syntaxError(b, "cannot decode object key string from 'null' value") |
| 1177 | } |
| 1178 | |
| 1179 | k, b, _, err = d.parseStringUnquote(b, nil) |
| 1180 | if err != nil { |
| 1181 | return objectKeyError(b, err) |
| 1182 | } |
| 1183 | b = skipSpaces(b) |
| 1184 | |
| 1185 | if len(b) == 0 { |
| 1186 | return b, syntaxError(b, "unexpected end of JSON input after object field key") |
| 1187 | } |
| 1188 | if b[0] != ':' { |
| 1189 | return b, syntaxError(b, "expected ':' after object field key but found '%c'", b[0]) |
| 1190 | } |
| 1191 | b = skipSpaces(b[1:]) |
| 1192 | |
| 1193 | var f *structField |
| 1194 | if len(st.keyset) != 0 { |
| 1195 | if n := keyset.Lookup(st.keyset, k); n < len(st.fields) { |
no test coverage detected