package main
import (
"embed"
"errors"
"log"
"os"
"github.com/go-mizu/mizu"
"github.com/go-mizu/mizu/view"
)
//go:embed views
var viewsFS embed.FS
func main() {
// Configuration
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
isDev := os.Getenv("ENV") != "production"
// Create view engine
config := view.Config{
Extension: ".html",
DefaultLayout: "default",
Development: isDev,
}
if isDev {
config.Dir = "./views"
} else {
config.FS = viewsFS
}
engine := view.New(config)
// Preload in production
if !isDev {
if err := engine.Load(); err != nil {
log.Fatal("Template error:", err)
}
log.Println("Templates loaded successfully")
}
// Create app
app := mizu.New()
app.Use(engine.Middleware())
// Error handler
app.ErrorHandler = func(c *mizu.Ctx, err error) {
code := 500
page := "500"
var httpErr *mizu.Error
if errors.As(err, &httpErr) {
code = httpErr.Code
if code == 404 {
page = "404"
}
}
if code >= 500 {
log.Printf("Error: %v", err)
}
c.Status(code)
view.Render(c, page, view.Data{"Title": "Error"})
}
// Routes
app.Get("/", homeHandler)
app.Get("/about", aboutHandler)
// Start server
log.Printf("Server starting on :%s (dev=%v)", port, isDev)
if err := app.Listen(":" + port); err != nil {
log.Fatal(err)
}
}
func homeHandler(c *mizu.Ctx) error {
return view.Render(c, "home", view.Data{
"Title": "Welcome",
})
}
func aboutHandler(c *mizu.Ctx) error {
return view.Render(c, "about", view.Data{
"Title": "About Us",
})
}