Skip to content

Commit edf4afd

Browse files
authored
Validate prompt skipped fields (#1475)
1 parent ea3b45a commit edf4afd

File tree

3 files changed

+82
-5
lines changed

3 files changed

+82
-5
lines changed

cli/cmd/lib_cli_config.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,9 @@ func promptLocalEnv(env *cliconfig.Environment, defaults cliconfig.Environment)
414414
}
415415

416416
func promptAWSEnv(env *cliconfig.Environment, defaults cliconfig.Environment) error {
417-
fmt.Print("you can get your cortex operator endpoint using `cortex cluster info` if you already have a cortex cluster running, otherwise run `cortex cluster up` to create a cortex cluster\n\n")
417+
if env.OperatorEndpoint == nil {
418+
fmt.Print("you can get your cortex operator endpoint using `cortex cluster info` if you already have a cortex cluster running, otherwise run `cortex cluster up` to create a cortex cluster\n\n")
419+
}
418420
for true {
419421
err := cr.ReadPrompt(env, &cr.PromptValidation{
420422
SkipNonEmptyFields: true,

pkg/lib/configreader/int32_ptr.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@ func makeInt32ValValidation(v *Int32PtrValidation) *Int32Validation {
5050

5151
func Int32Ptr(inter interface{}, v *Int32PtrValidation) (*int32, error) {
5252
if inter == nil {
53-
return ValidateInt32PtrProvdied(nil, v)
53+
return ValidateInt32PtrProvided(nil, v)
5454
}
5555
casted, castOk := cast.InterfaceToInt32(inter)
5656
if !castOk {
5757
return nil, ErrorInvalidPrimitiveType(inter, PrimTypeInt)
5858
}
59-
return ValidateInt32PtrProvdied(&casted, v)
59+
return ValidateInt32PtrProvided(&casted, v)
6060
}
6161

6262
func Int32PtrFromInterfaceMap(key string, iMap map[string]interface{}, v *Int32PtrValidation) (*int32, error) {
@@ -99,7 +99,7 @@ func Int32PtrFromStr(valStr string, v *Int32PtrValidation) (*int32, error) {
9999
if !castOk {
100100
return nil, ErrorInvalidPrimitiveType(valStr, PrimTypeInt)
101101
}
102-
return ValidateInt32PtrProvdied(&casted, v)
102+
return ValidateInt32PtrProvided(&casted, v)
103103
}
104104

105105
func Int32PtrFromEnv(envVarName string, v *Int32PtrValidation) (*int32, error) {
@@ -172,7 +172,7 @@ func ValidateInt32PtrMissing(v *Int32PtrValidation) (*int32, error) {
172172
return validateInt32Ptr(v.Default, v)
173173
}
174174

175-
func ValidateInt32PtrProvdied(val *int32, v *Int32PtrValidation) (*int32, error) {
175+
func ValidateInt32PtrProvided(val *int32, v *Int32PtrValidation) (*int32, error) {
176176
if !v.AllowExplicitNull && val == nil {
177177
return nil, ErrorCannotBeNull(v.Required)
178178
}

pkg/lib/configreader/reader.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,72 @@ func ReadPrompt(dest interface{}, promptValidation *PromptValidation) error {
585585
var err error
586586
shouldPrintTrailingNewLine := false
587587

588+
// Validate any skipped fields first, so that any errors are returned before prompting
589+
if promptValidation.SkipNonEmptyFields {
590+
for _, promptItemValidation := range promptValidation.PromptItemValidations {
591+
v := reflect.ValueOf(dest).Elem().FieldByName(promptItemValidation.StructField)
592+
if !v.IsZero() {
593+
if promptItemValidation.StringValidation != nil && promptItemValidation.Parser == nil {
594+
if _, err := ValidateString(v.Interface().(string), promptItemValidation.StringValidation); err != nil {
595+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
596+
}
597+
} else if promptItemValidation.StringPtrValidation != nil && promptItemValidation.Parser == nil {
598+
if _, err := ValidateStringPtrProvided(v.Interface().(*string), promptItemValidation.StringPtrValidation); err != nil {
599+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
600+
}
601+
} else if promptItemValidation.BoolValidation != nil {
602+
if _, err := ValidateBool(v.Interface().(bool), promptItemValidation.BoolValidation); err != nil {
603+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
604+
}
605+
} else if promptItemValidation.BoolPtrValidation != nil {
606+
if _, err := ValidateBoolPtrProvided(v.Interface().(*bool), promptItemValidation.BoolPtrValidation); err != nil {
607+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
608+
}
609+
} else if promptItemValidation.IntValidation != nil {
610+
if _, err := ValidateInt(v.Interface().(int), promptItemValidation.IntValidation); err != nil {
611+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
612+
}
613+
} else if promptItemValidation.IntPtrValidation != nil {
614+
if _, err := ValidateIntPtrProvided(v.Interface().(*int), promptItemValidation.IntPtrValidation); err != nil {
615+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
616+
}
617+
} else if promptItemValidation.Int32Validation != nil {
618+
if _, err := ValidateInt32(v.Interface().(int32), promptItemValidation.Int32Validation); err != nil {
619+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
620+
}
621+
} else if promptItemValidation.Int32PtrValidation != nil {
622+
if _, err := ValidateInt32PtrProvided(v.Interface().(*int32), promptItemValidation.Int32PtrValidation); err != nil {
623+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
624+
}
625+
} else if promptItemValidation.Int64Validation != nil {
626+
if _, err := ValidateInt64(v.Interface().(int64), promptItemValidation.Int64Validation); err != nil {
627+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
628+
}
629+
} else if promptItemValidation.Int64PtrValidation != nil {
630+
if _, err := ValidateInt64PtrProvided(v.Interface().(*int64), promptItemValidation.Int64PtrValidation); err != nil {
631+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
632+
}
633+
} else if promptItemValidation.Float32Validation != nil {
634+
if _, err := ValidateFloat32(v.Interface().(float32), promptItemValidation.Float32Validation); err != nil {
635+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
636+
}
637+
} else if promptItemValidation.Float32PtrValidation != nil {
638+
if _, err := ValidateFloat32PtrProvided(v.Interface().(*float32), promptItemValidation.Float32PtrValidation); err != nil {
639+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
640+
}
641+
} else if promptItemValidation.Float64Validation != nil {
642+
if _, err := ValidateFloat64(v.Interface().(float64), promptItemValidation.Float64Validation); err != nil {
643+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
644+
}
645+
} else if promptItemValidation.Float64PtrValidation != nil {
646+
if _, err := ValidateFloat64PtrProvided(v.Interface().(*float64), promptItemValidation.Float64PtrValidation); err != nil {
647+
return errors.Wrap(err, inferPromptFieldName(reflect.TypeOf(dest), promptItemValidation.StructField))
648+
}
649+
}
650+
}
651+
}
652+
}
653+
588654
for _, promptItemValidation := range promptValidation.PromptItemValidations {
589655
if promptValidation.SkipNonEmptyFields {
590656
v := reflect.ValueOf(dest).Elem().FieldByName(promptItemValidation.StructField)
@@ -1090,6 +1156,15 @@ func inferKey(structType reflect.Type, typeStructField string, typeKey string) s
10901156
return typeStructField
10911157
}
10921158

1159+
func inferPromptFieldName(structType reflect.Type, typeStructField string) string {
1160+
field, _ := structType.Elem().FieldByName(typeStructField)
1161+
tag, ok := getTagFieldName(field)
1162+
if ok {
1163+
return tag
1164+
}
1165+
return typeStructField
1166+
}
1167+
10931168
func getTagFieldName(field reflect.StructField) (string, bool) {
10941169
tag, ok := field.Tag.Lookup("json")
10951170
if ok {

0 commit comments

Comments
 (0)