gum/spin/command.go
Aaron Korte 01c7d96945
feat: pass stderr (#64)
* feat: pass stderr

Pass stderr from the command run by gum spin analog to how stdout is passed.

#63

* Apply suggestions from code review

* Update spin/spin.go

* fix(spin): Add stderr to output

When `--show-output` is passed we should display all the output of the
command and allow scripters to control `stderr` and `stdout` how they
want.

For example, if a user wants only `stdout` they can redirect stderr to
`/dev/null`:

```
gum spin --show-output -- <action> 2> /dev/null
```

Co-authored-by: Maas Lalani <maas@lalani.dev>
2022-08-01 13:24:01 -04:00

50 lines
1,008 B
Go

package spin
import (
"fmt"
"os"
"github.com/alecthomas/kong"
"github.com/charmbracelet/bubbles/spinner"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/gum/internal/exit"
"github.com/charmbracelet/gum/style"
)
// Run provides a shell script interface for the spinner bubble.
// https://github.com/charmbracelet/bubbles/spinner
func (o Options) Run() error {
s := spinner.New()
s.Style = o.SpinnerStyle.ToLipgloss()
s.Spinner = spinnerMap[o.Spinner]
m := model{
spinner: s,
title: o.TitleStyle.ToLipgloss().Render(o.Title),
command: o.Command,
}
p := tea.NewProgram(m)
mm, err := p.StartReturningModel()
m = mm.(model)
if err != nil {
return err
}
if o.ShowOutput {
fmt.Fprint(os.Stdout, m.stdout)
fmt.Fprint(os.Stderr, m.stderr)
}
if m.aborted {
return exit.ErrAborted
}
os.Exit(m.status)
return nil
}
// BeforeReset hook. Used to unclutter style flags.
func (o Options) BeforeReset(ctx *kong.Context) error {
return style.HideFlags(ctx)
}