package main import ( "flag" "log/slog" "net/http" "os" ) // for application wide dependencies type application struct { logger *slog.Logger } // main it's the snippetbox webapp func main() { // configuration addr := flag.String("addr", ":4000", "HTTP network address") logfmt := flag.String("logfmt", "text", "Log output format") loglevel := flag.String("loglevel", "INFO", "Log level: DEBUG, INFO, WARN, or ERROR") flag.Parse() var logger *slog.Logger var handler_options slog.HandlerOptions switch *loglevel { case "DEBUG": handler_options = slog.HandlerOptions{Level: slog.LevelDebug} case "INFO": handler_options = slog.HandlerOptions{Level: slog.LevelInfo} case "WARN": handler_options = slog.HandlerOptions{Level: slog.LevelWarn} case "ERROR": handler_options = slog.HandlerOptions{Level: slog.LevelError} } switch *logfmt { case "json": logger = slog.New(slog.NewJSONHandler(os.Stdout, &handler_options)) default: logger = slog.New(slog.NewTextHandler(os.Stdout, &handler_options)) } app := &application{ logger: logger, } mux := http.NewServeMux() // setup server for static files fileServer := http.FileServer(http.Dir("./ui/static")) mux.Handle("/static/", http.StripPrefix("/static", fileServer)) mux.HandleFunc("/", app.home) mux.HandleFunc("/snippet/view", app.snippetView) mux.HandleFunc("/snippet/create", app.snippetCreate) logger.Info("starting server", slog.String("addr", *addr)) err := http.ListenAndServe(*addr, mux) logger.Error(err.Error()) os.Exit(1) }