Initial bootrap of application

- Creates scaffold for router and server
- Main program set up for environment, OS signal listener
- Makefile generic commands
This commit is contained in:
2021-06-17 17:06:21 -04:00
parent 61e39b6c2f
commit 336b21a835
14 changed files with 307 additions and 2 deletions
Executable
BIN
View File
Binary file not shown.
+18
View File
@@ -0,0 +1,18 @@
package main
import (
"github.com/joho/godotenv"
"github.com/kelseyhightower/envconfig"
)
type config struct {
Env string `default:"dev"`
APIPort int `default:3000`
LogLevel string `default:"debug"`
}
func load() (cfg config, err error) {
_ = godotenv.Load("cmd/api/.env")
err = envconfig.Process("", &cfg)
return
}
+3
View File
@@ -0,0 +1,3 @@
ENV: dev
APIPORT: 3000
LOGLEVEL: debug
+62
View File
@@ -0,0 +1,62 @@
package main
import (
"context"
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/davidlick/supermarket-api/internal/http"
"github.com/sirupsen/logrus"
)
var (
cfg config
logger *logrus.Logger
err error
)
func init() {
cfg, err = load()
if err != nil {
log.Fatal(err)
}
ll, err := logrus.ParseLevel(cfg.LogLevel)
if err != nil {
log.Fatal(err)
}
logger = logrus.New()
logger.SetLevel(ll)
}
func main() {
server := http.NewServer(cfg.APIPort, logger, cfg.Env)
// Allow app to listen for OS Interrupts and SIGTERMS.
serverErrors := make(chan error, 1)
osSignals := make(chan os.Signal, 1)
signal.Notify(osSignals, os.Interrupt, syscall.SIGTERM)
go func() {
serverErrors <- server.Run()
}()
// Handling for server errors and OS signals.
select {
case err := <-serverErrors:
log.Fatal("error starting server: %w", err.Error())
case <-osSignals:
log.Println("starting server shutdown...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
err := server.Shutdown(ctx)
if err != nil {
log.Fatalf("error shutting down http server: %v", err.Error())
}
}
}