package app import ( "context" "database/sql" "fmt" "log" "time" "net/http" _ "modernc.org/sqlite" ) const filePath = "goshare.db" type App struct { router http.Handler db *sql.DB } func New() *App { db, err := sql.Open("sqlite3", filePath) if err != nil { log.Fatalf("failed to open db: %s", err) } return &App{ db: db, } } func (a *App) Start(ctx context.Context) error { server := &http.Server{ Addr: ":5454", Handler: a.router, } fmt.Println("Starting server") ch := make(chan error, 1) go func () { err := server.ListenAndServe() if err != nil { ch <- fmt.Errorf("failed to start server: %w", err) } close(ch) }() select { case err := <-ch: return err case <-ctx.Done(): timeout, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() return server.Shutdown(timeout) } }