package tmpl import ( "reflect" _ "unsafe" ) type TmplMap struct { reflect.Value } func (m TmplMap) Keys() ([]reflect.Value) { return m.MapKeys() } func (m TmplMap) MapWithDefaults(arg0 reflect.Value, args ...reflect.Value) (v reflect.Value) { if iarg0 := indirectInterface(arg0); evalTrue(iarg0) { if v = m.MapIndex(iarg0); evalTrue(v) { return } } for _, v = range args { if truth(v) { break } } return } func (m TmplMap) Map(arg0 reflect.Value, args ...reflect.Value) (v reflect.Value) { if iarg0 := indirectInterface(arg0); evalTrue(iarg0) { if v = m.MapIndex(iarg0); evalTrue(v) { return } } argLen := len(args) if argLen == 0 { return } keys, defaultValue := args[:argLen-1], args[argLen-1] for _, k := range keys { if ik := indirectInterface(k); !evalTrue(ik) { } else if v = m.Value.MapIndex(ik); evalTrue(v) { return } } v = defaultValue return } func MakeMapFunc(arg ...reflect.Value) TmplMap { if len(arg)%2 != 0 { panic("bad makemap") } m := reflect.MakeMapWithSize(reflect.TypeOf(map[interface{}]interface{}{}), len(arg)/2) for i := 0; i < len(arg); i += 2 { k, v := indirectInterface(arg[i]), indirectInterface(arg[i+1]) if !(evalTrue(k) && evalTrue(v)) { continue } m.SetMapIndex(k, v) } return TmplMap{m} }