package main import ( "embed" "html/template" "log" "net/http" "os" "gitea.seeseepuff.be/seeseemelk/mysqlite" "github.com/gin-gonic/gin" ) //go:embed migrations/*.sql var migrations embed.FS //go:embed templates/*.gohtml var templateFS embed.FS func main() { log.Println("Starting...") // Get database path from environment variable or use default dbPath := os.Getenv("PCINV_DB") if dbPath == "" { dbPath = "pcinv.db3" } db, err := mysqlite.OpenDb(dbPath) if err != nil { log.Fatalf("error opening db: %v", err) } defer db.MustClose() err = db.MigrateDb(migrations, "migrations") if err != nil { log.Fatalf("error migrating db: %v", err) } app := &App{ db: db, } templates, err := template.New("undefined.gohtml"). Funcs(template.FuncMap{ "statusText": http.StatusText, "createDeviceLink": createDeviceLink, "formatMemorySize": formatMemorySize, "formatMemoryPlainSize": formatMemoryPlainSize, "formatType": formatType, "isRamType": isRamType, "createSelectMenu": createSelectMenu, "createSelectMenuDefault": createSelectMenuDefault, }). ParseFS(templateFS, "templates/*.gohtml") if err != nil { log.Fatalf("error parsing templates: %v", err) } gin.DebugPrintFunc = log.Printf gin.SetMode(gin.ReleaseMode) r := gin.Default() r.SetHTMLTemplate(templates) r.StaticFS("/static", staticFiles) r.Use(errorHandler) r.GET("/", app.getIndex) r.GET("/device", app.getDevice) r.GET("/create", app.getCreateDevice) r.POST("/create", app.postCreateDevice) r.GET("/browse", app.getBrowse) r.GET("/delete", app.getDelete) r.POST("/delete", app.postDelete) err = r.Run() if err != nil { log.Fatalf("error serving website: %v", err) } } type ErrorVM struct { Errors []*gin.Error StatusCode int } func errorHandler(c *gin.Context) { c.Next() if len(c.Errors) != 0 { vm := ErrorVM{ Errors: c.Errors, StatusCode: c.Writer.Status(), } c.HTML(vm.StatusCode, "errors", vm) } }