diff options
author | Karan Misra <kidoman@gmail.com> | 2014-01-27 10:54:05 +0530 |
---|---|---|
committer | Karan Misra <kidoman@gmail.com> | 2014-01-27 10:54:05 +0530 |
commit | da9d8e922d0198a324af1f1b6df97d3e1d5938aa (patch) | |
tree | 37c8a313dd61e608f453a73073e434774d47fe73 /core.go | |
parent | fix signature (diff) | |
download | sleepy-da9d8e922d0198a324af1f1b6df97d3e1d5938aa.tar.gz sleepy-da9d8e922d0198a324af1f1b6df97d3e1d5938aa.tar.bz2 sleepy-da9d8e922d0198a324af1f1b6df97d3e1d5938aa.zip |
remove the need to provide “missing/unsupported” implementations in the
API consumers. also:
- more idiomatic
- loosely coupled with the API contract
Diffstat (limited to 'core.go')
-rw-r--r-- | core.go | 47 |
1 files changed, 31 insertions, 16 deletions
@@ -14,10 +14,19 @@ const ( DELETE = "DELETE" ) -type Resource interface { +type geter interface { Get(values url.Values) (int, interface{}) +} + +type poster interface { Post(values url.Values) (int, interface{}) +} + +type puter interface { Put(values url.Values) (int, interface{}) +} + +type deleter interface { Delete(values url.Values) (int, interface{}) } @@ -27,12 +36,8 @@ func (api *Api) Abort(rw http.ResponseWriter, statusCode int) { rw.WriteHeader(statusCode) } -func (api *Api) requestHandler(resource Resource) http.HandlerFunc { +func (api *Api) requestHandler(resource interface{}) http.HandlerFunc { return func(rw http.ResponseWriter, request *http.Request) { - - var data interface{} - var code int - method := request.Method if request.ParseForm() != nil { api.Abort(rw, 400) @@ -40,35 +45,45 @@ func (api *Api) requestHandler(resource Resource) http.HandlerFunc { } values := request.Form + var data interface{} = "" + var code int = 405 + switch method { case GET: - code, data = resource.Get(values) + if r, ok := resource.(geter); ok { + code, data = r.Get(values) + } case POST: - code, data = resource.Post(values) + if r, ok := resource.(poster); ok { + code, data = r.Post(values) + } case PUT: - code, data = resource.Put(values) + if r, ok := resource.(puter); ok { + code, data = r.Put(values) + } case DELETE: - code, data = resource.Delete(values) + if r, ok := resource.(deleter); ok { + code, data = r.Delete(values) + } default: api.Abort(rw, 405) return } - responseWriter := json.NewEncoder(rw) + responseWriter := json.NewEncoder(rw) rw.WriteHeader(code) if responseWriter.Encode(data) != nil { - api.Abort(rw, 500) - return - } + api.Abort(rw, 500) + return + } } } -func (api *Api) AddResource(resource Resource, path string) { +func (api *Api) AddResource(resource interface{}, path string) { http.HandleFunc(path, api.requestHandler(resource)) } func (api *Api) Start(port int) { portString := fmt.Sprintf(":%d", port) http.ListenAndServe(portString, nil) - fmt.Println("Hi.") } |