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