render.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. // Redirects
  20. redirectRender struct{}
  21. // Redirects
  22. htmlDebugRender struct{}
  23. // form binding
  24. HTMLRender struct {
  25. Template *template.Template
  26. }
  27. )
  28. var (
  29. JSON = jsonRender{}
  30. XML = xmlRender{}
  31. Plain = plainRender{}
  32. Redirect = redirectRender{}
  33. HTMLDebug = htmlDebugRender{}
  34. )
  35. func writeHeader(w http.ResponseWriter, code int, contentType string) {
  36. w.Header().Set("Content-Type", contentType)
  37. w.WriteHeader(code)
  38. }
  39. func (_ jsonRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  40. writeHeader(w, code, "application/json")
  41. encoder := json.NewEncoder(w)
  42. return encoder.Encode(data[0])
  43. }
  44. func (_ redirectRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  45. w.Header().Set("Location", data[0].(string))
  46. w.WriteHeader(code)
  47. return nil
  48. }
  49. func (_ xmlRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  50. writeHeader(w, code, "application/xml")
  51. encoder := xml.NewEncoder(w)
  52. return encoder.Encode(data[0])
  53. }
  54. func (_ plainRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  55. writeHeader(w, code, "text/plain")
  56. format := data[0].(string)
  57. args := data[1].([]interface{})
  58. var err error
  59. if len(args) > 0 {
  60. _, err = w.Write([]byte(fmt.Sprintf(format, args...)))
  61. } else {
  62. _, err = w.Write([]byte(format))
  63. }
  64. return err
  65. }
  66. func (_ htmlDebugRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  67. writeHeader(w, code, "text/html")
  68. file := data[0].(string)
  69. obj := data[1]
  70. t, err := template.ParseFiles(file)
  71. if err != nil {
  72. return err
  73. }
  74. return t.ExecuteTemplate(w, file, obj)
  75. }
  76. func (html HTMLRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  77. writeHeader(w, code, "text/html")
  78. file := data[0].(string)
  79. obj := data[1]
  80. return html.Template.ExecuteTemplate(w, file, obj)
  81. }