github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/cmd/protoc-gen-openapi/converter/proto_package.go (about) 1 package converter 2 3 import ( 4 "strings" 5 6 "github.com/golang/protobuf/protoc-gen-go/descriptor" 7 "github.com/tickoalcantara12/micro/v3/service/logger" 8 ) 9 10 // ProtoPackage describes a package of Protobuf, which is an container of message types. 11 type ProtoPackage struct { 12 name string 13 parent *ProtoPackage 14 children map[string]*ProtoPackage 15 types map[string]*descriptor.DescriptorProto 16 } 17 18 func (c *Converter) lookupType(pkg *ProtoPackage, name string) (*descriptor.DescriptorProto, string, bool) { 19 if strings.HasPrefix(name, ".") { 20 return c.relativelyLookupType(globalPkg, name[1:]) 21 } 22 23 for ; pkg != nil; pkg = pkg.parent { 24 if desc, pkgName, ok := c.relativelyLookupType(pkg, name); ok { 25 return desc, pkgName, ok 26 } 27 } 28 return nil, "", false 29 } 30 31 func (c *Converter) relativelyLookupType(pkg *ProtoPackage, name string) (*descriptor.DescriptorProto, string, bool) { 32 components := strings.SplitN(name, ".", 2) 33 switch len(components) { 34 case 0: 35 logger.Debug("empty message name") 36 return nil, "", false 37 case 1: 38 found, ok := pkg.types[components[0]] 39 return found, pkg.name, ok 40 case 2: 41 logger.Tracef("Looking for %s in %s at %s (%v)", components[1], components[0], pkg.name, pkg) 42 if child, ok := pkg.children[components[0]]; ok { 43 found, pkgName, ok := c.relativelyLookupType(child, components[1]) 44 return found, pkgName, ok 45 } 46 if msg, ok := pkg.types[components[0]]; ok { 47 found, ok := c.relativelyLookupNestedType(msg, components[1]) 48 return found, pkg.name, ok 49 } 50 logger.Infof("No such package nor message in package (%s), component (%s)", pkg.name, components[0]) 51 return nil, "", false 52 default: 53 logger.Error("Failed to lookup type") 54 return nil, "", false 55 } 56 } 57 58 func (c *Converter) relativelyLookupPackage(pkg *ProtoPackage, name string) (*ProtoPackage, bool) { 59 components := strings.Split(name, ".") 60 for _, c := range components { 61 var ok bool 62 pkg, ok = pkg.children[c] 63 if !ok { 64 return nil, false 65 } 66 } 67 return pkg, true 68 }