Przeglądaj źródła

Setup page rendering

master
Immanuel Onyeka 2 lat temu
commit
a159cd335f
1 zmienionych plików z 87 dodań i 0 usunięć
  1. +87
    -0
      skouter.go

+ 87
- 0
skouter.go Wyświetl plik

@@ -0,0 +1,87 @@
package main

import (
"net/http"
"log"
"sync"
"regexp"
"html/template"
)

type Page struct {
tpl *template.Template
Title string
Name string
}

var (
regexen = make(map[string]*regexp.Regexp)
relock sync.Mutex
address = "127.0.0.1:8080"
)

var paths = map[string]string {
"home": "home.tpl",
"terms": "terms.tpl",
}

var pages = map[string]Page {
"home": cache("home", "Home"),
"terms": cache("terms", "Terms and Conditions"),
}

func cache(name string, title string) Page {
var p = []string{"master.tpl", paths[name]}
tpl := template.Must(template.ParseFiles(p...))
return Page{tpl: tpl,
Title: title,
Name: name,
}
}

func (page Page) Render(w http.ResponseWriter) {
err := page.tpl.Execute(w, page)
if err != nil {
log.Print(err)
}
}

func match(path, pattern string, args *[]string) bool {
relock.Lock()
defer relock.Unlock()
regex := regexen[pattern]
if regex == nil {
regex = regexp.MustCompile("^" + pattern + "$")
regexen[pattern] = regex
}
matches := regex.FindStringSubmatch(path)
if len(matches) <= 0 {
return false
}
*args = matches[1:]
return true
}

func route(w http.ResponseWriter, r *http.Request) {
var page Page
var args []string

p := r.URL.Path
switch {
case r.Method == "GET" && match(p, "/", &args):
page = pages[ "home" ]
case match(p, "/terms", &args):
page = pages[ "terms" ]
default:
http.NotFound(w, r)
return
}

page.Render(w)
}

func main() {
http.HandleFunc("/", route)
log.Fatal(http.ListenAndServe(address, nil))
}


Ładowanie…
Anuluj
Zapisz