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 }