Documentation
¶
Overview ¶
Package tree provides a simple structure for dealing with dynamic or unknown JSON/YAML structures.
Index ¶
- Constants
- Variables
- func Edit(pn *Node, expr string) error
- func MarshalJSON(n Node) ([]byte, error)
- func MarshalYAML(n Node) ([]byte, error)
- func OutputColorJSON(out io.Writer, n Node) error
- func OutputColorYAML(out io.Writer, n Node) error
- func RegisterNewMethodQueryFunc(method string, fn NewMethodQueryFunc)
- func ToAny(n Node) interface{}
- func UnmarshalViaJSON(n Node, v interface{}) error
- func UnmarshalViaYAML(n Node, v interface{}) error
- func Walk(n Node, fn WalkFunc) error
- type And
- type Any
- func (n Any) Array() Array
- func (n Any) Each(cb func(key interface{}, n Node) error) error
- func (n Any) Find(expr string) ([]Node, error)
- func (n Any) Get(keys ...interface{}) Node
- func (n Any) Has(keys ...interface{}) bool
- func (n Any) IsNil() bool
- func (n Any) Map() Map
- func (n Any) Type() Type
- func (n *Any) UnmarshalJSON(data []byte) error
- func (n Any) Value() Value
- type Array
- func (n *Array) Append(v Node) error
- func (n Array) Array() Array
- func (n *Array) Delete(key interface{}) error
- func (n Array) Each(cb func(key interface{}, n Node) error) error
- func (n Array) Find(expr string) ([]Node, error)
- func (n Array) Get(keys ...interface{}) Node
- func (n Array) Has(keys ...interface{}) bool
- func (n Array) IsNil() bool
- func (n Array) Map() Map
- func (n *Array) Set(key interface{}, v Node) error
- func (n Array) Type() Type
- func (n *Array) UnmarshalJSON(data []byte) error
- func (n *Array) UnmarshalYAML(unmarshal func(interface{}) error) error
- func (n Array) Value() Value
- type ArrayQuery
- type ArrayRangeQuery
- type BoolValue
- func (n BoolValue) Array() Array
- func (n BoolValue) Bool() bool
- func (n BoolValue) Compare(op Operator, v Value) bool
- func (n BoolValue) Each(cb func(key interface{}, n Node) error) error
- func (n BoolValue) Find(expr string) ([]Node, error)
- func (n BoolValue) Float64() float64
- func (n BoolValue) Get(keys ...interface{}) Node
- func (n BoolValue) Has(keys ...interface{}) bool
- func (n BoolValue) Int() int
- func (n BoolValue) Int64() int64
- func (n BoolValue) IsNil() bool
- func (n BoolValue) Map() Map
- func (n BoolValue) String() string
- func (n BoolValue) Type() Type
- func (n BoolValue) Value() Value
- type ColorEncoder
- type Comparator
- type ContainsQuery
- type CountQuery
- type EditorNode
- type EditorQuery
- type EmptyQuery
- type Evaluator
- type FilterQuery
- type FirstQuery
- type HasQuery
- type KeysQuery
- type LastQuery
- type Map
- func (n Map) Append(v Node) error
- func (n Map) Array() Array
- func (n Map) Delete(key interface{}) error
- func (n Map) Each(cb func(key interface{}, n Node) error) error
- func (n Map) Find(expr string) ([]Node, error)
- func (n Map) Get(keys ...interface{}) Node
- func (n Map) Has(keys ...interface{}) bool
- func (n Map) IsNil() bool
- func (n Map) Keys() []string
- func (n Map) Map() Map
- func (n Map) Set(key interface{}, v Node) error
- func (n Map) Type() Type
- func (n *Map) UnmarshalJSON(data []byte) error
- func (n *Map) UnmarshalYAML(unmarshal func(interface{}) error) error
- func (n Map) Value() Value
- func (n Map) Values() []Node
- type MapQuery
- type MergeOption
- type NewMethodQueryFunc
- type NilValue
- func (n NilValue) Array() Array
- func (n NilValue) Bool() bool
- func (n NilValue) Compare(op Operator, v Value) bool
- func (n NilValue) Each(cb func(key interface{}, n Node) error) error
- func (n NilValue) Find(expr string) ([]Node, error)
- func (n NilValue) Float64() float64
- func (n NilValue) Get(keys ...interface{}) Node
- func (n NilValue) Has(keys ...interface{}) bool
- func (n NilValue) Int() int
- func (n NilValue) Int64() int64
- func (n NilValue) IsNil() bool
- func (n NilValue) Map() Map
- func (n NilValue) MarshalJSON() ([]byte, error)
- func (n NilValue) MarshalYAML() (interface{}, error)
- func (n NilValue) String() string
- func (n NilValue) Type() Type
- func (n NilValue) Value() Value
- type Node
- func Clone(n Node) Node
- func CloneDeep(n Node) Node
- func DecodeJSON(dec *json.Decoder) (Node, error)
- func DecodeYAML(dec *yaml.Decoder) (Node, error)
- func Find(n Node, expr string) ([]Node, error)
- func MarshalViaJSON(v interface{}) (Node, error)
- func MarshalViaYAML(v interface{}) (Node, error)
- func Merge(a, b Node, opts MergeOption) Node
- func ToNode(v interface{}) Node
- func ToNodeValues(vs ...interface{}) []Node
- func ToValue(v interface{}) Node
- func UnmarshalJSON(data []byte) (Node, error)
- func UnmarshalYAML(data []byte) (Node, error)
- type NopQuery
- type NumberValue
- func (n NumberValue) Array() Array
- func (n NumberValue) Bool() bool
- func (n NumberValue) Compare(op Operator, v Value) bool
- func (n NumberValue) Each(cb func(key interface{}, n Node) error) error
- func (n NumberValue) Find(expr string) ([]Node, error)
- func (n NumberValue) Float64() float64
- func (n NumberValue) Get(keys ...interface{}) Node
- func (n NumberValue) Has(keys ...interface{}) bool
- func (n NumberValue) Int() int
- func (n NumberValue) Int64() int64
- func (n NumberValue) IsNil() bool
- func (n NumberValue) Map() Map
- func (n NumberValue) String() string
- func (n NumberValue) Type() Type
- func (n NumberValue) Value() Value
- type Operator
- type Or
- type Query
- func NewContainsQuery(args ...string) (Query, error)
- func NewCountQuery(args ...string) (Query, error)
- func NewEmptyQuery(args ...string) (Query, error)
- func NewFirstQuery(args ...string) (Query, error)
- func NewHasQuery(args ...string) (Query, error)
- func NewKeysQuery(args ...string) (Query, error)
- func NewLastQuery(args ...string) (Query, error)
- func NewMethodQuery(method string, args ...string) (Query, error)
- func NewTypeQuery(args ...string) (Query, error)
- func NewValuesQuery(args ...string) (Query, error)
- func ParseQuery(expr string) (Query, error)
- type SelectQuery
- type Selector
- type SlurpQuery
- type StringValue
- func (n StringValue) Array() Array
- func (n StringValue) Bool() bool
- func (n StringValue) Compare(op Operator, v Value) bool
- func (n StringValue) Each(cb func(key interface{}, n Node) error) error
- func (n StringValue) Find(expr string) ([]Node, error)
- func (n StringValue) Float64() float64
- func (n StringValue) Get(keys ...interface{}) Node
- func (n StringValue) Has(keys ...interface{}) bool
- func (n StringValue) Int() int
- func (n StringValue) Int64() int64
- func (n StringValue) IsNil() bool
- func (n StringValue) Map() Map
- func (n StringValue) String() string
- func (n StringValue) Type() Type
- func (n StringValue) Value() Value
- type Type
- type TypeQuery
- type Value
- type ValueQuery
- type ValuesQuery
- type WalkFunc
- type WalkQuery
Examples ¶
Constants ¶
const VERSION = "0.8.4"
VERSION is the version number.
Variables ¶
var (
Nil = NilValue{}
)
var SkipWalk = errors.New("skip")
SkipWalk is used as a return value from WalkFunc to indicate that the node and that children in the call is to be skipped. It is not returned as an error by any function.
Functions ¶
func Edit ¶ added in v0.5.0
Example ¶
package main
import (
"fmt"
"log"
"github.com/jarxorg/tree"
)
func main() {
var group tree.Node = tree.Map{
"ID": tree.ToValue(1),
"Name": tree.ToValue("Reds"),
"Colors": tree.ToArrayValues("Crimson", "Red", "Ruby", "Maroon"),
}
if err := tree.Edit(&group, ".Colors += \"Pink\""); err != nil {
log.Fatal(err)
}
fmt.Printf("Append Pink to Colors:\n %+v\n", group)
if err := tree.Edit(&group, ".Name = \"Blue\""); err != nil {
log.Fatal(err)
}
fmt.Printf("Set Blue to Name:\n %+v\n", group)
if err := tree.Edit(&group, ".Colors ^?"); err != nil {
log.Fatal(err)
}
fmt.Printf("Delete Colors:\n %+v\n", group)
}
Output: Append Pink to Colors: map[Colors:[Crimson Red Ruby Maroon Pink] ID:1 Name:Reds] Set Blue to Name: map[Colors:[Crimson Red Ruby Maroon Pink] ID:1 Name:Blue] Delete Colors: map[ID:1 Name:Blue]
func MarshalJSON ¶
MarshalJSON returns the JSON encoding of the specified node.
Example ¶
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/jarxorg/tree"
)
func main() {
group := tree.Map{
"ID": tree.ToValue(1),
"Name": tree.ToValue("Reds"),
"Colors": tree.ToArrayValues("Crimson", "Red", "Ruby", "Maroon"),
}
b, err := json.Marshal(group)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
}
Output: {"Colors":["Crimson","Red","Ruby","Maroon"],"ID":1,"Name":"Reds"}
Example (Combined) ¶
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/jarxorg/tree"
)
func main() {
type ColorGroup struct {
ID int
Name string
Colors tree.Array
}
group := ColorGroup{
ID: 1,
Name: "Reds",
Colors: tree.ToArrayValues("Crimson", "Red", "Ruby", "Maroon"),
}
b, err := json.Marshal(group)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
}
Output: {"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}
func MarshalYAML ¶
MarshalYAML returns the YAML encoding of the specified node.
Example ¶
group := tree.Map{
"ID": tree.ToValue(1),
"Name": tree.ToValue("Reds"),
"Colors": tree.ToArrayValues("Crimson", "Red", "Ruby", "Maroon"),
}
b, err := yaml.Marshal(group)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
Output: Colors: - Crimson - Red - Ruby - Maroon ID: 1 Name: Reds
func OutputColorJSON ¶ added in v0.7.2
OutputColorJSON writes JSON values with color to out.
func OutputColorYAML ¶ added in v0.7.2
OutputColorYAML writes YAML values with color to out.
func RegisterNewMethodQueryFunc ¶ added in v0.8.3
func RegisterNewMethodQueryFunc(method string, fn NewMethodQueryFunc)
RegisterNewMethodQueryFunc registers a factory function for a method query. This allows dynamic registration of new method types at runtime.
func ToAny ¶ added in v0.7.2
func ToAny(n Node) interface{}
ToAny converts a Node back to a native Go interface{} value. This is the reverse operation of ToNode.
func UnmarshalViaJSON ¶ added in v0.6.3
UnmarshalViaJSON stores the node in the value pointed to by v via "encoding/json".
func UnmarshalViaYAML ¶ added in v0.6.3
UnmarshalViaYAML stores the node in the value pointed to by v via "gopkg.in/yaml.v2".
Types ¶
type And ¶ added in v0.4.0
type And []Selector
And represents selectors that combines each selector with and.
type Any ¶ added in v0.8.0
type Any struct {
Node
}
Any is an interface that defines any node.
func (*Any) UnmarshalJSON ¶ added in v0.8.0
UnmarshalJSON is an implementation of json.Unmarshaler.
type Array ¶
type Array []Node
Array represents an array of Node.
func ToArrayValues ¶ added in v0.2.0
func ToArrayValues(vs ...interface{}) Array
ToArrayValues calls ToValue for each provided vs and returns them as an Array.
func (*Array) UnmarshalJSON ¶
UnmarshalJSON is an implementation of json.Unmarshaler.
func (*Array) UnmarshalYAML ¶
UnmarshalYAML is an implementation of yaml.Unmarshaler.
type ArrayQuery ¶ added in v0.2.0
type ArrayQuery int
ArrayQuery is an index of the Array that implements methods of the Query.
func (ArrayQuery) Delete ¶ added in v0.5.0
func (q ArrayQuery) Delete(pn *Node) error
func (ArrayQuery) String ¶ added in v0.5.0
func (q ArrayQuery) String() string
type ArrayRangeQuery ¶ added in v0.2.0
type ArrayRangeQuery []int
ArrayRangeQuery represents a range of the Array that implements methods of the Query.
func (ArrayRangeQuery) String ¶ added in v0.5.0
func (q ArrayRangeQuery) String() string
type BoolValue ¶
type BoolValue bool
A BoolValue represents a bool value.
type ColorEncoder ¶ added in v0.7.2
type ColorEncoder struct {
Out io.Writer
IndentSize int
NoColor bool
// contains filtered or unexported fields
}
ColorEncoder writes JSON or YAML values with color to an output stream.
func (*ColorEncoder) EncodeJSON ¶ added in v0.7.2
func (e *ColorEncoder) EncodeJSON(n Node) error
EncodeJSON writes JSON values with color to an output stream.
func (*ColorEncoder) EncodeYAML ¶ added in v0.7.2
func (e *ColorEncoder) EncodeYAML(n Node) error
EncodeJSON writes JSON values with color to an output stream.
type Comparator ¶ added in v0.2.0
Comparator represents a comparable selector.
func (Comparator) Matches ¶ added in v0.2.0
func (c Comparator) Matches(n Node) (bool, error)
Matches evaluates left and right using the operator. (eg. .id == 0)
func (Comparator) String ¶ added in v0.5.0
func (c Comparator) String() string
type ContainsQuery ¶ added in v0.8.3
type ContainsQuery struct {
Value string
}
ContainsQuery checks if the node contains the specified value. Works with arrays, maps, and string values.
func (*ContainsQuery) Exec ¶ added in v0.8.3
func (q *ContainsQuery) Exec(n Node) ([]Node, error)
Exec returns whether the node contains the specified value. For arrays, checks if any element equals the value. For maps, checks if any value equals the value. For strings, checks if the string contains the substring.
func (*ContainsQuery) String ¶ added in v0.8.3
func (q *ContainsQuery) String() string
type CountQuery ¶ added in v0.8.0
type CountQuery struct{}
CountQuery returns the count of elements in arrays or maps. For other node types, returns 0.
func (*CountQuery) Exec ¶ added in v0.8.0
func (q *CountQuery) Exec(n Node) ([]Node, error)
Exec returns the count of elements in the node. For arrays and maps, returns their length. For other types, returns 0.
func (*CountQuery) String ¶ added in v0.8.0
func (q *CountQuery) String() string
type EditorNode ¶ added in v0.5.0
type EditorNode interface {
Node
Append(v Node) error
Set(key interface{}, v Node) error
Delete(key interface{}) error
}
EditorNode is an interface that defines the methods to edit this node.
type EditorQuery ¶ added in v0.5.0
type EditorQuery interface {
Query
Set(pn *Node, v Node) error
Append(pn *Node, v Node) error
Delete(pn *Node) error
}
EditorQuery is an interface that defines the methods to edit a node.
type EmptyQuery ¶ added in v0.8.3
type EmptyQuery struct{}
EmptyQuery checks if the node is empty. Returns true for empty arrays, empty maps, null values, and empty strings.
func (*EmptyQuery) Exec ¶ added in v0.8.3
func (q *EmptyQuery) Exec(n Node) ([]Node, error)
Exec returns whether the node is empty. Returns true for empty arrays, empty maps, null values, and empty strings.
func (*EmptyQuery) String ¶ added in v0.8.3
func (q *EmptyQuery) String() string
type Evaluator ¶ added in v0.8.1
type Evaluator struct {
Query Query
}
Evaluator represents a evaluatable selector.
type FilterQuery ¶ added in v0.2.0
type FilterQuery []Query
FilterQuery consists of multiple queries that filter the nodes in order.
func (FilterQuery) String ¶ added in v0.5.0
func (qs FilterQuery) String() string
type FirstQuery ¶ added in v0.8.3
type FirstQuery struct{}
FirstQuery returns the first element of an array. Returns null for empty arrays or non-array types.
func (*FirstQuery) Exec ¶ added in v0.8.3
func (q *FirstQuery) Exec(n Node) ([]Node, error)
Exec returns the first element of an array. Returns null for empty arrays or non-array types.
func (*FirstQuery) String ¶ added in v0.8.3
func (q *FirstQuery) String() string
type HasQuery ¶ added in v0.8.3
type HasQuery struct {
Key string
}
HasQuery checks if the node has the specified key. Works with both arrays (numeric keys) and maps (string keys).
type KeysQuery ¶ added in v0.8.0
type KeysQuery struct{}
KeysQuery returns the keys of arrays (as indices) or maps. For arrays, returns numeric indices. For maps, returns string keys.
type LastQuery ¶ added in v0.8.3
type LastQuery struct{}
LastQuery returns the last element of an array. Returns null for empty arrays or non-array types.
type Map ¶
Map represents a map of Node.
func (*Map) UnmarshalJSON ¶
UnmarshalJSON is an implementation of json.Unmarshaler.
func (*Map) UnmarshalYAML ¶
UnmarshalYAML is an implementation of yaml.Unmarshaler.
type MapQuery ¶ added in v0.2.0
type MapQuery string
MapQuery is a key of the Map that implements methods of the Query.
type MergeOption ¶ added in v0.8.1
type MergeOption int
MergeOption represents different merge strategies for combining nodes.
var ( // MergeOptionDefault merges with the following default rules. // For examples: // - {"a": 1, "b": 2} and {"a": 3, "c": 4} merges to {"a": 1, "b": 2, "c": 4} // - [1, 2] and [3, 4, 5] merges to [1, 2, 5] // - "a" and "b" merges to "a" MergeOptionDefault MergeOption = 0 // MergeOptionOverrideMap overrides duplicate map keys. // For examples: // - {"a": 1, "b": 2} and {"a": 3} merges to {"a": 3, "b": 2} // - "a" and "b" merges to "b MergeOptionOverrideMap MergeOption = 0b000001 // MergeOptionOverrideArray overrides duplicate array indexes. // For examples: // - [1, 2, 3] and [4, 5] merges to [4, 5, 3] // - "a" and "b" merges to "b MergeOptionOverrideArray MergeOption = 0b000010 // MergeOptionOverride overrides duplicate map keys and array indexes. // For examples: // - {"a": 1, "b": 2} and {"a": 3} merges to {"a": 3, "b": 2} // - [1, 2, 3] and [4, 5] merges to [4, 5, 3] // - "a" and "b" merges to "b" MergeOptionOverride MergeOption = MergeOptionOverrideMap | MergeOptionOverrideArray // MergeOptionReplaceMap merges with replace map. // For examples: // - {"a": 1, "b": 2} and {"a": 3} merges to {"a": 3} // - "a" and "b" merges to "b" MergeOptionReplaceMap MergeOption = 0b000100 // MergeOptionReplaceArray merges with replace array. // For examples: // - [1, 2, 3] and [4, 5] merges to [4, 5] // - "a" and "b" merges to "b" MergeOptionReplaceArray MergeOption = 0b001000 // MergeOptionReplace merges with replace. // For examples: // - {"a": 1, "b": 2} and {"a": 3} merges to {"a": 3} // - [1, 2, 3] and [4, 5] merges to [4, 5] // - "a" and "b" merges to "b" MergeOptionReplace MergeOption = MergeOptionReplaceMap | MergeOptionReplaceArray // MergeOptionAppend acts when both are arrays and append them. // It takes precedence over MergeOptionOverride and MergeOptionReplace. // For examples: // - [1, 2, 3] and [4, 5] merges to [1, 2, 3, 4, 5] MergeOptionAppend MergeOption = 0b010000 // MergeOptionSlurp acts on an array or value and converts it to an array and // merges it, even if the value is not an array. // It takes precedence over MergeOptionOverride and MergeOptionReplace. // For examples: // - [1, 2, 3] and [4, 5] merges to [1, 2, 3, 4, 5] // - [1, 2, 3] and 4 merges to [1, 2, 3, 4] // - 1 and 2 merges to [1, 2] MergeOptionSlurp MergeOption = 0b100000 )
type NewMethodQueryFunc ¶ added in v0.8.3
NewMethodQueryFunc is a factory function type for creating method queries. It takes string arguments and returns a Query implementation.
type NilValue ¶ added in v0.6.0
type NilValue struct{}
func (NilValue) MarshalJSON ¶ added in v0.6.0
MarshalJSON is an implementation of json.Marshaler.
func (NilValue) MarshalYAML ¶ added in v0.6.0
MarshalYAML is an implementation of yaml.Marshaler.
type Node ¶
type Node interface {
// IsNil returns true if this node is nil.
IsNil() bool
// Type returns this node type.
Type() Type
// Array returns this node as an Array.
// If this type is not Array, returns a Array(nil).
Array() Array
// Map returns this node as a Map.
// If this type is not Map, returns a Map(nil).
Map() Map
// Value returns this node as a Value.
// If this type is not Value, returns a NilValue.
Value() Value
// Has checks this node has key.
Has(keys ...interface{}) bool
// Get returns array/map value that matched by the specified key.
// The key type allows int or string.
// If the specified keys does not match, returns NilValue.
Get(keys ...interface{}) Node
// Each calls the callback function for each Array|Map values.
// If the node type is not Array|Map then the callback called once with nil key and self as value.
Each(cb func(key interface{}, v Node) error) error
// Find finds a node using the query expression.
Find(expr string) ([]Node, error)
}
A Node is an element on the tree.
func DecodeJSON ¶ added in v0.2.0
DecodeJSON decodes JSON as a node using the provided decoder.
func DecodeYAML ¶ added in v0.2.0
DecodeYAML decodes YAML as a node using the provided decoder.
func Find ¶ added in v0.2.0
Find finds a node from n using the Query.
Example ¶
package main
import (
"fmt"
"log"
"github.com/jarxorg/tree"
)
func main() {
group := tree.Map{
"ID": tree.ToValue(1),
"Name": tree.ToValue("Reds"),
"Colors": tree.ToArrayValues("Crimson", "Red", "Ruby", "Maroon"),
}
rs, err := group.Find(".Colors[1:3]")
if err != nil {
log.Fatal(err)
}
for _, r := range rs {
fmt.Println(r)
}
}
Output: Red Ruby
func MarshalViaJSON ¶ added in v0.6.3
MarshalViaJSON returns the node encoding of v via "encoding/json".
func MarshalViaYAML ¶ added in v0.6.3
MarshalViaYAML returns the node encoding of v via "gopkg.in/yaml.v2".
func Merge ¶ added in v0.8.1
func Merge(a, b Node, opts MergeOption) Node
Merge merges two nodes with MergeOption. If you do not want to change the state of the node given as an argument, use CloneDeep. ex: merged := Merge(CloneDeep(a), CloneDeep(b), opts)
func ToNodeValues ¶ added in v0.5.0
func ToNodeValues(vs ...interface{}) []Node
ToNodeValues calls ToValue for each provided vs and returns them as []Node.
func ToValue ¶
func ToValue(v interface{}) Node
ToValue converts the specified v to a Value as Node. Node.Value() returns converted value.
func UnmarshalJSON ¶
UnmarshalJSON parses the JSON-encoded data to a Node.
Example ¶
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/jarxorg/tree"
)
func main() {
data := []byte(`[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`)
var animals tree.Array
err := json.Unmarshal(data, &animals)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%v\n", animals)
}
Output: [map[Name:Platypus Order:Monotremata] map[Name:Quoll Order:Dasyuromorphia]]
Example (Any) ¶
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/jarxorg/tree"
)
func main() {
data := []byte(`[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`)
var animals tree.Any
err := json.Unmarshal(data, &animals)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%v\n", animals.Type().IsArray())
fmt.Printf("%v\n", animals.Array())
}
Output: true [map[Name:Platypus Order:Monotremata] map[Name:Quoll Order:Dasyuromorphia]]
Example (Combined) ¶
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/jarxorg/tree"
)
func main() {
data := []byte(`[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`)
type Animal struct {
Name string
Order tree.StringValue
}
var animals []Animal
err := json.Unmarshal(data, &animals)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", animals)
}
Output: [{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]
func UnmarshalYAML ¶
UnmarshalYAML returns the YAML encoding of the specified node.
Example ¶
data := []byte(`---
Colors:
- Crimson
- Red
- Ruby
- Maroon
ID: 1
Name: Reds
`)
var group tree.Map
if err := yaml.Unmarshal(data, &group); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", group)
Output: map[Colors:[Crimson Red Ruby Maroon] ID:1 Name:Reds]
type NopQuery ¶ added in v0.2.0
type NopQuery struct{}
NopQuery is a query that implements no-op Exec method.
type NumberValue ¶
type NumberValue float64
A NumberValue represents an number value.
func (NumberValue) Compare ¶ added in v0.2.0
func (n NumberValue) Compare(op Operator, v Value) bool
Compare compares n and v.
func (NumberValue) Each ¶ added in v0.3.0
func (n NumberValue) Each(cb func(key interface{}, n Node) error) error
Each calls cb(nil, n).
func (NumberValue) Find ¶ added in v0.5.0
func (n NumberValue) Find(expr string) ([]Node, error)
Find finds a node using the query expression.
func (NumberValue) Get ¶ added in v0.1.1
func (n NumberValue) Get(keys ...interface{}) Node
Get returns nil.
func (NumberValue) Has ¶ added in v0.5.0
func (n NumberValue) Has(keys ...interface{}) bool
Has returns false.
func (NumberValue) IsNil ¶ added in v0.6.0
func (n NumberValue) IsNil() bool
IsNil returns true if this node is nil.
func (NumberValue) String ¶
func (n NumberValue) String() string
String returns this as string using strconv.FormatFloat(float64(n), 'f', -1, 64).
type Or ¶ added in v0.4.0
type Or []Selector
Or represents selectors that combines each selector with or.
type Query ¶ added in v0.2.0
Query is an interface that defines the methods to query a node.
func NewContainsQuery ¶ added in v0.8.3
NewContainsQuery creates a new ContainsQuery instance. Requires exactly one argument specifying the value to check.
func NewCountQuery ¶ added in v0.8.3
NewCountQuery creates a new CountQuery instance. Arguments are ignored for this query type.
func NewEmptyQuery ¶ added in v0.8.3
NewEmptyQuery creates a new EmptyQuery instance. Arguments are ignored for this query type.
func NewFirstQuery ¶ added in v0.8.3
NewFirstQuery creates a new FirstQuery instance. Arguments are ignored for this query type.
func NewHasQuery ¶ added in v0.8.3
NewHasQuery creates a new HasQuery instance. Requires exactly one argument specifying the key to check.
func NewKeysQuery ¶ added in v0.8.3
NewKeysQuery creates a new KeysQuery instance. Arguments are ignored for this query type.
func NewLastQuery ¶ added in v0.8.3
NewLastQuery creates a new LastQuery instance. Arguments are ignored for this query type.
func NewMethodQuery ¶ added in v0.8.3
NewMethodQuery creates a method query for the specified method name. Returns an error if the method is not registered.
func NewTypeQuery ¶ added in v0.8.3
NewTypeQuery creates a new TypeQuery instance. Arguments are ignored for this query type.
func NewValuesQuery ¶ added in v0.8.3
NewValuesQuery creates a new ValuesQuery instance. Arguments are ignored for this query type.
func ParseQuery ¶ added in v0.2.0
ParseQuery parses the provided expr to a Query. See https://github.com/jarxorg/tree#Query
type SelectQuery ¶ added in v0.2.0
type SelectQuery struct {
Selector
}
SelectQuery returns nodes that matched by selectors.
func (SelectQuery) String ¶ added in v0.5.0
func (q SelectQuery) String() string
type SlurpQuery ¶ added in v0.5.0
type SlurpQuery struct{}
SlurpQuery is a special query that works in FilterQuery.
func (SlurpQuery) Exec ¶ added in v0.5.0
func (q SlurpQuery) Exec(n Node) ([]Node, error)
Exec returns the provided node into a single node array. FilterQuery calls q.Exec(Array(results)), which has the effect of to slurp all the results into a single node array.
func (SlurpQuery) String ¶ added in v0.5.0
func (q SlurpQuery) String() string
type StringValue ¶
type StringValue string
A StringValue represents a string value.
func (StringValue) Compare ¶ added in v0.2.0
func (n StringValue) Compare(op Operator, v Value) bool
Compare compares n and v.
func (StringValue) Each ¶ added in v0.3.0
func (n StringValue) Each(cb func(key interface{}, n Node) error) error
Each calls cb(nil, n).
func (StringValue) Find ¶ added in v0.5.0
func (n StringValue) Find(expr string) ([]Node, error)
Find finds a node using the query expression.
func (StringValue) Get ¶ added in v0.1.1
func (n StringValue) Get(keys ...interface{}) Node
Get returns nil.
func (StringValue) Has ¶ added in v0.5.0
func (n StringValue) Has(keys ...interface{}) bool
Has returns false.
func (StringValue) IsNil ¶ added in v0.6.0
func (n StringValue) IsNil() bool
IsNil returns true if this node is nil.
type Type ¶
type Type int
Type represents the Node type.
const ( TypeArray Type = 0b0001 TypeMap Type = 0b0010 TypeValue Type = 0b1000 TypeNilValue Type = 0b1001 TypeStringValue Type = 0b1010 TypeBoolValue Type = 0b1011 TypeNumberValue Type = 0b1100 )
These variables are the Node types.
func (Type) IsNilValue ¶ added in v0.6.0
IsNilValue returns t == TypeNilValue.
func (Type) IsNumberValue ¶
IsNumberValue returns t == TypeNumberValue.
func (Type) IsStringValue ¶
IsStringValue returns t == TypeStringValue.
type TypeQuery ¶ added in v0.8.3
type TypeQuery struct{}
TypeQuery returns the type name of the node. Returns "array", "object", "string", "number", "boolean", or "null".
type Value ¶
type Value interface {
Node
String() string
Bool() bool
Int() int
Int64() int64
Float64() float64
Compare(op Operator, v Value) bool
}
Value provides the accessor of primitive value.
type ValueQuery ¶ added in v0.2.0
type ValueQuery struct {
Node
}
ValueQuery is a query that returns the constant value.
func (ValueQuery) Exec ¶ added in v0.2.0
func (q ValueQuery) Exec(n Node) ([]Node, error)
Exec returns the constant value.
func (ValueQuery) String ¶ added in v0.5.0
func (q ValueQuery) String() string
type ValuesQuery ¶ added in v0.8.0
type ValuesQuery struct{}
ValuesQuery returns the values of arrays or maps as an array. For arrays, returns the array itself. For maps, returns values in key order.
func (*ValuesQuery) Exec ¶ added in v0.8.0
func (q *ValuesQuery) Exec(n Node) ([]Node, error)
Exec returns the values of the node as an array. For arrays, returns the array itself. For maps, returns values in key order. Returns nil for other node types.
func (*ValuesQuery) String ¶ added in v0.8.0
func (q *ValuesQuery) String() string
type WalkFunc ¶ added in v0.2.0
WalkFunc is the type of the function called by Walk to visit each nodes.
The keys argument contains that parent keys and the node key that type is int (array index) or string (map key).