feat: support tag
This commit is contained in:
parent
67ae76c9b9
commit
25badb3e79
748
example.pb.go
Normal file
748
example.pb.go
Normal file
@ -0,0 +1,748 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.29.0
|
||||
// protoc v4.22.2
|
||||
// source: example.proto
|
||||
|
||||
package gobuf
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
type ListReq struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
}
|
||||
|
||||
func (x *ListReq) Reset() {
|
||||
*x = ListReq{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_example_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ListReq) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ListReq) ProtoMessage() {}
|
||||
|
||||
func (x *ListReq) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_example_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ListReq.ProtoReflect.Descriptor instead.
|
||||
func (*ListReq) Descriptor() ([]byte, []int) {
|
||||
return file_example_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
type ListResp struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Items []*ListResp_Item `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` // 列表
|
||||
}
|
||||
|
||||
func (x *ListResp) Reset() {
|
||||
*x = ListResp{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_example_proto_msgTypes[1]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ListResp) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ListResp) ProtoMessage() {}
|
||||
|
||||
func (x *ListResp) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_example_proto_msgTypes[1]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ListResp.ProtoReflect.Descriptor instead.
|
||||
func (*ListResp) Descriptor() ([]byte, []int) {
|
||||
return file_example_proto_rawDescGZIP(), []int{1}
|
||||
}
|
||||
|
||||
func (x *ListResp) GetItems() []*ListResp_Item {
|
||||
if x != nil {
|
||||
return x.Items
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type UploadReq struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
}
|
||||
|
||||
func (x *UploadReq) Reset() {
|
||||
*x = UploadReq{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_example_proto_msgTypes[2]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *UploadReq) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*UploadReq) ProtoMessage() {}
|
||||
|
||||
func (x *UploadReq) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_example_proto_msgTypes[2]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use UploadReq.ProtoReflect.Descriptor instead.
|
||||
func (*UploadReq) Descriptor() ([]byte, []int) {
|
||||
return file_example_proto_rawDescGZIP(), []int{2}
|
||||
}
|
||||
|
||||
type UploadResp struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
}
|
||||
|
||||
func (x *UploadResp) Reset() {
|
||||
*x = UploadResp{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_example_proto_msgTypes[3]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *UploadResp) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*UploadResp) ProtoMessage() {}
|
||||
|
||||
func (x *UploadResp) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_example_proto_msgTypes[3]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use UploadResp.ProtoReflect.Descriptor instead.
|
||||
func (*UploadResp) Descriptor() ([]byte, []int) {
|
||||
return file_example_proto_rawDescGZIP(), []int{3}
|
||||
}
|
||||
|
||||
type DeleteReq struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Filename string `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"` // 文件名
|
||||
}
|
||||
|
||||
func (x *DeleteReq) Reset() {
|
||||
*x = DeleteReq{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_example_proto_msgTypes[4]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *DeleteReq) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*DeleteReq) ProtoMessage() {}
|
||||
|
||||
func (x *DeleteReq) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_example_proto_msgTypes[4]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use DeleteReq.ProtoReflect.Descriptor instead.
|
||||
func (*DeleteReq) Descriptor() ([]byte, []int) {
|
||||
return file_example_proto_rawDescGZIP(), []int{4}
|
||||
}
|
||||
|
||||
func (x *DeleteReq) GetFilename() string {
|
||||
if x != nil {
|
||||
return x.Filename
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type DeleteResp struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
}
|
||||
|
||||
func (x *DeleteResp) Reset() {
|
||||
*x = DeleteResp{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_example_proto_msgTypes[5]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *DeleteResp) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*DeleteResp) ProtoMessage() {}
|
||||
|
||||
func (x *DeleteResp) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_example_proto_msgTypes[5]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use DeleteResp.ProtoReflect.Descriptor instead.
|
||||
func (*DeleteResp) Descriptor() ([]byte, []int) {
|
||||
return file_example_proto_rawDescGZIP(), []int{5}
|
||||
}
|
||||
|
||||
type DownloadReq struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
// @v: required
|
||||
// @bson: "fffff"
|
||||
// @json: "fffff"
|
||||
F string `protobuf:"bytes,1,opt,name=f,proto3" json:"fffff" bson:"fffff"` // 文件地址
|
||||
}
|
||||
|
||||
func (x *DownloadReq) Reset() {
|
||||
*x = DownloadReq{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_example_proto_msgTypes[6]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *DownloadReq) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*DownloadReq) ProtoMessage() {}
|
||||
|
||||
func (x *DownloadReq) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_example_proto_msgTypes[6]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use DownloadReq.ProtoReflect.Descriptor instead.
|
||||
func (*DownloadReq) Descriptor() ([]byte, []int) {
|
||||
return file_example_proto_rawDescGZIP(), []int{6}
|
||||
}
|
||||
|
||||
func (x *DownloadReq) GetF() string {
|
||||
if x != nil {
|
||||
return x.F
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type DownloadResp struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
}
|
||||
|
||||
func (x *DownloadResp) Reset() {
|
||||
*x = DownloadResp{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_example_proto_msgTypes[7]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *DownloadResp) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*DownloadResp) ProtoMessage() {}
|
||||
|
||||
func (x *DownloadResp) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_example_proto_msgTypes[7]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use DownloadResp.ProtoReflect.Descriptor instead.
|
||||
func (*DownloadResp) Descriptor() ([]byte, []int) {
|
||||
return file_example_proto_rawDescGZIP(), []int{7}
|
||||
}
|
||||
|
||||
type UpdateUserInfoReq struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
}
|
||||
|
||||
func (x *UpdateUserInfoReq) Reset() {
|
||||
*x = UpdateUserInfoReq{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_example_proto_msgTypes[8]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *UpdateUserInfoReq) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*UpdateUserInfoReq) ProtoMessage() {}
|
||||
|
||||
func (x *UpdateUserInfoReq) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_example_proto_msgTypes[8]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use UpdateUserInfoReq.ProtoReflect.Descriptor instead.
|
||||
func (*UpdateUserInfoReq) Descriptor() ([]byte, []int) {
|
||||
return file_example_proto_rawDescGZIP(), []int{8}
|
||||
}
|
||||
|
||||
type UpdateUserInfoResp struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
}
|
||||
|
||||
func (x *UpdateUserInfoResp) Reset() {
|
||||
*x = UpdateUserInfoResp{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_example_proto_msgTypes[9]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *UpdateUserInfoResp) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*UpdateUserInfoResp) ProtoMessage() {}
|
||||
|
||||
func (x *UpdateUserInfoResp) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_example_proto_msgTypes[9]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use UpdateUserInfoResp.ProtoReflect.Descriptor instead.
|
||||
func (*UpdateUserInfoResp) Descriptor() ([]byte, []int) {
|
||||
return file_example_proto_rawDescGZIP(), []int{9}
|
||||
}
|
||||
|
||||
type ListResp_Item struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Filename string `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"` // 文件名
|
||||
FileSize string `protobuf:"bytes,2,opt,name=file_size,json=fileSize,proto3" json:"file_size,omitempty"` // 文件大小
|
||||
CreatedAt string `protobuf:"bytes,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` // 上传时间
|
||||
}
|
||||
|
||||
func (x *ListResp_Item) Reset() {
|
||||
*x = ListResp_Item{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_example_proto_msgTypes[10]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ListResp_Item) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ListResp_Item) ProtoMessage() {}
|
||||
|
||||
func (x *ListResp_Item) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_example_proto_msgTypes[10]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ListResp_Item.ProtoReflect.Descriptor instead.
|
||||
func (*ListResp_Item) Descriptor() ([]byte, []int) {
|
||||
return file_example_proto_rawDescGZIP(), []int{1, 0}
|
||||
}
|
||||
|
||||
func (x *ListResp_Item) GetFilename() string {
|
||||
if x != nil {
|
||||
return x.Filename
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ListResp_Item) GetFileSize() string {
|
||||
if x != nil {
|
||||
return x.FileSize
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ListResp_Item) GetCreatedAt() string {
|
||||
if x != nil {
|
||||
return x.CreatedAt
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var File_example_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_example_proto_rawDesc = []byte{
|
||||
0x0a, 0x0d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
|
||||
0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x22, 0x09, 0x0a, 0x07, 0x4c,
|
||||
0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x22, 0x9b, 0x01, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x52,
|
||||
0x65, 0x73, 0x70, 0x12, 0x2f, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03,
|
||||
0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e,
|
||||
0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69,
|
||||
0x74, 0x65, 0x6d, 0x73, 0x1a, 0x5e, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1a, 0x0a, 0x08,
|
||||
0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
|
||||
0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65,
|
||||
0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c,
|
||||
0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
|
||||
0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74,
|
||||
0x65, 0x64, 0x41, 0x74, 0x22, 0x0b, 0x0a, 0x09, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65,
|
||||
0x71, 0x22, 0x0c, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22,
|
||||
0x27, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08,
|
||||
0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
|
||||
0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x0c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65,
|
||||
0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x1b, 0x0a, 0x0b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f,
|
||||
0x61, 0x64, 0x52, 0x65, 0x71, 0x12, 0x0c, 0x0a, 0x01, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x01, 0x66, 0x22, 0x0e, 0x0a, 0x0c, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52,
|
||||
0x65, 0x73, 0x70, 0x22, 0x13, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65,
|
||||
0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x22, 0x14, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61,
|
||||
0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x32, 0xbb,
|
||||
0x02, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12,
|
||||
0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73,
|
||||
0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65,
|
||||
0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x37, 0x0a, 0x06, 0x55, 0x70,
|
||||
0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65,
|
||||
0x72, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6f,
|
||||
0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52,
|
||||
0x65, 0x73, 0x70, 0x12, 0x37, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x15, 0x2e,
|
||||
0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
|
||||
0x65, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65,
|
||||
0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x08,
|
||||
0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72,
|
||||
0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65,
|
||||
0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x44,
|
||||
0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x0e, 0x55,
|
||||
0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x2e,
|
||||
0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,
|
||||
0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, 0x63,
|
||||
0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
|
||||
0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x32, 0x0a, 0x0a, 0x08,
|
||||
0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x3b, 0x67,
|
||||
0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_example_proto_rawDescOnce sync.Once
|
||||
file_example_proto_rawDescData = file_example_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_example_proto_rawDescGZIP() []byte {
|
||||
file_example_proto_rawDescOnce.Do(func() {
|
||||
file_example_proto_rawDescData = protoimpl.X.CompressGZIP(file_example_proto_rawDescData)
|
||||
})
|
||||
return file_example_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_example_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
|
||||
var file_example_proto_goTypes = []interface{}{
|
||||
(*ListReq)(nil), // 0: controller.ListReq
|
||||
(*ListResp)(nil), // 1: controller.ListResp
|
||||
(*UploadReq)(nil), // 2: controller.UploadReq
|
||||
(*UploadResp)(nil), // 3: controller.UploadResp
|
||||
(*DeleteReq)(nil), // 4: controller.DeleteReq
|
||||
(*DeleteResp)(nil), // 5: controller.DeleteResp
|
||||
(*DownloadReq)(nil), // 6: controller.DownloadReq
|
||||
(*DownloadResp)(nil), // 7: controller.DownloadResp
|
||||
(*UpdateUserInfoReq)(nil), // 8: controller.UpdateUserInfoReq
|
||||
(*UpdateUserInfoResp)(nil), // 9: controller.UpdateUserInfoResp
|
||||
(*ListResp_Item)(nil), // 10: controller.ListResp.Item
|
||||
}
|
||||
var file_example_proto_depIdxs = []int32{
|
||||
10, // 0: controller.ListResp.items:type_name -> controller.ListResp.Item
|
||||
0, // 1: controller.File.List:input_type -> controller.ListReq
|
||||
2, // 2: controller.File.Upload:input_type -> controller.UploadReq
|
||||
4, // 3: controller.File.Delete:input_type -> controller.DeleteReq
|
||||
6, // 4: controller.File.Download:input_type -> controller.DownloadReq
|
||||
8, // 5: controller.File.UpdateUserInfo:input_type -> controller.UpdateUserInfoReq
|
||||
1, // 6: controller.File.List:output_type -> controller.ListResp
|
||||
3, // 7: controller.File.Upload:output_type -> controller.UploadResp
|
||||
5, // 8: controller.File.Delete:output_type -> controller.DeleteResp
|
||||
7, // 9: controller.File.Download:output_type -> controller.DownloadResp
|
||||
9, // 10: controller.File.UpdateUserInfo:output_type -> controller.UpdateUserInfoResp
|
||||
6, // [6:11] is the sub-list for method output_type
|
||||
1, // [1:6] is the sub-list for method input_type
|
||||
1, // [1:1] is the sub-list for extension type_name
|
||||
1, // [1:1] is the sub-list for extension extendee
|
||||
0, // [0:1] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_example_proto_init() }
|
||||
func file_example_proto_init() {
|
||||
if File_example_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_example_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ListReq); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_example_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ListResp); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_example_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*UploadReq); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_example_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*UploadResp); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_example_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*DeleteReq); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_example_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*DeleteResp); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_example_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*DownloadReq); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_example_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*DownloadResp); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_example_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*UpdateUserInfoReq); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_example_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*UpdateUserInfoResp); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_example_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ListResp_Item); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_example_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 11,
|
||||
NumExtensions: 0,
|
||||
NumServices: 2,
|
||||
},
|
||||
GoTypes: file_example_proto_goTypes,
|
||||
DependencyIndexes: file_example_proto_depIdxs,
|
||||
MessageInfos: file_example_proto_msgTypes,
|
||||
}.Build()
|
||||
File_example_proto = out.File
|
||||
file_example_proto_rawDesc = nil
|
||||
file_example_proto_goTypes = nil
|
||||
file_example_proto_depIdxs = nil
|
||||
}
|
@ -2,7 +2,7 @@ syntax = "proto3";
|
||||
|
||||
package controller;
|
||||
|
||||
option go_package = "./;core";
|
||||
option go_package = "./;gobuf";
|
||||
|
||||
|
||||
// @route_group: true
|
||||
|
1
go.mod
1
go.mod
@ -5,6 +5,7 @@ go 1.18
|
||||
require (
|
||||
github.com/emicklei/proto v1.11.1
|
||||
github.com/stretchr/testify v1.8.2
|
||||
google.golang.org/protobuf v1.30.0
|
||||
)
|
||||
|
||||
require (
|
||||
|
2
gobuf.go
2
gobuf.go
@ -115,7 +115,7 @@ func (parser *Parser) AddService(serviceName string) error {
|
||||
Lines: []string{
|
||||
" @route_group: true",
|
||||
" @base_url: /api/" + calm2Case(serviceName),
|
||||
" @gen_to: ./internal/controller/" + calm2Case(serviceName) + ".go",
|
||||
" @gen_to: ./internal/controller/" + calm2Case(serviceName) + "_controller.go",
|
||||
},
|
||||
},
|
||||
Name: serviceName,
|
||||
|
267
inject_tag.go
Normal file
267
inject_tag.go
Normal file
@ -0,0 +1,267 @@
|
||||
package gobuf
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go/ast"
|
||||
"go/parser"
|
||||
"go/token"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
rComment = regexp.MustCompile(`^//.*?@(?i:gotags?):\s*(.*)$`)
|
||||
bsonComment = regexp.MustCompile(`^//.*?@(?i:bson?):\s*(.*)$`)
|
||||
jsonComment = regexp.MustCompile(`^//.*?@(?i:json?):\s*(.*)$`)
|
||||
rInject = regexp.MustCompile("`.+`$")
|
||||
rTags = regexp.MustCompile(`[\w_]+:"[^"]+"`)
|
||||
)
|
||||
|
||||
type textArea struct {
|
||||
Start int
|
||||
End int
|
||||
CurrentTag string
|
||||
InjectTag string
|
||||
CommentStart int
|
||||
CommentEnd int
|
||||
}
|
||||
|
||||
type InjectTag struct {
|
||||
inputFiles string
|
||||
}
|
||||
|
||||
func NewInjectTag(pbFiles string) *InjectTag {
|
||||
return &InjectTag{inputFiles: pbFiles}
|
||||
}
|
||||
|
||||
func (it *InjectTag) Inject() error {
|
||||
globResults, err := filepath.Glob(it.inputFiles)
|
||||
if err != nil {
|
||||
return fmt.Errorf("parser input file failed: %v", err)
|
||||
}
|
||||
var matched int
|
||||
for _, path := range globResults {
|
||||
fileInfo, err := os.Stat(path)
|
||||
if err != nil {
|
||||
return fmt.Errorf("read file stat failed: %v", err)
|
||||
}
|
||||
|
||||
if fileInfo.IsDir() {
|
||||
continue
|
||||
}
|
||||
|
||||
// It should end with ".go" at a minimum.
|
||||
if !strings.HasSuffix(strings.ToLower(fileInfo.Name()), ".go") {
|
||||
continue
|
||||
}
|
||||
|
||||
matched++
|
||||
|
||||
areas, err := it.parserFile(path)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if err = it.writeFile(path, areas); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
if matched == 0 {
|
||||
return fmt.Errorf("input %q matched no files, see: -help", it.inputFiles)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (it *InjectTag) parserFile(inputPath string) (areas []textArea, err error) {
|
||||
it.logf("parsing file %q for inject tag comments", inputPath)
|
||||
fset := token.NewFileSet()
|
||||
f, err := parser.ParseFile(fset, inputPath, nil, parser.ParseComments)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, decl := range f.Decls {
|
||||
// check if is generic declaration
|
||||
genDecl, ok := decl.(*ast.GenDecl)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
var typeSpec *ast.TypeSpec
|
||||
for _, spec := range genDecl.Specs {
|
||||
if ts, tsOK := spec.(*ast.TypeSpec); tsOK {
|
||||
typeSpec = ts
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// skip if can't get type spec
|
||||
if typeSpec == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
// not a struct, skip
|
||||
structDecl, ok := typeSpec.Type.(*ast.StructType)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, field := range structDecl.Fields.List {
|
||||
// skip if field has no doc
|
||||
var comments []*ast.Comment
|
||||
|
||||
if field.Doc != nil {
|
||||
comments = append(comments, field.Doc.List...)
|
||||
}
|
||||
|
||||
// The "doc" field (above comment) is more commonly "free-form"
|
||||
// due to the ability to have a much larger comment without it
|
||||
// being unwieldy. As such, the "comment" field (trailing comment),
|
||||
// should take precedence if there happen to be multiple tags
|
||||
// specified, both in the field doc, and the field line. Whichever
|
||||
// comes last, will take precedence.
|
||||
if field.Comment != nil {
|
||||
comments = append(comments, field.Comment.List...)
|
||||
}
|
||||
|
||||
for _, comment := range comments {
|
||||
tag := it.tagFromComment(comment.Text)
|
||||
if tag == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
currentTag := field.Tag.Value
|
||||
area := textArea{
|
||||
Start: int(field.Pos()),
|
||||
End: int(field.End()),
|
||||
CurrentTag: currentTag[1 : len(currentTag)-1],
|
||||
InjectTag: tag,
|
||||
CommentStart: int(comment.Pos()),
|
||||
CommentEnd: int(comment.End()),
|
||||
}
|
||||
areas = append(areas, area)
|
||||
}
|
||||
}
|
||||
}
|
||||
//it.logf("parsed file %q, number of fields to inject custom tags: %d", inputPath, len(areas))
|
||||
return
|
||||
}
|
||||
|
||||
func (it *InjectTag) writeFile(inputPath string, areas []textArea) error {
|
||||
f, err := os.Open(inputPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
contents, err := io.ReadAll(f)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = f.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// inject custom tags from tail of file first to preserve order
|
||||
for i := range areas {
|
||||
area := areas[len(areas)-i-1]
|
||||
it.logf("inject custom tag %q to expression %q", area.InjectTag, string(contents[area.Start-1:area.End-1]))
|
||||
contents = it.injectTag(contents, area)
|
||||
}
|
||||
if err = os.WriteFile(inputPath, contents, 0o644); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(areas) > 0 {
|
||||
it.logf("file %q is injected with custom tags", inputPath)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (it *InjectTag) logf(format string, v ...interface{}) {
|
||||
log.Printf(format, v...)
|
||||
}
|
||||
|
||||
func (it *InjectTag) tagFromComment(comment string) (tag string) {
|
||||
bsonMatch := bsonComment.FindStringSubmatch(comment)
|
||||
if len(bsonMatch) == 2 {
|
||||
return fmt.Sprintf(`bson:%v`, bsonMatch[1])
|
||||
}
|
||||
jsonMatch := jsonComment.FindStringSubmatch(comment)
|
||||
if len(jsonMatch) == 2 {
|
||||
return fmt.Sprintf(`json:%v`, jsonMatch[1])
|
||||
}
|
||||
match := rComment.FindStringSubmatch(comment)
|
||||
if len(match) == 2 {
|
||||
return match[1]
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
type tagItem struct {
|
||||
key string
|
||||
value string
|
||||
}
|
||||
|
||||
type tagItems []tagItem
|
||||
|
||||
func (ti *tagItems) format() string {
|
||||
var tags []string
|
||||
for _, item := range *ti {
|
||||
tags = append(tags, fmt.Sprintf(`%s:%s`, item.key, item.value))
|
||||
}
|
||||
return strings.Join(tags, " ")
|
||||
}
|
||||
|
||||
func (ti *tagItems) override(nti tagItems) tagItems {
|
||||
var overrides []tagItem
|
||||
for i := range *ti {
|
||||
dup := -1
|
||||
for j := range nti {
|
||||
if (*ti)[i].key == nti[j].key {
|
||||
dup = j
|
||||
break
|
||||
}
|
||||
}
|
||||
if dup == -1 {
|
||||
overrides = append(overrides, (*ti)[i])
|
||||
} else {
|
||||
overrides = append(overrides, nti[dup])
|
||||
nti = append(nti[:dup], nti[dup+1:]...)
|
||||
}
|
||||
}
|
||||
return append(overrides, nti...)
|
||||
}
|
||||
|
||||
func (it *InjectTag) newTagItems(tag string) tagItems {
|
||||
var items []tagItem
|
||||
splitted := rTags.FindAllString(tag, -1)
|
||||
|
||||
for _, t := range splitted {
|
||||
sepPos := strings.Index(t, ":")
|
||||
items = append(items, tagItem{
|
||||
key: t[:sepPos],
|
||||
value: t[sepPos+1:],
|
||||
})
|
||||
}
|
||||
return items
|
||||
}
|
||||
|
||||
func (it *InjectTag) injectTag(contents []byte, area textArea) (injected []byte) {
|
||||
expr := make([]byte, area.End-area.Start)
|
||||
copy(expr, contents[area.Start-1:area.End-1])
|
||||
cti := it.newTagItems(area.CurrentTag)
|
||||
iti := it.newTagItems(area.InjectTag)
|
||||
ti := cti.override(iti)
|
||||
expr = rInject.ReplaceAll(expr, []byte(fmt.Sprintf("`%s`", ti.format())))
|
||||
|
||||
injected = append(injected, contents[:area.Start-1]...)
|
||||
injected = append(injected, expr...)
|
||||
injected = append(injected, contents[area.End-1:]...)
|
||||
|
||||
return
|
||||
}
|
12
inject_tag_test.go
Normal file
12
inject_tag_test.go
Normal file
@ -0,0 +1,12 @@
|
||||
package gobuf
|
||||
|
||||
import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestInjectTag_Inject(t *testing.T) {
|
||||
var parser = NewInjectTag("./example.pb.go")
|
||||
err := parser.Inject()
|
||||
assert.Nil(t, err)
|
||||
}
|
Loading…
Reference in New Issue
Block a user