render.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
  2. // Use of this source code is governed by a MIT style
  3. // license that can be found in the LICENSE file.
  4. package render
  5. import (
  6. "encoding/json"
  7. "encoding/xml"
  8. "fmt"
  9. "html/template"
  10. "net/http"
  11. )
  12. type (
  13. Render interface {
  14. Render(http.ResponseWriter, int, ...interface{}) error
  15. }
  16. // JSON binding
  17. jsonRender struct{}
  18. // XML binding
  19. xmlRender struct{}
  20. // Plain text
  21. plainRender struct{}
  22. // Redirects
  23. redirectRender struct{}
  24. // Redirects
  25. htmlDebugRender struct{}
  26. // form binding
  27. HTMLRender struct {
  28. Template *template.Template
  29. }
  30. )
  31. var (
  32. JSON = jsonRender{}
  33. XML = xmlRender{}
  34. Plain = plainRender{}
  35. Redirect = redirectRender{}
  36. HTMLDebug = htmlDebugRender{}
  37. )
  38. func writeHeader(w http.ResponseWriter, code int, contentType string) {
  39. w.Header().Set("Content-Type", contentType)
  40. w.WriteHeader(code)
  41. }
  42. func (_ jsonRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  43. writeHeader(w, code, "application/json")
  44. encoder := json.NewEncoder(w)
  45. return encoder.Encode(data[0])
  46. }
  47. func (_ redirectRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  48. w.Header().Set("Location", data[0].(string))
  49. w.WriteHeader(code)
  50. return nil
  51. }
  52. func (_ xmlRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  53. writeHeader(w, code, "application/xml")
  54. encoder := xml.NewEncoder(w)
  55. return encoder.Encode(data[0])
  56. }
  57. func (_ plainRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  58. writeHeader(w, code, "text/plain")
  59. format := data[0].(string)
  60. args := data[1].([]interface{})
  61. var err error
  62. if len(args) > 0 {
  63. _, err = w.Write([]byte(fmt.Sprintf(format, args...)))
  64. } else {
  65. _, err = w.Write([]byte(format))
  66. }
  67. return err
  68. }
  69. func (_ htmlDebugRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  70. writeHeader(w, code, "text/html")
  71. file := data[0].(string)
  72. obj := data[1]
  73. t, err := template.ParseFiles(file)
  74. if err != nil {
  75. return err
  76. }
  77. return t.ExecuteTemplate(w, file, obj)
  78. }
  79. func (html HTMLRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  80. writeHeader(w, code, "text/html")
  81. file := data[0].(string)
  82. obj := data[1]
  83. return html.Template.ExecuteTemplate(w, file, obj)
  84. }