From 301bb73dcad265af9c4b1028d7f33863c7b607d0 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 29 Mar 2026 11:13:33 +0000 Subject: object/type: Use table structure --- object/type/details.go | 10 ++++++++++ object/type/is_base.go | 7 +++++++ object/type/name.go | 39 ++++----------------------------------- object/type/objecttype.go | 29 ----------------------------- object/type/parse.go | 8 ++++++++ object/type/table.go | 21 +++++++++++++++++++++ object/type/type.go | 16 ++++++++++++++++ 7 files changed, 66 insertions(+), 64 deletions(-) create mode 100644 object/type/details.go create mode 100644 object/type/is_base.go delete mode 100644 object/type/objecttype.go create mode 100644 object/type/parse.go create mode 100644 object/type/table.go create mode 100644 object/type/type.go (limited to 'object') diff --git a/object/type/details.go b/object/type/details.go new file mode 100644 index 00000000..17bdcfd4 --- /dev/null +++ b/object/type/details.go @@ -0,0 +1,10 @@ +package objecttype + +type typeDetails struct { + name string + isBaseObject bool +} + +func (ty Type) details() typeDetails { + return typeTable[ty] +} diff --git a/object/type/is_base.go b/object/type/is_base.go new file mode 100644 index 00000000..cdc11f5b --- /dev/null +++ b/object/type/is_base.go @@ -0,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 +} diff --git a/object/type/name.go b/object/type/name.go index d5636be9..c95fe90b 100644 --- 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: - return "", false - default: + details := ty.details() + if details.name == "" { return "", false } + + return details.name, true } diff --git a/object/type/objecttype.go b/object/type/objecttype.go deleted file mode 100644 index d803cadf..00000000 --- a/object/type/objecttype.go +++ /dev/null @@ -1,29 +0,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 - } -} diff --git a/object/type/parse.go b/object/type/parse.go new file mode 100644 index 00000000..bc5ca736 --- /dev/null +++ b/object/type/parse.go @@ -0,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 +} diff --git a/object/type/table.go b/object/type/table.go new file mode 100644 index 00000000..19cc760d --- /dev/null +++ b/object/type/table.go @@ -0,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, +} diff --git a/object/type/type.go b/object/type/type.go new file mode 100644 index 00000000..18e0ac35 --- /dev/null +++ b/object/type/type.go @@ -0,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 +) -- cgit v1.3.1-10-gc9f91