From 839b5789e3c6f946835cd3a6800df2804fc8e647 Mon Sep 17 00:00:00 2001 From: Stephen McQuay Date: Mon, 10 Mar 2014 23:25:11 -0700 Subject: [PATCH] Implemented multiple encoders/decoders I really think we're close here; once we have gob server-side this might just work. --- robot.go | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/robot.go b/robot.go index 6eaa961..16634a1 100644 --- a/robot.go +++ b/robot.go @@ -1,6 +1,8 @@ package main import ( + "encoding/gob" + "encoding/json" "errors" "fmt" "log" @@ -45,6 +47,14 @@ type robot struct { wg *sync.WaitGroup } +type encoder interface { + Encode(v interface{}) error +} + +type decoder interface { + Decode(v interface{}) error +} + func (r *robot) negociate() (err error) { if *verbose { log.Printf("%s: trying to connect to game '%s'", r.name, r.game.Name) @@ -158,19 +168,30 @@ func (r *robot) play() { log.Printf("%s: starting loop", r.name) + var enc encoder + var dec decoder + + if r.game.Encoding == "json" { + enc = json.NewEncoder(r.ws) + dec = json.NewDecoder(r.ws) + } else { + enc = gob.NewEncoder(r.ws) + dec = gob.NewDecoder(r.ws) + } + for { r.speed = float32(maxSpeed) if *verbose { log.Printf("%s: about to wait on boardstate", r.name) } - err = websocket.JSON.Receive(r.ws, &r.boardstate) - if *verbose { - log.Printf("%s: one recv boardstate", r.name) - } + err = dec.Decode(&r.boardstate) if err != nil { log.Printf("%s: Connection lost", r.name) return } + if *verbose { + log.Printf("%s: one recv boardstate", r.name) + } // TODO: I need a truly-verbose flag? // if *verbose { // log.Printf("\n\n%#v\n\n", r.boardstate) @@ -199,7 +220,7 @@ func (r *robot) play() { FireAt: r.fireat, }, } - err = websocket.JSON.Send(r.ws, instruction) + err = enc.Encode(instruction) if err != nil { log.Println(err) return