blob: 74fd0f54fad4f2758b946f29b1ceeb382a8f13a9 [file] [log] [blame]
Jan Schäre4c48542025-03-20 08:39:10 +00001// Copyright The Monogon Project Authors.
2// SPDX-License-Identifier: Apache-2.0
3
4package structfs
5
6import (
7 "bytes"
8 "errors"
9 "io"
10 "io/fs"
11 "os"
12)
13
14// Blob is a binary large object, a read-only sequence of bytes of a known size.
15type Blob interface {
16 Open() (io.ReadCloser, error)
17 Size() int64
18}
19
20// Bytes implements [Blob] for a byte slice.
21type Bytes []byte
22
23func (b Bytes) Open() (io.ReadCloser, error) {
24 return &bytesReadCloser{*bytes.NewReader(b)}, nil
25}
26
27func (b Bytes) Size() int64 {
28 return int64(len(b))
29}
30
31type bytesReadCloser struct {
32 bytes.Reader
33}
34
35func (*bytesReadCloser) Close() error {
36 return nil
37}
38
39var errNotRegular = errors.New("not a regular file")
40
41// OSPathBlob creates a [Blob] for an OS path.
42func OSPathBlob(path string) (Blob, error) {
43 info, err := os.Stat(path)
44 if err != nil {
45 return nil, err
46 }
47 if !info.Mode().IsRegular() {
48 return nil, &fs.PathError{Op: "blob", Path: path, Err: errNotRegular}
49 }
50 b := &osPathBlob{
51 path: path,
52 size: info.Size(),
53 }
54 return b, nil
55}
56
57type osPathBlob struct {
58 path string
59 size int64
60}
61
62func (b *osPathBlob) Open() (io.ReadCloser, error) {
63 return os.Open(b.path)
64}
65
66func (b *osPathBlob) Size() int64 {
67 return b.size
68}