in sources.go [82:124]
func (w *Workflow) sourceContent(ctx context.Context, s string) (string, error) {
src, ok := w.Sources[s]
if !ok {
return "", Errf("source not found: %s", s)
}
// Try GCS file first.
if bkt, objPath, err := splitGCSPath(src); err == nil {
if objPath == "" || strings.HasSuffix(objPath, "/") {
return "", Errf("source %s appears to be a GCS 'bucket'", src)
}
src := w.StorageClient.Bucket(bkt).Object(objPath)
r, err := src.NewReader(ctx)
if err != nil {
return "", Errf("error reading from file %s/%s: %v", bkt, objPath, err)
}
defer r.Close()
if r.Size() > 1024 {
return "", Errf("file size is too large %s/%s: %d", bkt, objPath, r.Size())
}
var buf bytes.Buffer
if _, err := io.Copy(&buf, r); err != nil {
return "", Errf("error reading from file %s/%s: %v", bkt, objPath, err)
}
return buf.String(), nil
}
// Fall back to local read.
if !filepath.IsAbs(src) {
src = filepath.Join(w.workflowDir, src)
}
if _, err := os.Stat(src); err != nil {
return "", typedErr(fileIOError, "failed to find local file", err)
}
d, err := ioutil.ReadFile(src)
if err != nil {
return "", newErr("failed to read local file content", err)
}
return string(d), nil
}