aboutsummaryrefslogtreecommitdiff
path: root/page/render.go
diff options
context:
space:
mode:
Diffstat (limited to 'page/render.go')
-rw-r--r--page/render.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/page/render.go b/page/render.go
new file mode 100644
index 0000000..4378675
--- /dev/null
+++ b/page/render.go
@@ -0,0 +1,77 @@
+package page
+
+import (
+ "net/http"
+ "path/filepath"
+ "strings"
+)
+
+// Render is a lower level option, allowing you to specify local
+// variables and the status code in which to return
+func Render(w http.ResponseWriter, r *http.Request,
+ path string, vars map[string]interface{}, statusCode int) {
+
+ u := r.URL.Path
+ if u == "/" {
+ u = "/index"
+ }
+ u = filepath.Join(".", u)
+
+ // Sepcifically use the specified path for the page
+ p := NewPage(path)
+
+ if vars != nil {
+ p.SetVars(vars)
+ }
+
+ err := p.Render(w)
+ if err != nil {
+ if strings.HasSuffix(err.Error(), "no such file or directory") {
+ Logger.Printf("%s %s %d %s",
+ r.RemoteAddr,
+ r.Method,
+ http.StatusNotFound,
+ u)
+ p = NewPage("404")
+ w.WriteHeader(http.StatusNotFound)
+ err := p.Render(w)
+ if err != nil {
+ Logger.Printf("%s %s path: %s while trying 404: %s",
+ r.RemoteAddr,
+ r.Method,
+ u,
+ err)
+ http.Error(w, "Internal server error",
+ http.StatusInternalServerError)
+ return
+ }
+ return
+ } else {
+ Logger.Printf("%s %s path: %s encountered: %s",
+ r.RemoteAddr,
+ r.Method,
+ u,
+ err)
+ http.Error(w, "Internal server error",
+ http.StatusInternalServerError)
+ return
+ }
+ }
+
+ Logger.Printf("%s %s %d %s", r.RemoteAddr, r.Method, statusCode, u)
+}
+
+// RenderWithVars allows you to specify a specific page and whether or not
+// you wish to override vars. If left nil they will not be overridden.
+// Also see RenderForPath if you don't need to override them
+func RenderWithVars(w http.ResponseWriter, r *http.Request,
+ path string, vars map[string]interface{}) {
+
+ Render(w, r, path, vars, http.StatusOK)
+}
+
+// RenderForPath takes the path to a page and finish up the rendering
+// Allowing you to place logic on what page is rendered by your handlers
+func RenderForPath(w http.ResponseWriter, r *http.Request, path string) {
+ RenderWithVars(w, r, path, nil)
+}