aboutsummaryrefslogtreecommitdiff
path: root/commands/msg/pipe.go
diff options
context:
space:
mode:
Diffstat (limited to 'commands/msg/pipe.go')
-rw-r--r--commands/msg/pipe.go78
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)
}
})