package main import ( "html/template" "net/http" ) type Index struct { Wiki *template.Template } func (i Index) ServeHTTP(w http.ResponseWriter, r *http.Request) { pages, err := i.Wiki.List() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } p := Page{Pages: pages} if err := p.Render(w, i.Template); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } type View struct { Wiki *template.Template } func (v View) ServeHTTP(w http.ResponseWriter, r *http.Request) { title := r.PathValue("title") p, err := v.Wiki.Load(title) if err != nil { http.Redirect(w, r, "/edit/"+title, http.StatusFound) return } if err := p.Render(w, v.Template); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } type Edit struct { Wiki *template.Template } func (e Edit) ServeHTTP(w http.ResponseWriter, r *http.Request) { title := r.PathValue("title") p, _ := e.Wiki.Load(title) if err := p.Render(w, e.Template); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } type Delete struct { Wiki } func (d Delete) ServeHTTP(w http.ResponseWriter, r *http.Request) { title := r.PathValue("title") if err := d.Delete(title); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } http.Redirect(w, r, "/", http.StatusFound) } type Save struct { Wiki } func (s Save) ServeHTTP(w http.ResponseWriter, r *http.Request) { title := r.PathValue("title") p := Page{ Title: title, Body: []byte(r.FormValue("body")), } if err := s.Save(p); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } http.Redirect(w, r, "/view/"+title, http.StatusFound) }