param.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package mvc
  2. import (
  3. "reflect"
  4. "github.com/kataras/iris/context"
  5. "github.com/kataras/iris/core/router/macro"
  6. "github.com/kataras/iris/core/router/macro/interpreter/ast"
  7. )
  8. func getPathParamsForInput(params []macro.TemplateParam, funcIn ...reflect.Type) (values []reflect.Value) {
  9. if len(funcIn) == 0 || len(params) == 0 {
  10. return
  11. }
  12. consumedParams := make(map[int]bool, 0)
  13. for _, in := range funcIn {
  14. for j, p := range params {
  15. if _, consumed := consumedParams[j]; consumed {
  16. continue
  17. }
  18. paramType := p.Type
  19. paramName := p.Name
  20. // fmt.Printf("%s input arg type vs %s param type\n", in.Kind().String(), p.Type.Kind().String())
  21. if paramType.Assignable(in.Kind()) {
  22. consumedParams[j] = true
  23. // fmt.Printf("param.go: bind path param func for paramName = '%s' and paramType = '%s'\n", paramName, paramType.String())
  24. values = append(values, makeFuncParamGetter(paramType, paramName))
  25. }
  26. }
  27. }
  28. return
  29. }
  30. func makeFuncParamGetter(paramType ast.ParamType, paramName string) reflect.Value {
  31. var fn interface{}
  32. switch paramType {
  33. case ast.ParamTypeInt:
  34. fn = func(ctx context.Context) int {
  35. v, _ := ctx.Params().GetInt(paramName)
  36. return v
  37. }
  38. case ast.ParamTypeLong:
  39. fn = func(ctx context.Context) int64 {
  40. v, _ := ctx.Params().GetInt64(paramName)
  41. return v
  42. }
  43. case ast.ParamTypeBoolean:
  44. fn = func(ctx context.Context) bool {
  45. v, _ := ctx.Params().GetBool(paramName)
  46. return v
  47. }
  48. default:
  49. // string, path...
  50. fn = func(ctx context.Context) string {
  51. return ctx.Params().Get(paramName)
  52. }
  53. }
  54. return reflect.ValueOf(fn)
  55. }