package main import ( "flag" "html/template" "net/http" "path/filepath" "github.com/BurntSushi/toml" ) type HeaderData struct { MarqueeItems []MarqueeItem `toml:"marquee_items"` Links Links `toml:"links"` } type MarqueeItem struct { Text string `toml:"text"` URL template.URL `toml:"url"` } type Links struct { TopLevel []Link `toml:"top_level"` Categories []LinkCategory `toml:"categories"` } type Link struct { Name string `toml:"name"` URL template.URL `toml:"url"` } type LinkCategory struct { Name string `toml:"name"` MainLink string `toml:"main_link"` Links []Link `toml:"links"` } type Config struct { HeaderData HeaderData `toml:"header_data"` } type PageData struct { Header HeaderData Body template.HTML Posts []Post Post Post StatusCode int StatusMessage string } var debug *bool var configDir string var contentDir string var config Config func main() { debug = flag.Bool("debug", false, "Run in debug mode") var httpAddress string flag.StringVar(&httpAddress, "address", ":8080", "HTTP address to listen on") flag.StringVar(&configDir, "config", "", "The directory containing the server config") flag.StringVar(&contentDir, "content", "", "The directory containing content") flag.Parse() _, err := toml.DecodeFile(filepath.Join(configDir, "config.toml"), &config) if err != nil { panic(err) } mux := &http.ServeMux{} mux.HandleFunc("/", notFoundHandler) mux.HandleFunc("/{$}", homeHandler) mux.HandleFunc("/page/{page}", staticPageHandler) mux.HandleFunc("/page/{category}/{page}", staticCategoryHandler) mux.HandleFunc("/blog/{post}", postHandler) mux.HandleFunc("/blog", blogHandler) fs := http.FileServer(http.Dir(filepath.Join(contentDir, "static"))) mux.Handle("/static/", http.StripPrefix("/static/", fs)) mux.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, filepath.Join(contentDir, "/static/favicon.ico")) }) err = http.ListenAndServe(httpAddress, mux) if err != nil { panic(err) } }