github.com/jujuyuki/gospal@v1.0.1-0.20210215170718-af79fae13b20/ssa/build/builder.go (about) 1 package build 2 3 import ( 4 "bufio" 5 "bytes" 6 "io" 7 "io/ioutil" 8 "log" 9 "os" 10 11 "github.com/jujuyuki/gospal/ssa" 12 "github.com/pkg/errors" 13 ) 14 15 // Builder builds SSA IR and metainfo. 16 type Builder interface { 17 Build() (*ssa.Info, error) 18 } 19 20 // FileSrc is a set of filenames. 21 type FileSrc struct { 22 Files []string 23 } 24 25 // FromFiles returns a non-nil Builder from a slice of filenames. 26 func FromFiles(files ...string) Configurer { 27 return newConfig(&FileSrc{Files: files}) 28 } 29 30 // File returns an io.Reader for file[i]. 31 func (s *FileSrc) Reader(i int) io.Reader { 32 if i < len(s.Files) { 33 f, err := os.Open(s.Files[i]) 34 defer f.Close() 35 if err != nil { 36 log.Fatal(errors.Wrapf(err, "failed to read from file: %s", s.Files[i])) 37 } 38 return bufio.NewReader(f) 39 } 40 return nil 41 } 42 43 // NewReader returns an io.Reader for reading all files. 44 func (s *FileSrc) NewReader() io.Reader { 45 var rds []io.Reader 46 for i := range s.Files { 47 rds = append(rds, s.Reader(i)) 48 } 49 return io.MultiReader(rds...) 50 } 51 52 // CachedSrc is source file from a reader. 53 type CachedSrc struct { 54 cached []byte 55 } 56 57 // FromReader returns a non-nil Builder for a reader. 58 // This is typically used for testing or building a temporary file. 59 func FromReader(r io.Reader) Configurer { 60 b, err := ioutil.ReadAll(r) 61 if err != nil { 62 log.Fatal(errors.Wrap(err, "failed to read from reader")) 63 } 64 return newConfig(&CachedSrc{cached: b}) 65 } 66 67 // NewReader returns a reader for reading the string content. 68 func (s *CachedSrc) NewReader() io.Reader { 69 return bytes.NewReader(s.cached) 70 }