package rest

import (
	"net/http"
	"bytes"
	"encoding/json"
	"fmt"
)

// JSON marshals v to JSON, automatically setting the Content-Type as
// application/json and escaping HTML.
func JSON(w http.ResponseWriter, r *http.Request, v interface{}) {
	buf := &bytes.Buffer{}
	enc := json.NewEncoder(buf)
	enc.SetEscapeHTML(true)
	if err := enc.Encode(v); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", ContentTypeApplicationJSON)
	if status, ok := r.Context().Value(StatusCtxKey).(int); ok {
		w.WriteHeader(status)
	}

	_, err := w.Write(buf.Bytes())
	fmt.Errorf("JSON: %#v", err)
}

