Experimental external command implementation
authorMikael Berthe <mikael@lilotux.net>
Tue, 09 May 2017 20:14:28 +0200
changeset 111 863b61d682e1
parent 110 57843255fd1a
child 112 58d30ab47543
Experimental external command implementation Feeds output (any: plain, template, json...) to the standard input of an external command.
cmd/utils.go
--- a/cmd/utils.go	Tue May 09 20:14:28 2017 +0200
+++ b/cmd/utils.go	Tue May 09 20:14:28 2017 +0200
@@ -9,6 +9,7 @@
 	"fmt"
 	"io/ioutil"
 	"os"
+	"os/exec"
 	"path/filepath"
 	"strings"
 
@@ -89,10 +90,10 @@
 	var mcrp mcPrinter
 	p, err := printer.NewPrinter(of, opt)
 	if err != nil {
-		return mcrp, err
+		return &mcrp, err
 	}
 	mcrp.ResourcePrinter = p
-	return mcrp, nil
+	return &mcrp, nil
 }
 
 func readTemplate(name, templateDir string) ([]byte, error) {
@@ -141,10 +142,34 @@
 	return fmt.Fprintf(os.Stderr, format+"\n", a...)
 }
 
-func (mcp mcPrinter) printObj(obj interface{}) error {
-	return mcp.PrintObj(obj, nil, "")
+func (mcp *mcPrinter) printObj(obj interface{}) error {
+	if mcp.command == "" {
+		return mcp.PrintObj(obj, nil, "")
+	}
+
+	cmd := exec.Command(mcp.command)
+	stdin, err := cmd.StdinPipe()
+	if err != nil {
+		return err
+	}
+	err = mcp.PrintObj(obj, stdin, "")
+	stdin.Close()
+
+	if err != nil {
+		return err
+	}
+
+	out, err := cmd.CombinedOutput()
+	if len(out) > 0 {
+		errPrint("Command output: %s", string(out))
+	}
+	if err != nil {
+		return errors.Wrap(err, "external command failed")
+	}
+
+	return nil
 }
 
-func (mcp mcPrinter) setCommand(cmd string) {
+func (mcp *mcPrinter) setCommand(cmd string) {
 	mcp.command = cmd
 }