exec

package
v2.3.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 31, 2026 License: MIT Imports: 19 Imported by: 1

Documentation

Index

Constants

This section is empty.

Variables

View Source
var TypeDict = reflect.TypeOf(Dict{})

Functions

func AnyArgument

func AnyArgument(output *interface{}) func(*Value) error

func BoolArgument

func BoolArgument(output *bool) func(*Value) error

func CaseInsensitive

func CaseInsensitive(data sort.Interface) sort.Interface

CaseInsensitive returns the the data sorted in a case insensitive way (if string).

func FloatArgument

func FloatArgument(output *float64) func(v *Value) error

func IntArgument

func IntArgument(output *int) func(v *Value) error

func KeywordArgument

func KeywordArgument(name string, defaultValue *Value, transmuters ...ArgumentTransmuter) *argument

func NumberArgument

func NumberArgument(output *float64) func(v *Value) error

func OrArgument

func OrArgument(transmuters ...ArgumentTransmuter) func(*Value) error

func PositionalArgument

func PositionalArgument(name string, fallback *Value, transmuters ...ArgumentTransmuter) *argument

func Self

func Self(r *Renderer) map[string]func() string

func StringArgument

func StringArgument(output *string) func(*Value) error

func StringEnumArgument

func StringEnumArgument(output *string, options []string) func(v *Value) error

func StringListArgument

func StringListArgument(output *[]string) func(*Value) error

Types

type ArgumentTransmuter

type ArgumentTransmuter func(*Value) error

type Context

type Context struct {
	// contains filtered or unexported fields
}

func EmptyContext

func EmptyContext() *Context

func NewContext

func NewContext(data map[string]interface{}) *Context

func (*Context) Get

func (ctx *Context) Get(name string) (interface{}, bool)

func (*Context) Has

func (ctx *Context) Has(name string) bool

func (*Context) Inherit

func (ctx *Context) Inherit() *Context

func (*Context) Set

func (ctx *Context) Set(name string, value interface{})

func (*Context) Update

func (ctx *Context) Update(other *Context) *Context

Update updates this context with the key/value pairs from a map.

type ControlStructure

type ControlStructure interface {
	nodes.ControlStructure
	Execute(*Renderer, *nodes.ControlStructureBlock) error
}

type ControlStructureSet

type ControlStructureSet struct {
	// contains filtered or unexported fields
}

func NewControlStructureSet

func NewControlStructureSet(statements map[string]parser.ControlStructureParser) *ControlStructureSet

func (*ControlStructureSet) Exists

func (c *ControlStructureSet) Exists(name string) bool

Exists returns true if the given test is already registered

func (*ControlStructureSet) Get

func (*ControlStructureSet) Register

func (c *ControlStructureSet) Register(name string, parser parser.ControlStructureParser) error

Registers a new tag. You usually want to call this function in the tag's init() function: http://golang.org/doc/effective_go.html#init

func (*ControlStructureSet) Replace

Replaces an already registered tag with a new implementation. Use this function with caution since it allows you to change existing tag behaviour.

func (*ControlStructureSet) Update

type Dict

type Dict struct {
	Pairs []*Pair
}

func NewDict

func NewDict() *Dict

func (*Dict) Get

func (d *Dict) Get(key *Value) *Value

func (*Dict) Keys

func (d *Dict) Keys() ValuesList

func (*Dict) String

func (d *Dict) String() string

type Environment

type Environment struct {
	Filters           *FilterSet
	ControlStructures *ControlStructureSet
	Tests             *TestSet
	Context           *Context
	Methods           Methods
}

type ErrInvalidCall

type ErrInvalidCall error

type Evaluator

type Evaluator struct {
	Config      *config.Config
	Environment *Environment
	Loader      loaders.Loader
}

func (*Evaluator) Eval

func (e *Evaluator) Eval(node nodes.Expression) *Value

func (*Evaluator) EvalTest

func (e *Evaluator) EvalTest(expr *nodes.TestExpression) *Value

func (*Evaluator) EvaluateFiltered

func (e *Evaluator) EvaluateFiltered(expr *nodes.FilteredExpression) *Value

EvaluateFiltered evaluate a filtered expression

func (*Evaluator) ExecuteFilter

func (e *Evaluator) ExecuteFilter(fc *nodes.FilterCall, v *Value) *Value

ExecuteFilter execute a filter node

func (*Evaluator) ExecuteFilterByName

func (e *Evaluator) ExecuteFilterByName(name string, in *Value, params *VarArgs) *Value

ExecuteFilterByName execute a filter given its name

func (*Evaluator) ExecuteTest

func (e *Evaluator) ExecuteTest(tc *nodes.TestCall, v *Value) *Value

func (*Evaluator) ExecuteTestByName

func (e *Evaluator) ExecuteTestByName(name string, in *Value, params *VarArgs) *Value

