From 528d38d82ff62aaa282812ae8b7a9fcc30691213 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 3 Sep 2017 00:54:03 +0200 Subject: Add fsm --- fsm.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 fsm.go (limited to 'fsm.go') 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 +} -- cgit v1.2.3