survey
survey copied to clipboard
after validate failure, answer value not output or clean
What operating system and terminal are you using? macos iterm2 zsh github.com/AlecAivazis/survey/v2 v2.2.9
An example that showcases the bug.
package main
import (
"errors"
"fmt"
"net/url"
"github.com/AlecAivazis/survey/v2"
)
func main() {
prompt := &survey.Input{Message: "please input a url"}
var answer url.URL
err := survey.AskOne(prompt, &answer,survey.WithValidator(urlValidate))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(answer)
}
func urlValidate(val interface{}) error {
urlStr, ok := val.(string)
if !ok || urlStr == "" {
return errors.New("please input correct url")
}
res, err := url.Parse(urlStr)
if err != nil || res.Scheme == "" || res.Host == "" || res.Path == "" {
return errors.New("please input correct url")
}
return nil
}
What did you expect to see?
i inputed "aaa", then press Enter, the validate not passed, and the answer output has cleard, but when i continue to type "bbb", the "aaa" will show, continue press Enter, The answer is once again cleared, but when i input "http", the "aaabbb" will show. I think this is a confused behavior, is my code wrong? i also tested survey.Required, it has same behavior.
What did you see instead?
after validate failure, old answer should show or clean
Hey @zigitn - sorry you ran into this. If you want to try to dig a little deeper, here is where the validation loop happens and here is where the input is defined.
If you need any more help, feel free to reach out on the gophers slack!
i found a simple solution, in this file https://github.com/AlecAivazis/survey/blob/master/input.go
insert i.answer = "" to line 118
but I didn't test whether there is a non-expected impact on other parts, Because I didn't read all code, do you think this modification has non-expected impact?
I tested the #351 branch now with my app and it does fix the bug, which I've also been seeing :+1:
@zigitn in the original test code, declaring var answer url.URL does not work — after validation passes, AskOne returns error could not find field matching. Declaring var answer string works and prints the accepted answer.
If you want to access the url.Parse() result, you should make the validator save it somewhere. Or parse the string a 2nd time after AskOne returns...
Hello guys, bug still exist
Hello guys, bug still exist
I did a simple fix before, https://github.com/AlecAivazis/survey/pull/351, but I don’t have time to complete the test cases. If you want, you can take over my work.
I was not able to reproduce this with the latest version, is this fixed? I was gonna pick it up if it is still an issue.