door_client_zmq
[svn42.git] / go / door_client_zmq / main.go
diff --git a/go/door_client_zmq/main.go b/go/door_client_zmq/main.go
new file mode 100644 (file)
index 0000000..4db2f1e
--- /dev/null
@@ -0,0 +1,91 @@
+// (c) Bernhard Tittelbach, 2013
+
+package main
+
+import (
+    "fmt"
+    "os"
+    "flag"
+    "log"
+    "bufio"
+    "bytes"
+)
+
+
+// ---------- Main Code -------------
+
+var (
+    cmd_port_ string
+    sub_port_ string
+)
+
+func usage() {
+    fmt.Fprintf(os.Stderr, "Usage: door_client_zmq\n")
+    flag.PrintDefaults()
+}
+
+func init() {
+    flag.StringVar(&cmd_port_, "cmdport", "tcp://localhost:5555", "zmq command socket path")
+    flag.StringVar(&sub_port_, "pubport", "gmp://*:6666", "zmq subscribe/listen socket path")
+    flag.Usage = usage
+    flag.Parse()
+}
+
+func LineReader(out chan <- [][]byte, stdin * os.File) {
+    linescanner := bufio.NewScanner(stdin)
+    linescanner.Split(bufio.ScanLines)
+    for linescanner.Scan() {
+        if err := linescanner.Err(); err != nil {
+            log.Print(err)
+            close(out)
+            return
+        }
+        text := bytes.Fields([]byte(linescanner.Text()))
+        if len(text) == 0 {
+            continue
+        }
+        out <- text
+    }
+}
+
+func main() { 
+    cmd_chans, sub_chans := ZmqsInit(cmd_port_, sub_port_)
+    defer cmd_chans.Close()
+    defer sub_chans.Close()
+    var listen bool
+    var ignore_next bool
+
+    user_input_chan := make(chan [][]byte, 1)
+    go LineReader(user_input_chan, os.Stdin)
+    defer os.Stdin.Close()
+    
+    for {
+        select {
+        case input, input_open := (<- user_input_chan):
+            if input_open {
+                if len(input) == 0 { continue }
+                 switch string(input[0]) {
+                    case "listen":
+                        listen = true
+                        fmt.Println("Now listening")
+                    case "quit":
+                        break
+                    default:
+                        ignore_next = true
+                        cmd_chans.Out() <- input
+                        fmt.Println( <- cmd_chans.In())
+                }
+            } else {
+                break
+            }
+        case pubsubstuff := <- sub_chans.In():
+            if ignore_next {
+                ignore_next = false
+                continue
+            }
+            if listen {
+                fmt.Println(pubsubstuff)
+            }
+        }
+    }
+}