func validateFunc(funcName string, fv reflect.Value, isMethod bool) (inNum int, reqt reflect.Type, err error) {
if funcName == "" {
err = fmt.Errorf("funcName cannot be empty")
return
}
ft := fv.Type()
if ft.Kind() != reflect.Func {
err = fmt.Errorf("function [%s] must be a function instead of %s", funcName, ft)
return
}
inNum = ft.NumIn()
outNum := ft.NumOut()
dt := 0
if isMethod {
dt = 1
}
if inNum == 2+dt {
if ft.In(dt).Kind() != reflect.String {
err = fmt.Errorf("unexpected type for the first argument of the function [%s]: [%s]. Expected string", funcName, ft.In(dt))
return
}
} else if inNum > 2+dt {
err = fmt.Errorf("unexpected number of arguments in the function [%s]: %d. Expected 0, 1 (request) or 2 (clientAddr, request)", funcName, inNum-dt)
return
}
if outNum == 2 {
if !isErrorType(ft.Out(1)) {
err = fmt.Errorf("unexpected type for the second return value of the function [%s]: [%s]. Expected [%s]", funcName, ft.Out(1), errt)
return
}
} else if outNum > 2 {
err = fmt.Errorf("unexpected number of return values for the function %s: %d. Expected 0, 1 (response) or 2 (response, error)", funcName, outNum)
return
}
if inNum > dt {
reqt = ft.In(inNum - 1)
if err = registerType("request", funcName, reqt); err != nil {
return
}
}
if outNum > 0 {
respt := ft.Out(0)
if !isErrorType(respt) {
if err = registerType("response", funcName, ft.Out(0)); err != nil {
return
}
}
}
return
}