func PromptConfirm(prompt string) (bool, error) { var ( input string err error ) prompt = prompt + " [y/N] " if liner.TerminalSupported() { lr := liner.NewLiner() defer lr.Close() input, err = lr.Prompt(prompt) } else { fmt.Print(prompt) input, err = bufio.NewReader(os.Stdin).ReadString('\n') fmt.Println() } if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { return true, nil } else { return false, nil } return false, err }
func newLightweightJSRE(libPath string, client comms.EthereumClient, interactive bool) *jsre { js := &jsre{ps1: "> "} js.wait = make(chan *big.Int) js.client = client js.ds = docserver.New("/") // update state in separare forever blocks js.re = re.New(libPath) if err := js.apiBindings(js); err != nil { utils.Fatalf("Unable to initialize console - %v", err) } if !liner.TerminalSupported() || !interactive { js.prompter = dumbterm{bufio.NewReader(os.Stdin)} } else { lr := liner.NewLiner() js.withHistory(func(hist *os.File) { lr.ReadHistory(hist) }) lr.SetCtrlCAborts(true) js.loadAutoCompletion() lr.SetWordCompleter(apiWordCompleter) lr.SetTabCompletionStyle(liner.TabPrints) js.prompter = lr js.atexit = func() { js.withHistory(func(hist *os.File) { hist.Truncate(0); lr.WriteHistory(hist) }) lr.Close() close(js.wait) } } return js }
func readPassword(prompt string, warnTerm bool) (string, error) { if liner.TerminalSupported() { lr := liner.NewLiner() defer lr.Close() return lr.PasswordPrompt(prompt) } if warnTerm { fmt.Println("!! Unsupported terminal, password will be echoed.") } fmt.Print(prompt) input, err := bufio.NewReader(os.Stdin).ReadString('\n') fmt.Println() return input, err }
func newJSRE(expanse *exp.Expanse, docRoot, corsDomain string, client comms.ExpanseClient, interactive bool, f xeth.Frontend) *jsre { js := &jsre{expanse: expanse, ps1: "> "} // set default cors domain used by startRpc from CLI flag js.corsDomain = corsDomain if f == nil { f = js } js.xeth = xeth.New(expanse, f) js.wait = js.xeth.UpdateState() js.client = client if clt, ok := js.client.(*comms.InProcClient); ok { if offeredApis, err := api.ParseApiString(shared.AllApis, codec.JSON, js.xeth, expanse); err == nil { clt.Initialize(api.Merge(offeredApis...)) } } // update state in separare forever blocks js.re = re.New(docRoot) if err := js.apiBindings(f); err != nil { utils.Fatalf("Unable to connect - %v", err) } if !liner.TerminalSupported() || !interactive { js.prompter = dumbterm{bufio.NewReader(os.Stdin)} } else { lr := liner.NewLiner() js.withHistory(expanse.DataDir, func(hist *os.File) { lr.ReadHistory(hist) }) lr.SetCtrlCAborts(true) js.loadAutoCompletion() lr.SetWordCompleter(apiWordCompleter) lr.SetTabCompletionStyle(liner.TabPrints) js.prompter = lr js.atexit = func() { js.withHistory(expanse.DataDir, func(hist *os.File) { hist.Truncate(0); lr.WriteHistory(hist) }) lr.Close() close(js.wait) } } return js }
func newUserInputReader() *userInputReader { r := new(userInputReader) // Get the original mode before calling NewLiner. // This is usually regular "cooked" mode where characters echo. normalMode, _ := liner.TerminalMode() // Turn on liner. It switches to raw mode. r.State = liner.NewLiner() rawMode, err := liner.TerminalMode() if err != nil || !liner.TerminalSupported() { r.supported = false } else { r.supported = true r.normalMode = normalMode r.rawMode = rawMode // Switch back to normal mode while we're not prompting. normalMode.ApplyMode() } return r }
// newTerminalPrompter creates a liner based user input prompter working off the // standard input and output streams. func newTerminalPrompter() *terminalPrompter { p := new(terminalPrompter) // Get the original mode before calling NewLiner. // This is usually regular "cooked" mode where characters echo. normalMode, _ := liner.TerminalMode() // Turn on liner. It switches to raw mode. p.State = liner.NewLiner() rawMode, err := liner.TerminalMode() if err != nil || !liner.TerminalSupported() { p.supported = false } else { p.supported = true p.normalMode = normalMode p.rawMode = rawMode // Switch back to normal mode while we're not prompting. normalMode.ApplyMode() } p.SetCtrlCAborts(true) p.SetTabCompletionStyle(liner.TabPrints) return p }
func newJSRE(ethereum *eth.Ethereum, libPath string, interactive bool, corsDomain string) *jsre { js := &jsre{ethereum: ethereum, ps1: "> "} // set default cors domain used by startRpc from CLI flag js.corsDomain = corsDomain js.xeth = xeth.New(ethereum, js) js.re = re.New(libPath) js.apiBindings() js.adminBindings() if !liner.TerminalSupported() || !interactive { js.prompter = dumbterm{bufio.NewReader(os.Stdin)} } else { lr := liner.NewLiner() js.withHistory(func(hist *os.File) { lr.ReadHistory(hist) }) lr.SetCtrlCAborts(true) js.prompter = lr js.atexit = func() { js.withHistory(func(hist *os.File) { hist.Truncate(0); lr.WriteHistory(hist) }) lr.Close() } } return js }