1
0
mirror of https://github.com/danog/liquid.git synced 2024-12-02 14:37:50 +01:00
liquid/render/node_context.go

54 lines
1.4 KiB
Go
Raw Normal View History

package render
import (
2017-07-16 19:47:06 +02:00
"github.com/osteele/liquid/evaluator"
2017-07-14 02:18:23 +02:00
"github.com/osteele/liquid/expressions"
)
2017-07-09 17:18:35 +02:00
// nodeContext provides the evaluation context for rendering the AST.
2017-07-09 17:49:24 +02:00
//
// This type has a clumsy name so that render.Context, in the public API, can
// have a clean name that doesn't stutter.
type nodeContext struct {
bindings map[string]interface{}
2017-07-04 22:48:38 +02:00
config Config
}
// newNodeContext creates a new evaluation context.
2017-07-07 11:41:37 +02:00
func newNodeContext(scope map[string]interface{}, c Config) nodeContext {
// The assign tag modifies the scope, so make a copy first.
// TODO this isn't really the right place for this.
vars := map[string]interface{}{}
for k, v := range scope {
vars[k] = v
}
2017-07-07 11:41:37 +02:00
return nodeContext{vars, c}
}
// Clone makes a copy of a context, with copied bindings.
func (c nodeContext) Clone() nodeContext {
bindings := map[string]interface{}{}
for k, v := range c.bindings {
bindings[k] = v
}
2017-07-04 22:48:38 +02:00
return nodeContext{bindings, c.config}
}
// Evaluate evaluates an expression within the template context.
2017-07-14 02:18:23 +02:00
func (c nodeContext) Evaluate(expr expressions.Expression) (out interface{}, err error) {
defer func() {
if r := recover(); r != nil {
switch e := r.(type) {
2017-07-14 02:18:23 +02:00
case expressions.InterpreterError:
err = e
2017-07-16 19:47:06 +02:00
case *evaluator.CallParityError:
err = e
default:
// fmt.Println(string(debug.Stack()))
panic(e)
}
}
}()
2017-07-14 02:18:23 +02:00
return expr.Evaluate(expressions.NewContext(c.bindings, c.config.Config.Config))
}