type FilterFunction

type FilterFunction func(e *Evaluator, in *Value, params *VarArgs) *Value

FilterFunction is the type filter functions must fulfil

type FilterSet

type FilterSet struct {
	// contains filtered or unexported fields
}

func NewFilterSet

func NewFilterSet(filters map[string]FilterFunction) *FilterSet

func (*FilterSet) Exists

func (f *FilterSet) Exists(name string) bool

Exists returns true if the given filter is already registered

func (*FilterSet) Get

func (f *FilterSet) Get(name string) (FilterFunction, bool)

Exists returns true if the given filter is already registered

func (*FilterSet) Register

func (f *FilterSet) Register(name string, fn FilterFunction) error

Register registers a new filter. If there's already a filter with the same name, Register will panic. You usually want to call this function in the filter's init() function: http://golang.org/doc/effective_go.html#init

func (*FilterSet) Replace

func (f *FilterSet) Replace(name string, fn FilterFunction) error

Replace replaces an already registered filter with a new implementation. Use this function with caution since it allows you to change existing filter behaviour.

func (*FilterSet) Update

func (f *FilterSet) Update(other *FilterSet) *FilterSet

type KwArg

type KwArg struct {
	Name    string
	Default interface{}
}

type Macro

type Macro func(params *VarArgs) *Value

FilterFunction is the type filter functions must fulfil

func MacroNodeToFunc

func MacroNodeToFunc(node *nodes.Macro, r *Renderer) (Macro, error)

type MacroSet

type MacroSet map[string]Macro

func (MacroSet) Exists

func (ms MacroSet) Exists(name string) bool

Exists returns true if the given filter is already registered

func (*MacroSet) Register

func (ms *MacroSet) Register(name string, fn Macro) error

Register registers a new filter. If there's already a filter with the same name, Register will panic. You usually want to call this function in the filter's init() function: http://golang.org/doc/effective_go.html#init

See http://www.john-doe.de/post/gonja/ for more about writing filters and tags.

func (*MacroSet) Replace

func (ms *MacroSet) Replace(name string, fn Macro) error

Replace replaces an already registered filter with a new implementation. Use this function with caution since it allows you to change existing filter behaviour.

type Method

type Method[I interface{}] func(self I, selfValue *Value, arguments *VarArgs) (interface{}, error)

type MethodSet

type MethodSet[I interface{}] struct {
	// contains filtered or unexported fields
}

func NewMethodSet

func NewMethodSet[I interface{}](methods map[string]Method[I]) *MethodSet[I]

func (*MethodSet[I]) Exists

func (m *MethodSet[I]) Exists(name string) bool

func (*MethodSet[I]) Get

func (m *MethodSet[I]) Get(name string) (Method[I], bool)

type Methods

type Methods struct {
	Bool  *MethodSet[bool]
	Int   *MethodSet[int]
	Float *MethodSet[float64]
	Str   *MethodSet[string]
	Dict  *MethodSet[map[string]interface{}]
	List  *MethodSet[[]interface{}]
}

type Pair

type Pair struct {
	Key   *Value
	Value *Value
}

func (*Pair) String

func (p *Pair) String() string

type ReducedVarArgs

type ReducedVarArgs struct {
	*VarArgs
	// contains filtered or unexported fields
}

ReducedVarArgs represents python variadic arguments / keyword arguments but values are reduced (ie. keyword arguments given as arguments are accessible by name)

func (*ReducedVarArgs) Error

func (r *ReducedVarArgs) Error() string

func (*ReducedVarArgs) IsError

func (r *ReducedVarArgs) IsError() bool

IsError returns true if there was an error on Expect call

type Renderer

type Renderer struct {
	Config      *config.Config
	Environment *Environment
	Loader      loaders.Loader
	Template    *Template
	RootNode    *nodes.Template
	Output      io.Writer
}

Renderer is a node visitor in charge of rendering

func NewRenderer

func NewRenderer(environment *Environment, wr io.Writer, config *config.Config, loader loaders.Loader, template *Template) *Renderer

NewRenderer initialize a new renderer

func (*Renderer) Eval

func (r *Renderer) Eval(node nodes.Expression) *Value

func (*Renderer) Evaluator

func (r *Renderer) Evaluator() *Evaluator

func (*Renderer) Execute

func (r *Renderer) Execute() error

func (*Renderer) ExecuteWrapper

func (r *Renderer) ExecuteWrapper(wrapper *nodes.Wrapper) error

ExecuteWrapper wraps the nodes.Wrapper execution logic

func (*Renderer) Inherit

func (r *Renderer) Inherit() *Renderer

Inherit creates a new sub renderer

func (*Renderer) Visit

func (r *Renderer) Visit(node nodes.Node) (nodes.Visitor, error)

Visit implements the nodes.Visitor interface

type Template

