diff --git a/acn.go b/acn.go index 26d522b..b972fdf 100644 --- a/acn.go +++ b/acn.go @@ -35,17 +35,6 @@ func isConnected(m model) (bool, tea.Msg) { } func turnAcnOn(m *model) tea.Msg { - if ok, msg := isConnected(*m); !ok { - switch msg.(type) { - case acnConnectingMsg: - return msg - case acnAlreadyOnlineMsg: - return msg - } - } - - m.acnState = connecting - mrand.New(mrand.NewSource(int64(time.Now().Nanosecond()))) port := mrand.Intn(1000) + 9600 controlPort := port + 1 @@ -113,22 +102,9 @@ func turnAcnOn(m *model) tea.Msg { } func turnAcnOff(m *model, quitProgram bool) tea.Msg { - switch m.acnState { - case offline: - if !quitProgram { - return acnOfflineMsg{} - } - case connecting: - return acnConnectingMsg{} - } - - if m.app != nil { + if m.acnState != offline { m.app.Shutdown() - } - - if m.acn != nil { m.acn.Close() } - return acnOffMsg{quitProgram: quitProgram} } diff --git a/model.go b/model.go index 608a3e3..fd5149a 100644 --- a/model.go +++ b/model.go @@ -263,6 +263,17 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds = append(cmds, m.sendStatusCmd(msg.output...)) case turnAcnOffMsg: + switch m.acnState { + case offline: + if !msg.quitProgram { + cmds = append(cmds, func() tea.Msg { return acnOfflineMsg{} }) + return m, tea.Batch(cmds...) + } + case connecting: + cmds = append(cmds, func() tea.Msg { return acnConnectingMsg{} }) + return m, tea.Batch(cmds...) + } + m.input.Reset() cmds = append(cmds, func() tea.Msg { return turnAcnOff(&m, msg.quitProgram) @@ -276,9 +287,19 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.acnState = offline case turnAcnOnMsg: - // TODO: stop if we're already connecting! - // state management is getting a little tricky :/ + switch m.acnState { + case connecting: + cmds = append(cmds, func() tea.Msg { return acnConnectingMsg{} }) + return m, tea.Batch(cmds...) + case connected: + cmds = append(cmds, func() tea.Msg { return acnAlreadyOnlineMsg{} }) + return m, tea.Batch(cmds...) + } + + m.acnState = connecting + m.input.Reset() + cmds = append(cmds, func() tea.Msg { return turnAcnOn(&m) }) diff --git a/model_test.go b/model_test.go index 7e8fe53..695796c 100644 --- a/model_test.go +++ b/model_test.go @@ -25,3 +25,10 @@ func TestCairdeOnOffWorks(t *testing.T) { tm.WaitFinished(t, teatest.WithFinalTimeout(time.Second)) } + +// test acn on and then off, clean +// test acn on and then quit, clean +// test acn on and then on, asks to hold +// test acn on, then off, asks to hold, wait, then off +// test acn on and then quit, asks to hold +// test acn off, tells it is off