aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-05-24 07:22:15 +0000
committerGravatar Runxi Yu2026-05-24 07:22:15 +0000
commitd87381051b53a1cfabce27ce75f65ac9dcac9e00 (patch)
treefd2a41d4f0e34341780454493133edd780db35c9
parentobject/blob: Start (diff)
signatureNo signature
object: Add interfaces and global parser
-rw-r--r--object/object.go10
-rw-r--r--object/parse.go48
2 files changed, 58 insertions, 0 deletions
diff --git a/object/object.go b/object/object.go
new file mode 100644
index 00000000..e4053c93
--- /dev/null
+++ b/object/object.go
@@ -0,0 +1,10 @@
+package object
+
+import "codeberg.org/lindenii/furgit/object/typ"
+
+// Object is a Git object.
+type Object interface {
+ ObjectType() typ.Type
+ AppendWithoutHeader([]byte) ([]byte, error)
+ AppendWithHeader([]byte) ([]byte, error)
+}
diff --git a/object/parse.go b/object/parse.go
new file mode 100644
index 00000000..e1ebb5f8
--- /dev/null
+++ b/object/parse.go
@@ -0,0 +1,48 @@
+package object
+
+import (
+ "fmt"
+
+ "codeberg.org/lindenii/furgit/object/blob"
+ "codeberg.org/lindenii/furgit/object/commit"
+ "codeberg.org/lindenii/furgit/object/header"
+ "codeberg.org/lindenii/furgit/object/id"
+ "codeberg.org/lindenii/furgit/object/tag"
+ "codeberg.org/lindenii/furgit/object/tree"
+ "codeberg.org/lindenii/furgit/object/typ"
+)
+
+// ParseWithHeader parses a loose object in "type size\x00body" format.
+//
+//nolint:ireturn
+func ParseWithHeader(raw []byte, algo id.Algorithm) (Object, error) {
+ ty, size, headerLen, err := header.Parse(raw)
+ if err != nil {
+ return nil, err
+ }
+
+ body := raw[headerLen:]
+ if uint64(len(body)) != size {
+ return nil, fmt.Errorf("object: size mismatch: header says %d bytes, body has %d", size, len(body))
+ }
+
+ return ParseWithoutHeader(ty, body, algo)
+}
+
+// ParseWithoutHeader parses a typed object body.
+//
+//nolint:ireturn
+func ParseWithoutHeader(ty typ.Type, body []byte, algo id.Algorithm) (Object, error) {
+ switch ty {
+ case typ.TypeBlob:
+ return blob.Parse(body)
+ case typ.TypeTree:
+ return tree.Parse(body, algo)
+ case typ.TypeCommit:
+ return commit.Parse(body, algo)
+ case typ.TypeTag:
+ return tag.Parse(body, algo)
+ default:
+ return nil, fmt.Errorf("object: unsupported object type %d", ty)
+ }
+}