shithub: furgit

Download patch

ref: 301bb73dcad265af9c4b1028d7f33863c7b607d0
parent: 0109f0903d8e18d110d6b9456f9a1fb4501e62fc
author: Runxi Yu <runxiyu@umich.edu>
date: Sun Mar 29 07:13:33 EDT 2026

object/type: Use table structure

--- /dev/null
+++ b/object/type/details.go
@@ -1,0 +1,10 @@
+package objecttype
+
+type typeDetails struct {
+	name         string
+	isBaseObject bool
+}
+
+func (ty Type) details() typeDetails {
+	return typeTable[ty]
+}
--- /dev/null
+++ b/object/type/is_base.go
@@ -1,0 +1,7 @@
+package objecttype
+
+// IsBaseObject reports whether ty is one of the four canonical Git object
+// types encoded directly in pack entries.
+func (ty Type) IsBaseObject() bool {
+	return ty.details().isBaseObject
+}
--- a/object/type/name.go
+++ b/object/type/name.go
@@ -1,42 +1,11 @@
 package objecttype
 
-const (
-	typeNameBlob   = "blob"
-	typeNameTree   = "tree"
-	typeNameCommit = "commit"
-	typeNameTag    = "tag"
-)
-
-// Parse parses a canonical Git object type name.
-func Parse(name string) (Type, bool) {
-	switch name {
-	case typeNameBlob:
-		return TypeBlob, true
-	case typeNameTree:
-		return TypeTree, true
-	case typeNameCommit:
-		return TypeCommit, true
-	case typeNameTag:
-		return TypeTag, true
-	default:
-		return TypeInvalid, false
-	}
-}
-
 // Name returns the canonical Git object type name.
 func (ty Type) Name() (string, bool) {
-	switch ty {
-	case TypeBlob:
-		return typeNameBlob, true
-	case TypeTree:
-		return typeNameTree, true
-	case TypeCommit:
-		return typeNameCommit, true
-	case TypeTag:
-		return typeNameTag, true
-	case TypeInvalid, TypeFuture, TypeOfsDelta, TypeRefDelta:
+	details := ty.details()
+	if details.name == "" {
 		return "", false
-	default:
-		return "", false
 	}
+
+	return details.name, true
 }
--- a/object/type/objecttype.go
+++ /dev/null
@@ -1,29 +1,0 @@
-// Package objecttype provides Git object type tags and names.
-package objecttype
-
-// Type mirrors Git object type tags in packfiles.
-type Type uint8
-
-const (
-	TypeInvalid  Type = 0
-	TypeCommit   Type = 1
-	TypeTree     Type = 2
-	TypeBlob     Type = 3
-	TypeTag      Type = 4
-	TypeFuture   Type = 5
-	TypeOfsDelta Type = 6
-	TypeRefDelta Type = 7
-)
-
-// IsBaseObject reports whether ty is one of the four canonical Git object
-// types encoded directly in pack entries.
-func (ty Type) IsBaseObject() bool {
-	switch ty {
-	case TypeCommit, TypeTree, TypeBlob, TypeTag:
-		return true
-	case TypeInvalid, TypeFuture, TypeOfsDelta, TypeRefDelta:
-		return false
-	default:
-		return false
-	}
-}
--- /dev/null
+++ b/object/type/parse.go
@@ -1,0 +1,8 @@
+package objecttype
+
+// Parse parses a canonical Git object type name.
+func Parse(name string) (Type, bool) {
+	ty, ok := typeByName[name]
+
+	return ty, ok
+}
--- /dev/null
+++ b/object/type/table.go
@@ -1,0 +1,21 @@
+package objecttype
+
+//nolint:gochecknoglobals
+var typeTable = [...]typeDetails{
+	TypeInvalid:  {},
+	TypeCommit:   {name: "commit", isBaseObject: true},
+	TypeTree:     {name: "tree", isBaseObject: true},
+	TypeBlob:     {name: "blob", isBaseObject: true},
+	TypeTag:      {name: "tag", isBaseObject: true},
+	TypeFuture:   {},
+	TypeOfsDelta: {},
+	TypeRefDelta: {},
+}
+
+//nolint:gochecknoglobals
+var typeByName = map[string]Type{
+	typeTable[TypeCommit].name: TypeCommit,
+	typeTable[TypeTree].name:   TypeTree,
+	typeTable[TypeBlob].name:   TypeBlob,
+	typeTable[TypeTag].name:    TypeTag,
+}
--- /dev/null
+++ b/object/type/type.go
@@ -1,0 +1,16 @@
+// Package objecttype provides Git object type tags and names.
+package objecttype
+
+// Type mirrors Git object type tags in packfiles.
+type Type uint8
+
+const (
+	TypeInvalid  Type = 0
+	TypeCommit   Type = 1
+	TypeTree     Type = 2
+	TypeBlob     Type = 3
+	TypeTag      Type = 4
+	TypeFuture   Type = 5
+	TypeOfsDelta Type = 6
+	TypeRefDelta Type = 7
+)
--