route.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package pairec
  2. import (
  3. "bytes"
  4. "net/http"
  5. "net/http/httptest"
  6. "reflect"
  7. )
  8. type handleFunc func(http.ResponseWriter, *http.Request)
  9. type RouteInfo struct {
  10. pattern string
  11. hf handleFunc
  12. initialize func() ControllerInterface
  13. controllerType reflect.Type
  14. }
  15. func Route(pattern string, c ControllerInterface) {
  16. reflectVal := reflect.ValueOf(c)
  17. t := reflect.Indirect(reflectVal).Type()
  18. info := RouteInfo{
  19. pattern: pattern,
  20. controllerType: t,
  21. }
  22. info.initialize = func() ControllerInterface {
  23. vc := reflect.New(info.controllerType)
  24. execController, ok := vc.Interface().(ControllerInterface)
  25. if !ok {
  26. panic("controller is not ControllerInterface")
  27. }
  28. elemVal := reflect.ValueOf(c).Elem()
  29. elemType := reflect.TypeOf(c).Elem()
  30. execElem := reflect.ValueOf(execController).Elem()
  31. numOfFields := elemVal.NumField()
  32. for i := 0; i < numOfFields; i++ {
  33. fieldType := elemType.Field(i)
  34. elemField := execElem.FieldByName(fieldType.Name)
  35. if elemField.CanSet() {
  36. fieldVal := elemVal.Field(i)
  37. elemField.Set(fieldVal)
  38. }
  39. }
  40. return execController
  41. }
  42. PairecApp.Handlers.Register(&info)
  43. }
  44. func HandleFunc(pattern string, hf handleFunc) {
  45. info := RouteInfo{
  46. pattern: pattern,
  47. hf: hf,
  48. }
  49. PairecApp.Handlers.Register(&info)
  50. }
  51. func Forward(method, url, body string) *http.Response {
  52. readBuf := bytes.NewBufferString(body)
  53. req := httptest.NewRequest(method, url, readBuf)
  54. w := httptest.NewRecorder()
  55. PairecApp.Handlers.ServeHTTP(w, req)
  56. return w.Result()
  57. }