| package rest |
| |
| import ( |
| "encoding/json" |
| "net/http" |
| ) |
| |
| type HandlerFunc func(w http.ResponseWriter, r *http.Request) error |
| |
| // ServeHTTP calls f(w, r) and handles error |
| func (f HandlerFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
| if err := f(w, r); err != nil { |
| jsoner(w, http.StatusBadRequest, err.Error()) // TODO detect the correct statusCode from error |
| } |
| } |
| |
| func jsoner(w http.ResponseWriter, statusCode int, payload interface{}) error { |
| w.Header().Set("Content-Type", "application/json") |
| |
| // If there is nothing to marshal then set status code and return. |
| if payload == nil { |
| _, err := w.Write([]byte("{}")) |
| return err |
| } |
| |
| w.WriteHeader(statusCode) |
| |
| encoder := json.NewEncoder(w) |
| encoder.SetEscapeHTML(true) |
| encoder.SetIndent("", "") |
| |
| if err := encoder.Encode(payload); err != nil { |
| return err |
| } |
| |
| return nil |
| } |