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