type Template struct {
	// contains filtered or unexported fields
}

func NewTemplate

func NewTemplate(identifier string, config *config.Config, loader loaders.Loader, environment *Environment) (*Template, error)

Create a gonja template instance that can be executed with a given context later on

func (*Template) Execute

func (t *Template) Execute(wr io.Writer, data *Context) error

Executes the template and return the rendered content in the provided writer

func (*Template) ExecuteToBytes

func (t *Template) ExecuteToBytes(data *Context) ([]byte, error)

Executes the template and return the rendered content as bytes

func (*Template) ExecuteToString

func (t *Template) ExecuteToString(data *Context) (string, error)

Executes the template and return the rendered content as a string

func (*Template) Macros

func (t *Template) Macros() map[string]*nodes.Macro

Return all macros available to the template

type TestFunction

type TestFunction func(*Context, *Value, *VarArgs) (bool, error)

TestFunction is the type test functions must fulfil

type TestSet

type TestSet struct {
	// contains filtered or unexported fields
}

TestSet maps test names to their TestFunction handler

func NewTestSet

func NewTestSet(tests map[string]TestFunction) *TestSet

func (*TestSet) Exists

func (t *TestSet) Exists(name string) bool

Exists returns true if the given test is already registered

func (*TestSet) Get

func (t *TestSet) Get(name string) (TestFunction, bool)

func (*TestSet) Register

func (t *TestSet) Register(name string, fn TestFunction) error

Register registers a new test. If there's already a test with the same name, RegisterTest will panic. You usually want to call this function in the test's init() function: http://golang.org/doc/effective_go.html#init

func (*TestSet) Replace

func (t *TestSet) Replace(name string, fn TestFunction) error

Replace replaces an already registered test with a new implementation. Use this function with caution since it allows you to change existing test behaviour.

func (*TestSet) Update

func (t *TestSet) Update(other *TestSet) *TestSet

type Value

type Value struct {
	Val  reflect.Value
	Safe bool // used to indicate whether a Value needs explicit escaping in the template
}

func AsSafeValue

func AsSafeValue(i interface{}) *Value

AsSafeValue works like AsValue, but does not apply the 'escape' filter.

func AsValue

func AsValue(i interface{}) *Value

AsValue converts any given Value to a gonja.Value Usually being used within oSn functions passed to a template through a Context or within filter functions.

Example:

AsValue("my string")

func ToValue

func ToValue(data interface{}) *Value

func ValueError

func ValueError(err error) *Value

func (*Value) Bool

func (v *Value) Bool() bool

Bool returns the underlying value as bool. If the value is not bool, false will always be returned. If you're looking for true/false-evaluation of the underlying value, have a look on the IsTrue()-function.

func (*Value) CanSlice

func (v *Value) CanSlice() bool

CanSlice checks whether the underlying value is of type array, slice or string. You normally would use CanSlice() before using the Slice() operation.

func (*Value) Contains

func (v *Value) Contains(other *Value) bool

Contains checks whether the underlying value (which must be of type struct, map, string, array or slice) contains of another Value (e. g. used to check whether a struct contains of a specific field or a map contains a specific key).

Example:

AsValue("Hello, World!").Contains(AsValue("World")) == true

func (*Value) EqualValueTo

func (v *Value) EqualValueTo(other *Value) bool

EqualValueTo checks whether two values are containing the same value or object.

func (*Value) Error

func (v *Value) Error() string

func (*Value) Escaped

func (v *Value) Escaped() string

Escaped returns the escaped version of String()

func (*Value) Float

func (v *Value) Float() float64

Float returns the underlying value as a float (converts the underlying value, if necessary). If it's not possible to convert the underlying value, it will return 0.0.

func (*Value) Get

func (v *Value) Get(key string) (*Value, bool)

func (*Value) GetAttribute

func (v *Value) GetAttribute(name string) (*Value, bool)

func (*Value) GetItem

func (v *Value) GetItem(key interface{}) (*Value, bool)

func (*Value) Index

func (v *Value) Index(i int) *Value

Index gets the i-th item of an array, slice or string. Otherwise it will return NIL.

func (*Value) Integer

func (v *Value) Integer() int

Integer returns the underlying value as an integer (converts the underlying value, if necessary). If it's not possible to convert the underlying value, it will return 0.

func (*Value) Interface

func (v *Value) Interface() interface{}

Interface gives you access to the underlying value.

func (*Value) IsBool

func (v *Value) IsBool() bool

IsBool checks whether the underlying value is a bool

func (*Value) IsCallable

func (v *Value) IsCallable() bool

func (*Value) IsDict

func (v *Value) IsDict() bool

func (*Value) IsError

func (v *Value) IsError() bool

func (*Value) IsFloat

func (v *Value) IsFloat() bool

IsFloat checks whether the underlying value is a float

func (*Value) IsInteger

func (v *Value) IsInteger() bool

IsInteger checks whether the underlying value is an integer

func (*Value) IsIterable

func (v *Value) IsIterable() bool

func (*Value) IsList

func (v *Value) IsList() bool

func (*Value) IsNil

func (v *Value) IsNil() bool

IsNil checks whether the underlying value is NIL

func (*Value) IsNumber

func (v *Value) IsNumber() bool

IsNumber checks whether the underlying value is either an integer or a float.

func (*Value) IsString

func (v *Value) IsString() bool

IsString checks whether the underlying value is a string

func (*Value) IsTrue

func (v *Value) IsTrue() bool

IsTrue tries to evaluate the underlying value the Pythonic-way:

Returns TRUE in one the following cases:

  • int != 0
  • uint != 0
  • float != 0.0
  • len(array/chan/map/slice/string) > 0
  • bool == true
  • underlying value is a struct

Otherwise returns always FALSE.

func (*Value) Items

func (v *Value) Items() []*Pair

func (*Value) Iterate

func (v *Value) Iterate(fn func(idx, count int, key, value *Value) bool, empty func())

Iterate iterates over a map, array, slice or a string. It calls the function's first argument for every value with the following arguments:

idx      current 0-index
count    total amount of items
key      *Value for the key or item
value    *Value (only for maps, the respective value for a specific key)

If the underlying value has no items or is not one of the types above, the empty function (function's second argument) will be called.

func (*Value) IterateOrder

func (v *Value) IterateOrder(fn func(idx, count int, key, value *Value) bool, empty func(), reverse bool, sorted bool, caseSensitive bool)

IterateOrder behaves like Value.Iterate, but can iterate through an array/slice/string in reverse. Does not affect the iteration through a map because maps don't have any particular order. However, you can force an order using the `sorted` keyword (and even use `reversed sorted`).

func (*Value) Keys

func (v *Value) Keys() ValuesList

func (*Value) Len

func (v *Value) Len() int

Len returns the length for an array, chan, map, slice or string. Otherwise it will return 0.

func (*Value) Negate

func (v *Value) Negate() *Value

Negate tries to negate the underlying value. It's mainly used for the NOT-operator and in conjunction with a call to return_value.IsTrue() afterwards.

Example:

AsValue(1).Negate().IsTrue() == false

func (*Value) Set

func (v *Value) Set(key *Value, value interface{}) error

func (*Value) Slice

func (v *Value) Slice(i, j int) *Value

Slice slices an array, slice or string. Otherwise it will return an empty []int.

func (*Value) String

func (v *Value) String() string

String returns a string for the underlying value. If this value is not of type string, gonja tries to convert it. Currently the following types for underlying values are supported:

  1. string
  2. int/uint (any size)
  3. float (any precision)
  4. bool
  5. time.Time
  6. String() will be called on the underlying value if provided

NIL values will lead to an empty string. Unsupported types are leading to their respective type name.

func (*Value) ToGoSimpleType

func (v *Value) ToGoSimpleType(allowInterfaceKeys bool) interface{}

type ValuesList

type ValuesList []*Value

func (ValuesList) Contains

func (vl ValuesList) Contains(value *Value) bool

func (ValuesList) Len

func (vl ValuesList) Len() int

func (ValuesList) Less

func (vl ValuesList) Less(i, j int) bool

func (ValuesList) String

func (vl ValuesList) String() string

func (ValuesList) Swap

func (vl ValuesList) Swap(i, j int)

type VarArgs

type VarArgs struct {
	Args   []*Value
	KwArgs map[string]*Value
}

VarArgs represents pythonic variadic args/kwargs

func NewVarArgs

func NewVarArgs() *VarArgs

func (*VarArgs) Expect

func (v *VarArgs) Expect(arguments int, keywordArguments []*KwArg) *ReducedVarArgs

Expect validates VarArgs against an expected signature

func (*VarArgs) ExpectArgs

func (va *VarArgs) ExpectArgs(args int) *ReducedVarArgs

ExpectArgs ensures VarArgs receive only arguments

func (*VarArgs) ExpectKwArgs

func (va *VarArgs) ExpectKwArgs(kwargs []*KwArg) *ReducedVarArgs

ExpectKwArgs allow to specify optionnaly expected KwArgs

func (*VarArgs) ExpectNothing

func (va *VarArgs) ExpectNothing() *ReducedVarArgs

ExpectNothing ensures VarArgs does not receive any argument

func (*VarArgs) First

func (va *VarArgs) First() *Value

First returns the first argument or nil AsValue

func (*VarArgs) GetKeywordArgument

func (va *VarArgs) GetKeywordArgument(key string, fallback interface{}) *Value

GetKeywordArgument gets a keyword arguments with fallback on default value

func (*VarArgs) Take

func (v *VarArgs) Take(arguments ...*argument) error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL