2014-02-09 18:40:51 +01:00
|
|
|
package goSam
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"fmt"
|
2014-02-10 19:27:24 +01:00
|
|
|
"net"
|
2014-02-09 18:40:51 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
type Client struct {
|
2014-02-10 21:01:55 +01:00
|
|
|
samConn net.Conn
|
2014-02-09 18:40:51 +01:00
|
|
|
|
|
|
|
fromSam *bufio.Reader
|
|
|
|
toSam *bufio.Writer
|
|
|
|
}
|
|
|
|
|
2014-02-10 19:27:24 +01:00
|
|
|
func NewDefaultClient() (*Client, error) {
|
|
|
|
return NewClient("localhost:7656")
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewClient(addr string) (*Client, error) {
|
|
|
|
conn, err := net.Dial("tcp", addr)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2014-02-09 18:40:51 +01:00
|
|
|
c := &Client{
|
2014-02-10 19:27:24 +01:00
|
|
|
samConn: conn,
|
|
|
|
fromSam: bufio.NewReader(conn),
|
|
|
|
toSam: bufio.NewWriter(conn),
|
2014-02-09 18:40:51 +01:00
|
|
|
}
|
|
|
|
return c, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Client) Hello() (err error) {
|
|
|
|
if _, err = c.toSam.WriteString("HELLO VERSION MIN=3.0 MAX=3.0\n"); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err = c.toSam.Flush(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
for {
|
|
|
|
line, err := c.fromSam.ReadString('\n')
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
reply, err := parseReply(line)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if reply.Topic != "HELLO" {
|
|
|
|
return fmt.Errorf("Unknown Reply: %+v\n", reply)
|
|
|
|
}
|
|
|
|
|
|
|
|
if reply.Pairs["RESULT"] != "OK" {
|
|
|
|
return fmt.Errorf("Handshake did not succeed")
|
|
|
|
}
|
|
|
|
|
|
|
|
break
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Client) Close() error {
|
|
|
|
return c.samConn.Close()
|
|
|
|
}
|