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  }