Skip to content

Commit 1cb1967

Browse files
sv-kozlovSergey Kozlov
and
Sergey Kozlov
authoredOct 8, 2024··
feat: set custom tag name for envPrefix (#332)
* Support other names for envPrefix Co-authored-by: Sergey Kozlov <s.kozlov@ctrl2go.solutions>
1 parent 76faca5 commit 1cb1967

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed
 

‎env.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ type Options struct {
140140
// TagName specifies another tag name to use rather than the default 'env'.
141141
TagName string
142142

143+
// PrefixTagName specifies another prefix tag name to use rather than the default 'envPrefix'.
144+
PrefixTagName string
145+
143146
// DefaultValueTagName specifies another default tag name to use rather than the default 'envDefault'.
144147
DefaultValueTagName string
145148

@@ -178,6 +181,7 @@ func (opts *Options) getRawEnv(s string) string {
178181
func defaultOptions() Options {
179182
return Options{
180183
TagName: "env",
184+
PrefixTagName: "envPrefix",
181185
DefaultValueTagName: "envDefault",
182186
Environment: toMap(os.Environ()),
183187
FuncMap: defaultTypeParsers(),
@@ -190,6 +194,9 @@ func customOptions(opt Options) Options {
190194
if opt.TagName == "" {
191195
opt.TagName = defOpts.TagName
192196
}
197+
if opt.PrefixTagName == "" {
198+
opt.PrefixTagName = defOpts.PrefixTagName
199+
}
193200
if opt.DefaultValueTagName == "" {
194201
opt.DefaultValueTagName = defOpts.DefaultValueTagName
195202
}
@@ -214,6 +221,7 @@ func optionsWithSliceEnvPrefix(opts Options, index int) Options {
214221
return Options{
215222
Environment: opts.Environment,
216223
TagName: opts.TagName,
224+
PrefixTagName: opts.PrefixTagName,
217225
DefaultValueTagName: opts.DefaultValueTagName,
218226
RequiredIfNoDef: opts.RequiredIfNoDef,
219227
OnSet: opts.OnSet,
@@ -228,10 +236,11 @@ func optionsWithEnvPrefix(field reflect.StructField, opts Options) Options {
228236
return Options{
229237
Environment: opts.Environment,
230238
TagName: opts.TagName,
239+
PrefixTagName: opts.PrefixTagName,
231240
DefaultValueTagName: opts.DefaultValueTagName,
232241
RequiredIfNoDef: opts.RequiredIfNoDef,
233242
OnSet: opts.OnSet,
234-
Prefix: opts.Prefix + field.Tag.Get("envPrefix"),
243+
Prefix: opts.Prefix + field.Tag.Get(opts.PrefixTagName),
235244
UseFieldNameByDefault: opts.UseFieldNameByDefault,
236245
FuncMap: opts.FuncMap,
237246
rawEnvVars: opts.rawEnvVars,

‎env_test.go

+23
Original file line numberDiff line numberDiff line change
@@ -2191,3 +2191,26 @@ func TestParseWithOptionsRenamedDefault(t *testing.T) {
21912191
isNoErr(t, Parse(cfg))
21922192
isEqual(t, "foo", cfg.Str)
21932193
}
2194+
2195+
func TestParseWithOptionsRenamedPrefix(t *testing.T) {
2196+
type Config struct {
2197+
Str string `env:"STR"`
2198+
}
2199+
type ComplexConfig struct {
2200+
Foo Config `envPrefix:"FOO_" myPrefix:"BAR_"`
2201+
}
2202+
2203+
t.Setenv("FOO_STR", "101")
2204+
t.Setenv("BAR_STR", "202")
2205+
t.Setenv("APP_BAR_STR", "303")
2206+
2207+
cfg := &ComplexConfig{}
2208+
isNoErr(t, ParseWithOptions(cfg, Options{PrefixTagName: "myPrefix"}))
2209+
isEqual(t, "202", cfg.Foo.Str)
2210+
2211+
isNoErr(t, ParseWithOptions(cfg, Options{PrefixTagName: "myPrefix", Prefix: "APP_"}))
2212+
isEqual(t, "303", cfg.Foo.Str)
2213+
2214+
isNoErr(t, Parse(cfg))
2215+
isEqual(t, "101", cfg.Foo.Str)
2216+
}

0 commit comments

Comments
 (0)
Please sign in to comment.