diff options
| author | 2026-02-20 22:41:11 +0800 | |
|---|---|---|
| committer | 2026-02-20 22:41:21 +0800 | |
| commit | 5797711751b1da63648ecf3e597d7418b256d5c8 (patch) | |
| tree | ade1dc598833be2cbeb905d9edb5a32fe1093062 /object | |
| parent | oid: Remove these unnecessary checks too (diff) | |
| signature | No signature | |
object: Add general parse function
Diffstat (limited to 'object')
| -rw-r--r-- | object/parse.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/object/parse.go b/object/parse.go new file mode 100644 index 00000000..c87f2713 --- /dev/null +++ b/object/parse.go @@ -0,0 +1,40 @@ +package object + +import ( + "fmt" + + "codeberg.org/lindenii/furgit/internal/objectheader" + "codeberg.org/lindenii/furgit/objecttype" + "codeberg.org/lindenii/furgit/oid" +) + +// ParseObjectWithoutHeader parses a typed object body. +func ParseObjectWithoutHeader(ty objecttype.Type, body []byte, algo oid.Algorithm) (Object, error) { + switch ty { + case objecttype.TypeBlob: + return ParseBlob(body) + case objecttype.TypeTree: + return ParseTree(body, algo) + case objecttype.TypeCommit: + return ParseCommit(body, algo) + case objecttype.TypeTag: + return ParseTag(body, algo) + default: + return nil, fmt.Errorf("object: unsupported object type %d", ty) + } +} + +// ParseObjectWithHeader parses a loose object in "type size\\x00body" format. +func ParseObjectWithHeader(raw []byte, algo oid.Algorithm) (Object, error) { + ty, size, headerLen, ok := objectheader.Parse(raw) + if !ok { + return nil, fmt.Errorf("object: malformed object header") + } + + body := raw[headerLen:] + if int64(len(body)) != size { + return nil, fmt.Errorf("object: size mismatch: header says %d bytes, body has %d", size, len(body)) + } + + return ParseObjectWithoutHeader(ty, body, algo) +} |
