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  }