github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/funcmap/funcmap.go (about) 1 package funcmap 2 3 import ( 4 "errors" 5 "reflect" 6 ) 7 8 var ( 9 ErrParamsNotAdapted = errors.New("The number of params is not adapted.") 10 ) 11 12 type Funcs map[string]reflect.Value 13 14 func NewFuncs(size int) Funcs { 15 return make(Funcs, size) 16 } 17 18 func (f Funcs) Bind(name string, fn interface{}) (err error) { 19 defer func() { 20 if e := recover(); e != nil { 21 err = errors.New(name + " is not callable.") 22 } 23 }() 24 v := reflect.ValueOf(fn) 25 v.Type().NumIn() 26 f[name] = v 27 return 28 } 29 30 func (f Funcs) Call(name string, params ... interface{}) (result []reflect.Value, err error) { 31 if _, ok := f[name]; !ok { 32 err = errors.New(name + " does not exist.") 33 return 34 } 35 if len(params) != f[name].Type().NumIn() { 36 err = ErrParamsNotAdapted 37 return 38 } 39 in := make([]reflect.Value, len(params)) 40 for k, param := range params { 41 in[k] = reflect.ValueOf(param) 42 } 43 result = f[name].Call(in) 44 return 45 } 46