package responder import ( "encoding/json" "net/http" ) type defaultResponse struct { Status int `json:"status"` Message string `json:"message"` } type response struct { value *interface{} status int pretty bool } type Option func(r *response) func Pretty(pretty bool) Option { return func(r *response) { r.pretty = pretty } } func Status(status int) Option { return func(r *response) { r.status = status } } func Body(v interface{}) Option { return func(r *response) { r.value = &v } } func Respond(w http.ResponseWriter, opts ...Option) { r := &response{ status: http.StatusOK, } for _, opt := range opts { opt(r) } enc := json.NewEncoder(w) if r.pretty { enc.SetIndent(" ", "") } w.Header().Add("Content-Type", "application/json") w.WriteHeader(r.status) if v := r.value; v != nil { _ = enc.Encode(*v) } else { _ = enc.Encode(&defaultResponse{ Status: r.status, Message: http.StatusText(r.status), }) } }