-
Notifications
You must be signed in to change notification settings - Fork 3
Support io.Reader interface #2
Copy link
Copy link
Open
Description
it would be nice if NewReader() returned an io.Reader interface, so that the reader could be chained across other readers (for example you could open a file or a http body request, wrap a decompressor, and return a generic reader.
for example
func loadData(pathOpt string) (io.ReadCloser, error) {
var reader io.ReadCloser
u, err := url.Parse(pathOpt)
if err != nil {
return nil, err
}
switch u.Scheme {
case "http", "https":
resp, err := cleanhttp.DefaultClient().Get(pathOpt)
if err != nil {
return nil, err
}
reader = resp.Body
case "b2":
src := strings.TrimPrefix(u.Path, "/")
obj := B2Bucket.Object(src).NewReader(context.TODO())
obj.ConcurrentDownloads = 20
reader = obj
default:
file, err := os.Open(pathOpt)
if err != nil {
return nil, err
}
reader = file
}
if strings.HasSuffix(pathOpt, "xz") {
xzReader, err := xzReader.NewReader(reader, 0)
if err != nil {
return nil, err
}
reader = io.NopCloser(xzReader)
} else if strings.HasSuffix(pathOpt, "bz2") {
bz2Reader, err := bzip2.NewReader(reader, nil)
if err != nil {
return nil, err
}
reader = bz2Reader
} else if strings.HasSuffix(pathOpt, "zip") {
zipReader := zipstream.NewReader(reader)
reader = io.NopCloser(zipReader) // <---- can't do this
}
return reader, err
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels