64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
|
|
package config
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"os"
|
||
|
|
"strconv"
|
||
|
|
)
|
||
|
|
|
||
|
|
type Config struct {
|
||
|
|
Env string
|
||
|
|
Host string
|
||
|
|
Port int
|
||
|
|
Database DatabaseConfig
|
||
|
|
Meilisearch MeilisearchConfig
|
||
|
|
Redis RedisConfig
|
||
|
|
}
|
||
|
|
|
||
|
|
func Load() (*Config, error) {
|
||
|
|
port, err := strconv.Atoi(getEnv("APP_PORT", "8080"))
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("invalid APP_PORT: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
env := getEnv("APP_ENV", "development")
|
||
|
|
|
||
|
|
db, err := loadDatabase(env)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
if err := db.validate(env); err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
ms := loadMeilisearch(env)
|
||
|
|
if err := ms.validate(); err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
rd := loadRedis(env)
|
||
|
|
if err := rd.validate(); err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
return &Config{
|
||
|
|
Env: env,
|
||
|
|
Host: getEnv("APP_HOST", "0.0.0.0"),
|
||
|
|
Port: port,
|
||
|
|
Database: db,
|
||
|
|
Meilisearch: ms,
|
||
|
|
Redis: rd,
|
||
|
|
}, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *Config) Addr() string {
|
||
|
|
return fmt.Sprintf("%s:%d", c.Host, c.Port)
|
||
|
|
}
|
||
|
|
|
||
|
|
func getEnv(key, fallback string) string {
|
||
|
|
if v := os.Getenv(key); v != "" {
|
||
|
|
return v
|
||
|
|
}
|
||
|
|
return fallback
|
||
|
|
}
|