Compare commits

...

2 Commits

Author SHA1 Message Date
5d13b84c7a add micro.codec.Frame special type handling
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2021-08-31 20:39:56 +03:00
ee4d83458f fix tag for nested messages
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2021-08-31 19:40:20 +03:00
4 changed files with 61 additions and 46 deletions

73
ast.go
View File

@@ -15,47 +15,58 @@ import (
"google.golang.org/protobuf/proto"
)
var (
astFields = make(map[string]map[string]map[string]*structtag.Tags) // map proto file with proto message ast struct
)
var astFields = make(map[string]map[string]map[string]*structtag.Tags) // map proto file with proto message ast struct
func (g *Generator) astFill(file *protogen.File, message *protogen.Message) error {
for _, field := range message.Fields {
if field.Desc.Options() == nil {
continue
}
if !proto.HasExtension(field.Desc.Options(), tag_options.E_Tags) {
continue
}
opts := proto.GetExtension(field.Desc.Options(), tag_options.E_Tags)
if opts != nil {
fpath := filepath.Join(g.tagPath, file.GeneratedFilenamePrefix+".pb.go")
mp, ok := astFields[fpath]
if !ok {
mp = make(map[string]map[string]*structtag.Tags)
}
nmp, ok := mp[message.GoIdent.GoName]
if !ok {
nmp = make(map[string]*structtag.Tags)
}
tags, err := structtag.Parse(opts.(string))
if err != nil {
return err
}
nmp[field.GoName] = tags
mp[message.GoIdent.GoName] = nmp
astFields[fpath] = mp
}
}
for _, nmessage := range message.Messages {
if err := g.astFill(file, nmessage); err != nil {
return err
}
}
return nil
}
func (g *Generator) astGenerate(plugin *protogen.Plugin) error {
if g.tagPath == "" {
return nil
}
for _, file := range plugin.Files {
if !file.Generate {
continue
}
for _, message := range file.Messages {
for _, field := range message.Fields {
if field.Desc.Options() == nil {
continue
}
if !proto.HasExtension(field.Desc.Options(), tag_options.E_Tags) {
continue
}
opts := proto.GetExtension(field.Desc.Options(), tag_options.E_Tags)
if opts != nil {
fpath := filepath.Join(g.tagPath, file.GeneratedFilenamePrefix+".pb.go")
mp, ok := astFields[fpath]
if !ok {
mp = make(map[string]map[string]*structtag.Tags)
}
nmp, ok := mp[message.GoIdent.GoName]
if !ok {
nmp = make(map[string]*structtag.Tags)
}
tags, err := structtag.Parse(opts.(string))
if err != nil {
return err
}
nmp[field.GoName] = tags
mp[message.GoIdent.GoName] = nmp
astFields[fpath] = mp
}
if err := g.astFill(file, message); err != nil {
return err
}
}
}

View File

@@ -29,6 +29,7 @@ func (g *Generator) httpGenerate(component string, plugin *protogen.Plugin, genC
gfile.Import(contextPackage)
gfile.Import(microApiPackage)
if genClient {
gfile.Import(microClientPackage)
gfile.Import(microClientHttpPackage)

32
util.go
View File

@@ -10,19 +10,17 @@ import (
"google.golang.org/protobuf/proto"
)
var (
httpMethodMap = map[string]string{
"GET": "MethodGet",
"HEAD": "MethodHead",
"POST": "MethodPost",
"PUT": "MethodPut",
"PATCH": "MethodPatch",
"DELETE": "MethodDelete",
"CONNECT": "MethodConnect",
"OPTIONS": "MethodOptions",
"TRACE": "MethodTrace",
}
)
var httpMethodMap = map[string]string{
"GET": "MethodGet",
"HEAD": "MethodHead",
"POST": "MethodPost",
"PUT": "MethodPut",
"PATCH": "MethodPatch",
"DELETE": "MethodDelete",
"CONNECT": "MethodConnect",
"OPTIONS": "MethodOptions",
"TRACE": "MethodTrace",
}
func unexport(s string) string {
return strings.ToLower(s[:1]) + s[1:]
@@ -30,7 +28,7 @@ func unexport(s string) string {
func generateServiceClient(gfile *protogen.GeneratedFile, service *protogen.Service) {
serviceName := service.GoName
//if rule, ok := getMicroApiService(service); ok {
// if rule, ok := getMicroApiService(service); ok {
// gfile.P("// client wrappers ", strings.Join(rule.ClientWrappers, ", "))
// }
gfile.P("type ", unexport(serviceName), "Client struct {")
@@ -62,7 +60,11 @@ func generateServiceClientMethods(gfile *protogen.GeneratedFile, service *protog
if strings.HasPrefix(ref, "."+string(service.Desc.ParentFile().Package())+".") {
ref = strings.TrimPrefix(ref, "."+string(service.Desc.ParentFile().Package())+".")
}
gfile.P(`errmap["`, rsp.Name, `"] = &`, ref, "{}")
if ref == "micro.codec.Frame" {
gfile.P(`errmap["`, rsp.Name, `"] = &`, microCodecPackage.Ident("Frame"), "{}")
} else {
gfile.P(`errmap["`, rsp.Name, `"] = &`, ref, "{}")
}
}
}
}

View File

@@ -15,6 +15,7 @@ var (
microClientPackage = protogen.GoImportPath("github.com/unistack-org/micro/v3/client")
microServerPackage = protogen.GoImportPath("github.com/unistack-org/micro/v3/server")
microClientHttpPackage = protogen.GoImportPath("github.com/unistack-org/micro-client-http/v3")
microCodecPackage = protogen.GoImportPath("github.com/unistack-org/micro/v3/codec")
timePackage = protogen.GoImportPath("time")
deprecationComment = "// Deprecated: Do not use."
versionComment = "v3.4.2"