package input import ( "bufio" "fmt" "io" "os" "strings" "syscall" "golang.org/x/crypto/ssh/terminal" ) // Terminal is a terminal used for input. If `nil`, stdin is used. var Terminal *terminal.Terminal // ReadLine reads line from the input without trailing '\n' func ReadLine(w io.Writer, prompt string) (string, error) { if Terminal != nil { _, err := Terminal.Write([]byte(prompt)) if err != nil { return "", err } raw, err := Terminal.ReadLine() return strings.TrimRight(raw, "\n"), err } fmt.Fprint(w, prompt) buf := bufio.NewReader(os.Stdin) return buf.ReadString('\n') } // ReadPassword reads user password with prompt. func ReadPassword(w io.Writer, prompt string) (string, error) { if Terminal != nil { return Terminal.ReadPassword(prompt) } fmt.Fprint(w, prompt) rawPass, err := terminal.ReadPassword(syscall.Stdin) if err != nil { return "", err } fmt.Fprintln(w) return strings.TrimRight(string(rawPass), "\n"), nil }