diff options
Diffstat (limited to 'commands/msg/pipe.go')
-rw-r--r-- | commands/msg/pipe.go | 78 |
1 files changed, 27 insertions, 51 deletions
diff --git a/commands/msg/pipe.go b/commands/msg/pipe.go index fc1ac8f8..d37ab0ff 100644 --- a/commands/msg/pipe.go +++ b/commands/msg/pipe.go @@ -14,11 +14,14 @@ import ( "git.sr.ht/~rjarry/aerc/widgets" mboxer "git.sr.ht/~rjarry/aerc/worker/mbox" "git.sr.ht/~rjarry/aerc/worker/types" - - "git.sr.ht/~sircmpwn/getopt" ) -type Pipe struct{} +type Pipe struct { + Background bool `opt:"-b"` + Full bool `opt:"-m"` + Part bool `opt:"-p"` + Cmd []string `opt:"..."` +} func init() { register(Pipe{}) @@ -32,44 +35,17 @@ func (Pipe) Complete(aerc *widgets.Aerc, args []string) []string { return nil } -func (Pipe) Execute(aerc *widgets.Aerc, args []string) error { - var ( - background bool - pipeFull bool - pipePart bool - ) - // TODO: let user specify part by index or preferred mimetype - opts, optind, err := getopt.Getopts(args, "bmp") - if err != nil { - return err - } - for _, opt := range opts { - switch opt.Option { - case 'b': - background = true - case 'm': - if pipePart { - return errors.New("-m and -p are mutually exclusive") - } - pipeFull = true - case 'p': - if pipeFull { - return errors.New("-m and -p are mutually exclusive") - } - pipePart = true - } - } - cmd := args[optind:] - if len(cmd) == 0 { - return errors.New("Usage: pipe [-mp] <cmd> [args...]") +func (p Pipe) Execute(aerc *widgets.Aerc, args []string) error { + if p.Full && p.Part { + return errors.New("-m and -p are mutually exclusive") } provider := aerc.SelectedTabContent().(widgets.ProvidesMessage) - if !pipeFull && !pipePart { + if !p.Full && !p.Part { if _, ok := provider.(*widgets.MessageViewer); ok { - pipePart = true + p.Part = true } else if _, ok := provider.(*widgets.AccountView); ok { - pipeFull = true + p.Full = true } else { return errors.New( "Neither -m nor -p specified and cannot infer default") @@ -77,7 +53,7 @@ func (Pipe) Execute(aerc *widgets.Aerc, args []string) error { } doTerm := func(reader io.Reader, name string) { - term, err := commands.QuickTerm(aerc, cmd, reader) + term, err := commands.QuickTerm(aerc, p.Cmd, reader) if err != nil { aerc.PushError(err.Error()) return @@ -86,7 +62,7 @@ func (Pipe) Execute(aerc *widgets.Aerc, args []string) error { } doExec := func(reader io.Reader) { - ecmd := exec.Command(cmd[0], cmd[1:]...) + ecmd := exec.Command(p.Cmd[0], p.Cmd[1:]...) pipe, err := ecmd.StdinPipe() if err != nil { return @@ -106,17 +82,17 @@ func (Pipe) Execute(aerc *widgets.Aerc, args []string) error { } else { if ecmd.ProcessState.ExitCode() != 0 { aerc.PushError(fmt.Sprintf( - "%s: completed with status %d", cmd[0], + "%s: completed with status %d", p.Cmd[0], ecmd.ProcessState.ExitCode())) } else { aerc.PushStatus(fmt.Sprintf( - "%s: completed with status %d", cmd[0], + "%s: completed with status %d", p.Cmd[0], ecmd.ProcessState.ExitCode()), 10*time.Second) } } } - if pipeFull { + if p.Full { var uids []uint32 var title string @@ -125,12 +101,12 @@ func (Pipe) Execute(aerc *widgets.Aerc, args []string) error { if err != nil { if mv, ok := provider.(*widgets.MessageViewer); ok { mv.MessageView().FetchFull(func(reader io.Reader) { - if background { + if p.Background { doExec(reader) } else { doTerm(reader, fmt.Sprintf("%s <%s", - cmd[0], title)) + p.Cmd[0], title)) } }) return nil @@ -202,27 +178,27 @@ func (Pipe) Execute(aerc *widgets.Aerc, args []string) error { } reader := newMessagesReader(messages, len(messages) > 1) - if background { + if p.Background { doExec(reader) } else { - doTerm(reader, fmt.Sprintf("%s <%s", cmd[0], title)) + doTerm(reader, fmt.Sprintf("%s <%s", p.Cmd[0], title)) } }() - } else if pipePart { + } else if p.Part { mv, ok := provider.(*widgets.MessageViewer) if !ok { return fmt.Errorf("can only pipe message part from a message view") } - p := provider.SelectedMessagePart() - if p == nil { + part := provider.SelectedMessagePart() + if part == nil { return fmt.Errorf("could not fetch message part") } - mv.MessageView().FetchBodyPart(p.Index, func(reader io.Reader) { - if background { + mv.MessageView().FetchBodyPart(part.Index, func(reader io.Reader) { + if p.Background { doExec(reader) } else { name := fmt.Sprintf("%s <%s/[%d]", - cmd[0], p.Msg.Envelope.Subject, p.Index) + p.Cmd[0], part.Msg.Envelope.Subject, part.Index) doTerm(reader, name) } }) |