tpl: Do not return errors in substr for out-of-bounds cases
authorCameron Moore <moorereason@gmail.com>
Sun, 3 Jan 2021 18:01:42 +0000 (12:01 -0600)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 8 Jan 2021 09:13:10 +0000 (10:13 +0100)
Most other substr implementations don't error out in out-of-bounds cases
but simply return an empty string (or a value that's printed as an empty
string). We'll follow their lead and not exit template execution.  Allow
the user decide what to do with the empty result.

Fixes #8113

tpl/strings/strings.go
tpl/strings/strings_test.go

index 178d17bc0421d49f2a4e92a5f76e0a5a458633f3..b2f02d8f5263c8411791b07e848617b3165ada59 100644 (file)
@@ -16,7 +16,6 @@ package strings
 
 import (
        "errors"
-       "fmt"
        "html/template"
        "strings"
        "unicode/utf8"
@@ -322,7 +321,7 @@ func (ns *Namespace) Substr(a interface{}, nums ...interface{}) (string, error)
        }
 
        if start > rlen-1 {
-               return "", fmt.Errorf("start position out of bounds for %d-byte string", rlen)
+               return "", nil
        }
 
        end := rlen
@@ -337,7 +336,7 @@ func (ns *Namespace) Substr(a interface{}, nums ...interface{}) (string, error)
        }
 
        if start >= end {
-               return "", fmt.Errorf("calculated start position greater than end position: %d > %d", start, end)
+               return "", nil
        }
 
        if end < 0 {
index ef926aeef3354b6531f2097f36b4100f8a876697..f3bb82c63a1969f53755ee40491bd4d4419cf0ed 100644 (file)
@@ -451,9 +451,9 @@ func TestSubstr(t *testing.T) {
                {"abcdef", -3, 1, "d"},
                {"abcdef", 0, -1, "abcde"},
                {"abcdef", 2, -1, "cde"},
-               {"abcdef", 4, -4, false},
-               {"abcdef", 7, 1, false},
-               {"abcdef", 6, nil, false},
+               {"abcdef", 4, -4, ""},
+               {"abcdef", 7, 1, ""},
+               {"abcdef", 6, nil, ""},
                {"abcdef", 1, 100, "bcdef"},
                {"abcdef", -100, 3, "abc"},
                {"abcdef", -3, -1, "de"},
@@ -476,6 +476,7 @@ func TestSubstr(t *testing.T) {
                {"abcdef", "doo", nil, false},
                {"abcdef", "doo", "doo", false},
                {"abcdef", 1, "doo", false},
+               {"", 0, nil, ""},
        } {
 
                var result string
@@ -491,7 +492,7 @@ func TestSubstr(t *testing.T) {
                        continue
                }
 
-               c.Assert(err, qt.IsNil)
+               c.Assert(err, qt.IsNil, qt.Commentf("%v", test))
                c.Check(result, qt.Equals, test.expect, qt.Commentf("%v", test))
        }