all repos

test1 @ 7102d64

for testing purposes
2 files changed, 124 insertions(+), 0 deletions(-)
envy: add
Author: Oleksandr Smirnov olexsmir@gmail.com
Committed at: 2025-12-04 16:28:05 +0200
Change ID: nllmpxvquqywxpvyollnpuzxtvwnzprt
Parent: 8cb64b3
A envy/env.go

@@ -0,0 +1,50 @@

+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 +}
A envy/env_test.go

@@ -0,0 +1,74 @@

+package envy_test + +import ( + "testing" + "time" + + "olexsmir.xyz/x/envy" + "olexsmir.xyz/x/is" +) + +func TestGet(t *testing.T) { + env := "TESTING" + t.Run("string", func(t *testing.T) { + t.Setenv(env, "asdf") + is.Equal(t, "asdf", envy.Get[string](env)) + }) + t.Run("string, not set", func(t *testing.T) { + is.Equal(t, "", envy.Get[string](env)) + }) + + t.Run("int", func(t *testing.T) { + t.Setenv("TESTING", "123") + is.Equal(t, 123, envy.Get[int](env)) + }) + t.Run("int, not set", func(t *testing.T) { + is.Equal(t, 0, envy.Get[int](env)) + }) + + t.Run("int64", func(t *testing.T) { + t.Setenv(env, "112233") + is.Equal(t, 112233, envy.Get[int64](env)) + }) + t.Run("int64, not set", func(t *testing.T) { + is.Equal(t, 0, envy.Get[int64](env)) + }) + + t.Run("float64", func(t *testing.T) { + t.Setenv(env, "123.123") + is.Equal(t, 123.123, envy.Get[float64](env)) + }) + t.Run("float64, not set", func(t *testing.T) { + is.Equal(t, 0, envy.Get[float64](env)) + }) + + t.Run("bool", func(t *testing.T) { + t.Setenv(env, "true") + is.Equal(t, true, envy.Get[bool](env)) + }) + t.Run("bool, not set", func(t *testing.T) { + is.Equal(t, false, envy.Get[bool](env)) + }) + + t.Run("time.Duration", func(t *testing.T) { + t.Setenv(env, "3s") + got := envy.Get[time.Duration](env) + is.Equal(t, 3*time.Second, got) + }) + t.Run("time.Duration, not set", func(t *testing.T) { + got := envy.Get[time.Duration](env) + is.Equal(t, 0, got) + }) +} + +func TestGetOrDefault(t *testing.T) { + env := "TESTING" + t.Run("string, unset", func(t *testing.T) { + is.Equal(t, "asdf", envy.GetOrDefault(env, "asdf")) + }) + + t.Run("string, unset", func(t *testing.T) { + t.Setenv(env, "test") + is.Equal(t, "test", envy.GetOrDefault(env, "asdf")) + }) +}