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  }