Browse Source

beam/examples/beamsh: 'prompt' asks the user for a value and sends it.

Docker-DCO-1.1-Signed-off-by: Solomon Hykes <solomon@docker.com> (github: shykes)
Solomon Hykes 11 years ago
parent
commit
a2b88b4915
1 changed files with 33 additions and 0 deletions
  1. 33 0
      pkg/beam/examples/beamsh/beamsh.go

+ 33 - 0
pkg/beam/examples/beamsh/beamsh.go

@@ -361,6 +361,39 @@ func GetHandler(name string) Handler {
 				}
 			}
 		}
+	} else if name == "prompt" {
+		return func(args []string, in beam.Receiver, out beam.Sender) {
+			stdout, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stdout").Set("fromcmd", args...).Bytes())
+			if err != nil {
+				return
+			}
+			defer stdout.Close()
+			stderr, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stderr").Set("fromcmd", args...).Bytes())
+			if err != nil {
+				return
+			}
+			defer stderr.Close()
+			if len(args) < 2 {
+				fmt.Fprintf(stderr, "usage: %s PROMPT...\n", args[0])
+				return
+			}
+			if !term.IsTerminal(0) {
+				fmt.Fprintf(stderr, "can't prompt: no tty available...\n")
+				return
+			}
+			fmt.Printf("%s: ", strings.Join(args[1:], " "))
+			oldState, _ := term.SaveState(0)
+			term.DisableEcho(0, oldState)
+			line, _, err := bufio.NewReader(os.Stdin).ReadLine()
+			if err != nil {
+				fmt.Fprintln(stderr, err.Error())
+				return
+			}
+			val := string(line)
+			fmt.Printf("\n")
+			term.RestoreTerminal(0, oldState)
+			out.Send(data.Empty().Set("fromcmd", args...).Set("value", val).Bytes(), nil)
+		}
 	} else if name == "stdio" {
 		return func(args []string, in beam.Receiver, out beam.Sender) {
 			stdout, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stdout").Set("fromcmd", args...).Bytes())