8 "github.com/vmihailenco/msgpack/codes"
11 type queryResult struct {
19 func (q *queryResult) nextKey() {
20 ind := strings.IndexByte(q.query, '.')
27 q.query = q.query[ind+1:]
30 // Query extracts data specified by the query from the msgpack stream skipping
31 // any other data. Query consists of map keys and array indexes separated with dot,
33 func (d *Decoder) Query(query string) ([]interface{}, error) {
37 if err := d.query(&res); err != nil {
40 return res.values, nil
43 func (d *Decoder) query(q *queryResult) error {
46 v, err := d.decodeInterfaceCond()
50 q.values = append(q.values, v)
54 code, err := d.PeekCode()
60 case code == codes.Map16 || code == codes.Map32 || codes.IsFixedMap(code):
61 err = d.queryMapKey(q)
62 case code == codes.Array16 || code == codes.Array32 || codes.IsFixedArray(code):
63 err = d.queryArrayIndex(q)
65 err = fmt.Errorf("msgpack: unsupported code=%x decoding key=%q", code, q.key)
70 func (d *Decoder) queryMapKey(q *queryResult) error {
71 n, err := d.DecodeMapLen()
79 for i := 0; i < n; i++ {
80 k, err := d.bytesNoCopy()
85 if string(k) == q.key {
86 if err := d.query(q); err != nil {
90 return d.skipNext((n - i - 1) * 2)
95 if err := d.Skip(); err != nil {
103 func (d *Decoder) queryArrayIndex(q *queryResult) error {
104 n, err := d.DecodeArrayLen()
116 for i := 0; i < n; i++ {
118 if err := d.query(q); err != nil {
123 q.hasAsterisk = false
127 ind, err := strconv.Atoi(q.key)
132 for i := 0; i < n; i++ {
134 if err := d.query(q); err != nil {
138 return d.skipNext(n - i - 1)
143 if err := d.Skip(); err != nil {
151 func (d *Decoder) skipNext(n int) error {
152 for i := 0; i < n; i++ {
153 if err := d.Skip(); err != nil {