URI: 
       tplimpl: return an error on unsupported type in isSet - hugo - [fork] hugo port for 9front
  HTML git clone git@git.drkhsh.at/hugo.git
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit 74ea81b885adc64d0194df461cbc85667294d16e
   DIR parent 577522bd45078fef46655d38f3e831d1df6b2744
  HTML Author: Cameron Moore <moorereason@gmail.com>
       Date:   Thu, 23 Feb 2017 22:35:20 -0600
       
       tplimpl: return an error on unsupported type in isSet
       
       Fixes #3092
       
       Diffstat:
         M tpl/tplimpl/template_funcs.go       |      10 ++++++----
         M tpl/tplimpl/template_funcs_test.go  |      30 ++++++++++++++++++++++++------
       
       2 files changed, 30 insertions(+), 10 deletions(-)
       ---
   DIR diff --git a/tpl/tplimpl/template_funcs.go b/tpl/tplimpl/template_funcs.go
       @@ -1276,22 +1276,24 @@ func (p pairList) sort() interface{} {
        
        // isSet returns whether a given array, channel, slice, or map has a key
        // defined.
       -func isSet(a interface{}, key interface{}) bool {
       +func isSet(a interface{}, key interface{}) (bool, error) {
                av := reflect.ValueOf(a)
                kv := reflect.ValueOf(key)
        
                switch av.Kind() {
                case reflect.Array, reflect.Chan, reflect.Slice:
                        if int64(av.Len()) > kv.Int() {
       -                        return true
       +                        return true, nil
                        }
                case reflect.Map:
                        if kv.Type() == av.Type().Key() {
       -                        return av.MapIndex(kv).IsValid()
       +                        return av.MapIndex(kv).IsValid(), nil
                        }
       +        default:
       +                return false, fmt.Errorf("unsupported type %q", av.Kind())
                }
        
       -        return false
       +        return false, nil
        }
        
        // returnWhenSet returns a given value if it set.  Otherwise, it returns an
   DIR diff --git a/tpl/tplimpl/template_funcs_test.go b/tpl/tplimpl/template_funcs_test.go
       @@ -1017,13 +1017,31 @@ func TestIntersect(t *testing.T) {
        
        func TestIsSet(t *testing.T) {
                t.Parallel()
       -        aSlice := []interface{}{1, 2, 3, 5}
       -        aMap := map[string]interface{}{"a": 1, "b": 2}
        
       -        assert.True(t, isSet(aSlice, 2))
       -        assert.True(t, isSet(aMap, "b"))
       -        assert.False(t, isSet(aSlice, 22))
       -        assert.False(t, isSet(aMap, "bc"))
       +        for _, test := range []struct {
       +                src    interface{}
       +                key    interface{}
       +                res    bool
       +                isErr  bool
       +                errStr string
       +        }{
       +                {[]interface{}{1, 2, 3, 5}, 2, true, false, ""},
       +                {[]interface{}{1, 2, 3, 5}, 22, false, false, ""},
       +
       +                {map[string]interface{}{"a": 1, "b": 2}, "b", true, false, ""},
       +                {map[string]interface{}{"a": 1, "b": 2}, "bc", false, false, ""},
       +
       +                {time.Now(), 1, false, true, `unsupported type "struct"`},
       +        } {
       +                res, err := isSet(test.src, test.key)
       +                if test.isErr {
       +                        assert.EqualError(t, err, test.errStr)
       +                        continue
       +                }
       +
       +                assert.NoError(t, err)
       +                assert.Equal(t, test.res, res)
       +        }
        }
        
        func (x *TstX) TstRp() string {