diff options
| author | 2026-05-16 08:29:46 +0000 | |
|---|---|---|
| committer | 2026-05-16 08:30:11 +0000 | |
| commit | 62d363f044dbcd5dbdf447a0f3ce4c12b8ab30e4 (patch) | |
| tree | 17bd09f235f9c95a9690e8ed7af405121347fd61 /object/header/parse.go | |
| parent | object/typ: Simplify (diff) | |
| signature | No signature | |
object/header: Refactor
Diffstat (limited to 'object/header/parse.go')
| -rw-r--r-- | object/header/parse.go | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/object/header/parse.go b/object/header/parse.go index 77deef38..7fb3ed04 100644 --- a/object/header/parse.go +++ b/object/header/parse.go @@ -2,39 +2,42 @@ package header import ( "bytes" + "errors" "strconv" "codeberg.org/lindenii/furgit/object/typ" ) +var ErrInvalidHeader = errors.New("object/header: invalid header") + // Parse parses a canonical loose-object header ("type size\x00"). -func Parse(data []byte) (ty typ.Type, size int64, consumed int, ok bool) { +func Parse(data []byte) (ty typ.Type, size uint64, consumed int, err error) { space := bytes.IndexByte(data, ' ') if space <= 0 { - return typ.TypeInvalid, 0, 0, false + return 0, 0, 0, ErrInvalidHeader } nulRel := bytes.IndexByte(data[space+1:], 0) if nulRel < 0 { - return typ.TypeInvalid, 0, 0, false + return 0, 0, 0, ErrInvalidHeader } nul := space + 1 + nulRel - ty, ok = typ.Parse(string(data[:space])) - if !ok { - return typ.TypeInvalid, 0, 0, false + ty, err = typ.Parse(string(data[:space])) + if err != nil { + return 0, 0, 0, ErrInvalidHeader } sizeBytes := data[space+1 : nul] if len(sizeBytes) == 0 { - return typ.TypeInvalid, 0, 0, false + return 0, 0, 0, ErrInvalidHeader } - size, err := strconv.ParseInt(string(sizeBytes), 10, 64) - if err != nil || size < 0 { - return typ.TypeInvalid, 0, 0, false + size, err = strconv.ParseUint(string(sizeBytes), 10, 64) + if err != nil { + return 0, 0, 0, ErrInvalidHeader } - return ty, size, nul + 1, true + return ty, size, nul + 1, nil } |
