hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 6b8422bb35b7c9eada3a62563f2056eee29f94e0
parent f25f8373390f73d8bb8b7bdfdf49fa9fc6d0d910
Author: Cameron Moore <moorereason@gmail.com>
Date:   Thu, 22 Dec 2016 17:29:31 -0600

tpl: Update hasPrefix to accept interface{} params

Updates #2822

Diffstat:
Mtpl/template_funcs.go | 17++++++++++++++++-
Mtpl/template_funcs_test.go | 27+++++++++++++++++++++++++++
2 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/tpl/template_funcs.go b/tpl/template_funcs.go
@@ -239,6 +239,21 @@ func slicestr(a interface{}, startEnd ...interface{}) (string, error) {
 
 }
 
+// hasPrefix tests whether the input s begins with prefix.
+func hasPrefix(s, prefix interface{}) (bool, error) {
+	ss, err := cast.ToStringE(s)
+	if err != nil {
+		return false, err
+	}
+
+	sp, err := cast.ToStringE(prefix)
+	if err != nil {
+		return false, err
+	}
+
+	return strings.HasPrefix(ss, sp), nil
+}
+
 // substr extracts parts of a string, beginning at the character at the specified
 // position, and returns the specified number of characters.
 //
@@ -2060,7 +2075,7 @@ func initFuncMap() {
 		"getJSON":       getJSON,
 		"getenv":        func(varName string) string { return os.Getenv(varName) },
 		"gt":            gt,
-		"hasPrefix":     func(a, b string) bool { return strings.HasPrefix(a, b) },
+		"hasPrefix":     hasPrefix,
 		"highlight":     highlight,
 		"htmlEscape":    htmlEscape,
 		"htmlUnescape":  htmlUnescape,
diff --git a/tpl/template_funcs_test.go b/tpl/template_funcs_test.go
@@ -804,6 +804,33 @@ func TestSlicestr(t *testing.T) {
 	}
 }
 
+func TestHasPrefix(t *testing.T) {
+	cases := []struct {
+		s      interface{}
+		prefix interface{}
+		want   interface{}
+		isErr  bool
+	}{
+		{"abcd", "ab", true, false},
+		{"abcd", "cd", false, false},
+		{template.HTML("abcd"), "ab", true, false},
+		{template.HTML("abcd"), "cd", false, false},
+		{template.HTML("1234"), 12, true, false},
+		{template.HTML("1234"), 34, false, false},
+		{[]byte("abcd"), "ab", true, false},
+	}
+
+	for i, c := range cases {
+		res, err := hasPrefix(c.s, c.prefix)
+		if (err != nil) != c.isErr {
+			t.Fatalf("[%d] unexpected isErr state: want %v, got %v, err = %v", i, c.isErr, err != nil, err)
+		}
+		if res != c.want {
+			t.Errorf("[%d] want %v, got %v", i, c.want, res)
+		}
+	}
+}
+
 func TestSubstr(t *testing.T) {
 	var err error
 	var n int