aboutsummaryrefslogtreecommitdiff
path: root/download.go
diff options
context:
space:
mode:
Diffstat (limited to 'download.go')
-rw-r--r--download.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/download.go b/download.go
new file mode 100644
index 0000000..6515bbf
--- /dev/null
+++ b/download.go
@@ -0,0 +1,83 @@
+/******************************************************************************
+*
+* Copyright 2018 Stefan Majewsky <majewsky@gmx.net>
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+******************************************************************************/
+
+package schwift
+
+import (
+ "io"
+ "io/ioutil"
+)
+
+//DownloadedObject is returned by Object.Download(). It wraps the io.ReadCloser
+//from http.Response.Body with convenience methods for collecting the contents
+//into a byte slice or string.
+//
+// var obj *swift.Object
+//
+// //Do NOT do this!
+// reader, err := obj.Download(nil, nil).AsReadCloser()
+// bytes, err := ioutil.ReadAll(reader)
+// err := reader.Close()
+// str := string(bytes)
+//
+// //Do this instead:
+// str, err := obj.Download(nil, nil).AsString()
+//
+//Since the AsByteSlice and AsString method consume only the unread portion of
+//the ReadCloser, and since they drain the ReadCloser irreversibly, the
+//idiomatic way of using DownloadedObject is to call one of its members
+//immediately, without storing the DownloadedObject instance in a variable
+//first.
+//
+// var obj *swift.Object
+//
+// //Do NOT do this!
+// downloaded := obj.Download(nil, nil)
+// reader, err := downloaded.AsReadCloser()
+//
+// //Do this instead:
+// reader, err := obj.Download(nil, nil).AsReadCloser()
+type DownloadedObject struct {
+ r io.ReadCloser
+ err error
+}
+
+//AsReadCloser returns an io.ReadCloser containing the contents of the
+//downloaded object.
+func (o DownloadedObject) AsReadCloser() (io.ReadCloser, error) {
+ return o.r, o.err
+}
+
+//AsByteSlice collects the contents of this downloaded object into a byte slice.
+func (o DownloadedObject) AsByteSlice() ([]byte, error) {
+ if o.err != nil {
+ return nil, o.err
+ }
+ slice, err := ioutil.ReadAll(o.r)
+ closeErr := o.r.Close()
+ if err == nil {
+ err = closeErr
+ }
+ return slice, closeErr
+}
+
+//AsString collects the contents of this downloaded object into a string.
+func (o DownloadedObject) AsString() (string, error) {
+ slice, err := o.AsByteSlice()
+ return string(slice), err
+}