Files
capytal.cc/main.go

104 lines
2.3 KiB
Go
Raw Normal View History

package main
import (
"context"
"errors"
"flag"
"fmt"
"log/slog"
"net/http"
"os"
"os/signal"
"syscall"
2025-03-31 16:45:51 -03:00
"capytal.cc/templates"
"capytal.cc/tinyssert"
)
var (
2025-03-31 16:45:51 -03:00
hostname = flag.String("hostname", "localhost", "Host to listen to")
port = flag.Uint("port", 8080, "Port to be used for the server.")
templatesDir = flag.String("templates", "", "Templates directory to be used instead of built-in ones.")
verbose = flag.Bool("verbose", false, "Print debug information on logs")
dev = flag.Bool("dev", false, "Run the server in debug mode.")
)
2025-03-31 16:45:51 -03:00
func getEnv(key string, d string) string {
v := os.Getenv(key)
if v == "" {
return d
}
2025-03-31 16:45:51 -03:00
return v
}
2025-03-31 16:45:51 -03:00
func init() {
flag.Parse()
}
func main() {
2025-03-31 16:45:51 -03:00
ctx := context.Background()
2025-03-31 16:45:51 -03:00
assertions := tinyssert.NewDisabledAssertions()
if *dev {
assertions = tinyssert.NewAssertions(tinyssert.Opts{
Panic: true,
})
}
2025-03-31 16:45:51 -03:00
level := slog.LevelError
if *dev {
level = slog.LevelDebug
} else if *verbose {
level = slog.LevelInfo
}
log := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level}))
2025-03-31 16:45:51 -03:00
opts := []Option{
WithAssertions(assertions),
WithLogger(log),
}
if *dev {
opts = append(opts, WithAssets(os.DirFS("./assets")))
opts = append(opts, WithTemplates(templates.NewHotTemplates(os.DirFS("./templates"))))
opts = append(opts, WithCacheDisabled())
}
2025-03-31 16:45:51 -03:00
app, err := NewApp(opts...)
if err != nil {
log.Error("Unable to initiate application", slog.String("error", err.Error()))
os.Exit(1)
}
2025-03-31 16:45:51 -03:00
srv := &http.Server{
Addr: fmt.Sprintf("%s:%d", *hostname, *port),
Handler: app,
}
2025-03-31 16:45:51 -03:00
c, stop := signal.NotifyContext(ctx, syscall.SIGINT, syscall.SIGTERM)
defer stop()
go func() {
2025-03-31 16:45:51 -03:00
log.Info("Starting application",
slog.String("host", *hostname),
slog.Uint64("port", uint64(*port)),
slog.Bool("verbose", *verbose),
slog.Bool("development", *dev))
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
log.Error("Failed to start application server", slog.String("error", err.Error()))
os.Exit(1)
}
}()
2025-03-31 16:45:51 -03:00
<-c.Done()
log.Info("Stopping application gracefully")
if err := srv.Shutdown(ctx); err != nil {
log.Error("Failed to stop application server gracefully", slog.String("error", err.Error()))
os.Exit(1)
}
2025-03-31 16:45:51 -03:00
log.Info("FINAL")
os.Exit(0)
}