2017-06-29 19:08:25 +02:00
// Package expressions parses and evaluates the expression language that is used in objects {{a.b[c]}} and tag parameters {%assign pages = site.pages | reverse%}.
2017-06-26 15:33:07 +02:00
package expressions
2017-06-26 14:23:50 +02:00
2017-06-27 23:29:50 +02:00
import (
"github.com/osteele/liquid/generics"
)
2017-06-27 22:11:32 +02:00
2017-06-28 17:24:24 +02:00
// Expression is a parsed expression.
type Expression interface {
// Evaluate evaluates an expression in a context.
Evaluate ( ctx Context ) ( interface { } , error )
}
// Closure binds an environment.
type Closure interface {
Bind ( name string , value interface { } ) Closure
Evaluate ( ) ( interface { } , error )
}
type closure struct {
expr Expression
context Context
}
func ( c closure ) Bind ( name string , value interface { } ) Closure {
// TODO create a new context
c . context . Set ( name , value )
return c
}
func ( c closure ) Evaluate ( ) ( interface { } , error ) {
return c . expr . Evaluate ( c . context )
}
type expression struct {
evaluator func ( Context ) interface { }
}
2017-06-27 22:11:32 +02:00
func ( e expression ) Evaluate ( ctx Context ) ( out interface { } , err error ) {
defer func ( ) {
if r := recover ( ) ; r != nil {
switch e := r . ( type ) {
2017-06-27 23:29:50 +02:00
case generics . GenericError :
err = e
2017-06-27 22:53:34 +02:00
case InterpreterError :
err = e
2017-06-29 13:54:31 +02:00
case UndefinedFilter :
2017-06-27 22:11:32 +02:00
err = e
default :
panic ( r )
}
}
} ( )
2017-06-26 16:52:23 +02:00
return e . evaluator ( ctx ) , nil
2017-06-26 15:06:55 +02:00
}