shithub: furgit

Download patch

ref: 397eb22166afa8cd273dbd0decdcb2ac7f2d34df
parent: 50cd7868cf055bce46e1a4253840089dfc602a11
author: Runxi Yu <me@runxiyu.org>
date: Thu Jan 29 17:05:30 EST 2026

obj, loose: Add Object.Serialize() interface

--- a/loose.go
+++ b/loose.go
@@ -173,23 +173,10 @@
 
 // WriteLooseObject writes an object to the repository as a loose object.
 func (repo *Repository) WriteLooseObject(obj Object) (Hash, error) {
-	var raw []byte
-	var err error
-
-	switch o := obj.(type) {
-	case *Blob:
-		raw, err = o.Serialize()
-	case *Tree:
-		raw, err = o.Serialize()
-	case *Commit:
-		raw, err = o.Serialize()
-	case *Tag:
-		raw, err = o.Serialize()
-	default:
-		return Hash{}, fmt.Errorf("furgit: unsupported object type for writing: %T", obj)
+	if obj == nil {
+		return Hash{}, ErrInvalidObject
 	}
-	// TODO: Consider adding serialize to the interface?
-
+	raw, err := obj.Serialize()
 	if err != nil {
 		return Hash{}, err
 	}
--- a/obj.go
+++ b/obj.go
@@ -40,6 +40,9 @@
 type Object interface {
 	// ObjectType returns the object's type.
 	ObjectType() ObjectType
+	// Serialize renders the object into its raw byte representation,
+	// including the header (i.e., "type size\0").
+	Serialize() ([]byte, error)
 }
 
 // StoredObject describes a Git object with a known hash, such as
--