3
0
corteza/cmd/sam/main.go
Denis Arh fca62c8f5f Add .env file reading capabilties and ability to config sam via env variables
For dsn & addr: explicit config via flag has priority over env variables. Final failsafe is hardcoded default values

Env variables:
 - SAM_DB_DSN
 - SAM_HTTP_ADDR
2018-07-12 17:36:54 +02:00

78 lines
1.6 KiB
Go

package main
import (
"flag"
"log"
"net"
"os"
"net/http"
"github.com/go-chi/chi"
_ "github.com/joho/godotenv/autoload"
project "github.com/crusttech/crust/sam"
"github.com/titpetric/factory"
)
const (
defaultAddr = ":3000"
defaultDsn = "crust:crust@tcp(db1:3306)/crust?collation=utf8mb4_general_ci"
envVarKey_HTTP_ADDR = "SAM_HTTP_ADDR"
envVarKey_DB_DSN = "SAM_DB_DSN"
)
func handleError(err error, message string) {
if message == "" {
message = "Error making API call"
}
if err != nil {
log.Fatalf(message+": %v", err.Error())
}
}
func main() {
var envHttpAddr, envDbDsn string
var has bool
if envHttpAddr, has = os.LookupEnv(envVarKey_HTTP_ADDR); !has {
envHttpAddr = defaultAddr
}
if envDbDsn, has = os.LookupEnv(envVarKey_DB_DSN); !has {
envDbDsn = defaultDsn
}
var (
// set up flags
addr = flag.String("addr", envHttpAddr, "Listen address for HTTP server")
dsn = flag.String("dsn", envDbDsn, "DSN for database connection")
)
flag.Parse()
// log to stdout not stderr
log.SetOutput(os.Stdout)
// set up database connection
factory.Database.Add("default", dsn)
db, err := factory.Database.Get()
handleError(err, "Can't connect to database")
db.Profiler = &factory.Database.ProfilerStdout
// listen socket for http server
log.Println("Starting http server on address " + *addr)
listener, err := net.Listen("tcp", *addr)
handleError(err, "Can't listen on addr "+*addr)
// route options
routeOptions, err := RouteOptions{}.New()
handleError(err, "Error creating RouteOptions object")
// mount routes
r := chi.NewRouter()
MountRoutes(r, routeOptions, project.MountRoutes)
http.Serve(listener, r)
}