package main import ( "database/sql" "flag" "log" "net/http" "os" "text/template" "git.32bit.cafe/yequari/webring/internal/models" _ "modernc.org/sqlite" ) type application struct { errorLog *log.Logger infoLog *log.Logger siteEntries *models.SiteEntryModel webmasters *models.WebmasterModel templateCache map[string]*template.Template } func main() { addr := flag.String("addr", ":8000", "HTTP network address") dsn := flag.String("dsn", "webring.db", "data source name") flag.Parse() infoLog := log.New(os.Stdout, "INFO\t", log.Ldate|log.Ltime) errorLog := log.New(os.Stderr, "ERROR\t", log.Ldate|log.Ltime|log.Lshortfile) db, err := openDB(*dsn) if err != nil { errorLog.Fatal(err) } defer db.Close() templateCache, err := newTemplateCache() if err != nil { errorLog.Fatal(err) } app := &application{ errorLog: errorLog, infoLog: infoLog, siteEntries: &models.SiteEntryModel{DB: db}, webmasters: &models.WebmasterModel{DB: db}, templateCache: templateCache, } srv := &http.Server{ Addr: *addr, ErrorLog: errorLog, Handler: app.routes(), } infoLog.Printf("Starting server on %s", *addr) err = srv.ListenAndServe() errorLog.Fatal(err) } func openDB(dsn string) (*sql.DB, error) { db, err := sql.Open("sqlite", dsn) if err != nil { return nil, err } if err = db.Ping(); err != nil { return nil, err } return db, nil }