From 36cb91953c46438234726fb967b43e80e76019e7 Mon Sep 17 00:00:00 2001 From: andig Date: Wed, 24 Aug 2022 19:22:17 +0200 Subject: [PATCH] Add template formatting --- util/format.go | 6 +++++- util/format_functions.go | 14 ++++++++++++++ util/format_test.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 util/format_functions.go diff --git a/util/format.go b/util/format.go index 4e4e60a3f..e8149762e 100644 --- a/util/format.go +++ b/util/format.go @@ -51,7 +51,11 @@ func FormatValue(format string, val interface{}) string { // ReplaceFormatted replaces all occurrences of ${key} with formatted val from the kv map func ReplaceFormatted(s string, kv map[string]interface{}) (string, error) { // Enhanced golang template logic - tpl, err := template.New("base").Funcs(sprig.FuncMap()).Parse(s) + tpl, err := template.New("base"). + Funcs(sprig.FuncMap()). + Funcs(map[string]any{ + "timeRound": timeRound, + }).Parse(s) if err != nil { return s, err } diff --git a/util/format_functions.go b/util/format_functions.go new file mode 100644 index 000000000..2ba39ea2c --- /dev/null +++ b/util/format_functions.go @@ -0,0 +1,14 @@ +package util + +import "time" + +func timeRound(d time.Duration, round string) time.Duration { + switch round { + case "s", "sec": + return d.Round(time.Second) + case "m", "min": + return d.Round(time.Minute) + default: + return d + } +} diff --git a/util/format_test.go b/util/format_test.go index 32d2f2af2..dcb5e3bfe 100644 --- a/util/format_test.go +++ b/util/format_test.go @@ -3,6 +3,7 @@ package util import ( "math" "testing" + "time" ) func TestTruish(t *testing.T) { @@ -70,3 +71,31 @@ func TestReplaceNoMatch(t *testing.T) { t.Error(s, err) } } + +func TestReplaceTemplate(t *testing.T) { + tc := []struct { + in, out, key string + val any + }{ + {`"{{ .mode }}"`, `"pv"`, "mode", "pv"}, + {`{{ printf "%.1f" .chargedEnergy }}kW`, `1.2kW`, "chargedEnergy", 1.234}, + {`{{ round .chargedEnergy 1 }}kW`, `1.2kW`, "chargedEnergy", 1.234}, + {`{{ timeRound .connectedDuration "s" }}`, `1s`, "connectedDuration", 1234 * time.Millisecond}, + {`{{ timeRound .connectedDuration "m" }}`, `21m0s`, "connectedDuration", 1234 * time.Second}, + } + + for _, tc := range tc { + s, err := ReplaceFormatted(tc.in, map[string]interface{}{ + tc.key: tc.val, + }) + + t.Log(s) + if err != nil { + t.Error(s, err) + } + + if s != tc.out { + t.Errorf("expected: %s, got: %s", tc.out, s) + } + } +}