main.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package config
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "path/filepath"
  7. "strconv"
  8. "github.com/joho/godotenv"
  9. "github.com/felamaslen/go-music-player/pkg/logger"
  10. )
  11. func getEnvFile() (string, bool) {
  12. goEnv, _ := os.LookupEnv("GO_ENV")
  13. switch goEnv {
  14. case "test":
  15. return "test.env", true
  16. case "development":
  17. return ".env", true
  18. default:
  19. return "", false
  20. }
  21. }
  22. var envLoaded = false
  23. func loadEnv() {
  24. envFileBase, loadEnvFile := getEnvFile()
  25. cwd, _ := os.Getwd()
  26. envFile := filepath.Join(cwd, envFileBase)
  27. if loadEnvFile {
  28. err := godotenv.Load(envFile)
  29. if err != nil {
  30. log.Printf("Error loading dotenv file: %v\n", err)
  31. } else {
  32. envLoaded = true
  33. }
  34. }
  35. }
  36. func getDatabaseUrl() string {
  37. host, hasHost := os.LookupEnv("POSTGRES_HOST")
  38. if !hasHost {
  39. log.Fatal("Must set POSTGRES_HOST")
  40. }
  41. user := os.Getenv("POSTGRES_USER")
  42. password := os.Getenv("POSTGRES_PASSWORD")
  43. port, hasPort := os.LookupEnv("POSTGRES_PORT")
  44. if !hasPort {
  45. port = "5432"
  46. }
  47. portNumeric, err := strconv.Atoi(port)
  48. if err != nil {
  49. log.Fatal("POSTGRES_PORT must be numeric")
  50. }
  51. database, hasDatabase := os.LookupEnv("POSTGRES_DATABASE")
  52. if !hasDatabase {
  53. log.Fatal("Must set POSTGRES_DATABASE")
  54. }
  55. databaseUrl := fmt.Sprintf("postgres://%s:%s@%s:%d/%s", user, password, host, portNumeric, database)
  56. return databaseUrl
  57. }
  58. const defaultLogLevel = logger.LevelInfo
  59. func getLogLevel() logger.LogLevel {
  60. level, hasLevel := os.LookupEnv("LOG_LEVEL")
  61. if !hasLevel {
  62. return defaultLogLevel
  63. }
  64. levelInt, err := strconv.Atoi(level)
  65. if err != nil {
  66. return defaultLogLevel
  67. }
  68. switch levelInt {
  69. case 0:
  70. return logger.LevelNone
  71. case 1:
  72. return logger.LevelError
  73. case 2:
  74. return logger.LevelWarn
  75. case 3:
  76. return logger.LevelInfo
  77. case 4:
  78. return logger.LevelVerbose
  79. case 5:
  80. return logger.LevelDebug
  81. }
  82. return defaultLogLevel
  83. }
  84. type config struct {
  85. DatabaseUrl string
  86. LogLevel logger.LogLevel
  87. }
  88. func GetConfig() config {
  89. if !envLoaded {
  90. loadEnv()
  91. }
  92. return config{
  93. DatabaseUrl: getDatabaseUrl(),
  94. LogLevel: getLogLevel(),
  95. }
  96. }