github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/ginx/anyfn/in.go (about)

     1  package anyfn
     2  
     3  import (
     4  	"net/http"
     5  	"reflect"
     6  
     7  	"github.com/bingoohuang/gg/pkg/ginx"
     8  	"github.com/gin-gonic/gin"
     9  )
    10  
    11  func (a *Adapter) PrependInSupport(support InSupport) {
    12  	a.InSupports = append([]InSupport{support}, a.InSupports...)
    13  }
    14  
    15  func (a *Adapter) PrependOutSupport(support OutSupport) {
    16  	a.OutSupports = append([]OutSupport{support}, a.OutSupports...)
    17  }
    18  
    19  type InSupport interface {
    20  	InSupport(argIn ArgIn, argsIn []ArgIn, c *gin.Context) (reflect.Value, error)
    21  }
    22  
    23  type InSupportFn func(argIn ArgIn, argsIn []ArgIn, c *gin.Context) (reflect.Value, error)
    24  
    25  func (f InSupportFn) InSupport(argIn ArgIn, argsIn []ArgIn, c *gin.Context) (reflect.Value, error) {
    26  	return f(argIn, argsIn, c)
    27  }
    28  
    29  var (
    30  	GinContextType = reflect.TypeOf((*gin.Context)(nil)).Elem()
    31  	InvalidValue   = reflect.Value{}
    32  )
    33  
    34  func GinContextSupport(arg ArgIn, argsIn []ArgIn, c *gin.Context) (reflect.Value, error) {
    35  	if arg.Ptr && arg.Type == GinContextType { // 直接注入gin.Context
    36  		return reflect.ValueOf(c), nil
    37  	}
    38  
    39  	return InvalidValue, nil
    40  }
    41  
    42  var HTTPRequestType = reflect.TypeOf((*http.Request)(nil)).Elem()
    43  
    44  func HTTPRequestSupport(arg ArgIn, argsIn []ArgIn, c *gin.Context) (reflect.Value, error) {
    45  	if arg.Ptr && arg.Type == HTTPRequestType {
    46  		return reflect.ValueOf(c.Request), nil
    47  	}
    48  
    49  	return InvalidValue, nil
    50  }
    51  
    52  var HTTPResponseWriterType = reflect.TypeOf((*http.ResponseWriter)(nil)).Elem()
    53  
    54  func HTTPResponseWriterSupport(arg ArgIn, argsIn []ArgIn, c *gin.Context) (reflect.Value, error) {
    55  	if arg.Kind == reflect.Interface && arg.Type == HTTPResponseWriterType {
    56  		return reflect.ValueOf(c.Writer), nil
    57  	}
    58  
    59  	return InvalidValue, nil
    60  }
    61  
    62  func ContextKeyValuesSupport(arg ArgIn, argsIn []ArgIn, c *gin.Context) (reflect.Value, error) {
    63  	for _, v := range c.Keys {
    64  		if arg.Type == IndirectTypeOf(v) {
    65  			return ConvertPtr(arg.Ptr, reflect.ValueOf(v)), nil
    66  		}
    67  	}
    68  
    69  	return InvalidValue, nil
    70  }
    71  
    72  func BindSupport(arg ArgIn, argsIn []ArgIn, c *gin.Context) (reflect.Value, error) {
    73  	argValue := reflect.New(arg.Type)
    74  	if err := ginx.ShouldBind(c, argValue.Interface()); err != nil {
    75  		return InvalidValue, &AdapterError{Err: err, Context: "ShouldBind"}
    76  	}
    77  
    78  	return ConvertPtr(arg.Ptr, argValue), nil
    79  }
    80  
    81  func SinglePrimitiveValueSupport(arg ArgIn, argsIn []ArgIn, c *gin.Context) (reflect.Value, error) {
    82  	v := singlePrimitiveValue(c, argsIn)
    83  	if v != "" {
    84  		return arg.convertValue(v)
    85  	}
    86  
    87  	return InvalidValue, nil
    88  }