codies/internal/responder/respond.go

66 lines
979 B
Go

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),
})
}
}