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 }