From 8ee8cef4916f632484504c6afa2406c40abeb221 Mon Sep 17 00:00:00 2001 From: James Littlejohn Date: Fri, 21 Jul 2017 10:36:44 +1000 Subject: [PATCH 1/2] Return errors applying filters as Render errors --- expressions/builders.go | 5 ++++- expressions/expressions.go | 2 ++ expressions/filters.go | 10 ++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/expressions/builders.go b/expressions/builders.go index cd79cdc..40c621f 100644 --- a/expressions/builders.go +++ b/expressions/builders.go @@ -22,7 +22,10 @@ func makeFilter(fn valueFn, name string, args []valueFn) valueFn { return func(ctx Context) evaluator.Value { result, err := ctx.ApplyFilter(name, fn, args) if err != nil { - panic(err) + panic(FilterError{ + FilterName: name, + Err: err, + }) } return evaluator.ValueOf(result) } diff --git a/expressions/expressions.go b/expressions/expressions.go index 9f1669c..b70fcb6 100644 --- a/expressions/expressions.go +++ b/expressions/expressions.go @@ -53,6 +53,8 @@ func (e expression) Evaluate(ctx Context) (out interface{}, err error) { err = e case UndefinedFilter: err = e + case FilterError: + err = e default: panic(r) } diff --git a/expressions/filters.go b/expressions/filters.go index 60779b2..62a136c 100644 --- a/expressions/filters.go +++ b/expressions/filters.go @@ -21,6 +21,16 @@ func (e UndefinedFilter) Error() string { return fmt.Sprintf("undefined filter %q", string(e)) } +// FilterError is the error returned by a filter when it is applied +type FilterError struct { + FilterName string + Err error +} + +func (e FilterError) Error() string { + return fmt.Sprintf("error applying filter %q (%q)", e.FilterName, e.Err) +} + type valueFn func(Context) evaluator.Value // AddFilter adds a filter to the filter dictionary. From 3d99b41252afd108c14583383f0fd6b02b21537c Mon Sep 17 00:00:00 2001 From: James Littlejohn Date: Fri, 21 Jul 2017 10:57:52 +1000 Subject: [PATCH 2/2] Add test --- expressions/expressions_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/expressions/expressions_test.go b/expressions/expressions_test.go index 033ee49..f381c52 100644 --- a/expressions/expressions_test.go +++ b/expressions/expressions_test.go @@ -1,6 +1,7 @@ package expressions import ( + "errors" "fmt" "strings" "testing" @@ -134,6 +135,10 @@ func TestEvaluateString(t *testing.T) { _, err = EvaluateString("1 | undefined_filter", ctx) require.Error(t, err) + + cfg.AddFilter("error", func(input interface{}) (string, error) { return "", errors.New("test error") }) + _, err = EvaluateString("1 | error", ctx) + require.Error(t, err) } func TestClosure(t *testing.T) {