package config import ( "fmt" "os" "strconv" ) type Config struct { Env string Host string Port int Database DatabaseConfig Meilisearch MeilisearchConfig Redis RedisConfig Equalize EqualizeConfig EnablePersistTask bool } 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 } eq := loadEqualize(env) return &Config{ Env: env, Host: getEnv("APP_HOST", "0.0.0.0"), Port: port, Database: db, Meilisearch: ms, Redis: rd, Equalize: eq, EnablePersistTask: getEnv("ENABLE_PERSIST_TASK", "false") == "true", }, 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 }