| 169 | } |
| 170 | |
| 171 | func (t *parser) key(data map[string]interface{}) (reterr error) { |
| 172 | defer func() { |
| 173 | if r := recover(); r != nil { |
| 174 | reterr = fmt.Errorf("unable to parse key: %s", r) |
| 175 | } |
| 176 | }() |
| 177 | stop := runeSet([]rune{'=', '[', ',', '.'}) |
| 178 | for { |
| 179 | switch k, last, err := runesUntil(t.sc, stop); { |
| 180 | case err != nil: |
| 181 | if len(k) == 0 { |
| 182 | return err |
| 183 | } |
| 184 | return errors.Errorf("key %q has no value", string(k)) |
| 185 | //set(data, string(k), "") |
| 186 | //return err |
| 187 | case last == '[': |
| 188 | // We are in a list index context, so we need to set an index. |
| 189 | i, err := t.keyIndex() |
| 190 | if err != nil { |
| 191 | return errors.Wrap(err, "error parsing index") |
| 192 | } |
| 193 | kk := string(k) |
| 194 | // Find or create target list |
| 195 | list := []interface{}{} |
| 196 | if _, ok := data[kk]; ok { |
| 197 | list = data[kk].([]interface{}) |
| 198 | } |
| 199 | |
| 200 | // Now we need to get the value after the ]. |
| 201 | list, err = t.listItem(list, i) |
| 202 | set(data, kk, list) |
| 203 | return err |
| 204 | case last == '=': |
| 205 | //End of key. Consume =, Get value. |
| 206 | // FIXME: Get value list first |
| 207 | vl, e := t.valList() |
| 208 | switch e { |
| 209 | case nil: |
| 210 | set(data, string(k), vl) |
| 211 | return nil |
| 212 | case io.EOF: |
| 213 | set(data, string(k), "") |
| 214 | return e |
| 215 | case ErrNotList: |
| 216 | rs, e := t.val() |
| 217 | if e != nil && e != io.EOF { |
| 218 | return e |
| 219 | } |
| 220 | v, e := t.reader(rs) |
| 221 | set(data, string(k), v) |
| 222 | return e |
| 223 | default: |
| 224 | return e |
| 225 | } |
| 226 | |
| 227 | case last == ',': |
| 228 | // No value given. Set the value to empty string. Return error. |