blob: 74fd0f54fad4f2758b946f29b1ceeb382a8f13a9 [file] [log] [blame]
// Copyright The Monogon Project Authors.
// SPDX-License-Identifier: Apache-2.0
package structfs
import (
"bytes"
"errors"
"io"
"io/fs"
"os"
)
// Blob is a binary large object, a read-only sequence of bytes of a known size.
type Blob interface {
Open() (io.ReadCloser, error)
Size() int64
}
// Bytes implements [Blob] for a byte slice.
type Bytes []byte
func (b Bytes) Open() (io.ReadCloser, error) {
return &bytesReadCloser{*bytes.NewReader(b)}, nil
}
func (b Bytes) Size() int64 {
return int64(len(b))
}
type bytesReadCloser struct {
bytes.Reader
}
func (*bytesReadCloser) Close() error {
return nil
}
var errNotRegular = errors.New("not a regular file")
// OSPathBlob creates a [Blob] for an OS path.
func OSPathBlob(path string) (Blob, error) {
info, err := os.Stat(path)
if err != nil {
return nil, err
}
if !info.Mode().IsRegular() {
return nil, &fs.PathError{Op: "blob", Path: path, Err: errNotRegular}
}
b := &osPathBlob{
path: path,
size: info.Size(),
}
return b, nil
}
type osPathBlob struct {
path string
size int64
}
func (b *osPathBlob) Open() (io.ReadCloser, error) {
return os.Open(b.path)
}
func (b *osPathBlob) Size() int64 {
return b.size
}