Files
GarminSync/internal/config/config.go
2025-08-08 05:32:38 -07:00

68 lines
1.6 KiB
Go

package config
import (
"fmt"
"os"
"path/filepath"
"time"
)
// Config holds application configuration
type Config struct {
GarminEmail string
GarminPassword string
DatabasePath string
RateLimit time.Duration
SessionPath string
SessionTimeout time.Duration
}
// LoadConfig loads configuration from environment variables
func LoadConfig() (*Config, error) {
email := os.Getenv("GARMIN_EMAIL")
password := os.Getenv("GARMIN_PASSWORD")
if email == "" || password == "" {
return nil, fmt.Errorf("GARMIN_EMAIL and GARMIN_PASSWORD environment variables are required")
}
databasePath := os.Getenv("DATABASE_PATH")
if databasePath == "" {
databasePath = "garmin.db"
}
rateLimit := parseDuration(os.Getenv("RATE_LIMIT"), 2*time.Second)
sessionTimeout := parseDuration(os.Getenv("SESSION_TIMEOUT"), 30*time.Minute)
sessionPath := os.Getenv("SESSION_PATH")
if sessionPath == "" {
sessionPath = "/data/session.json"
}
// Ensure session path directory exists
if err := os.MkdirAll(filepath.Dir(sessionPath), 0755); err != nil {
return nil, fmt.Errorf("failed to create session directory: %w", err)
}
return &Config{
GarminEmail: email,
GarminPassword: password,
DatabasePath: databasePath,
RateLimit: rateLimit,
SessionPath: sessionPath,
SessionTimeout: sessionTimeout,
}, nil
}
// parseDuration parses a duration string with a default
func parseDuration(value string, defaultValue time.Duration) time.Duration {
if value == "" {
return defaultValue
}
d, err := time.ParseDuration(value)
if err != nil {
return defaultValue
}
return d
}