Files
guz.one/main.go
Gustavo "Guz" L. de Mello cc53639ca8 feat: dev mode in server
2024-05-24 11:29:20 -03:00

85 lines
2.0 KiB
Go

package main
import (
"flag"
"fmt"
"log"
"net/http"
"slices"
"strings"
"www/config"
"www/internals"
)
var logger = log.Default()
func main() {
staticDir := flag.String("s", "./static", "the directory to copy static files from")
port := flag.Int("p", 8080, "the port to run the server")
dev := flag.Bool("d", false, "if the server is in development mode")
flag.Parse()
if *dev {
log.Printf("Running server in DEVELOPMENT MODE")
}
mux := http.NewServeMux()
config.APIROUTES(mux)
for _, route := range config.ROUTES {
path := "/" + strings.TrimSuffix(route.Path, ".html")
if path == "/index" {
continue
}
logger.Printf("Registering page route. page=%s route=%s", route.Path, path)
mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
logger.Printf("Handling request. path=%s", r.URL.Path)
if *dev {
w.Header().Add("Cache-Control", "max-age=0")
}
w.Header().Add("Content-Type", "text/html")
err := route.Component.Render(r.Context(), w)
if err != nil {
logger.Fatalf("Unable to render route %s due to %s", route.Path, err)
}
})
}
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if *dev {
w.Header().Add("Cache-Control", "max-age=0")
}
if r.URL.Path != "/" {
logger.Printf("Handling file server request. path=%s", r.URL.Path)
http.FileServer(http.Dir(*staticDir)).ServeHTTP(w, r)
return
}
logger.Printf("Handling request. path=%s", r.URL.Path)
w.Header().Add("Content-Type", "text/html")
index := slices.IndexFunc(config.ROUTES, func(route internals.Page) bool {
return route.Path == "index.html"
})
indexPage := config.ROUTES[index]
err := indexPage.Component.Render(r.Context(), w)
if err != nil {
log.Fatalf("Unable to render index page due to %s", err)
}
})
logger.Printf("Running server at port: %v", *port)
err := http.ListenAndServe(fmt.Sprintf(":%v", *port), mux)
if err != nil {
logger.Fatalf("Server crashed due to:\n%s", err)
}
}