v3/internal/helper.go (64 lines of code) (raw):
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package internal
import (
"errors"
"io"
"os"
)
type writerStore struct {
io.ReadWriteSeeker
Cleanup func()
}
func GetWriterStore(path string, useTempFile bool) (*writerStore, error) {
if !useTempFile {
return &writerStore{
ReadWriteSeeker: &bytesReadWriteSeeker{},
Cleanup: func() {},
}, nil
}
// Create temp file to be used later for calculating the SHA256 header
f, err := os.CreateTemp(path, "")
if err != nil {
return nil, err
}
ws := &writerStore{
ReadWriteSeeker: f,
Cleanup: func() {
// Close the temp file and Cleanup
f.Close()
os.Remove(f.Name())
},
}
return ws, nil
}
type bytesReadWriteSeeker struct {
buf []byte
i int64
}
// Copied from Go stdlib bytes.Reader
func (ws *bytesReadWriteSeeker) Read(b []byte) (int, error) {
if ws.i >= int64(len(ws.buf)) {
return 0, io.EOF
}
n := copy(b, ws.buf[ws.i:])
ws.i += int64(n)
return n, nil
}
func (ws *bytesReadWriteSeeker) Write(b []byte) (int, error) {
ws.buf = append(ws.buf, b...)
return len(b), nil
}
// Copied from Go stdlib bytes.Reader
func (ws *bytesReadWriteSeeker) Seek(offset int64, whence int) (int64, error) {
var abs int64
switch whence {
case 0:
abs = offset
case 1:
abs = int64(ws.i) + offset
case 2:
abs = int64(len(ws.buf)) + offset
default:
return 0, errors.New("bytes.Reader.Seek: invalid whence")
}
if abs < 0 {
return 0, errors.New("bytes.Reader.Seek: negative position")
}
ws.i = abs
return abs, nil
}