package envy import ( "os" "strconv" "time" ) func Get[T comparable](key string) T { var zero T val, ok := os.LookupEnv(key) if !ok { return zero } var res any switch any(zero).(type) { case string: res = val case int: if n, err := strconv.Atoi(val); err == nil { res = n } case int64: if n, err := strconv.ParseInt(val, 10, 64); err == nil { res = n } case float64: if f, err := strconv.ParseFloat(val, 64); err == nil { res = f } case bool: if b, err := strconv.ParseBool(val); err == nil { res = b } case time.Duration: if d, err := time.ParseDuration(val); err == nil { res = d } } return res.(T) } func GetOrDefault[T comparable](key string, def T) T { var zero T if val := Get[T](key); val != zero { return val } return def }