exec

package
v0.0.0-...-6939cd4 Latest Latest
Warning

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

Go to latest
Published: Jan 3, 2023 License: MIT Imports: 15 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

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

Functions

func CaseInsensitive

func CaseInsensitive(data sort.Interface) sort.Interface

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

func Self

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

Types

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{}

func (*Context) Has

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

func (*Context) Inherit

func (ctx *Context) Inherit() *Context

func (*Context) Merge

func (ctx *Context) Merge(other *Context) *Context

Merge updates this context with the key/value pairs from another context.

func (*Context) Set

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

func (*Context) Update

func (ctx *Context) Update(other map[string]interface{}) *Context

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

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 EvalConfig

type EvalConfig struct {
	*config.Config
	Filters    *FilterSet
	Globals    *Context
	Statements *StatementSet
	Tests      *TestSet
	Loader     TemplateLoader
}

func NewEvalConfig

func NewEvalConfig(cfg *config.Config) *EvalConfig

func (*EvalConfig) GetTemplate

func (cfg *EvalConfig) GetTemplate(filename string) (*nodes.Template, error)

func (*EvalConfig) Inherit

func (cfg *EvalConfig) Inherit() *EvalConfig

type Evaluator

type Evaluator struct {
	*EvalConfig
	Ctx *Context
}

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 map[string]FilterFunction

func (FilterSet) Exists

func (fs FilterSet) Exists(name string) bool

Exists returns true if the given filter is already registered

func (*FilterSet) Register

func (fs *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

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

func (*FilterSet) Replace

func (fs *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 (fs *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.florian-schlachter.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 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 pythonic variadic args/kwargs but values are reduced (ie. kwargs given as args are accessible by name)

func (*ReducedVarArgs) Error

func (rva *ReducedVarArgs) Error() string

func (*ReducedVarArgs) IsError

func (rva *ReducedVarArgs) IsError() bool

IsError returns true if there was an error on Expect call

type Renderer

type Renderer struct {
	*EvalConfig
	Ctx      *Context
	Template *Template
	Root     *nodes.Template
	Out      *strings.Builder
	Trim     *TrimState
}

Renderer is a node visitor in charge of rendering

func NewRenderer

func NewRenderer(ctx *Context, out *strings.Builder, cfg *EvalConfig, tpl *Template) *Renderer

NewRenderer initialize a new renderer

func (*Renderer) EndTag

func (r *Renderer) EndTag(trim *nodes.Trim)

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) Flush

func (r *Renderer) Flush(lstrip bool)

func (*Renderer) FlushAndTrim

func (r *Renderer) FlushAndTrim(trim, lstrip bool)

func (*Renderer) Inherit

func (r *Renderer) Inherit() *Renderer

Inherit creates a new sub renderer

func (*Renderer) LStrip

func (r *Renderer) LStrip()

func (*Renderer) RenderValue

func (r *Renderer) RenderValue(value *Value)

RenderValue properly render a value

func (*Renderer) StartTag

func (r *Renderer) StartTag(trim *nodes.Trim, lstrip bool)

func (*Renderer) String

func (r *Renderer) String() string

func (*Renderer) Tag

func (r *Renderer) Tag(trim *nodes.Trim, lstrip bool)

func (*Renderer) Visit

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

Visit implements the nodes.Visitor interface

func (*Renderer) WriteString

func (r *Renderer) WriteString(txt string) (int, error)

WriteString wraps the triming policy

type Statement

type Statement interface {
	nodes.Statement
	Execute(*Renderer, *nodes.StatementBlock) error
}

type StatementSet

type StatementSet map[string]parser.StatementParser

func (StatementSet) Exists

func (ss StatementSet) Exists(name string) bool

Exists returns true if the given test is already registered

func (*StatementSet) Register

func (ss *StatementSet) Register(name string, parser parser.StatementParser) 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

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

func (*StatementSet) Replace

func (ss *StatementSet) Replace(name string, parser parser.StatementParser) error

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

func (*StatementSet) Update

func (ss *StatementSet) Update(other StatementSet) StatementSet

type Template

type Template struct {
	Name   string
	Reader io.Reader
	Source string

	Env    *EvalConfig
	Loader TemplateLoader

	Tokens *tokens.Stream
	Parser *parser.Parser

	Root   *nodes.Template
	Macros MacroSet
}

func NewTemplate

func NewTemplate(name string, source string, cfg *EvalConfig) (*Template, error)

func (*Template) Execute

func (tpl *Template) Execute(ctx map[string]interface{}) (string, error)

Executes the template and returns the rendered template as a string

func (*Template) ExecuteBytes

func (tpl *Template) ExecuteBytes(ctx map[string]interface{}) ([]byte, error)

Executes the template and returns the rendered template as a []byte

type TemplateLoader

type TemplateLoader interface {
	GetTemplate(string) (*Template, error)
}

type TestFunction

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

TestFunction is the type test functions must fulfil

type TestSet

type TestSet map[string]TestFunction

TestSet maps test names to their TestFunction handler

func (TestSet) Exists

func (ts TestSet) Exists(name string) bool

Exists returns true if the given test is already registered

func (*TestSet) Register

func (ts *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

See http://www.florian-schlachter.de/post/gonja/ for more about writing tests and tags.

func (*TestSet) Replace

func (ts *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 (ts *TestSet) Update(other TestSet) TestSet

type TrimState

type TrimState struct {
	Should      bool
	ShouldBlock bool
	Buffer      *strings.Builder
}

TrimState stores and apply trim policy

func (*TrimState) TrimBlocks

func (ts *TrimState) TrimBlocks(r rune) bool

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) Getattr

func (v *Value) Getattr(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 string, 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.

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 (va *VarArgs) Expect(args int, kwargs []*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) GetKwarg

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

GetKwarg gets a keyword arguments with fallback on default value

Jump to

Keyboard shortcuts

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