Package protoplugin provides utilities for protoc plugins.

The only functions that should be called as of now is Main. The rest are not guaranteed to stay here.

This was HEAVILY adapted from

Eventually, a rewrite of this to be simpler for what we need would be nice, but this was available to get us here, especially with handling go imports.

Note that "FQMN", "FQSN", etc stand for "Fully Qualified Message Name", "Fully Qualified Service Name", etc, which denotes the package and object name together.



This section is empty.


This section is empty.


func Do

func Do(runner Runner, reader io.Reader, writer io.Writer) error

Do is a helper function for protobuf plugins.

func main() {
  if err := protoplugin.Do(runner, os.Stdin, os.Stdout); err != nil {

func ReadRequest

func ReadRequest(reader io.Reader) (*plugin_go.CodeGeneratorRequest, error)

ReadRequest reads the request from the reader.

func WriteResponse

func WriteResponse(writer io.Writer, response *plugin_go.CodeGeneratorResponse) error

WriteResponse writes the response to the writer.


type Enum

type Enum struct {
	File *File
	// Outers is a list of outer messages if this enum is a nested type.
	Outers []string
	Index  int

Enum describes a protocol buffer enum type.

func (*Enum) FQEN

func (e *Enum) FQEN() string

FQEN returns a fully qualified enum name of this enum.

type Field

type Field struct {
	// Message is the message type which this field belongs to.
	Message *Message
	// FieldMessage is the message type of the field.
	FieldMessage *Message

Field wraps descriptor.FieldDescriptorProto for richer features.

type File

type File struct {
	GoPackage              *GoPackage
	Messages               []*Message
	Enums                  []*Enum
	Services               []*Service
	TransitiveDependencies []*File

File wraps descriptor.FileDescriptorProto for richer features.

func (*File) SerializedFileDescriptor

func (f *File) SerializedFileDescriptor() ([]byte, error)

SerializedFileDescriptor returns a gzipped marshalled representation of the FileDescriptor.

type GoPackage

type GoPackage struct {
	Path string
	Name string
	// Alias is an alias of the package unique within the current invocation of the generator.
	Alias string

GoPackage represents a golang package.

func (*GoPackage) Standard

func (g *GoPackage) Standard() bool

Standard returns whether the import is a golang standard package.

func (*GoPackage) String

func (g *GoPackage) String() string

String returns a string representation of this package in the form of import line in golang.

type Message

type Message struct {
	File *File
	// Outers is a list of outer messages if this message is a nested type.
	Outers []string
	Fields []*Field
	// Index is proto path index of this message in File.
	Index int

Message describes a protocol buffer message types.

func (*Message) FQMN

func (m *Message) FQMN() string

FQMN returns a fully qualified message name of this message.

func (*Message) GoType

func (m *Message) GoType(currentPackage string) string

GoType returns a go type name for the message type. It prefixes the type name with the package alias if its belonging package is not "currentPackage".

type Method

type Method struct {
	Service      *Service
	RequestType  *Message
	ResponseType *Message

Method wraps descriptor.MethodDescriptorProto for richer features.

type Runner

type Runner interface {
	Run(*plugin_go.CodeGeneratorRequest) *plugin_go.CodeGeneratorResponse

Runner runs the plugin logic.

func NewMultiRunner

func NewMultiRunner(runners ...Runner) Runner

NewMultiRunner returns a new Runner that executes all the given Runners and merges the resulting CodeGeneratorResponses.

func NewRunner

func NewRunner(
	tmpl *template.Template,
	templateInfoChecker func(*TemplateInfo) error,
	baseImports []string,
	fileToOutputFilename func(*File) (string, error),
	unknownFlagHandler func(key string, value string) error,
) Runner

NewRunner returns a new Runner.

type Service

type Service struct {
	File    *File
	Methods []*Method

Service wraps descriptor.ServiceDescriptorProto for richer features.

func (*Service) FQSN

func (s *Service) FQSN() string

FQSN returns a fully qualified service name of this service.

type TemplateInfo

type TemplateInfo struct {
	Imports []*GoPackage

TemplateInfo is the info passed to a template.