aboutsummaryrefslogtreecommitdiff
path: root/object/store/packed/internal/reading/read_bytes.go
diff options
context:
space:
mode:
Diffstat (limited to 'object/store/packed/internal/reading/read_bytes.go')
-rw-r--r--object/store/packed/internal/reading/read_bytes.go46
1 files changed, 46 insertions, 0 deletions
diff --git a/object/store/packed/internal/reading/read_bytes.go b/object/store/packed/internal/reading/read_bytes.go
new file mode 100644
index 00000000..f0821687
--- /dev/null
+++ b/object/store/packed/internal/reading/read_bytes.go
@@ -0,0 +1,46 @@
+package reading
+
+import (
+ "fmt"
+
+ objectheader "codeberg.org/lindenii/furgit/object/header"
+ objectid "codeberg.org/lindenii/furgit/object/id"
+ objecttype "codeberg.org/lindenii/furgit/object/type"
+)
+
+// ReadBytesContent reads an object's type and content bytes.
+//
+// It fully resolves the requested object bytes. For base pack entries, this
+// includes verifying that the zlib stream inflates to exactly the declared
+// object size and verifying the Adler-32 trailer.
+func (store *Store) ReadBytesContent(id objectid.ObjectID) (objecttype.Type, []byte, error) {
+ loc, err := store.lookup(id)
+ if err != nil {
+ return objecttype.TypeInvalid, nil, err
+ }
+
+ return store.deltaResolveContent(loc)
+}
+
+// ReadBytesFull reads a full serialized object as "type size\0content".
+//
+// Like ReadBytesContent, it fully resolves the requested object bytes. For
+// base pack entries, this includes verifying that the zlib stream inflates to
+// exactly the declared object size and verifying the Adler-32 trailer.
+func (store *Store) ReadBytesFull(id objectid.ObjectID) ([]byte, error) {
+ ty, content, err := store.ReadBytesContent(id)
+ if err != nil {
+ return nil, err
+ }
+
+ header, ok := objectheader.Encode(ty, int64(len(content)))
+ if !ok {
+ return nil, fmt.Errorf("objectstore/packed: failed to encode object header for type %d", ty)
+ }
+
+ out := make([]byte, len(header)+len(content))
+ copy(out, header)
+ copy(out[len(header):], content)
+
+ return out, nil
+}