github.com/jd-ly/tools@v0.5.7/imports/forward.go (about)

     1  // Package imports implements a Go pretty-printer (like package "go/format")
     2  // that also adds or removes import statements as necessary.
     3  package imports // import "github.com/jd-ly/tools/imports"
     4  
     5  import (
     6  	"io/ioutil"
     7  	"log"
     8  
     9  	"github.com/jd-ly/tools/internal/gocommand"
    10  	intimp "github.com/jd-ly/tools/internal/imports"
    11  )
    12  
    13  // Options specifies options for processing files.
    14  type Options struct {
    15  	Fragment  bool // Accept fragment of a source file (no package statement)
    16  	AllErrors bool // Report all errors (not just the first 10 on different lines)
    17  
    18  	Comments  bool // Print comments (true if nil *Options provided)
    19  	TabIndent bool // Use tabs for indent (true if nil *Options provided)
    20  	TabWidth  int  // Tab width (8 if nil *Options provided)
    21  
    22  	FormatOnly bool // Disable the insertion and deletion of imports
    23  }
    24  
    25  // Debug controls verbose logging.
    26  var Debug = false
    27  
    28  // LocalPrefix is a comma-separated string of import path prefixes, which, if
    29  // set, instructs Process to sort the import paths with the given prefixes
    30  // into another group after 3rd-party packages.
    31  var LocalPrefix string
    32  
    33  // Process formats and adjusts imports for the provided file.
    34  // If opt is nil the defaults are used, and if src is nil the source
    35  // is read from the filesystem.
    36  //
    37  // Note that filename's directory influences which imports can be chosen,
    38  // so it is important that filename be accurate.
    39  // To process data ``as if'' it were in filename, pass the data as a non-nil src.
    40  func Process(filename string, src []byte, opt *Options) ([]byte, error) {
    41  	var err error
    42  	if src == nil {
    43  		src, err = ioutil.ReadFile(filename)
    44  		if err != nil {
    45  			return nil, err
    46  		}
    47  	}
    48  	if opt == nil {
    49  		opt = &Options{Comments: true, TabIndent: true, TabWidth: 8}
    50  	}
    51  	intopt := &intimp.Options{
    52  		Env: &intimp.ProcessEnv{
    53  			GocmdRunner: &gocommand.Runner{},
    54  		},
    55  		LocalPrefix: LocalPrefix,
    56  		AllErrors:   opt.AllErrors,
    57  		Comments:    opt.Comments,
    58  		FormatOnly:  opt.FormatOnly,
    59  		Fragment:    opt.Fragment,
    60  		TabIndent:   opt.TabIndent,
    61  		TabWidth:    opt.TabWidth,
    62  	}
    63  	if Debug {
    64  		intopt.Env.Logf = log.Printf
    65  	}
    66  	return intimp.Process(filename, src, intopt)
    67  }
    68  
    69  // VendorlessPath returns the devendorized version of the import path ipath.
    70  // For example, VendorlessPath("foo/bar/vendor/a/b") returns "a/b".
    71  func VendorlessPath(ipath string) string {
    72  	return intimp.VendorlessPath(ipath)
    73  }