diff options
| author | Teddy Wing | 2020-12-19 20:58:39 +0100 | 
|---|---|---|
| committer | Teddy Wing | 2020-12-19 21:03:52 +0100 | 
| commit | 30d8fa0a2781b6b4cc2b9c0d4301b47c95a13d05 (patch) | |
| tree | 8d660a2a061ab6951efc341c03c1cd3c49515500 | |
| parent | efd421e130b4277098e140e37c0e0d76a071540d (diff) | |
| download | browserenv-30d8fa0a2781b6b4cc2b9c0d4301b47c95a13d05.tar.bz2 | |
Add `BROWSER` support to `OpenURL()`
If the `BROWSER` environment variable is set, open the given URL using
the command specified in the variable.
Run the command in a shell process, either from the `SHELL` environment
variable or `/bin/sh` on Unix OSes. Run it through `cmd` on Windows.
Essentially repurposes my code from
https://github.com/pkg/browser/pull/14.
| -rw-r--r-- | browserenv.go | 28 | ||||
| -rw-r--r-- | browserenv_unix.go | 25 | ||||
| -rw-r--r-- | browserenv_unix_test.go | 29 | ||||
| -rw-r--r-- | browserenv_windows.go | 15 | 
4 files changed, 97 insertions, 0 deletions
| diff --git a/browserenv.go b/browserenv.go index 8685fc8..2a7abcd 100644 --- a/browserenv.go +++ b/browserenv.go @@ -3,6 +3,7 @@ package browserenv  import (  	"io"  	"os" +	"os/exec"  	"github.com/pkg/browser"  ) @@ -19,5 +20,32 @@ func OpenReader(r io.Reader) error {  }  func OpenURL(url string) error { +	envCommand := envBrowserCommand() +	if envCommand != "" { +		return runBrowserCommand(envCommand, url) +	} +  	return browser.OpenURL(url)  } + +// TODO +func envBrowserCommand() string { +	return os.Getenv("BROWSER") +} + +// TODO +func runBrowserCommand(command, url string) error { +	return browserCommand(command, url).Run() +} + +// TODO +func browserCommand(command, url string) *exec.Cmd { +	shellArgs := shell() +	shell := shellArgs[0] +	args := shellArgs[1:] + +	command = fmtBrowserCommand(command, url) +	args = append(args, command) + +	return exec.Command(shell, args...) +} diff --git a/browserenv_unix.go b/browserenv_unix.go new file mode 100644 index 0000000..e6416f8 --- /dev/null +++ b/browserenv_unix.go @@ -0,0 +1,25 @@ +// +build !windows + +package browserenv + +import ( +	"fmt" +	"os" +) + +// TODO +func shell() (args []string) { +	shell := os.Getenv("SHELL") + +	if shell == "" { +		shell = "/bin/sh" +	} + +	return []string{shell, "-c"} +} + +// TODO +func fmtBrowserCommand(browser, url string) string { +	// TODO: handle %s in browser command +	return fmt.Sprintf("%s '%s'", browser, url) +} diff --git a/browserenv_unix_test.go b/browserenv_unix_test.go new file mode 100644 index 0000000..bcc7c2d --- /dev/null +++ b/browserenv_unix_test.go @@ -0,0 +1,29 @@ +// +build !windows + +package browserenv + +import ( +	"fmt" +	"os" +	"reflect" +	"testing" +) + +func TestBrowserCommand(t *testing.T) { +	envValue := "open -a Firefox" +	url := "https://duckduckgo.com" + +	cmd := browserCommand(envValue, url) + +	shell := os.Getenv("SHELL") +	if shell == "" { +		shell = "/bin/sh" +	} + +	browserCommand := fmt.Sprintf("%s '%s'", envValue, url) + +	wantArgs := []string{shell, "-c", browserCommand} +	if !reflect.DeepEqual(cmd.Args, wantArgs) { +		t.Errorf("got args '%#v' want '%#v'", cmd.Args, wantArgs) +	} +} diff --git a/browserenv_windows.go b/browserenv_windows.go new file mode 100644 index 0000000..ef9c2b7 --- /dev/null +++ b/browserenv_windows.go @@ -0,0 +1,15 @@ +package browserenv + +import "fmt" + +var shellArgs = []string{"cmd", "/c"} + +// TODO +func shell() (args []string) { +	return shellArgs +} + +// TODO +func fmtBrowserCommand(browser, url string) string { +	return fmt.Sprintf("%s %s", browser, url) +} | 
