1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- package pairec
- import (
- "bytes"
- "net/http"
- "net/http/httptest"
- "reflect"
- )
- type handleFunc func(http.ResponseWriter, *http.Request)
- type RouteInfo struct {
- pattern string
- hf handleFunc
- initialize func() ControllerInterface
- controllerType reflect.Type
- }
- func Route(pattern string, c ControllerInterface) {
- reflectVal := reflect.ValueOf(c)
- t := reflect.Indirect(reflectVal).Type()
- info := RouteInfo{
- pattern: pattern,
- controllerType: t,
- }
- info.initialize = func() ControllerInterface {
- vc := reflect.New(info.controllerType)
- execController, ok := vc.Interface().(ControllerInterface)
- if !ok {
- panic("controller is not ControllerInterface")
- }
- elemVal := reflect.ValueOf(c).Elem()
- elemType := reflect.TypeOf(c).Elem()
- execElem := reflect.ValueOf(execController).Elem()
- numOfFields := elemVal.NumField()
- for i := 0; i < numOfFields; i++ {
- fieldType := elemType.Field(i)
- elemField := execElem.FieldByName(fieldType.Name)
- if elemField.CanSet() {
- fieldVal := elemVal.Field(i)
- elemField.Set(fieldVal)
- }
- }
- return execController
- }
- PairecApp.Handlers.Register(&info)
- }
- func HandleFunc(pattern string, hf handleFunc) {
- info := RouteInfo{
- pattern: pattern,
- hf: hf,
- }
- PairecApp.Handlers.Register(&info)
- }
- func Forward(method, url, body string) *http.Response {
- readBuf := bytes.NewBufferString(body)
- req := httptest.NewRequest(method, url, readBuf)
- w := httptest.NewRecorder()
- PairecApp.Handlers.ServeHTTP(w, req)
- return w.Result()
- }
|