render.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package render
  2. import (
  3. "encoding/json"
  4. "encoding/xml"
  5. "fmt"
  6. "html/template"
  7. "net/http"
  8. )
  9. type (
  10. Render interface {
  11. Render(http.ResponseWriter, int, ...interface{}) error
  12. }
  13. // JSON binding
  14. jsonRender struct{}
  15. // XML binding
  16. xmlRender struct{}
  17. // Plain text
  18. plainRender struct{}
  19. // form binding
  20. HTMLRender struct {
  21. Template *template.Template
  22. }
  23. )
  24. var (
  25. JSON = jsonRender{}
  26. XML = xmlRender{}
  27. Plain = plainRender{}
  28. )
  29. func writeHeader(w http.ResponseWriter, code int, contentType string) {
  30. if code >= 0 {
  31. w.Header().Set("Content-Type", contentType)
  32. w.WriteHeader(code)
  33. }
  34. }
  35. func (_ jsonRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  36. writeHeader(w, code, "application/json")
  37. encoder := json.NewEncoder(w)
  38. return encoder.Encode(data[0])
  39. }
  40. func (_ xmlRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  41. writeHeader(w, code, "application/xml")
  42. encoder := xml.NewEncoder(w)
  43. return encoder.Encode(data[0])
  44. }
  45. func (html HTMLRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  46. writeHeader(w, code, "text/html")
  47. file := data[0].(string)
  48. obj := data[1]
  49. return html.Template.ExecuteTemplate(w, file, obj)
  50. }
  51. func (_ plainRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  52. writeHeader(w, code, "text/plain")
  53. format := data[0].(string)
  54. args := data[1].([]interface{})
  55. _, err := w.Write([]byte(fmt.Sprintf(format, args)))
  56. return err
  57. }