@@ -123,37 +123,47 @@ func parseFlagTag(field reflect.StructField, opt opts) *Flag {
123123 return & flag
124124}
125125
126- func parseEnv (flagName string , field reflect.StructField , opt opts ) string {
127- ignoreEnvPrefix := false
128- envVar := flagToEnv (flagName , opt .flagDivider , opt .envDivider )
126+ func parseEnv (flagName string , field reflect.StructField , opt opts ) [] string {
127+ var envVars [] string
128+ flagEnvVar := flagToEnv (flagName , opt .flagDivider , opt .envDivider )
129129 if envTags := strings .Split (field .Tag .Get (defaultEnvTag ), "," ); len (envTags ) > 0 {
130130 switch envName := envTags [0 ]; envName {
131131 case "-" :
132- // if tag is `env:"-"` then won't fill flag from environment
133- envVar = ""
132+ return envVars
134133 case "" :
135134 // if tag is `env:""` then env var will be taken from flag name
135+ envVars = append (envVars , opt .envPrefix + flagEnvVar )
136136 default :
137137 // if tag is `env:"NAME"` then env var is envPrefix_flagPrefix_NAME
138138 // if tag is `env:"~NAME"` then env var is NAME
139- if strings .HasPrefix (envName , "~" ) {
140- envVar = envName [1 :]
141- ignoreEnvPrefix = true
142- } else {
143- envVar = envName
144- if opt .prefix != "" {
145- envVar = flagToEnv (
146- opt .prefix ,
147- opt .flagDivider ,
148- opt .envDivider ) + envVar
139+ for _ , envName := range envTags {
140+ ignoreEnvPrefix := false
141+ var envVar string
142+ if strings .HasPrefix (envName , "~" ) {
143+ envVar = envName [1 :]
144+ ignoreEnvPrefix = true
145+ } else {
146+ envVar = envName
147+ if opt .prefix != "" {
148+ envVar = flagToEnv (
149+ opt .prefix ,
150+ opt .flagDivider ,
151+ opt .envDivider ) + envVar
152+ }
153+ }
154+ if envVar != "" {
155+ if ! ignoreEnvPrefix {
156+ envVars = append (envVars , opt .envPrefix + envVar )
157+ } else {
158+ envVars = append (envVars , envVar )
159+ }
149160 }
150161 }
151162 }
163+ } else if flagEnvVar != "" {
164+ envVars = append (envVars , opt .envPrefix + flagEnvVar )
152165 }
153- if envVar != "" && opt .envPrefix != "" && ! ignoreEnvPrefix {
154- envVar = opt .envPrefix + envVar
155- }
156- return envVar
166+ return envVars
157167}
158168
159169// ParseStruct parses structure and returns list of flags based on this structure.
@@ -247,7 +257,7 @@ fields:
247257 continue fields
248258 }
249259
250- flag .EnvName = parseEnv (flag .Name , field , opt )
260+ flag .EnvNames = parseEnv (flag .Name , field , opt )
251261 flag .Usage = field .Tag .Get (opt .descTag )
252262 prefix := flag .Name + opt .flagDivider
253263 if field .Anonymous && opt .flatten {
0 commit comments