events/handler.go

46 lines
982 B
Go
Raw Normal View History

2020-08-22 22:15:12 +00:00
// +build !tinygo
package events
import (
"errors"
"reflect"
)
type receiptHandler struct {
receiverFunc reflect.Value
funcType reflect.Type
}
func newReceiptHandler(receiver interface{}) (receiptHandler, error) {
val := reflect.ValueOf(receiver)
if val.Type().Kind() != reflect.Func {
return receiptHandler{}, errors.New("not a function")
}
return receiptHandler{receiverFunc: val, funcType: val.Type()}, nil
}
func (rh *receiptHandler) invoke(values preparedArgs) {
args := make([]reflect.Value, rh.funcType.NumIn())
for i := range args {
args[i] = reflect.Zero(rh.funcType.In(i))
if i < len(values) {
if rh.funcType.In(i).AssignableTo(values[i].Type()) {
args[i] = values[i]
}
}
}
rh.receiverFunc.Call(args)
}
type preparedArgs []reflect.Value
func prepareArgs(argIfacess []interface{}) preparedArgs {
values := make([]reflect.Value, len(argIfacess))
for i, a := range argIfacess {
values[i] = reflect.ValueOf(a)
}
return values
}