package cmd import ( "bufio" "fmt" "os" "syscall" "git.iamthefij.com/iamthefij/slog" "github.com/spf13/cobra" "github.com/spf13/viper" "golang.org/x/term" ) func readPrompt(prompt string, reader *bufio.Reader, secret bool) string { fmt.Printf("%s? ", prompt) var value string var err error if secret { byteValue, err := term.ReadPassword(syscall.Stdin) if err == nil { value = string(byteValue) } } else { value, err = reader.ReadString('\n') } slog.OnErrFatalf(err, "failed reading %s from input", prompt) return value } func promptConfig(configKey string, reader *bufio.Reader, secret bool) { hostname := readPrompt(configKey, reader, secret) viper.Set(configKey, hostname) } var loginCmd = &cobra.Command{ Use: "login", Short: "Login to an imap server", Long: `Login to an imap server and store configuration`, Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { reader := bufio.NewReader(os.Stdin) promptConfig("hostname", reader, false) promptConfig("username", reader, false) promptConfig("password", reader, true) }, }