package main import ( "fmt" "io" "log" "net/http" "time" h "gitlab.codemonkeysoftware.net/b/hatmill" a "gitlab.codemonkeysoftware.net/b/hatmill/attribute" e "gitlab.codemonkeysoftware.net/b/hatmill/element" _ "gitlab.codemonkeysoftware.net/b/henwen" ) const Addr = ":8080" const Title = "Henwen" const ( PathRoot = "/" PathCreate = "/create" PathDoCreate = "/create/do" ) func writePage(w io.Writer, contents h.Term) error { page := e.Html()( e.Head()( e.Title()(h.Text(Title)), ), e.Body()( e.H1()(h.Text(Title)), e.Div()(contents), ), ) _, err := h.WriteDocument(w, page) return err } func pageRoot() h.Term { return h.Terms{ e.H2()(h.Text("Welcome!")), e.A(a.Href(PathCreate))( h.Text("Create event"), ), } } const ( fieldNameEarliest = "earliestDate" fieldNameLatest = "latestDate" fieldNameEventName = "eventName" ) func pageCreate() h.Term { return h.Terms{ e.H2()(h.Text("Create an event")), e.Form(a.Action(PathDoCreate), a.Method("POST"))( e.Label(a.For(fieldNameEventName))(h.Text("Event name")), e.Input(a.Name(fieldNameEventName)), e.Label(a.For(fieldNameEarliest))(h.Text("Earliest date")), e.Input(a.Name(fieldNameEarliest), a.Type("date")), e.Label(a.For(fieldNameLatest))(h.Text("Latest date")), e.Input(a.Name(fieldNameLatest), a.Type("date")), e.Input(a.Type("submit")), ), } } func pageDoCreate(name string, earliest, latest time.Time) h.Term { return h.Terms{ e.H2()(h.Text("Created event!")), e.H3()(h.Text("Name")), h.Text(name), e.H3()(h.Text("Earliest date")), h.Text(earliest.Format(time.ANSIC)), e.H3()(h.Text("Latest date")), h.Text(latest.Format(time.ANSIC)), } } func main() { mux := http.NewServeMux() mux.HandleFunc(PathRoot, func(w http.ResponseWriter, r *http.Request) { _ = writePage(w, pageRoot()) }) mux.HandleFunc(PathCreate, func(w http.ResponseWriter, r *http.Request) { _ = writePage(w, pageCreate()) }) mux.HandleFunc(PathDoCreate, func(w http.ResponseWriter, r *http.Request) { const dateFmt = "2006-01-02" earliest, err := time.Parse(dateFmt, r.FormValue(fieldNameEarliest)) if err != nil { fmt.Fprint(w, "bad earliest date") return } latest, err := time.Parse(dateFmt, r.FormValue(fieldNameLatest)) if err != nil { fmt.Fprint(w, "bad latest date") return } eventName := r.FormValue(fieldNameEventName) if eventName == "" { fmt.Fprint(w, "event name is required") return } _ = writePage(w, pageDoCreate(eventName, earliest, latest)) }) srv := http.Server{ Addr: Addr, Handler: mux, } log.Println(srv.ListenAndServe()) }