From 56aa4efb6081c8a0605ee6822be605c43f7d80dd Mon Sep 17 00:00:00 2001 From: Niklas Johansson Date: Wed, 22 Sep 2021 13:26:58 +0200 Subject: [PATCH] tea: Add StartReturningModel() Sometimes it is useful to obtain the final model after the program has finished. Add StartReturningModel() (Model, error), so that it is possible to obtain the final model. Make sure to keep the original Start() error function, so that everything is backwards compatible. --- tea.go | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/tea.go b/tea.go index 14c3802..8c9c9db 100644 --- a/tea.go +++ b/tea.go @@ -249,8 +249,8 @@ func NewProgram(model Model, opts ...ProgramOption) *Program { return p } -// Start initializes the program. -func (p *Program) Start() error { +// StartReturningModel initializes the program. Returns the final model. +func (p *Program) StartReturningModel() (Model, error) { p.msgs = make(chan Msg) var ( @@ -291,7 +291,7 @@ func (p *Program) Start() error { // Open a new TTY, by request f, err := openInputTTY() if err != nil { - return err + return p.initialModel, err } defer f.Close() // nolint:errcheck @@ -314,7 +314,7 @@ func (p *Program) Start() error { f, err := openInputTTY() if err != nil { - return err + return p.initialModel, err } defer f.Close() // nolint:errcheck @@ -355,7 +355,7 @@ func (p *Program) Start() error { // Check if output is a TTY before entering raw mode, hiding the cursor and // so on. if err := p.initTerminal(); err != nil { - return err + return p.initialModel, err } // If no renderer is set use the standard one. @@ -396,7 +396,7 @@ func (p *Program) Start() error { cancelReader, err := newCancelReader(p.input) if err != nil { - return err + return model, err } defer cancelReader.Close() // nolint:errcheck @@ -483,8 +483,8 @@ func (p *Program) Start() error { cancelContext() waitForGoroutines(cancelReader.Cancel()) p.shutdown(false) + return model, err - return err case msg := <-p.msgs: // Handle special internal messages. @@ -493,7 +493,7 @@ func (p *Program) Start() error { cancelContext() waitForGoroutines(cancelReader.Cancel()) p.shutdown(false) - return nil + return model, nil case batchMsg: for _, cmd := range msg { @@ -537,6 +537,12 @@ func (p *Program) Start() error { } } +// Start initializes the program. Ignores the final model. +func (p *Program) Start() error { + _, err := p.StartReturningModel() + return err +} + // Send sends a message to the main update function, effectively allowing // messages to be injected from outside the program for interoperability // purposes.