github.com/vugu/vugu@v0.3.6-0.20240430171613-3f6f402e014b/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  }