github.com/vugu/vugu@v0.3.5/vugufmt/goimports.go (about) 1 package vugufmt 2 3 import ( 4 "bytes" 5 "fmt" 6 "os" 7 "os/exec" 8 ) 9 10 // UseGoImports sets the formatter to use goimports on x-go blocks. 11 func UseGoImports(f *Formatter) { 12 f.ScriptFormatters["application/x-go"] = func(input []byte) ([]byte, *FmtError) { 13 return runGoImports(input) 14 } 15 } 16 17 func runGoImports(input []byte) ([]byte, *FmtError) { 18 // build up command to run 19 cmd := exec.Command("goimports") 20 21 var resBuff bytes.Buffer 22 23 // I need to capture output 24 cmd.Stderr = &resBuff 25 cmd.Stdout = &resBuff 26 27 // also set up input pipe 28 cmd.Stdin = bytes.NewReader(input) 29 30 // copy down environment variables 31 cmd.Env = os.Environ() 32 33 // start gofmt 34 if err := cmd.Start(); err != nil { 35 return input, &FmtError{Msg: fmt.Sprintf("can't run goimports: %s", err.Error())} 36 } 37 38 // wait until gofmt is done 39 err := cmd.Wait() 40 41 // Get all the output 42 res := resBuff.Bytes() 43 44 // Wrap the output in an error. 45 if err != nil { 46 return input, fromGoFmt(string(res)) 47 } 48 49 return res, nil 50 }