@@ -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+
10931168func getTagFieldName (field reflect.StructField ) (string , bool ) {
10941169 tag , ok := field .Tag .Lookup ("json" )
10951170 if ok {
0 commit comments