learn-go/snippetbox/cmd/web/main.go

57 lines
1.5 KiB
Go

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)
}