| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- // Package uiutil provides utility functions for UI message handling.
- // TODO: Move to internal/ui/<appropriate_location> once the new UI migration
- // is finalized.
- package uiutil
- import (
- "context"
- "errors"
- "log/slog"
- "os/exec"
- "time"
- tea "charm.land/bubbletea/v2"
- "mvdan.cc/sh/v3/shell"
- )
- type Cursor interface {
- Cursor() *tea.Cursor
- }
- func CmdHandler(msg tea.Msg) tea.Cmd {
- return func() tea.Msg {
- return msg
- }
- }
- func ReportError(err error) tea.Cmd {
- slog.Error("Error reported", "error", err)
- return CmdHandler(InfoMsg{
- Type: InfoTypeError,
- Msg: err.Error(),
- })
- }
- type InfoType int
- const (
- InfoTypeInfo InfoType = iota
- InfoTypeSuccess
- InfoTypeWarn
- InfoTypeError
- InfoTypeUpdate
- )
- func ReportInfo(info string) tea.Cmd {
- return CmdHandler(InfoMsg{
- Type: InfoTypeInfo,
- Msg: info,
- })
- }
- func ReportWarn(warn string) tea.Cmd {
- return CmdHandler(InfoMsg{
- Type: InfoTypeWarn,
- Msg: warn,
- })
- }
- type (
- InfoMsg struct {
- Type InfoType
- Msg string
- TTL time.Duration
- }
- ClearStatusMsg struct{}
- )
- // ExecShell parses a shell command string and executes it with exec.Command.
- // Uses shell.Fields for proper handling of shell syntax like quotes and
- // arguments while preserving TTY handling for terminal editors.
- func ExecShell(ctx context.Context, cmdStr string, callback tea.ExecCallback) tea.Cmd {
- fields, err := shell.Fields(cmdStr, nil)
- if err != nil {
- return ReportError(err)
- }
- if len(fields) == 0 {
- return ReportError(errors.New("empty command"))
- }
- cmd := exec.CommandContext(ctx, fields[0], fields[1:]...)
- return tea.ExecProcess(cmd, callback)
- }
|