package msgpack
import (
)
type queryResult struct {
query string
key string
hasAsterisk bool
values []interface{}
}
func ( *queryResult) () {
:= strings.IndexByte(.query, '.')
if == -1 {
.key = .query
.query = ""
return
}
.key = .query[:]
.query = .query[+1:]
}
func ( *Decoder) ( string) ([]interface{}, error) {
:= queryResult{
query: ,
}
if := .query(&); != nil {
return nil,
}
return .values, nil
}
func ( *Decoder) ( *queryResult) error {
.nextKey()
if .key == "" {
, := .decodeInterfaceCond()
if != nil {
return
}
.values = append(.values, )
return nil
}
, := .PeekCode()
if != nil {
return
}
switch {
case == msgpcode.Map16 || == msgpcode.Map32 || msgpcode.IsFixedMap():
= .queryMapKey()
case == msgpcode.Array16 || == msgpcode.Array32 || msgpcode.IsFixedArray():
= .queryArrayIndex()
default:
= fmt.Errorf("msgpack: unsupported code=%x decoding key=%q", , .key)
}
return
}
func ( *Decoder) ( *queryResult) error {
, := .DecodeMapLen()
if != nil {
return
}
if == -1 {
return nil
}
for := 0; < ; ++ {
, := .decodeStringTemp()
if != nil {
return
}
if == .key {
if := .query(); != nil {
return
}
if .hasAsterisk {
return .skipNext(( - - 1) * 2)
}
return nil
}
if := .Skip(); != nil {
return
}
}
return nil
}
func ( *Decoder) ( *queryResult) error {
, := .DecodeArrayLen()
if != nil {
return
}
if == -1 {
return nil
}
if .key == "*" {
.hasAsterisk = true
:= .query
for := 0; < ; ++ {
.query =
if := .query(); != nil {
return
}
}
.hasAsterisk = false
return nil
}
, := strconv.Atoi(.key)
if != nil {
return
}
for := 0; < ; ++ {
if == {
if := .query(); != nil {
return
}
if .hasAsterisk {
return .skipNext( - - 1)
}
return nil
}
if := .Skip(); != nil {
return
}
}
return nil
}
func ( *Decoder) ( int) error {
for := 0; < ; ++ {
if := .Skip(); != nil {
return
}
}
return nil
}