From b1e166a1c9410d9247878cb8a6de78e64748daf2 Mon Sep 17 00:00:00 2001 From: Manu Mtz-Almeida Date: Fri, 16 May 2014 04:08:21 +0200 Subject: [PATCH 1/3] Adds Encoder.Render() facility. Since encoder.Must is very frequently. enc.Render(result) == encoder.Must(enc.Encode(result)) --- encoder.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/encoder.go b/encoder.go index d6bed5f..2b578b8 100644 --- a/encoder.go +++ b/encoder.go @@ -17,6 +17,7 @@ import ( // requests on the API endpoints. type Encoder interface { Encode(v ...interface{}) ([]byte, error) + Render(v ...interface{}) []byte } // Because `panic`s are caught by martini's Recovery handler, it can be used @@ -29,6 +30,10 @@ func Must(data []byte, err error) []byte { return data } +func (enc JsonEncoder) Render(v ...interface{}) []byte { + return Must(enc.Encode(v...)) +} + type JsonEncoder struct{} // @todo test for slice of structure support From abe339c66e7286772d3ab7d7cdccdd79ec48f510 Mon Sep 17 00:00:00 2001 From: Manu Mtz-Almeida Date: Fri, 16 May 2014 04:10:11 +0200 Subject: [PATCH 2/3] Adds encoder.JSON() and encoder.XML() facilities. Now, you can use: ``` m.Use(encoder.JSON()) ``` instead of: ``` m.Use(func(c martini.Context, w http.ResponseWriter) { c.MapTo(encoder.JsonEncoder{}, (*encoder.Encoder)(nil)) w.Header().Set("Content-Type", "application/json; charset=utf-8") }) ``` --- encoder.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/encoder.go b/encoder.go index 2b578b8..83c5f13 100644 --- a/encoder.go +++ b/encoder.go @@ -9,6 +9,8 @@ import ( "bytes" "encoding/json" "encoding/xml" + "github.com/go-martini/martini" + "net/http" "reflect" "time" ) @@ -163,3 +165,17 @@ func iterateSlice(v reflect.Value) reflect.Value { return result } + +func JSON() func(martini.Context, http.ResponseWriter) { + return func(c martini.Context, w http.ResponseWriter) { + c.MapTo(JsonEncoder{}, (*Encoder)(nil)) + w.Header().Set("Content-Type", "application/json; charset=utf-8") + } +} + +func XML() func(martini.Context, http.ResponseWriter) { + return func(c martini.Context, w http.ResponseWriter) { + c.MapTo(XmlEncoder{}, (*Encoder)(nil)) + w.Header().Set("Content-Type", "application/xml; charset=utf-8") + } +} From 0a432246a209813d79f25020c341b43e1156c638 Mon Sep 17 00:00:00 2001 From: Manu Mtz-Almeida Date: Fri, 16 May 2014 04:25:05 +0200 Subject: [PATCH 3/3] Missing Render implementation for XmlEncoder --- encoder.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/encoder.go b/encoder.go index 83c5f13..f0e8495 100644 --- a/encoder.go +++ b/encoder.go @@ -32,10 +32,6 @@ func Must(data []byte, err error) []byte { return data } -func (enc JsonEncoder) Render(v ...interface{}) []byte { - return Must(enc.Encode(v...)) -} - type JsonEncoder struct{} // @todo test for slice of structure support @@ -70,6 +66,10 @@ func (_ JsonEncoder) Encode(v ...interface{}) ([]byte, error) { return json.Marshal(result) } +func (enc JsonEncoder) Render(v ...interface{}) []byte { + return Must(enc.Encode(v...)) +} + type XmlEncoder struct{} // Since we don't use xml as a binding source, we don't need to use @@ -98,6 +98,10 @@ func (_ XmlEncoder) Encode(v ...interface{}) ([]byte, error) { return buffer.Bytes(), nil } +func (enc XmlEncoder) Render(v ...interface{}) []byte { + return Must(enc.Encode(v...)) +} + func copyStruct(v reflect.Value) reflect.Value { if v.Kind() == reflect.Ptr { v = v.Elem()