From 2990bc25361fe4767347725b74da5d2b02d488db Mon Sep 17 00:00:00 2001 From: Jan De Dobbeleer Date: Sun, 11 Apr 2021 15:24:03 +0200 Subject: [PATCH] fix: return error on template render --- src/console_title.go | 6 +++++- src/main.go | 6 +++++- src/segment.go | 4 ++-- src/segment_aws.go | 6 +++++- src/segment_battery.go | 6 +++++- src/segment_kubectl.go | 6 +++++- src/segment_session.go | 6 +++++- src/segment_time.go | 6 +++++- src/template.go | 9 +++++---- src/template_test.go | 20 +++++++++++++------- 10 files changed, 55 insertions(+), 20 deletions(-) diff --git a/src/console_title.go b/src/console_title.go index bb9d918fbd79..66df35ddc6c8 100644 --- a/src/console_title.go +++ b/src/console_title.go @@ -65,7 +65,11 @@ func (t *consoleTitle) getTemplateText() string { Template: t.config.ConsoleTitleTemplate, Context: context, } - return template.render() + text, err := template.render() + if err != nil { + return err.Error() + } + return text } func (t *consoleTitle) getPwd() string { diff --git a/src/main.go b/src/main.go index 33268b51051b..6ba5571d7a8b 100644 --- a/src/main.go +++ b/src/main.go @@ -275,5 +275,9 @@ func getConsoleBackgroundColor(env environmentInfo, backgroundColorTemplate stri Template: backgroundColorTemplate, Context: context, } - return template.render() + text, err := template.render() + if err != nil { + return err.Error() + } + return text } diff --git a/src/segment.go b/src/segment.go index c9cc20936ed8..c50e901846ea 100644 --- a/src/segment.go +++ b/src/segment.go @@ -170,8 +170,8 @@ func (segment *Segment) getColor(templates []string, defaultColor string) string } for _, template := range templates { txtTemplate.Template = template - value := txtTemplate.render() - if value == "" { + value, err := txtTemplate.render() + if err != nil || value == "" { continue } return value diff --git a/src/segment_aws.go b/src/segment_aws.go index d3f4024eba89..aa3f37889357 100644 --- a/src/segment_aws.go +++ b/src/segment_aws.go @@ -84,5 +84,9 @@ func (a *aws) string() string { Template: segmentTemplate, Context: a, } - return template.render() + text, err := template.render() + if err != nil { + return err.Error() + } + return text } diff --git a/src/segment_battery.go b/src/segment_battery.go index 081905efc0eb..08459514e396 100644 --- a/src/segment_battery.go +++ b/src/segment_battery.go @@ -89,7 +89,11 @@ func (b *batt) string() string { Template: segmentTemplate, Context: b, } - return template.render() + text, err := template.render() + if err != nil { + return err.Error() + } + return text } func (b *batt) init(props *properties, env environmentInfo) { diff --git a/src/segment_kubectl.go b/src/segment_kubectl.go index b965b8a574c5..3dfdf8dcf713 100644 --- a/src/segment_kubectl.go +++ b/src/segment_kubectl.go @@ -17,7 +17,11 @@ func (k *kubectl) string() string { Template: segmentTemplate, Context: k, } - return template.render() + text, err := template.render() + if err != nil { + return err.Error() + } + return text } func (k *kubectl) init(props *properties, env environmentInfo) { diff --git a/src/segment_session.go b/src/segment_session.go index 96bc1236ea8b..ed7cfca7a383 100644 --- a/src/segment_session.go +++ b/src/segment_session.go @@ -47,7 +47,11 @@ func (s *session) enabled() bool { Template: segmentTemplate, Context: s, } - s.templateText = template.render() + var err error + s.templateText, err = template.render() + if err != nil { + s.templateText = err.Error() + } return len(s.templateText) > 0 } showDefaultUser := s.props.getBool(DisplayDefault, true) diff --git a/src/segment_time.go b/src/segment_time.go index 2851ec2deafa..f537c5298e1f 100644 --- a/src/segment_time.go +++ b/src/segment_time.go @@ -25,7 +25,11 @@ func (t *tempus) enabled() bool { Template: segmentTemplate, Context: t, } - t.templateText = template.render() + var err error + t.templateText, err = template.render() + if err != nil { + t.templateText = err.Error() + } return len(t.templateText) > 0 } return true diff --git a/src/template.go b/src/template.go index 2ec800db5f55..bbeee660a697 100644 --- a/src/template.go +++ b/src/template.go @@ -2,6 +2,7 @@ package main import ( "bytes" + "errors" "text/template" "github.com/Masterminds/sprig" @@ -18,16 +19,16 @@ type textTemplate struct { Context interface{} } -func (t *textTemplate) render() string { +func (t *textTemplate) render() (string, error) { tmpl, err := template.New("title").Funcs(sprig.TxtFuncMap()).Parse(t.Template) if err != nil { - return invalidTemplate + return "", errors.New(invalidTemplate) } buffer := new(bytes.Buffer) defer buffer.Reset() err = tmpl.Execute(buffer, t.Context) if err != nil { - return incorrectTemplate + return "", errors.New(incorrectTemplate) } - return buffer.String() + return buffer.String(), nil } diff --git a/src/template_test.go b/src/template_test.go index 539f1da5eb71..dea8fa510b3b 100644 --- a/src/template_test.go +++ b/src/template_test.go @@ -8,14 +8,15 @@ import ( func TestRenderTemplate(t *testing.T) { cases := []struct { - Case string - Expected string - Template string - Context interface{} + Case string + Expected string + Template string + ShouldError bool + Context interface{} }{ {Case: "single property", Expected: "hello world", Template: "{{.Text}} world", Context: struct{ Text string }{Text: "hello"}}, - {Case: "invalid property", Expected: incorrectTemplate, Template: "{{.Durp}} world", Context: struct{ Text string }{Text: "hello"}}, - {Case: "invalid template", Expected: invalidTemplate, Template: "{{ if .Text }} world", Context: struct{ Text string }{Text: "hello"}}, + {Case: "invalid property", ShouldError: true, Template: "{{.Durp}} world", Context: struct{ Text string }{Text: "hello"}}, + {Case: "invalid template", ShouldError: true, Template: "{{ if .Text }} world", Context: struct{ Text string }{Text: "hello"}}, {Case: "if statement true", Expected: "hello world", Template: "{{ if .Text }}{{.Text}} world{{end}}", Context: struct{ Text string }{Text: "hello"}}, {Case: "if statement false", Expected: "world", Template: "{{ if .Text }}{{.Text}} {{end}}world", Context: struct{ Text string }{Text: ""}}, { @@ -72,6 +73,11 @@ func TestRenderTemplate(t *testing.T) { Template: tc.Template, Context: tc.Context, } - assert.Equal(t, tc.Expected, template.render(), tc.Case) + text, err := template.render() + if tc.ShouldError { + assert.Error(t, err) + continue + } + assert.Equal(t, tc.Expected, text, tc.Case) } }