Files
jiazhizhong 1279635d7f fix
2022-03-10 17:09:03 +08:00

76 lines
1.5 KiB
Go

package admin
import (
"errors"
"jiacrontab/models"
"jiacrontab/pkg/rpc"
"reflect"
"strings"
"github.com/iwannay/log"
)
func rpcCall(addr string, serviceMethod string, args interface{}, reply interface{}) error {
err := rpc.Call(addr, serviceMethod, args, reply)
if err != nil {
log.Errorf("rpcCall(%s->%s):%v", addr, serviceMethod, err)
}
if err == rpc.ErrRpc || err == rpc.ErrShutdown {
models.DB().Unscoped().Model(&models.Node{}).Where("addr=?", addr).Update("disabled", true)
}
return err
}
func validStructRule(i interface{}) error {
rt := reflect.TypeOf(i)
rv := reflect.ValueOf(i)
if rt.Kind() == reflect.Ptr {
rt = rt.Elem()
}
if rv.Kind() == reflect.Ptr {
rv = rv.Elem()
}
for i := 0; i < rt.NumField(); i++ {
sf := rt.Field(i)
r := sf.Tag.Get("rule")
br := sf.Tag.Get("bind")
if br == "required" && rv.Field(i).Kind() == reflect.Ptr {
if rv.Field(i).IsNil() {
return errors.New(sf.Name + " is required")
}
}
if r == "" {
continue
}
if rs := strings.Split(r, ","); len(rs) == 2 {
rvf := rv.Field(i)
if rs[0] == "required" {
switch rvf.Kind() {
case reflect.String:
if rvf.Interface() == "" {
return errors.New(rs[1])
}
case reflect.Array, reflect.Map:
if rvf.Len() == 0 {
return errors.New(rs[1])
}
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
if rvf.Interface() == 0 {
return errors.New(rs[1])
}
default:
}
}
continue
}
}
return nil
}