aerc/lib/open.go

66 lines
1.5 KiB
Go

package lib
import (
"os/exec"
"runtime"
"git.sr.ht/~rjarry/aerc/logging"
)
var openBin string = "xdg-open"
func init() {
if runtime.GOOS == "darwin" {
openBin = "open"
}
}
type xdgOpen struct {
args []string
errCh chan (error)
cmd *exec.Cmd
}
// NewXDGOpen returns a handler for opening a file via the system handler xdg-open
// or comparable tools on other OSs than Linux
func NewXDGOpen(filename string) *xdgOpen {
errch := make(chan error, 1)
return &xdgOpen{
errCh: errch,
args: []string{filename},
}
}
// SetArgs sets additional arguments to the open command prior to the filename
func (xdg *xdgOpen) SetArgs(args []string) {
args = append([]string{}, args...) // don't overwrite array of caller
filename := xdg.args[len(xdg.args)-1]
xdg.args = append(args, filename) //nolint:gocritic // intentional append to different slice
}
// Start the open handler.
// Returns an error if the command could not be started.
// Use Wait to wait for the commands completion and to check the error.
func (xdg *xdgOpen) Start() error {
xdg.cmd = exec.Command(openBin, xdg.args...)
err := xdg.cmd.Start()
if err != nil {
xdg.errCh <- err // for callers that just check the error from Wait()
close(xdg.errCh)
return err
}
go func() {
defer logging.PanicHandler()
xdg.errCh <- xdg.cmd.Wait()
close(xdg.errCh)
}()
return nil
}
// Wait for the xdg-open command to complete
// The xdgOpen must have been started
func (xdg *xdgOpen) Wait() error {
return <-xdg.errCh
}