# HG changeset patch # User Mikael Berthe # Date 1494353668 -7200 # Node ID 863b61d682e14e4b77cbffecaa34fa5b9f89d162 # Parent 57843255fd1aba552d7badb30aaae862f70df004 Experimental external command implementation Feeds output (any: plain, template, json...) to the standard input of an external command. diff -r 57843255fd1a -r 863b61d682e1 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 }