Documentation ¶
Overview ¶
Package gojq provides the parser and interpreter of gojq.
Please refer to https://github.com/itchyny/gojq#usage-as-a-library for introduction of the usage as a library.
Index ¶
- type Alt
- type AltRight
- type AndExpr
- type AndExprRight
- type Arith
- type ArithRight
- type Array
- type Bind
- type Code
- type Comma
- type Compare
- type CompareRight
- type CompilerOption
- type ConstArray
- type ConstObject
- type ConstObjectKeyVal
- type ConstTerm
- type Expr
- type Factor
- type FactorRight
- type Filter
- type Foreach
- type Func
- type FuncDef
- type If
- type IfElif
- type Import
- type Index
- type Iter
- type Label
- type Logic
- type LogicRight
- type Module
- type ModuleLoader
- type Object
- type ObjectKeyVal
- type ObjectVal
- type Operator
- type Pattern
- type PatternObject
- type Query
- type Reduce
- type Suffix
- type SuffixIndex
- type Term
- type Try
- type Unary
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AndExpr ¶ added in v0.1.0
type AndExpr struct { Left *Compare `@@` Right []AndExprRight `@@*` }
AndExpr ...
type AndExprRight ¶ added in v0.4.0
AndExprRight ...
func (AndExprRight) String ¶ added in v0.4.0
func (e AndExprRight) String() string
type Arith ¶ added in v0.1.0
type Arith struct { Left *Factor `@@` Right []ArithRight `@@*` }
Arith ...
type ArithRight ¶ added in v0.4.0
ArithRight ...
func (ArithRight) String ¶ added in v0.4.0
func (e ArithRight) String() string
type Code ¶ added in v0.8.0
type Code struct {
// contains filtered or unexported fields
}
Code is a compiled jq query.
func Compile ¶ added in v0.8.0
func Compile(q *Query, options ...CompilerOption) (*Code, error)
Compile compiles a query.
Example ¶
package main import ( "fmt" "log" "github.com/itchyny/gojq" ) func main() { query, err := gojq.Parse(".foo") if err != nil { log.Fatalln(err) } code, err := gojq.Compile(query) if err != nil { log.Fatalln(err) } inputs := []interface{}{ nil, "string", 42, []interface{}{"foo"}, map[string]interface{}{"foo": 42}, } for _, input := range inputs { iter := code.Run(input) for { v, ok := iter.Next() if !ok { break } if err, ok := v.(error); ok { fmt.Printf("%s\n", err) break } fmt.Printf("%#v\n", v) } } }
Output: <nil> expected an object but got: string ("string") expected an object but got: number (42) expected an object but got: array (["foo"]) 42
func (*Code) Run ¶ added in v0.8.0
Run runs the code with the variable values (which should be in the same order as the given variables using WithVariables) and returns a result iterator.
Example ¶
package main import ( "fmt" "log" "github.com/itchyny/gojq" ) func main() { query, err := gojq.Parse(".foo") if err != nil { log.Fatalln(err) } code, err := gojq.Compile(query) if err != nil { log.Fatalln(err) } input := map[string]interface{}{"foo": 42} iter := code.Run(input) for { v, ok := iter.Next() if !ok { break } if err, ok := v.(error); ok { log.Fatalln(err) } fmt.Printf("%#v\n", v) } }
Output: 42
func (*Code) RunWithContext ¶ added in v0.8.0
RunWithContext runs the code with context.
Example ¶
package main import ( "context" "fmt" "log" "time" "github.com/itchyny/gojq" ) func main() { query, err := gojq.Parse("def f: f; f") if err != nil { log.Fatalln(err) } code, err := gojq.Compile(query) if err != nil { log.Fatalln(err) } ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) defer cancel() iter := code.RunWithContext(ctx, nil) for { v, ok := iter.Next() if !ok { break } if err, ok := v.(error); ok { fmt.Printf("%s\n", err) return } _ = v } }
Output: context deadline exceeded
type Compare ¶ added in v0.1.0
type Compare struct { Left *Arith `@@` Right *CompareRight `@@?` }
Compare ...
type CompareRight ¶ added in v0.4.0
CompareRight ...
func (*CompareRight) String ¶ added in v0.4.0
func (e *CompareRight) String() string
type CompilerOption ¶ added in v0.8.0
type CompilerOption func(*compiler)
CompilerOption ...
func WithEnvironLoader ¶ added in v0.9.0
func WithEnvironLoader(environLoader func() []string) CompilerOption
WithEnvironLoader is a compiler option for environment variables loader. The OS environment variables are not accessible by default due to security reason. You can pass os.Environ if you allow to access it.
Example ¶
package main import ( "fmt" "log" "github.com/itchyny/gojq" ) func main() { query, err := gojq.Parse("env | keys[]") if err != nil { log.Fatalln(err) } code, err := gojq.Compile( query, gojq.WithEnvironLoader(func() []string { return []string{"foo=42", "bar=128"} }), ) if err != nil { log.Fatalln(err) } iter := code.Run(nil) for { v, ok := iter.Next() if !ok { break } if err, ok := v.(error); ok { log.Fatalln(err) } fmt.Printf("%#v\n", v) } }
Output: "bar" "foo"
func WithInputIter ¶ added in v0.10.0
func WithInputIter(inputIter Iter) CompilerOption
WithInputIter is a compiler option for input iterator used by input(s)/0. Note that input and inputs functions are not allowed by default. We have to distinguish the query input and the values for input(s) functions. For example, consider using inputs with --null-input. If you want to allow input(s) functions, create an Iter and use WithInputIter option.
Example ¶
package main import ( "encoding/json" "fmt" "io" "log" "strings" "github.com/itchyny/gojq" ) type testInputIter struct { dec *json.Decoder } func newTestInputIter(r io.Reader) *testInputIter { dec := json.NewDecoder(r) dec.UseNumber() return &testInputIter{dec: dec} } func (i *testInputIter) Next() (interface{}, bool) { var v interface{} if err := i.dec.Decode(&v); err != nil { if err == io.EOF { return nil, false } return err, true } return v, true } func main() { query, err := gojq.Parse("reduce inputs as $x (0; . + $x)") if err != nil { log.Fatalln(err) } code, err := gojq.Compile( query, gojq.WithInputIter( newTestInputIter(strings.NewReader("1 2 3 4 5")), ), ) if err != nil { log.Fatalln(err) } iter := code.Run(nil) for { v, ok := iter.Next() if !ok { break } if err, ok := v.(error); ok { log.Fatalln(err) } fmt.Printf("%#v\n", v) } }
Output: 15
func WithModuleLoader ¶ added in v0.8.0
func WithModuleLoader(moduleLoader ModuleLoader) CompilerOption
WithModuleLoader is a compiler option for module loader.
Example ¶
package main import ( "fmt" "log" "github.com/itchyny/gojq" ) type moduleLoader struct{} func (*moduleLoader) LoadModule(name string) (*gojq.Module, error) { switch name { case "module1": return gojq.ParseModule(` module { name: "module1", test: 42 }; import "module2" as foo; def f: foo::f; `) case "module2": return gojq.ParseModule(` def f: .foo; `) } return nil, fmt.Errorf("module not found: %q", name) } func main() { query, err := gojq.Parse(` import "module1" as m; m::f `) if err != nil { log.Fatalln(err) } code, err := gojq.Compile( query, gojq.WithModuleLoader(&moduleLoader{}), ) if err != nil { log.Fatalln(err) } input := map[string]interface{}{"foo": 42} iter := code.Run(input) for { v, ok := iter.Next() if !ok { break } if err, ok := v.(error); ok { log.Fatalln(err) } fmt.Printf("%#v\n", v) } }
Output: 42
func WithVariables ¶ added in v0.8.0
func WithVariables(variables []string) CompilerOption
WithVariables is a compiler option for variable names. The variables can be used in the query. You have to give the values to query.Run or code.Run in the same order.
Example ¶
package main import ( "fmt" "log" "github.com/itchyny/gojq" ) func main() { query, err := gojq.Parse("$x * 100 + $y, $z") if err != nil { log.Fatalln(err) } code, err := gojq.Compile( query, gojq.WithVariables([]string{ "$x", "$y", "$z", }), ) if err != nil { log.Fatalln(err) } iter := code.Run(nil, 12, 42, 128) for { v, ok := iter.Next() if !ok { break } if err, ok := v.(error); ok { log.Fatalln(err) } fmt.Printf("%#v\n", v) } }
Output: 1242 128
type ConstArray ¶ added in v0.8.0
type ConstArray struct {
Elems []*ConstTerm `"[" (@@ ("," @@)*)? "]"`
}
ConstArray ...
func (*ConstArray) String ¶ added in v0.8.0
func (e *ConstArray) String() string
type ConstObject ¶ added in v0.8.0
type ConstObject struct {
KeyVals []ConstObjectKeyVal `"{" (@@ ("," @@)*)? "}"`
}
ConstObject ...
func (*ConstObject) String ¶ added in v0.8.0
func (e *ConstObject) String() string
func (*ConstObject) ToValue ¶ added in v0.10.0
func (e *ConstObject) ToValue() map[string]interface{}
ToValue converts the object to map[string]interface{}.
type ConstObjectKeyVal ¶ added in v0.8.0
type ConstObjectKeyVal struct { Key string `( @Ident | @Keyword` KeyString string `| @String ) ":"` Val *ConstTerm `@@` }
ConstObjectKeyVal ...
func (*ConstObjectKeyVal) String ¶ added in v0.8.0
func (e *ConstObjectKeyVal) String() string
type ConstTerm ¶ added in v0.8.0
type ConstTerm struct { Object *ConstObject ` @@` Array *ConstArray `| @@` Number string `| @Number` Str string `| @String` Null bool `| @"null"` True bool `| @"true"` False bool `| @"false"` }
ConstTerm ...
type Expr ¶ added in v0.1.0
type Expr struct { Logic *Logic `@@` UpdateOp Operator `( ( @UpdateOp | @UpdateAltOp )` Update *Alt ` @@` Bind *Bind `| @@ )?` Label *Label `| @@` }
Expr ...
type Factor ¶ added in v0.1.0
type Factor struct { Left *Term `@@` Right []FactorRight `@@*` }
Factor ...
type FactorRight ¶ added in v0.4.0
FactorRight ...
func (FactorRight) String ¶ added in v0.4.0
func (e FactorRight) String() string
type Foreach ¶ added in v0.3.0
type Foreach struct { Term *Term `"foreach" @@` Pattern *Pattern `"as" @@` Start *Query `"(" @@` Update *Query `";" @@` Extract *Query `(";" @@)? ")"` }
Foreach ...
type Func ¶ added in v0.1.0
type Func struct { Name string `( @Ident | @Variable | @ModuleIdent )` Args []*Query `( "(" @@ (";" @@)* ")" )?` }
Func ...
type FuncDef ¶ added in v0.1.0
type FuncDef struct { Name string `"def" @Ident` Args []string `("(" ( @Ident | @Variable ) (";" ( @Ident | @Variable ))* ")")? ":"` Body *Query `@@ ";"` }
FuncDef ...
type If ¶ added in v0.1.0
type If struct { Cond *Query `"if" @@` Then *Query `"then" @@` Elif []IfElif `@@*` Else *Query `("else" @@)? "end"` }
If ...
type Import ¶ added in v0.8.0
type Import struct { ImportPath string `( "import" @String` ImportAlias string ` "as" ( @Ident | @Variable )` IncludePath string `| "include" @String )` Meta *ConstObject `@@? ";"` }
Import ...
type Index ¶ added in v0.2.0
type Index struct { Name string `@Index` Str string `| "." ( @String` Start *Query `| "[" ( @@` IsSlice bool `( @":"` End *Query `@@? )? | ":" @@ ) "]" )` }
Index ...
type Iter ¶ added in v0.4.0
type Iter interface {
Next() (interface{}, bool)
}
Iter is an interface for an iterator.
type Logic ¶ added in v0.1.0
type Logic struct { Left *AndExpr `@@` Right []LogicRight `@@*` }
Logic ...
type LogicRight ¶ added in v0.4.0
LogicRight ...
func (LogicRight) String ¶ added in v0.4.0
func (e LogicRight) String() string
type Module ¶ added in v0.8.0
type Module struct { Meta *ConstObject `( "module" @@ ";" )?` Imports []*Import `@@*` FuncDefs []*FuncDef `@@*` }
Module ...
func ParseModule ¶ added in v0.8.0
ParseModule parses a module.
type ModuleLoader ¶ added in v0.8.0
ModuleLoader is an interface for loading modules.
type ObjectKeyVal ¶ added in v0.4.0
type ObjectKeyVal struct { Key string `( ( ( @Ident | @Variable | @Keyword )` KeyString string ` | @String )` Query *Query `| "(" @@ ")" ) ":"` Val *ObjectVal `@@` KeyOnly *string `| @Ident | @Variable` KeyOnlyString string `| @String` }
ObjectKeyVal ...
func (*ObjectKeyVal) String ¶ added in v0.4.0
func (e *ObjectKeyVal) String() string
type Operator ¶ added in v0.1.0
type Operator int
Operator ...
const ( OpAdd Operator = iota OpSub OpMul OpDiv OpMod OpEq OpNe OpGt OpLt OpGe OpLe OpAnd OpOr OpAlt OpAssign OpModify OpUpdateAdd OpUpdateSub OpUpdateMul OpUpdateDiv OpUpdateMod OpUpdateAlt )
Operators ...
type Pattern ¶ added in v0.3.0
type Pattern struct { Name string ` @Variable` Array []*Pattern `| "[" @@ ("," @@)* "]"` Object []PatternObject `| "{" @@ ("," @@)* "}"` }
Pattern ...
type PatternObject ¶ added in v0.4.0
type PatternObject struct { Key string `( ( @Ident | @Variable | @Keyword )` KeyString string ` | @String` Query *Query ` | "(" @@ ")" ) ":"` Val *Pattern `@@` KeyOnly string `| @Variable` }
PatternObject ...
func (*PatternObject) String ¶ added in v0.4.0
func (e *PatternObject) String() string
type Query ¶
Query ...
func (*Query) Run ¶ added in v0.1.0
Run query.
Example ¶
package main import ( "fmt" "log" "github.com/itchyny/gojq" ) func main() { query, err := gojq.Parse(".foo | ..") if err != nil { log.Fatalln(err) } input := map[string]interface{}{"foo": []interface{}{1, 2, 3}} iter := query.Run(input) for { v, ok := iter.Next() if !ok { break } if err, ok := v.(error); ok { log.Fatalln(err) } fmt.Printf("%#v\n", v) } }
Output: []interface {}{1, 2, 3} 1 2 3
func (*Query) RunWithContext ¶ added in v0.8.0
RunWithContext query.
Example ¶
package main import ( "context" "fmt" "log" "time" "github.com/itchyny/gojq" ) func main() { query, err := gojq.Parse("def f: f; f") if err != nil { log.Fatalln(err) } ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) defer cancel() iter := query.RunWithContext(ctx, nil) for { v, ok := iter.Next() if !ok { break } if err, ok := v.(error); ok { fmt.Printf("%s\n", err) return } _ = v } }
Output: context deadline exceeded
type Reduce ¶ added in v0.3.0
type Reduce struct { Term *Term `"reduce" @@` Pattern *Pattern `"as" @@` Start *Query `"(" @@` Update *Query `";" @@ ")"` }
Reduce ...
type Suffix ¶
type Suffix struct { Index *Index ` @@` SuffixIndex *SuffixIndex `| @@` Iter bool `| @("[" "]")` Optional bool `| @"?"` }
Suffix ...
type SuffixIndex ¶ added in v0.2.0
type SuffixIndex struct { Start *Query `"[" ( @@` IsSlice bool `( @":"` End *Query `@@? )? | ":" @@ ) "]"` }
SuffixIndex ...
func (*SuffixIndex) String ¶ added in v0.4.0
func (e *SuffixIndex) String() string
type Term ¶
type Term struct { Index *Index `( @@` Identity bool `| @"."` Recurse bool `| @".."` Null bool `| @"null"` True bool `| @"true"` False bool `| @"false"` Func *Func `| @@` Object *Object `| @@` Array *Array `| @@` Number string `| @Number` Unary *Unary `| @@` Format string `| ( @Format` FormatStr string ` @String? )` Str string `| @String` RawStr string `| @" "` // never matches, used in compiler If *If `| @@` Try *Try `| @@` Reduce *Reduce `| @@` Foreach *Foreach `| @@` Break string `| "break" @Variable` Query *Query `| "(" @@ ")" )` SuffixList []*Suffix `@@*` }
Term ...