Simplify error handling during startup
This commit is contained in:
parent
969dbfb1aa
commit
4b2fcbc58a
5 changed files with 29 additions and 54 deletions
|
|
@ -10,10 +10,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func Run() {
|
func Run() {
|
||||||
h, err := server.New()
|
h := server.New()
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
defer h.Close()
|
defer h.Close()
|
||||||
|
|
||||||
var handler http.Handler = h
|
var handler http.Handler = h
|
||||||
|
|
|
||||||
|
|
@ -19,15 +19,6 @@ func (h *Server) Close() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Server) openStore() error {
|
|
||||||
var err error
|
|
||||||
h.s, err = store.OpenStore("./foo.db")
|
|
||||||
if err != nil {
|
|
||||||
h.s.Close()
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *Server) loadHandler() {
|
func (h *Server) loadHandler() {
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
|
|
||||||
|
|
@ -38,21 +29,12 @@ func (h *Server) loadHandler() {
|
||||||
h.Handler = mux
|
h.Handler = mux
|
||||||
}
|
}
|
||||||
|
|
||||||
func New() (*Server, error) {
|
func New() *Server {
|
||||||
var server Server
|
var server Server
|
||||||
var err error
|
|
||||||
|
|
||||||
err = server.loadTemplates()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = server.openStore()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
|
server.loadTemplates()
|
||||||
|
server.s = store.OpenStore("./foo.db")
|
||||||
server.loadHandler()
|
server.loadHandler()
|
||||||
|
|
||||||
return &server, nil
|
return &server
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,16 +3,19 @@ package server
|
||||||
import (
|
import (
|
||||||
"embed"
|
"embed"
|
||||||
"html/template"
|
"html/template"
|
||||||
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:embed templates/*
|
//go:embed templates/*
|
||||||
var templates embed.FS
|
var templates embed.FS
|
||||||
|
|
||||||
func (h *Server) loadTemplates() error {
|
func (h *Server) loadTemplates() {
|
||||||
var err error
|
var err error
|
||||||
h.tmpl, err = template.ParseFS(templates, "templates/*")
|
h.tmpl, err = template.ParseFS(templates, "templates/*")
|
||||||
return err
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) render(fetch fetcher, templateName string) http.HandlerFunc {
|
func (s *Server) render(fetch fetcher, templateName string) http.HandlerFunc {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ package store
|
||||||
import (
|
import (
|
||||||
"embed"
|
"embed"
|
||||||
_ "embed"
|
_ "embed"
|
||||||
"errors"
|
"log"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
@ -11,38 +11,29 @@ import (
|
||||||
//go:embed migrations/*.sql
|
//go:embed migrations/*.sql
|
||||||
var migrations embed.FS
|
var migrations embed.FS
|
||||||
|
|
||||||
func (s *Store) loadFile(file string) error {
|
func (s *Store) loadFile(file string) {
|
||||||
filename := strings.Split(file, ".")
|
filename := strings.Split(file, ".")
|
||||||
version, err := strconv.Atoi(filename[0])
|
version, err := strconv.Atoi(filename[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
log.Fatal("only allowed files in migrations directory are <version>.txt")
|
||||||
}
|
}
|
||||||
if version <= s.version() {
|
if version <= s.version() {
|
||||||
return nil
|
return
|
||||||
}
|
|
||||||
query, err := migrations.ReadFile("migrations/" + file)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
query, _ := migrations.ReadFile("migrations/" + file)
|
||||||
_, err = s.db.Exec(string(query))
|
_, err = s.db.Exec(string(query))
|
||||||
return err
|
if err != nil {
|
||||||
|
log.Fatal("error executing migration: ", file)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) loadMigrations() error {
|
func (s *Store) loadMigrations() {
|
||||||
if s.db == nil {
|
migration_files, _ := migrations.ReadDir("migrations")
|
||||||
return errors.New("database doesn't exist")
|
|
||||||
}
|
|
||||||
|
|
||||||
migration_files, err := migrations.ReadDir("migrations")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, e := range migration_files {
|
for _, e := range migration_files {
|
||||||
_ = s.loadFile(e.Name())
|
s.loadFile(e.Name())
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) version() int {
|
func (s *Store) version() int {
|
||||||
|
|
|
||||||
|
|
@ -2,25 +2,27 @@ package store
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
"log"
|
||||||
|
|
||||||
_ "github.com/mattn/go-sqlite3"
|
_ "github.com/mattn/go-sqlite3"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Store struct {
|
type Store struct {
|
||||||
db *sql.DB
|
db *sql.DB
|
||||||
|
cakes []Cake
|
||||||
}
|
}
|
||||||
|
|
||||||
func OpenStore(filename string) (*Store, error) {
|
func OpenStore(filename string) *Store {
|
||||||
var out Store
|
var out Store
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
out.db, err = sql.Open("sqlite3", filename)
|
out.db, err = sql.Open("sqlite3", filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &out, err
|
log.Fatal("Can't open the database", filename, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = out.loadMigrations()
|
out.loadMigrations()
|
||||||
return &out, err
|
return &out
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) Close() {
|
func (s *Store) Close() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue