// Package env provides .env file loading and typed lookups using only the // standard library. package env import ( "bufio" "os" "strings" ) // Load reads KEY=VALUE pairs from the given file into the process // environment. Existing environment variables win over file values. A // missing file is not an error, so .env stays optional. func Load(path string) error { f, err := os.Open(path) if err != nil { if os.IsNotExist(err) { return nil } return err } defer f.Close() scanner := bufio.NewScanner(f) for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) if line == "" || strings.HasPrefix(line, "#") { continue } key, value, ok := strings.Cut(line, "=") if !ok { continue } key = strings.TrimSpace(strings.TrimPrefix(key, "export ")) value = strings.TrimSpace(value) if len(value) >= 2 { if (value[0] == '"' && value[len(value)-1] == '"') || (value[0] == '\'' && value[len(value)-1] == '\'') { value = value[1 : len(value)-1] } } if _, exists := os.LookupEnv(key); !exists { os.Setenv(key, value) } } return scanner.Err() } // Get returns the environment variable or a default. func Get(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback }