aboutsummaryrefslogtreecommitdiff
path: root/fsm.go
diff options
context:
space:
mode:
Diffstat (limited to 'fsm.go')
-rw-r--r--fsm.go57
1 files changed, 57 insertions, 0 deletions
diff --git a/fsm.go b/fsm.go
new file mode 100644
index 0000000..772a73d
--- /dev/null
+++ b/fsm.go
@@ -0,0 +1,57 @@
+package main
+
+import (
+ "bufio"
+ "io"
+ "log"
+)
+
+type stateFn func() stateFn
+
+type FSM struct {
+ events chan *Events
+ command chan *Command
+}
+
+func NewFSM(rw io.ReadWriter) *FSM {
+ events := make(chan *Events)
+ command := make(chan *Command)
+ go readEvents(rw, events)
+ go writeCommands(rw, command)
+ return &FSM{events: events, command: command}
+}
+
+func readEvents(r io.Reader, ch chan<- *Events) {
+ buf := bufio.NewReader(r)
+ for {
+ event := new(Events)
+ if err := Recv(buf, event); err != nil {
+ if err == io.ErrUnexpectedEOF {
+ continue
+ }
+ log.Println(err)
+ continue
+ }
+ ch <- event
+ }
+}
+
+func writeCommands(w io.Writer, ch <-chan *Command) {
+ for command := range ch {
+ if err := Send(w, command); err != nil {
+ if err == io.ErrUnexpectedEOF {
+ continue
+ }
+ log.Println(err)
+ }
+ }
+}
+
+func (f *FSM) Start() {
+ for state := f.initalState; state != nil; state = state() {
+ }
+}
+
+func (f *FSM) initalState() stateFn {
+ return nil
+}