github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/ginx/anyfn/arg.go (about) 1 package anyfn 2 3 import ( 4 "fmt" 5 "reflect" 6 7 "github.com/bingoohuang/gg/pkg/ginx/cast" 8 ) 9 10 type ArgIn struct { 11 Index int 12 Type reflect.Type 13 Kind reflect.Kind 14 Ptr bool 15 } 16 17 func parseArgIns(ft reflect.Type) []ArgIn { 18 numIn := ft.NumIn() 19 argIns := make([]ArgIn, numIn) 20 21 for i := 0; i < numIn; i++ { 22 argIns[i] = parseArgs(ft, i) 23 } 24 25 return argIns 26 } 27 28 func parseArgs(ft reflect.Type, argIndex int) ArgIn { 29 argType := ft.In(argIndex) 30 ptr := argType.Kind() == reflect.Ptr 31 32 if ptr { 33 argType = argType.Elem() 34 } 35 36 return ArgIn{Index: argIndex, Type: argType, Kind: argType.Kind(), Ptr: ptr} 37 } 38 39 func (arg ArgIn) convertValue(s string) (reflect.Value, error) { 40 v, err := cast.To(s, arg.Type) 41 if err != nil { 42 return reflect.Value{}, &AdapterError{ 43 Err: err, 44 Context: fmt.Sprintf("To %s to %v", s, arg.Type), 45 } 46 } 47 48 return ConvertPtr(arg.Ptr, v), nil 49 }