34 lines
651 B
Go
34 lines
651 B
Go
package model
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
)
|
|
|
|
// Query returns node by array query
|
|
func (n *Node) Query(query []string) (*Node, error) {
|
|
if len(query) == 0 {
|
|
return n, nil
|
|
}
|
|
head, rest := query[0], query[1:]
|
|
switch n.Type {
|
|
case ArrayNode:
|
|
idx, err := strconv.Atoi(head)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("index must be a number, got %s", head)
|
|
}
|
|
next, err := n.Index(idx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return next.Query(rest)
|
|
case ObjectNode:
|
|
next, err := n.Get(head)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return next.Query(rest)
|
|
}
|
|
return nil, fmt.Errorf("can't get %s from node type %s", head, n.Type)
|
|
}
|