github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/console/prompter.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:33</date> 10 //</624342612765052928> 11 12 13 package console 14 15 import ( 16 "fmt" 17 "strings" 18 19 "github.com/peterh/liner" 20 ) 21 22 //stdin保存stdin行阅读器(也使用stdout进行打印提示)。 23 // 24 var Stdin = newTerminalPrompter() 25 26 //userprompter定义控制台提示用户 27 //各种类型的输入。 28 type UserPrompter interface { 29 //promptinput向用户显示给定的提示并请求一些文本 30 // 31 PromptInput(prompt string) (string, error) 32 33 // 34 //要输入的数据,但不能回送到终端。 35 //方法返回用户提供的输入。 36 PromptPassword(prompt string) (string, error) 37 38 //promptconfirm向用户显示给定的提示并请求布尔值 39 //做出选择,返回该选择。 40 PromptConfirm(prompt string) (bool, error) 41 42 //setHistory设置prompter允许的输入回滚历史记录 43 //the user to scroll back to. 44 SetHistory(history []string) 45 46 //AppendHistory将一个条目追加到回滚历史记录。应该叫它 47 //如果且仅当追加提示是有效命令时。 48 AppendHistory(command string) 49 50 //清除历史记录清除整个历史记录 51 ClearHistory() 52 53 //setwordCompleter设置提示器将调用的完成函数 54 //当用户按Tab键时获取完成候选项。 55 SetWordCompleter(completer WordCompleter) 56 } 57 58 //WordCompleter使用光标位置获取当前编辑的行,并 59 //返回要完成的部分单词的完成候选词。如果 60 //电话是“你好,我!!光标在第一个“!”之前,(“你好, 61 //哇!!,9)传递给可能返回的完成者(“hello,”,“world”, 62 //“Word”},“!!!!“你好,世界!!. 63 type WordCompleter func(line string, pos int) (string, []string, string) 64 65 //TerminalPrompter是一个由liner包支持的用户Prompter。它支持 66 //提示用户输入各种输入,其中包括不回显密码 67 //输入。 68 type terminalPrompter struct { 69 *liner.State 70 warned bool 71 supported bool 72 normalMode liner.ModeApplier 73 rawMode liner.ModeApplier 74 } 75 76 // 77 //standard input and output streams. 78 func newTerminalPrompter() *terminalPrompter { 79 p := new(terminalPrompter) 80 //在调用newliner之前获取原始模式。 81 //这通常是常规的“煮熟”模式,其中字符回音。 82 normalMode, _ := liner.TerminalMode() 83 //打开班轮。它切换到原始模式。 84 p.State = liner.NewLiner() 85 rawMode, err := liner.TerminalMode() 86 if err != nil || !liner.TerminalSupported() { 87 p.supported = false 88 } else { 89 p.supported = true 90 p.normalMode = normalMode 91 p.rawMode = rawMode 92 //在不提示的情况下切换回正常模式。 93 normalMode.ApplyMode() 94 } 95 p.SetCtrlCAborts(true) 96 p.SetTabCompletionStyle(liner.TabPrints) 97 p.SetMultiLineMode(true) 98 return p 99 } 100 101 //promptinput向用户显示给定的提示并请求一些文本 102 //要输入的数据,返回用户的输入。 103 func (p *terminalPrompter) PromptInput(prompt string) (string, error) { 104 if p.supported { 105 p.rawMode.ApplyMode() 106 defer p.normalMode.ApplyMode() 107 } else { 108 //liner试图巧妙地打印提示 109 //如果输入被重定向,则不打印任何内容。 110 //总是通过打印提示来取消智能。 111 fmt.Print(prompt) 112 prompt = "" 113 defer fmt.Println() 114 } 115 return p.State.Prompt(prompt) 116 } 117 118 //提示密码向用户显示给定的提示并请求一些文本 119 //要输入的数据,但不能回送到终端。 120 //方法返回用户提供的输入。 121 func (p *terminalPrompter) PromptPassword(prompt string) (passwd string, err error) { 122 if p.supported { 123 p.rawMode.ApplyMode() 124 defer p.normalMode.ApplyMode() 125 return p.State.PasswordPrompt(prompt) 126 } 127 if !p.warned { 128 fmt.Println("!! Unsupported terminal, password will be echoed.") 129 p.warned = true 130 } 131 //正如在提示中一样,在这里处理打印提示,而不是依赖于衬线。 132 fmt.Print(prompt) 133 passwd, err = p.State.Prompt("") 134 fmt.Println() 135 return passwd, err 136 } 137 138 //promptconfirm向用户显示给定的提示并请求布尔值 139 //做出选择,返回该选择。 140 func (p *terminalPrompter) PromptConfirm(prompt string) (bool, error) { 141 input, err := p.Prompt(prompt + " [y/N] ") 142 if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { 143 return true, nil 144 } 145 return false, err 146 } 147 148 //setHistory设置prompter允许的输入回滚历史记录 149 //要回滚到的用户。 150 func (p *terminalPrompter) SetHistory(history []string) { 151 p.State.ReadHistory(strings.NewReader(strings.Join(history, "\n"))) 152 } 153 154 //AppendHistory将一个条目追加到回滚历史记录。 155 func (p *terminalPrompter) AppendHistory(command string) { 156 p.State.AppendHistory(command) 157 } 158 159 //清除历史记录清除整个历史记录 160 func (p *terminalPrompter) ClearHistory() { 161 p.State.ClearHistory() 162 } 163 164 //setwordCompleter设置提示器将调用的完成函数 165 //当用户按Tab键时获取完成候选项。 166 func (p *terminalPrompter) SetWordCompleter(completer WordCompleter) { 167 p.State.SetWordCompleter(liner.WordCompleter(completer)) 168 } 169