34 lines
661 B
Go
34 lines
661 B
Go
package model
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
)
|
|
|
|
// Query returns node by array query
|
|
func Query(n Node, query []string) (Node, error) {
|
|
if len(query) == 0 {
|
|
return n, nil
|
|
}
|
|
head, rest := query[0], query[1:]
|
|
switch n := 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 Query(next, rest)
|
|
case *ObjectNode:
|
|
next, err := n.Get(head)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return Query(next, rest)
|
|
}
|
|
return nil, fmt.Errorf("can't get %s from node type %s", head, n.Type())
|
|
}
|