From da9d8e922d0198a324af1f1b6df97d3e1d5938aa Mon Sep 17 00:00:00 2001 From: Karan Misra Date: Mon, 27 Jan 2014 10:54:05 +0530 Subject: remove the need to provide “missing/unsupported” implementations in the API consumers. also: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - more idiomatic - loosely coupled with the API contract --- README.md | 6 +----- core.go | 47 +++++++++++++++++++++++++++++++---------------- http.go | 28 ---------------------------- tests/items.go | 8 ++------ tests/test.go | 6 ++---- 5 files changed, 36 insertions(+), 59 deletions(-) delete mode 100644 http.go diff --git a/README.md b/README.md index 5447f30..97c01ce 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,11 @@ package main import ( "net/url" + "github.com/dougblack/sleepy" ) type Item struct { - sleepy.PostNotSupported - sleepy.PutNotSupported - sleepy.DeleteNotSupported } func (item Item) Get(values url.Values) (int, interface{}) { @@ -26,13 +24,11 @@ func (item Item) Get(values url.Values) (int, interface{}) { } func main() { - item := new(Item) var api = new(sleepy.Api) api.AddResource(item, "/items") api.Start(3000) - } ``` diff --git a/core.go b/core.go index c8d7ca9..bbcb009 100644 --- a/core.go +++ b/core.go @@ -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.") } diff --git a/http.go b/http.go deleted file mode 100644 index 7b79aca..0000000 --- a/http.go +++ /dev/null @@ -1,28 +0,0 @@ -package sleepy - -import ( - "net/url" -) - -type ( - GetNotSupported struct{} - PostNotSupported struct{} - PutNotSupported struct{} - DeleteNotSupported struct{} -) - -func (GetNotSupported) Get(values url.Values) (int, interface{}) { - return 405, "" -} - -func (PostNotSupported) Post(values url.Values) (int, interface{}) { - return 405, "" -} - -func (PutNotSupported) Put(values url.Values) (int, interface{}) { - return 405, "" -} - -func (DeleteNotSupported) Delete(values url.Values) (int, interface{}) { - return 405, "" -} diff --git a/tests/items.go b/tests/items.go index d39cae9..6aae382 100644 --- a/tests/items.go +++ b/tests/items.go @@ -2,13 +2,11 @@ package main import ( "net/url" - "sleepy" + + "github.com/kid0m4n/sleepy" ) type Item struct { - sleepy.PostNotSupported - sleepy.PutNotSupported - sleepy.DeleteNotSupported } func (item Item) Get(values url.Values) (int, interface{}) { @@ -19,11 +17,9 @@ func (item Item) Get(values url.Values) (int, interface{}) { } func main() { - item := new(Item) var api = new(sleepy.Api) api.AddResource(item, "/items") api.Start(3000) - } diff --git a/tests/test.go b/tests/test.go index 070d4b6..8ccbfbd 100644 --- a/tests/test.go +++ b/tests/test.go @@ -2,13 +2,11 @@ package main import ( "net/url" - "sleepy" + + "github.com/dougblack/sleepy" ) type Bar struct { - sleepy.PostNotSupported - sleepy.PutNotSupported - sleepy.DeleteNotSupported } func (b Bar) Get(values url.Values) (int, interface{}) { -- cgit