2c2afe38b981a9616bfe71e8e387bb93b536566a
[svn42.git] / go / door_client_zmq / main.go
1 // (c) Bernhard Tittelbach, 2013
2
3 package main
4
5 import (
6     "fmt"
7     "os"
8     "flag"
9     "log"
10     "bufio"
11     "bytes"
12 )
13
14
15 // ---------- Main Code -------------
16
17 var (
18     cmd_port_ string
19     sub_port_ string
20 )
21
22 func usage() {
23     fmt.Fprintf(os.Stderr, "Usage: door_client_zmq\n")
24     flag.PrintDefaults()
25 }
26
27 func init() {
28     flag.StringVar(&cmd_port_, "cmdport", "tcp://localhost:5555", "zmq command socket path")
29     flag.StringVar(&sub_port_, "pubport", "gmp://*:6666", "zmq subscribe/listen socket path")
30     flag.Usage = usage
31     flag.Parse()
32 }
33
34 func LineReader(out chan <- [][]byte, stdin * os.File) {
35     linescanner := bufio.NewScanner(stdin)
36     linescanner.Split(bufio.ScanLines)
37     for linescanner.Scan() {
38         if err := linescanner.Err(); err != nil {
39             log.Print(err)
40             close(out)
41             return
42         }
43         text := bytes.Fields([]byte(linescanner.Text()))
44         if len(text) == 0 {
45             continue
46         }
47         out <- text
48     }
49 }
50
51 func main() {
52     cmd_chans, sub_chans := ZmqsInit(cmd_port_, sub_port_)
53     defer cmd_chans.Close()
54     defer sub_chans.Close()
55     var listen bool
56     var ignore_next bool
57
58     user_input_chan := make(chan [][]byte, 1)
59     go LineReader(user_input_chan, os.Stdin)
60     defer os.Stdin.Close()
61
62     for {
63         select {
64         case input, input_open := (<- user_input_chan):
65             if input_open {
66                 if len(input) == 0 { continue }
67                  switch string(input[0]) {
68                     case "listen":
69                         listen = true
70                         fmt.Println("Now listening")
71                     case "quit":
72                         break
73                     default:
74                         ignore_next = true
75                         cmd_chans.Out() <- input
76                         fmt.Println( <- cmd_chans.In())
77                 }
78             } else {
79                 break
80             }
81         case pubsubstuff := <- sub_chans.In():
82             if ignore_next {
83                 ignore_next = false
84                 continue
85             }
86             if listen {
87                 fmt.Println(pubsubstuff)
88             }
89         }
90     }
91 }