Files
ps/runner/runner.go
Spencer Brower 206b94dcac Updates, Improvements, and Fixes
* Moved scripts / runner to separate package
    allows future replacement with PS Plugin.
* Fixed issues with Refresh and removed "layer" function.
* Added github documentation via godocdown.
* Reduced number of calls to Panic.
* Updated Tests
* Updated documentation.
* Fixed warnings.
* .gitignore now ignores .test and .out files.
2018-06-18 23:51:52 -04:00

66 lines
1.5 KiB
Go

package runner
import (
"bytes"
"errors"
"fmt"
"os/exec"
"path/filepath"
"runtime"
"strings"
)
// Windows is the runner for Visual Basic Scripts.
var Windows = Runner{
Cmd: "cscript.exe",
Args: []string{"/nologo"},
Ext: ".vbs",
}
// pkgpath is the path to this package.
var pkgpath string
// std is the Standard Runner.
var std Runner
func init() {
_, file, _, _ := runtime.Caller(0)
pkgpath = filepath.Dir(file)
switch runtime.GOOS {
case "windows":
std = Windows
}
}
// Runner runs script files to communicate between the OS/Photoshop and the Go code.
type Runner struct {
Cmd string // The name of the command to run
Args []string // The arguments to pass to the command.
Ext string // The file extension to use for these commands.
}
// Run runs the standard runner with the given values.
func Run(name string, args ...string) ([]byte, error) {
var out, errs bytes.Buffer
cmd := exec.Command(std.Cmd, parseArgs(name, args...)...)
cmd.Stdout, cmd.Stderr = &out, &errs
if err := cmd.Run(); err != nil || len(errs.Bytes()) != 0 {
return out.Bytes(), errors.New(errs.String())
}
return out.Bytes(), nil
}
// parseArgs parses the given args into the correct syntax.
func parseArgs(name string, args ...string) []string {
if !strings.HasSuffix(name, std.Ext) {
name += std.Ext
}
newArgs := append(std.Args, filepath.Join(pkgpath, "scripts", name))
if strings.Contains(name, "dojs") {
newArgs = append(newArgs, args[0], fmt.Sprint(strings.Join(args[1:], ",,")))
} else {
newArgs = append(newArgs, args...)
}
return newArgs
}