diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b4e42a1..d15178f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - go-version: [1.17, oldstable, stable] + go-version: [1.18, oldstable, stable] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 diff --git a/env.go b/env.go index 99a9484..6d45ec6 100644 --- a/env.go +++ b/env.go @@ -191,6 +191,28 @@ func ParseWithOptions(v interface{}, opts Options) error { return parseInternal(v, setField, customOptions(opts)) } +// ParseAs parses the given struct type containing `env` tags and loads its +// values from environment variables. +func ParseAs[T any]() (T, error) { + var t T + return t, Parse(&t) +} + +// ParseWithOptions parses the given struct type containing `env` tags and +// loads its values from environment variables. +func ParseAsWithOptions[T any](opts Options) (T, error) { + var t T + return t, ParseWithOptions(&t, opts) +} + +// Must panic is if err is not nil, and returns t otherwise. +func Must[T any](t T, err error) T { + if err != nil { + panic(err) + } + return t +} + // GetFieldParams parses a struct containing `env` tags and returns information about // tags it found. func GetFieldParams(v interface{}) ([]FieldParams, error) { diff --git a/env_generic.go b/env_generic.go deleted file mode 100644 index d14003e..0000000 --- a/env_generic.go +++ /dev/null @@ -1,26 +0,0 @@ -//go:build go1.18 -// +build go1.18 - -package env - -// ParseAs parses the given struct type containing `env` tags and loads its -// values from environment variables. -func ParseAs[T any]() (T, error) { - var t T - return t, Parse(&t) -} - -// ParseWithOptions parses the given struct type containing `env` tags and -// loads its values from environment variables. -func ParseAsWithOptions[T any](opts Options) (T, error) { - var t T - return t, ParseWithOptions(&t, opts) -} - -// Must panic is if err is not nil, and returns t otherwise. -func Must[T any](t T, err error) T { - if err != nil { - panic(err) - } - return t -} diff --git a/env_generic_test.go b/env_generic_test.go deleted file mode 100644 index bed4896..0000000 --- a/env_generic_test.go +++ /dev/null @@ -1,46 +0,0 @@ -//go:build go1.18 -// +build go1.18 - -package env - -import "testing" - -type Conf struct { - Foo string `env:"FOO" envDefault:"bar"` -} - -func TestParseAs(t *testing.T) { - config, err := ParseAs[Conf]() - isNoErr(t, err) - isEqual(t, "bar", config.Foo) -} - -func TestParseAsWithOptions(t *testing.T) { - config, err := ParseAsWithOptions[Conf](Options{ - Environment: map[string]string{ - "FOO": "not bar", - }, - }) - isNoErr(t, err) - isEqual(t, "not bar", config.Foo) -} - -type ConfRequired struct { - Foo string `env:"FOO,required"` -} - -func TestMust(t *testing.T) { - t.Run("error", func(t *testing.T) { - defer func() { - err := recover() - isErrorWithMessage(t, err.(error), `env: required environment variable "FOO" is not set`) - }() - conf := Must(ParseAs[ConfRequired]()) - isEqual(t, "", conf.Foo) - }) - t.Run("success", func(t *testing.T) { - t.Setenv("FOO", "bar") - conf := Must(ParseAs[ConfRequired]()) - isEqual(t, "bar", conf.Foo) - }) -} diff --git a/env_test.go b/env_test.go index 65628ed..e80075e 100644 --- a/env_test.go +++ b/env_test.go @@ -1854,6 +1854,46 @@ func TestGetFieldParamsError(t *testing.T) { isTrue(t, errors.Is(err, NotStructPtrError{})) } +type Conf struct { + Foo string `env:"FOO" envDefault:"bar"` +} + +func TestParseAs(t *testing.T) { + config, err := ParseAs[Conf]() + isNoErr(t, err) + isEqual(t, "bar", config.Foo) +} + +func TestParseAsWithOptions(t *testing.T) { + config, err := ParseAsWithOptions[Conf](Options{ + Environment: map[string]string{ + "FOO": "not bar", + }, + }) + isNoErr(t, err) + isEqual(t, "not bar", config.Foo) +} + +type ConfRequired struct { + Foo string `env:"FOO,required"` +} + +func TestMust(t *testing.T) { + t.Run("error", func(t *testing.T) { + defer func() { + err := recover() + isErrorWithMessage(t, err.(error), `env: required environment variable "FOO" is not set`) + }() + conf := Must(ParseAs[ConfRequired]()) + isEqual(t, "", conf.Foo) + }) + t.Run("success", func(t *testing.T) { + t.Setenv("FOO", "bar") + conf := Must(ParseAs[ConfRequired]()) + isEqual(t, "bar", conf.Foo) + }) +} + func isTrue(tb testing.TB, b bool) { tb.Helper() diff --git a/go.mod b/go.mod index 67c4c80..5aea115 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/caarlos0/env/v10 -go 1.17 +go 1.18