github.com/jduhamel/gcli@v0.2.4-0.20151019142748-0d5307cd7e21/helper/gofmt.go (about)

     1  package helper
     2  
     3  import (
     4  	"bytes"
     5  	"go/ast"
     6  	"go/parser"
     7  	"go/printer"
     8  	"go/token"
     9  	"io"
    10  	"io/ioutil"
    11  	"os"
    12  )
    13  
    14  // GoFmt runs `gofmt` to io.Reader and save it as file
    15  // If something wrong it returns error.
    16  func GoFmt(filename string, in io.Reader) error {
    17  
    18  	if in == nil {
    19  		f, err := os.Open(filename)
    20  		if err != nil {
    21  			return err
    22  		}
    23  		defer f.Close()
    24  		in = f
    25  	}
    26  
    27  	src, err := ioutil.ReadAll(in)
    28  	if err != nil {
    29  		return err
    30  	}
    31  	fileSet := token.NewFileSet()
    32  	file, err := parser.ParseFile(fileSet, filename, src, parser.ParseComments)
    33  	if err != nil {
    34  		return err
    35  	}
    36  
    37  	ast.SortImports(fileSet, file)
    38  
    39  	var buf bytes.Buffer
    40  	tabWidth := 8
    41  	printerMode := printer.UseSpaces | printer.TabIndent
    42  	err = (&printer.Config{Mode: printerMode, Tabwidth: tabWidth}).Fprint(&buf, fileSet, file)
    43  	if err != nil {
    44  		return err
    45  	}
    46  
    47  	res := buf.Bytes()
    48  	if !bytes.Equal(src, res) {
    49  		err = ioutil.WriteFile(filename, res, 0)
    50  		if err != nil {
    51  			return err
    52  		}
    53  	}
    54  	return nil
    55  }