diff --git a/.gitignore b/.gitignore index 7239fd5..1c43a8a 100644 --- a/.gitignore +++ b/.gitignore @@ -114,4 +114,6 @@ fabric.properties # End of https://www.toptal.com/developers/gitignore/api/goland+all,go -build \ No newline at end of file +build + +config.json \ No newline at end of file diff --git a/cmd/server/server.go b/cmd/server/server.go index 66f5879..eedb580 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -2,7 +2,12 @@ package main import ( "flag" + "git.brettb.xyz/goinv/server/internal/config" + "github.com/knadh/koanf/parsers/json" + "github.com/knadh/koanf/providers/env" + "github.com/knadh/koanf/providers/file" "log" + "strings" "git.brettb.xyz/goinv/server/internal/api" "git.brettb.xyz/goinv/server/internal/storage" @@ -13,9 +18,22 @@ func main() { seed := flag.Bool("seed", false, "seed the database") flag.Parse() - datastore, err := storage.NewDataStorePG("127.0.0.1", "postgres", "password", "em_test", "disable") // TODO: CONFIGURATION + config.LoadConfig(file.Provider("config.json"), json.Parser()) + config.LoadConfig(env.Provider("GOINV_SRV_", ".", func(s string) string { + return strings.Replace(strings.ToLower( + strings.TrimPrefix(s, "GOINV_SRV_")), "_", ".", -1, + ) + }), nil) + + var cfg config.Config + err := config.Unmarshal(&cfg) + if err != nil { + log.Fatalf("could not load config: %v", err) + } + + datastore, err := storage.NewDataStorePG(cfg.DB.Host, cfg.DB.Username, cfg.DB.Password, cfg.DB.Database, cfg.DB.SSLMode) if err != nil { - panic(err) + log.Fatalf("could not connect to database: %v", err) } if *seed { diff --git a/config.example.json b/config.example.json new file mode 100644 index 0000000..f88c3d3 --- /dev/null +++ b/config.example.json @@ -0,0 +1,9 @@ +{ + "db": { + "host": "127.0.0.1", + "username": "postgres", + "password": "password", + "database": "em_test", + "ssl_mode": "disable" + } +} \ No newline at end of file diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100644 index 0000000..8f1b3c5 --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,25 @@ +package config + +import "github.com/knadh/koanf" + +var ( + K = koanf.New(".") +) + +type Config struct { + DB struct { + Host string `koanf:"host"` + Username string `koanf:"username"` + Password string `koanf:"password"` + Database string `koanf:"database"` + SSLMode string `koanf:"ssl_mode"` + } `koanf:"db"` +} + +func LoadConfig(provider koanf.Provider, parser koanf.Parser) error { + return K.Load(provider, parser) +} + +func Unmarshal(o interface{}) error { + return K.Unmarshal("", o) +}