feat: support multiple env variables (#349)
This commit is contained in:
+15
-7
@@ -165,16 +165,16 @@ func (c *Context) Validate() error { // nolint: gocyclo
|
||||
err := Visit(c.Model, func(node Visitable, next Next) error {
|
||||
switch node := node.(type) {
|
||||
case *Value:
|
||||
_, ok := os.LookupEnv(node.Tag.Env)
|
||||
if node.Enum != "" && (!node.Required || node.HasDefault || (node.Tag.Env != "" && ok)) {
|
||||
ok := atLeastOneEnvSet(node.Tag.Envs)
|
||||
if node.Enum != "" && (!node.Required || node.HasDefault || (len(node.Tag.Envs) != 0 && ok)) {
|
||||
if err := checkEnum(node, node.Target); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
case *Flag:
|
||||
_, ok := os.LookupEnv(node.Tag.Env)
|
||||
if node.Enum != "" && (!node.Required || node.HasDefault || (node.Tag.Env != "" && ok)) {
|
||||
ok := atLeastOneEnvSet(node.Tag.Envs)
|
||||
if node.Enum != "" && (!node.Required || node.HasDefault || (len(node.Tag.Envs) != 0 && ok)) {
|
||||
if err := checkEnum(node.Value, node.Target); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -890,9 +890,8 @@ func checkMissingPositionals(positional int, values []*Value) error {
|
||||
for ; positional < len(values); positional++ {
|
||||
arg := values[positional]
|
||||
// TODO(aat): Fix hardcoding of these env checks all over the place :\
|
||||
if arg.Tag.Env != "" {
|
||||
_, ok := os.LookupEnv(arg.Tag.Env)
|
||||
if ok {
|
||||
if len(arg.Tag.Envs) != 0 {
|
||||
if atLeastOneEnvSet(arg.Tag.Envs) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
@@ -997,3 +996,12 @@ func isValidatable(v reflect.Value) validatable {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func atLeastOneEnvSet(envs []string) bool {
|
||||
for _, env := range envs {
|
||||
if _, ok := os.LookupEnv(env); ok {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user