-
Notifications
You must be signed in to change notification settings - Fork 0
/
httproc.go
70 lines (59 loc) · 1.2 KB
/
httproc.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main
import (
"bufio"
"fmt"
"os"
"os/exec"
"gopkg.in/pipe.v2"
)
func runScanLoop(scanner *bufio.Scanner) {
for scanner.Scan() {
if text := scanner.Text(); text != "\"\"" {
fmt.Printf("%v\n", text)
}
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading command input:", err)
}
}
func runWatchCmdLoop(cmd *exec.Cmd, term chan bool) {
cmd.Wait()
fmt.Println("Process exit detected")
term <- true
}
func main() {
ruby := "puts 'Start'; while str = gets; exit if str.start_with?('quit'); p str.chomp.reverse; end"
cmd := exec.Command("ruby", "-e", ruby)
stdout, err := cmd.StdoutPipe()
stdin, err2 := cmd.StdinPipe()
if err != nil || err2 != nil {
panic(err)
}
if err := cmd.Start(); err != nil {
panic(err)
}
// Invoke first input
fmt.Fprint(stdin, "\n")
scanner := bufio.NewScanner(stdout)
go runScanLoop(scanner)
term := make(chan bool, 1)
go runWatchCmdLoop(cmd, term)
go func() {
<-term
fmt.Println("Exited...")
os.Exit(0)
}()
for {
p := pipe.Line(
pipe.Read(os.Stdin),
pipe.Write(stdin),
)
if err := pipe.Run(p); err != nil {
panic(err)
}
if s, err := pipe.Output(p); err != nil {
fmt.Println(s)
panic(err)
}
}
}