| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
- // Use of this source code is governed by a MIT style
- // license that can be found in the LICENSE file.
- package render
- import (
- "encoding/json"
- "encoding/xml"
- "fmt"
- "html/template"
- "net/http"
- )
- type (
- Render interface {
- Render(http.ResponseWriter, int, ...interface{}) error
- }
- jsonRender struct{}
- xmlRender struct{}
- plainTextRender struct{}
- htmlPlainRender struct{}
- redirectRender struct{}
- htmlDebugRender struct {
- files []string
- globs []string
- }
- HTMLRender struct {
- Template *template.Template
- }
- )
- var (
- JSON = jsonRender{}
- XML = xmlRender{}
- HTMLPlain = htmlPlainRender{}
- Plain = plainTextRender{}
- Redirect = redirectRender{}
- HTMLDebug = &htmlDebugRender{}
- )
- func writeHeader(w http.ResponseWriter, code int, contentType string) {
- w.Header().Set("Content-Type", contentType+"; charset=utf-8")
- w.WriteHeader(code)
- }
- func (_ jsonRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
- writeHeader(w, code, "application/json")
- encoder := json.NewEncoder(w)
- return encoder.Encode(data[0])
- }
- func (_ redirectRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
- w.Header().Set("Location", data[0].(string))
- w.WriteHeader(code)
- return nil
- }
- func (_ xmlRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
- writeHeader(w, code, "application/xml")
- encoder := xml.NewEncoder(w)
- return encoder.Encode(data[0])
- }
- func (_ plainTextRender) Render(w http.ResponseWriter, code int, data ...interface{}) (err error) {
- writeHeader(w, code, "text/plain")
- format := data[0].(string)
- args := data[1].([]interface{})
- if len(args) > 0 {
- _, err = w.Write([]byte(fmt.Sprintf(format, args...)))
- } else {
- _, err = w.Write([]byte(format))
- }
- return
- }
- func (_ htmlPlainRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
- writeHeader(w, code, "text/html")
- format := data[0].(string)
- args := data[1].([]interface{})
- var err error
- if len(args) > 0 {
- _, err = w.Write([]byte(fmt.Sprintf(format, args...)))
- } else {
- _, err = w.Write([]byte(format))
- }
- return err
- }
- func (r *htmlDebugRender) AddGlob(pattern string) {
- r.globs = append(r.globs, pattern)
- }
- func (r *htmlDebugRender) AddFiles(files ...string) {
- r.files = append(r.files, files...)
- }
- func (r *htmlDebugRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
- writeHeader(w, code, "text/html")
- file := data[0].(string)
- obj := data[1]
- t := template.New("")
- if len(r.files) > 0 {
- if _, err := t.ParseFiles(r.files...); err != nil {
- return err
- }
- }
- for _, glob := range r.globs {
- if _, err := t.ParseGlob(glob); err != nil {
- return err
- }
- }
- return t.ExecuteTemplate(w, file, obj)
- }
- func (html HTMLRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
- writeHeader(w, code, "text/html")
- file := data[0].(string)
- obj := data[1]
- return html.Template.ExecuteTemplate(w, file, obj)
- }
|