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