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
+)
--
⑨