You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.1 KiB
86 lines
2.1 KiB
package main |
|
|
|
import ( |
|
"fmt" |
|
"net/http" |
|
"strings" |
|
|
|
"go-common/app/tool/bmproto/protoc-gen-bm/extensions/gogoproto" |
|
|
|
"github.com/golang/protobuf/proto" |
|
"github.com/golang/protobuf/protoc-gen-go/descriptor" |
|
"google.golang.org/genproto/googleapis/api/annotations" |
|
) |
|
|
|
func getMoreTags(field *descriptor.FieldDescriptorProto) *string { |
|
if field == nil { |
|
return nil |
|
} |
|
if field.Options != nil { |
|
v, err := proto.GetExtension(field.Options, gogoproto.E_Moretags) |
|
if err == nil && v.(*string) != nil { |
|
return v.(*string) |
|
} |
|
} |
|
return nil |
|
} |
|
|
|
func getJsonTag(field *descriptor.FieldDescriptorProto) string { |
|
if field == nil { |
|
return "" |
|
} |
|
if field.Options != nil { |
|
v, err := proto.GetExtension(field.Options, gogoproto.E_Jsontag) |
|
if err == nil && v.(*string) != nil { |
|
ret := *(v.(*string)) |
|
i := strings.Index(ret, ",") |
|
if i != -1 { |
|
ret = ret[:i] |
|
} |
|
return ret |
|
} |
|
} |
|
return field.GetName() |
|
} |
|
|
|
type googleMethodOptionInfo struct { |
|
Method string |
|
PathPattern string |
|
HTTPRule *annotations.HttpRule |
|
} |
|
|
|
// ParseBMMethod parse BMMethodDescriptor form method descriptor proto |
|
func ParseBMMethod(method *descriptor.MethodDescriptorProto) (*googleMethodOptionInfo, error) { |
|
ext, err := proto.GetExtension(method.GetOptions(), annotations.E_Http) |
|
if err != nil { |
|
return nil, fmt.Errorf("get extension error: %s", err) |
|
} |
|
rule := ext.(*annotations.HttpRule) |
|
var httpMethod string |
|
var pathPattern string |
|
switch pattern := rule.Pattern.(type) { |
|
case *annotations.HttpRule_Get: |
|
pathPattern = pattern.Get |
|
httpMethod = http.MethodGet |
|
case *annotations.HttpRule_Put: |
|
pathPattern = pattern.Put |
|
httpMethod = http.MethodPut |
|
case *annotations.HttpRule_Post: |
|
pathPattern = pattern.Post |
|
httpMethod = http.MethodPost |
|
case *annotations.HttpRule_Patch: |
|
pathPattern = pattern.Patch |
|
httpMethod = http.MethodPatch |
|
case *annotations.HttpRule_Delete: |
|
pathPattern = pattern.Delete |
|
httpMethod = http.MethodDelete |
|
default: |
|
return nil, fmt.Errorf("unsupport http pattern %s", rule.Pattern) |
|
} |
|
bmMethod := &googleMethodOptionInfo{ |
|
Method: httpMethod, |
|
PathPattern: pathPattern, |
|
HTTPRule: rule, |
|
} |
|
return bmMethod, nil |
|
}
|
|
|