diff --git a/cmd/api-server/main.go b/cmd/api-server/main.go index 3f9024b..cf855ba 100644 --- a/cmd/api-server/main.go +++ b/cmd/api-server/main.go @@ -3,29 +3,21 @@ package main import ( "context" "errors" - "flag" "fmt" "log/slog" "net/http" "os" "os/signal" - "strconv" "syscall" "time" "github.com/joho/godotenv" "github.com/robindittmar/dttmr-api/internal/api/router" + "github.com/robindittmar/dttmr-api/internal/config" "github.com/robindittmar/dttmr-api/internal/database" "github.com/robindittmar/dttmr-api/internal/telemetry" ) -type Config struct { - Environment string - Port int - OTLPEndpoint string - DatabaseURL string -} - func main() { serviceName := "dttmr-api" serviceVersion := "0.1.0" @@ -42,7 +34,7 @@ func run(serviceName string, serviceVersion string) error { slog.Info("Starting service", slog.String("service", serviceName), slog.String("version", serviceVersion)) - cfg := loadConfig() + cfg := config.Load() telCfg := telemetry.Config{ ServiceName: serviceName, @@ -113,47 +105,7 @@ func setupLogging() { slog.SetDefault(logger) } -func loadConfig() *Config { - envFlag := flag.String("env", "development", "environment to use") - portFlag := flag.Int("port", 8080, "port to listen on") - otlpEndpointFlag := flag.String("otlp-endpoint", "localhost:4317", "otlp endpoint") - databaseUrlFlag := flag.String("database-url", "postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable", "database connection string") - - flag.Parse() - - cfg := &Config{ - Environment: *envFlag, - Port: *portFlag, - OTLPEndpoint: *otlpEndpointFlag, - DatabaseURL: *databaseUrlFlag, - } - - assignStringFromEnv("DTTMR_ENVIRONMENT", &cfg.Environment) - assignIntFromEnv("DTTMR_PORT", &cfg.Port) - assignStringFromEnv("DTTMR_OTLP_ENDPOINT", &cfg.OTLPEndpoint) - assignStringFromEnv("DTTMR_DATABASE_URL", &cfg.DatabaseURL) - - return cfg -} - -func assignStringFromEnv(key string, target *string) { - if val, exists := os.LookupEnv(key); exists { - *target = val - } -} - -func assignIntFromEnv(key string, target *int) { - if val, exists := os.LookupEnv(key); exists { - parsed, err := strconv.Atoi(val) - if err != nil { - slog.Error("Failed to parse environment variable", slog.String("var", key), slog.Any("error", err)) - } else { - *target = parsed - } - } -} - -func makeServer(cfg *Config) *http.Server { +func makeServer(cfg *config.Config) *http.Server { routerConfig := router.Config{} mux := router.NewMux(routerConfig) diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100644 index 0000000..9c764bc --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,55 @@ +package config + +import ( + "flag" + "log/slog" + "os" + "strconv" +) + +type Config struct { + Environment string + Port int + OTLPEndpoint string + DatabaseURL string +} + +func Load() *Config { + envFlag := flag.String("env", "development", "environment to use") + portFlag := flag.Int("port", 8080, "port to listen on") + otlpEndpointFlag := flag.String("otlp-endpoint", "localhost:4317", "otlp endpoint") + databaseUrlFlag := flag.String("database-url", "postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable", "database connection string") + + flag.Parse() + + cfg := &Config{ + Environment: *envFlag, + Port: *portFlag, + OTLPEndpoint: *otlpEndpointFlag, + DatabaseURL: *databaseUrlFlag, + } + + assignStringFromEnv("DTTMR_ENVIRONMENT", &cfg.Environment) + assignIntFromEnv("DTTMR_PORT", &cfg.Port) + assignStringFromEnv("DTTMR_OTLP_ENDPOINT", &cfg.OTLPEndpoint) + assignStringFromEnv("DTTMR_DATABASE_URL", &cfg.DatabaseURL) + + return cfg +} + +func assignStringFromEnv(key string, target *string) { + if val, exists := os.LookupEnv(key); exists { + *target = val + } +} + +func assignIntFromEnv(key string, target *int) { + if val, exists := os.LookupEnv(key); exists { + parsed, err := strconv.Atoi(val) + if err != nil { + slog.Error("Failed to parse environment variable", slog.String("var", key), slog.Any("error", err)) + } else { + *target = parsed + } + } +}