get rid of unused files
This commit is contained in:
parent
4f663312f9
commit
907ebf48a7
|
@ -1,180 +0,0 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package descriptor provides functions for obtaining the protocol buffer
|
|
||||||
// descriptors of generated Go types.
|
|
||||||
//
|
|
||||||
// Deprecated: See the "google.golang.org/protobuf/reflect/protoreflect" package
|
|
||||||
// for how to obtain an EnumDescriptor or MessageDescriptor in order to
|
|
||||||
// programatically interact with the protobuf type system.
|
|
||||||
package descriptor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"compress/gzip"
|
|
||||||
"io/ioutil"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"google.golang.org/protobuf/reflect/protodesc"
|
|
||||||
"google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
"google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
|
|
||||||
descriptorpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Message is proto.Message with a method to return its descriptor.
|
|
||||||
//
|
|
||||||
// Deprecated: The Descriptor method may not be generated by future
|
|
||||||
// versions of protoc-gen-go, meaning that this interface may not
|
|
||||||
// be implemented by many concrete message types.
|
|
||||||
type Message interface {
|
|
||||||
proto.Message
|
|
||||||
Descriptor() ([]byte, []int)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ForMessage returns the file descriptor proto containing
|
|
||||||
// the message and the message descriptor proto for the message itself.
|
|
||||||
// The returned proto messages must not be mutated.
|
|
||||||
//
|
|
||||||
// Deprecated: Not all concrete message types satisfy the Message interface.
|
|
||||||
// Use MessageDescriptorProto instead. If possible, the calling code should
|
|
||||||
// be rewritten to use protobuf reflection instead.
|
|
||||||
// See package "google.golang.org/protobuf/reflect/protoreflect" for details.
|
|
||||||
func ForMessage(m Message) (*descriptorpb.FileDescriptorProto, *descriptorpb.DescriptorProto) {
|
|
||||||
return MessageDescriptorProto(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
type rawDesc struct {
|
|
||||||
fileDesc []byte
|
|
||||||
indexes []int
|
|
||||||
}
|
|
||||||
|
|
||||||
var rawDescCache sync.Map // map[protoreflect.Descriptor]*rawDesc
|
|
||||||
|
|
||||||
func deriveRawDescriptor(d protoreflect.Descriptor) ([]byte, []int) {
|
|
||||||
// Fast-path: check whether raw descriptors are already cached.
|
|
||||||
origDesc := d
|
|
||||||
if v, ok := rawDescCache.Load(origDesc); ok {
|
|
||||||
return v.(*rawDesc).fileDesc, v.(*rawDesc).indexes
|
|
||||||
}
|
|
||||||
|
|
||||||
// Slow-path: derive the raw descriptor from the v2 descriptor.
|
|
||||||
|
|
||||||
// Start with the leaf (a given enum or message declaration) and
|
|
||||||
// ascend upwards until we hit the parent file descriptor.
|
|
||||||
var idxs []int
|
|
||||||
for {
|
|
||||||
idxs = append(idxs, d.Index())
|
|
||||||
d = d.Parent()
|
|
||||||
if d == nil {
|
|
||||||
// TODO: We could construct a FileDescriptor stub for standalone
|
|
||||||
// descriptors to satisfy the API.
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
if _, ok := d.(protoreflect.FileDescriptor); ok {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obtain the raw file descriptor.
|
|
||||||
fd := d.(protoreflect.FileDescriptor)
|
|
||||||
b, _ := proto.Marshal(protodesc.ToFileDescriptorProto(fd))
|
|
||||||
file := protoimpl.X.CompressGZIP(b)
|
|
||||||
|
|
||||||
// Reverse the indexes, since we populated it in reverse.
|
|
||||||
for i, j := 0, len(idxs)-1; i < j; i, j = i+1, j-1 {
|
|
||||||
idxs[i], idxs[j] = idxs[j], idxs[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
if v, ok := rawDescCache.LoadOrStore(origDesc, &rawDesc{file, idxs}); ok {
|
|
||||||
return v.(*rawDesc).fileDesc, v.(*rawDesc).indexes
|
|
||||||
}
|
|
||||||
return file, idxs
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnumRawDescriptor returns the GZIP'd raw file descriptor representing
|
|
||||||
// the enum and the index path to reach the enum declaration.
|
|
||||||
// The returned slices must not be mutated.
|
|
||||||
func EnumRawDescriptor(e proto.GeneratedEnum) ([]byte, []int) {
|
|
||||||
if ev, ok := e.(interface{ EnumDescriptor() ([]byte, []int) }); ok {
|
|
||||||
return ev.EnumDescriptor()
|
|
||||||
}
|
|
||||||
ed := protoimpl.X.EnumTypeOf(e)
|
|
||||||
return deriveRawDescriptor(ed.Descriptor())
|
|
||||||
}
|
|
||||||
|
|
||||||
// MessageRawDescriptor returns the GZIP'd raw file descriptor representing
|
|
||||||
// the message and the index path to reach the message declaration.
|
|
||||||
// The returned slices must not be mutated.
|
|
||||||
func MessageRawDescriptor(m proto.GeneratedMessage) ([]byte, []int) {
|
|
||||||
if mv, ok := m.(interface{ Descriptor() ([]byte, []int) }); ok {
|
|
||||||
return mv.Descriptor()
|
|
||||||
}
|
|
||||||
md := protoimpl.X.MessageTypeOf(m)
|
|
||||||
return deriveRawDescriptor(md.Descriptor())
|
|
||||||
}
|
|
||||||
|
|
||||||
var fileDescCache sync.Map // map[*byte]*descriptorpb.FileDescriptorProto
|
|
||||||
|
|
||||||
func deriveFileDescriptor(rawDesc []byte) *descriptorpb.FileDescriptorProto {
|
|
||||||
// Fast-path: check whether descriptor protos are already cached.
|
|
||||||
if v, ok := fileDescCache.Load(&rawDesc[0]); ok {
|
|
||||||
return v.(*descriptorpb.FileDescriptorProto)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Slow-path: derive the descriptor proto from the GZIP'd message.
|
|
||||||
zr, err := gzip.NewReader(bytes.NewReader(rawDesc))
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
b, err := ioutil.ReadAll(zr)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
fd := new(descriptorpb.FileDescriptorProto)
|
|
||||||
if err := proto.Unmarshal(b, fd); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
if v, ok := fileDescCache.LoadOrStore(&rawDesc[0], fd); ok {
|
|
||||||
return v.(*descriptorpb.FileDescriptorProto)
|
|
||||||
}
|
|
||||||
return fd
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnumDescriptorProto returns the file descriptor proto representing
|
|
||||||
// the enum and the enum descriptor proto for the enum itself.
|
|
||||||
// The returned proto messages must not be mutated.
|
|
||||||
func EnumDescriptorProto(e proto.GeneratedEnum) (*descriptorpb.FileDescriptorProto, *descriptorpb.EnumDescriptorProto) {
|
|
||||||
rawDesc, idxs := EnumRawDescriptor(e)
|
|
||||||
if rawDesc == nil || idxs == nil {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
fd := deriveFileDescriptor(rawDesc)
|
|
||||||
if len(idxs) == 1 {
|
|
||||||
return fd, fd.EnumType[idxs[0]]
|
|
||||||
}
|
|
||||||
md := fd.MessageType[idxs[0]]
|
|
||||||
for _, i := range idxs[1 : len(idxs)-1] {
|
|
||||||
md = md.NestedType[i]
|
|
||||||
}
|
|
||||||
ed := md.EnumType[idxs[len(idxs)-1]]
|
|
||||||
return fd, ed
|
|
||||||
}
|
|
||||||
|
|
||||||
// MessageDescriptorProto returns the file descriptor proto representing
|
|
||||||
// the message and the message descriptor proto for the message itself.
|
|
||||||
// The returned proto messages must not be mutated.
|
|
||||||
func MessageDescriptorProto(m proto.GeneratedMessage) (*descriptorpb.FileDescriptorProto, *descriptorpb.DescriptorProto) {
|
|
||||||
rawDesc, idxs := MessageRawDescriptor(m)
|
|
||||||
if rawDesc == nil || idxs == nil {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
fd := deriveFileDescriptor(rawDesc)
|
|
||||||
md := fd.MessageType[idxs[0]]
|
|
||||||
for _, i := range idxs[1:] {
|
|
||||||
md = md.NestedType[i]
|
|
||||||
}
|
|
||||||
return fd, md
|
|
||||||
}
|
|
|
@ -1,85 +0,0 @@
|
||||||
// Copyright 2020 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package descriptor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp"
|
|
||||||
"google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
|
|
||||||
descpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestEnumDescriptor(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
enum protoreflect.Enum
|
|
||||||
idxs []int
|
|
||||||
name string
|
|
||||||
}{{
|
|
||||||
enum: descpb.FieldDescriptorProto_Type(0),
|
|
||||||
idxs: []int{
|
|
||||||
new(descpb.FieldDescriptorProto).ProtoReflect().Descriptor().Index(),
|
|
||||||
new(descpb.FieldDescriptorProto_Type).Descriptor().Index(),
|
|
||||||
},
|
|
||||||
name: "Type",
|
|
||||||
}, {
|
|
||||||
enum: descpb.FieldOptions_CType(0),
|
|
||||||
idxs: []int{
|
|
||||||
new(descpb.FieldOptions).ProtoReflect().Descriptor().Index(),
|
|
||||||
new(descpb.FieldOptions_CType).Descriptor().Index(),
|
|
||||||
},
|
|
||||||
name: "CType",
|
|
||||||
}}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
e := struct{ protoreflect.Enum }{tt.enum} // v2-only enum
|
|
||||||
|
|
||||||
_, idxs := EnumRawDescriptor(e)
|
|
||||||
if diff := cmp.Diff(tt.idxs, idxs); diff != "" {
|
|
||||||
t.Errorf("path index mismatch (-want +got):\n%v", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, ed := EnumDescriptorProto(e)
|
|
||||||
if ed.GetName() != tt.name {
|
|
||||||
t.Errorf("mismatching enum name: got %v, want %v", ed.GetName(), tt.name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMessageDescriptor(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
message protoreflect.ProtoMessage
|
|
||||||
idxs []int
|
|
||||||
name string
|
|
||||||
}{{
|
|
||||||
message: (*descpb.SourceCodeInfo_Location)(nil),
|
|
||||||
idxs: []int{
|
|
||||||
new(descpb.SourceCodeInfo).ProtoReflect().Descriptor().Index(),
|
|
||||||
new(descpb.SourceCodeInfo_Location).ProtoReflect().Descriptor().Index(),
|
|
||||||
},
|
|
||||||
name: "Location",
|
|
||||||
}, {
|
|
||||||
message: (*descpb.FileDescriptorProto)(nil),
|
|
||||||
idxs: []int{
|
|
||||||
new(descpb.FileDescriptorProto).ProtoReflect().Descriptor().Index(),
|
|
||||||
},
|
|
||||||
name: "FileDescriptorProto",
|
|
||||||
}}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
m := struct{ protoreflect.ProtoMessage }{tt.message} // v2-only message
|
|
||||||
|
|
||||||
_, idxs := MessageRawDescriptor(m)
|
|
||||||
if diff := cmp.Diff(tt.idxs, idxs); diff != "" {
|
|
||||||
t.Errorf("path index mismatch (-want +got):\n%v", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, md := MessageDescriptorProto(m)
|
|
||||||
if md.GetName() != tt.name {
|
|
||||||
t.Errorf("mismatching message name: got %v, want %v", md.GetName(), tt.name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -7,3 +7,7 @@ require (
|
||||||
github.com/google/go-cmp v0.5.5
|
github.com/google/go-cmp v0.5.5
|
||||||
google.golang.org/protobuf v1.26.0
|
google.golang.org/protobuf v1.26.0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
replace github.com/golang/protobuf => ../
|
||||||
|
|
||||||
|
replace github.com/golang/protobuf/protoc-gen-go/descriptor => ../protoc-gen-go/descriptor
|
||||||
|
|
|
@ -1,132 +0,0 @@
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:generate go run . -execute
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"path"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
gengo "google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo"
|
|
||||||
"google.golang.org/protobuf/compiler/protogen"
|
|
||||||
"google.golang.org/protobuf/reflect/protodesc"
|
|
||||||
"google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
|
|
||||||
"google.golang.org/protobuf/types/descriptorpb"
|
|
||||||
"google.golang.org/protobuf/types/known/anypb"
|
|
||||||
"google.golang.org/protobuf/types/known/durationpb"
|
|
||||||
"google.golang.org/protobuf/types/known/emptypb"
|
|
||||||
"google.golang.org/protobuf/types/known/structpb"
|
|
||||||
"google.golang.org/protobuf/types/known/timestamppb"
|
|
||||||
"google.golang.org/protobuf/types/known/wrapperspb"
|
|
||||||
"google.golang.org/protobuf/types/pluginpb"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
run := flag.Bool("execute", false, "Write generated files to destination.")
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
// Set of generated proto packages to forward to v2.
|
|
||||||
files := []struct {
|
|
||||||
oldGoPkg string
|
|
||||||
newGoPkg string
|
|
||||||
pbDesc protoreflect.FileDescriptor
|
|
||||||
}{{
|
|
||||||
oldGoPkg: "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor",
|
|
||||||
newGoPkg: "google.golang.org/protobuf/types/descriptorpb",
|
|
||||||
pbDesc: descriptorpb.File_google_protobuf_descriptor_proto,
|
|
||||||
}, {
|
|
||||||
oldGoPkg: "github.com/golang/protobuf/protoc-gen-go/plugin;plugin_go",
|
|
||||||
newGoPkg: "google.golang.org/protobuf/types/pluginpb",
|
|
||||||
pbDesc: pluginpb.File_google_protobuf_compiler_plugin_proto,
|
|
||||||
}, {
|
|
||||||
oldGoPkg: "github.com/golang/protobuf/ptypes/any;any",
|
|
||||||
newGoPkg: "google.golang.org/protobuf/types/known/anypb",
|
|
||||||
pbDesc: anypb.File_google_protobuf_any_proto,
|
|
||||||
}, {
|
|
||||||
oldGoPkg: "github.com/golang/protobuf/ptypes/duration;duration",
|
|
||||||
newGoPkg: "google.golang.org/protobuf/types/known/durationpb",
|
|
||||||
pbDesc: durationpb.File_google_protobuf_duration_proto,
|
|
||||||
}, {
|
|
||||||
oldGoPkg: "github.com/golang/protobuf/ptypes/timestamp;timestamp",
|
|
||||||
newGoPkg: "google.golang.org/protobuf/types/known/timestamppb",
|
|
||||||
pbDesc: timestamppb.File_google_protobuf_timestamp_proto,
|
|
||||||
}, {
|
|
||||||
oldGoPkg: "github.com/golang/protobuf/ptypes/wrappers;wrappers",
|
|
||||||
newGoPkg: "google.golang.org/protobuf/types/known/wrapperspb",
|
|
||||||
pbDesc: wrapperspb.File_google_protobuf_wrappers_proto,
|
|
||||||
}, {
|
|
||||||
oldGoPkg: "github.com/golang/protobuf/ptypes/struct;structpb",
|
|
||||||
newGoPkg: "google.golang.org/protobuf/types/known/structpb",
|
|
||||||
pbDesc: structpb.File_google_protobuf_struct_proto,
|
|
||||||
}, {
|
|
||||||
oldGoPkg: "github.com/golang/protobuf/ptypes/empty;empty",
|
|
||||||
newGoPkg: "google.golang.org/protobuf/types/known/emptypb",
|
|
||||||
pbDesc: emptypb.File_google_protobuf_empty_proto,
|
|
||||||
}}
|
|
||||||
|
|
||||||
// For each package, construct a proto file that public imports the package.
|
|
||||||
var req pluginpb.CodeGeneratorRequest
|
|
||||||
var flags []string
|
|
||||||
for _, file := range files {
|
|
||||||
pkgPath := file.oldGoPkg[:strings.IndexByte(file.oldGoPkg, ';')]
|
|
||||||
fd := &descriptorpb.FileDescriptorProto{
|
|
||||||
Name: proto.String(pkgPath + "/" + path.Base(pkgPath) + ".proto"),
|
|
||||||
Syntax: proto.String(file.pbDesc.Syntax().String()),
|
|
||||||
Dependency: []string{file.pbDesc.Path()},
|
|
||||||
PublicDependency: []int32{0},
|
|
||||||
Options: &descriptorpb.FileOptions{GoPackage: proto.String(file.oldGoPkg)},
|
|
||||||
}
|
|
||||||
req.ProtoFile = append(req.ProtoFile, protodesc.ToFileDescriptorProto(file.pbDesc), fd)
|
|
||||||
req.FileToGenerate = append(req.FileToGenerate, fd.GetName())
|
|
||||||
flags = append(flags, "M"+file.pbDesc.Path()+"="+file.newGoPkg)
|
|
||||||
}
|
|
||||||
req.Parameter = proto.String(strings.Join(flags, ","))
|
|
||||||
|
|
||||||
// Use the internal logic of protoc-gen-go to generate the files.
|
|
||||||
gen, err := protogen.Options{}.New(&req)
|
|
||||||
check(err)
|
|
||||||
for _, file := range gen.Files {
|
|
||||||
if file.Generate {
|
|
||||||
gengo.GenerateVersionMarkers = false
|
|
||||||
gengo.GenerateFile(gen, file)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the generated files.
|
|
||||||
resp := gen.Response()
|
|
||||||
if resp.Error != nil {
|
|
||||||
panic("gengo error: " + resp.GetError())
|
|
||||||
}
|
|
||||||
for _, file := range resp.File {
|
|
||||||
relPath, err := filepath.Rel(filepath.FromSlash("github.com/golang/protobuf"), file.GetName())
|
|
||||||
check(err)
|
|
||||||
|
|
||||||
check(ioutil.WriteFile(relPath+".bak", []byte(file.GetContent()), 0664))
|
|
||||||
if *run {
|
|
||||||
fmt.Println("#", relPath)
|
|
||||||
check(os.Rename(relPath+".bak", relPath))
|
|
||||||
} else {
|
|
||||||
cmd := exec.Command("diff", relPath, relPath+".bak", "-N", "-u")
|
|
||||||
cmd.Stdout = os.Stdout
|
|
||||||
cmd.Run()
|
|
||||||
os.Remove(relPath + ".bak") // best-effort delete
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func check(err error) {
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,398 +0,0 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package gengogrpc contains the gRPC code generator.
|
|
||||||
package gengogrpc
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"google.golang.org/protobuf/compiler/protogen"
|
|
||||||
|
|
||||||
"google.golang.org/protobuf/types/descriptorpb"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
contextPackage = protogen.GoImportPath("context")
|
|
||||||
grpcPackage = protogen.GoImportPath("google.golang.org/grpc")
|
|
||||||
codesPackage = protogen.GoImportPath("google.golang.org/grpc/codes")
|
|
||||||
statusPackage = protogen.GoImportPath("google.golang.org/grpc/status")
|
|
||||||
)
|
|
||||||
|
|
||||||
// GenerateFile generates a _grpc.pb.go file containing gRPC service definitions.
|
|
||||||
func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.GeneratedFile {
|
|
||||||
if len(file.Services) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
filename := file.GeneratedFilenamePrefix + "_grpc.pb.go"
|
|
||||||
g := gen.NewGeneratedFile(filename, file.GoImportPath)
|
|
||||||
g.P("// Code generated by protoc-gen-go-grpc. DO NOT EDIT.")
|
|
||||||
g.P()
|
|
||||||
g.P("package ", file.GoPackageName)
|
|
||||||
g.P()
|
|
||||||
GenerateFileContent(gen, file, g)
|
|
||||||
return g
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenerateFileContent generates the gRPC service definitions, excluding the package statement.
|
|
||||||
func GenerateFileContent(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile) {
|
|
||||||
if len(file.Services) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Remove this. We don't need to include these references any more.
|
|
||||||
g.P("// Reference imports to suppress errors if they are not otherwise used.")
|
|
||||||
g.P("var _ ", contextPackage.Ident("Context"))
|
|
||||||
g.P("var _ ", grpcPackage.Ident("ClientConnInterface"))
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
g.P("// This is a compile-time assertion to ensure that this generated file")
|
|
||||||
g.P("// is compatible with the grpc package it is being compiled against.")
|
|
||||||
g.P("const _ = ", grpcPackage.Ident("SupportPackageIsVersion6"))
|
|
||||||
g.P()
|
|
||||||
for _, service := range file.Services {
|
|
||||||
genService(gen, file, g, service)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func genService(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, service *protogen.Service) {
|
|
||||||
clientName := service.GoName + "Client"
|
|
||||||
|
|
||||||
g.P("// ", clientName, " is the client API for ", service.GoName, " service.")
|
|
||||||
g.P("//")
|
|
||||||
g.P("// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.")
|
|
||||||
|
|
||||||
// Client interface.
|
|
||||||
if service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() {
|
|
||||||
g.P("//")
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.Annotate(clientName, service.Location)
|
|
||||||
g.P("type ", clientName, " interface {")
|
|
||||||
for _, method := range service.Methods {
|
|
||||||
g.Annotate(clientName+"."+method.GoName, method.Location)
|
|
||||||
if method.Desc.Options().(*descriptorpb.MethodOptions).GetDeprecated() {
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.P(method.Comments.Leading,
|
|
||||||
clientSignature(g, method))
|
|
||||||
}
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
// Client structure.
|
|
||||||
g.P("type ", unexport(clientName), " struct {")
|
|
||||||
g.P("cc ", grpcPackage.Ident("ClientConnInterface"))
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
// NewClient factory.
|
|
||||||
if service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() {
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.P("func New", clientName, " (cc ", grpcPackage.Ident("ClientConnInterface"), ") ", clientName, " {")
|
|
||||||
g.P("return &", unexport(clientName), "{cc}")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
var methodIndex, streamIndex int
|
|
||||||
// Client method implementations.
|
|
||||||
for _, method := range service.Methods {
|
|
||||||
if !method.Desc.IsStreamingServer() && !method.Desc.IsStreamingClient() {
|
|
||||||
// Unary RPC method
|
|
||||||
genClientMethod(gen, file, g, method, methodIndex)
|
|
||||||
methodIndex++
|
|
||||||
} else {
|
|
||||||
// Streaming RPC method
|
|
||||||
genClientMethod(gen, file, g, method, streamIndex)
|
|
||||||
streamIndex++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Server interface.
|
|
||||||
serverType := service.GoName + "Server"
|
|
||||||
g.P("// ", serverType, " is the server API for ", service.GoName, " service.")
|
|
||||||
if service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() {
|
|
||||||
g.P("//")
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.Annotate(serverType, service.Location)
|
|
||||||
g.P("type ", serverType, " interface {")
|
|
||||||
for _, method := range service.Methods {
|
|
||||||
g.Annotate(serverType+"."+method.GoName, method.Location)
|
|
||||||
if method.Desc.Options().(*descriptorpb.MethodOptions).GetDeprecated() {
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.P(method.Comments.Leading,
|
|
||||||
serverSignature(g, method))
|
|
||||||
}
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
// Server Unimplemented struct for forward compatibility.
|
|
||||||
g.P("// Unimplemented", serverType, " can be embedded to have forward compatible implementations.")
|
|
||||||
g.P("type Unimplemented", serverType, " struct {")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
for _, method := range service.Methods {
|
|
||||||
nilArg := ""
|
|
||||||
if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {
|
|
||||||
nilArg = "nil,"
|
|
||||||
}
|
|
||||||
g.P("func (*Unimplemented", serverType, ") ", serverSignature(g, method), "{")
|
|
||||||
g.P("return ", nilArg, statusPackage.Ident("Errorf"), "(", codesPackage.Ident("Unimplemented"), `, "method `, method.GoName, ` not implemented")`)
|
|
||||||
g.P("}")
|
|
||||||
}
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
// Server registration.
|
|
||||||
if service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() {
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
serviceDescVar := "_" + service.GoName + "_serviceDesc"
|
|
||||||
g.P("func Register", service.GoName, "Server(s *", grpcPackage.Ident("Server"), ", srv ", serverType, ") {")
|
|
||||||
g.P("s.RegisterService(&", serviceDescVar, `, srv)`)
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
// Server handler implementations.
|
|
||||||
var handlerNames []string
|
|
||||||
for _, method := range service.Methods {
|
|
||||||
hname := genServerMethod(gen, file, g, method)
|
|
||||||
handlerNames = append(handlerNames, hname)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Service descriptor.
|
|
||||||
g.P("var ", serviceDescVar, " = ", grpcPackage.Ident("ServiceDesc"), " {")
|
|
||||||
g.P("ServiceName: ", strconv.Quote(string(service.Desc.FullName())), ",")
|
|
||||||
g.P("HandlerType: (*", serverType, ")(nil),")
|
|
||||||
g.P("Methods: []", grpcPackage.Ident("MethodDesc"), "{")
|
|
||||||
for i, method := range service.Methods {
|
|
||||||
if method.Desc.IsStreamingClient() || method.Desc.IsStreamingServer() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
g.P("{")
|
|
||||||
g.P("MethodName: ", strconv.Quote(string(method.Desc.Name())), ",")
|
|
||||||
g.P("Handler: ", handlerNames[i], ",")
|
|
||||||
g.P("},")
|
|
||||||
}
|
|
||||||
g.P("},")
|
|
||||||
g.P("Streams: []", grpcPackage.Ident("StreamDesc"), "{")
|
|
||||||
for i, method := range service.Methods {
|
|
||||||
if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
g.P("{")
|
|
||||||
g.P("StreamName: ", strconv.Quote(string(method.Desc.Name())), ",")
|
|
||||||
g.P("Handler: ", handlerNames[i], ",")
|
|
||||||
if method.Desc.IsStreamingServer() {
|
|
||||||
g.P("ServerStreams: true,")
|
|
||||||
}
|
|
||||||
if method.Desc.IsStreamingClient() {
|
|
||||||
g.P("ClientStreams: true,")
|
|
||||||
}
|
|
||||||
g.P("},")
|
|
||||||
}
|
|
||||||
g.P("},")
|
|
||||||
g.P("Metadata: \"", file.Desc.Path(), "\",")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
|
|
||||||
func clientSignature(g *protogen.GeneratedFile, method *protogen.Method) string {
|
|
||||||
s := method.GoName + "(ctx " + g.QualifiedGoIdent(contextPackage.Ident("Context"))
|
|
||||||
if !method.Desc.IsStreamingClient() {
|
|
||||||
s += ", in *" + g.QualifiedGoIdent(method.Input.GoIdent)
|
|
||||||
}
|
|
||||||
s += ", opts ..." + g.QualifiedGoIdent(grpcPackage.Ident("CallOption")) + ") ("
|
|
||||||
if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {
|
|
||||||
s += "*" + g.QualifiedGoIdent(method.Output.GoIdent)
|
|
||||||
} else {
|
|
||||||
s += method.Parent.GoName + "_" + method.GoName + "Client"
|
|
||||||
}
|
|
||||||
s += ", error)"
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
func genClientMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, method *protogen.Method, index int) {
|
|
||||||
service := method.Parent
|
|
||||||
sname := fmt.Sprintf("/%s/%s", service.Desc.FullName(), method.Desc.Name())
|
|
||||||
|
|
||||||
if method.Desc.Options().(*descriptorpb.MethodOptions).GetDeprecated() {
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.P("func (c *", unexport(service.GoName), "Client) ", clientSignature(g, method), "{")
|
|
||||||
if !method.Desc.IsStreamingServer() && !method.Desc.IsStreamingClient() {
|
|
||||||
g.P("out := new(", method.Output.GoIdent, ")")
|
|
||||||
g.P(`err := c.cc.Invoke(ctx, "`, sname, `", in, out, opts...)`)
|
|
||||||
g.P("if err != nil { return nil, err }")
|
|
||||||
g.P("return out, nil")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
streamType := unexport(service.GoName) + method.GoName + "Client"
|
|
||||||
serviceDescVar := "_" + service.GoName + "_serviceDesc"
|
|
||||||
g.P("stream, err := c.cc.NewStream(ctx, &", serviceDescVar, ".Streams[", index, `], "`, sname, `", opts...)`)
|
|
||||||
g.P("if err != nil { return nil, err }")
|
|
||||||
g.P("x := &", streamType, "{stream}")
|
|
||||||
if !method.Desc.IsStreamingClient() {
|
|
||||||
g.P("if err := x.ClientStream.SendMsg(in); err != nil { return nil, err }")
|
|
||||||
g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }")
|
|
||||||
}
|
|
||||||
g.P("return x, nil")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
genSend := method.Desc.IsStreamingClient()
|
|
||||||
genRecv := method.Desc.IsStreamingServer()
|
|
||||||
genCloseAndRecv := !method.Desc.IsStreamingServer()
|
|
||||||
|
|
||||||
// Stream auxiliary types and methods.
|
|
||||||
g.P("type ", service.GoName, "_", method.GoName, "Client interface {")
|
|
||||||
if genSend {
|
|
||||||
g.P("Send(*", method.Input.GoIdent, ") error")
|
|
||||||
}
|
|
||||||
if genRecv {
|
|
||||||
g.P("Recv() (*", method.Output.GoIdent, ", error)")
|
|
||||||
}
|
|
||||||
if genCloseAndRecv {
|
|
||||||
g.P("CloseAndRecv() (*", method.Output.GoIdent, ", error)")
|
|
||||||
}
|
|
||||||
g.P(grpcPackage.Ident("ClientStream"))
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
g.P("type ", streamType, " struct {")
|
|
||||||
g.P(grpcPackage.Ident("ClientStream"))
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
if genSend {
|
|
||||||
g.P("func (x *", streamType, ") Send(m *", method.Input.GoIdent, ") error {")
|
|
||||||
g.P("return x.ClientStream.SendMsg(m)")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
if genRecv {
|
|
||||||
g.P("func (x *", streamType, ") Recv() (*", method.Output.GoIdent, ", error) {")
|
|
||||||
g.P("m := new(", method.Output.GoIdent, ")")
|
|
||||||
g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }")
|
|
||||||
g.P("return m, nil")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
if genCloseAndRecv {
|
|
||||||
g.P("func (x *", streamType, ") CloseAndRecv() (*", method.Output.GoIdent, ", error) {")
|
|
||||||
g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }")
|
|
||||||
g.P("m := new(", method.Output.GoIdent, ")")
|
|
||||||
g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }")
|
|
||||||
g.P("return m, nil")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func serverSignature(g *protogen.GeneratedFile, method *protogen.Method) string {
|
|
||||||
var reqArgs []string
|
|
||||||
ret := "error"
|
|
||||||
if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {
|
|
||||||
reqArgs = append(reqArgs, g.QualifiedGoIdent(contextPackage.Ident("Context")))
|
|
||||||
ret = "(*" + g.QualifiedGoIdent(method.Output.GoIdent) + ", error)"
|
|
||||||
}
|
|
||||||
if !method.Desc.IsStreamingClient() {
|
|
||||||
reqArgs = append(reqArgs, "*"+g.QualifiedGoIdent(method.Input.GoIdent))
|
|
||||||
}
|
|
||||||
if method.Desc.IsStreamingClient() || method.Desc.IsStreamingServer() {
|
|
||||||
reqArgs = append(reqArgs, method.Parent.GoName+"_"+method.GoName+"Server")
|
|
||||||
}
|
|
||||||
return method.GoName + "(" + strings.Join(reqArgs, ", ") + ") " + ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func genServerMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, method *protogen.Method) string {
|
|
||||||
service := method.Parent
|
|
||||||
hname := fmt.Sprintf("_%s_%s_Handler", service.GoName, method.GoName)
|
|
||||||
|
|
||||||
if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {
|
|
||||||
g.P("func ", hname, "(srv interface{}, ctx ", contextPackage.Ident("Context"), ", dec func(interface{}) error, interceptor ", grpcPackage.Ident("UnaryServerInterceptor"), ") (interface{}, error) {")
|
|
||||||
g.P("in := new(", method.Input.GoIdent, ")")
|
|
||||||
g.P("if err := dec(in); err != nil { return nil, err }")
|
|
||||||
g.P("if interceptor == nil { return srv.(", service.GoName, "Server).", method.GoName, "(ctx, in) }")
|
|
||||||
g.P("info := &", grpcPackage.Ident("UnaryServerInfo"), "{")
|
|
||||||
g.P("Server: srv,")
|
|
||||||
g.P("FullMethod: ", strconv.Quote(fmt.Sprintf("/%s/%s", service.Desc.FullName(), method.GoName)), ",")
|
|
||||||
g.P("}")
|
|
||||||
g.P("handler := func(ctx ", contextPackage.Ident("Context"), ", req interface{}) (interface{}, error) {")
|
|
||||||
g.P("return srv.(", service.GoName, "Server).", method.GoName, "(ctx, req.(*", method.Input.GoIdent, "))")
|
|
||||||
g.P("}")
|
|
||||||
g.P("return interceptor(ctx, in, info, handler)")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
return hname
|
|
||||||
}
|
|
||||||
streamType := unexport(service.GoName) + method.GoName + "Server"
|
|
||||||
g.P("func ", hname, "(srv interface{}, stream ", grpcPackage.Ident("ServerStream"), ") error {")
|
|
||||||
if !method.Desc.IsStreamingClient() {
|
|
||||||
g.P("m := new(", method.Input.GoIdent, ")")
|
|
||||||
g.P("if err := stream.RecvMsg(m); err != nil { return err }")
|
|
||||||
g.P("return srv.(", service.GoName, "Server).", method.GoName, "(m, &", streamType, "{stream})")
|
|
||||||
} else {
|
|
||||||
g.P("return srv.(", service.GoName, "Server).", method.GoName, "(&", streamType, "{stream})")
|
|
||||||
}
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
genSend := method.Desc.IsStreamingServer()
|
|
||||||
genSendAndClose := !method.Desc.IsStreamingServer()
|
|
||||||
genRecv := method.Desc.IsStreamingClient()
|
|
||||||
|
|
||||||
// Stream auxiliary types and methods.
|
|
||||||
g.P("type ", service.GoName, "_", method.GoName, "Server interface {")
|
|
||||||
if genSend {
|
|
||||||
g.P("Send(*", method.Output.GoIdent, ") error")
|
|
||||||
}
|
|
||||||
if genSendAndClose {
|
|
||||||
g.P("SendAndClose(*", method.Output.GoIdent, ") error")
|
|
||||||
}
|
|
||||||
if genRecv {
|
|
||||||
g.P("Recv() (*", method.Input.GoIdent, ", error)")
|
|
||||||
}
|
|
||||||
g.P(grpcPackage.Ident("ServerStream"))
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
g.P("type ", streamType, " struct {")
|
|
||||||
g.P(grpcPackage.Ident("ServerStream"))
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
if genSend {
|
|
||||||
g.P("func (x *", streamType, ") Send(m *", method.Output.GoIdent, ") error {")
|
|
||||||
g.P("return x.ServerStream.SendMsg(m)")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
if genSendAndClose {
|
|
||||||
g.P("func (x *", streamType, ") SendAndClose(m *", method.Output.GoIdent, ") error {")
|
|
||||||
g.P("return x.ServerStream.SendMsg(m)")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
if genRecv {
|
|
||||||
g.P("func (x *", streamType, ") Recv() (*", method.Input.GoIdent, ", error) {")
|
|
||||||
g.P("m := new(", method.Input.GoIdent, ")")
|
|
||||||
g.P("if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err }")
|
|
||||||
g.P("return m, nil")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
|
|
||||||
return hname
|
|
||||||
}
|
|
||||||
|
|
||||||
const deprecationComment = "// Deprecated: Do not use."
|
|
||||||
|
|
||||||
func unexport(s string) string { return strings.ToLower(s[:1]) + s[1:] }
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,155 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
syntax = "proto2";
|
|
||||||
|
|
||||||
option go_package = "github.com/golang/protobuf/internal/testprotos/jsonpb_proto";
|
|
||||||
|
|
||||||
import "google/protobuf/any.proto";
|
|
||||||
import "google/protobuf/duration.proto";
|
|
||||||
import "google/protobuf/struct.proto";
|
|
||||||
import "google/protobuf/timestamp.proto";
|
|
||||||
import "google/protobuf/wrappers.proto";
|
|
||||||
|
|
||||||
package jsonpb_test;
|
|
||||||
|
|
||||||
// Test message for holding primitive types.
|
|
||||||
message Simple {
|
|
||||||
optional bool o_bool = 1;
|
|
||||||
optional int32 o_int32 = 2;
|
|
||||||
optional int32 o_int32_str = 3;
|
|
||||||
optional int64 o_int64 = 4;
|
|
||||||
optional int64 o_int64_str = 5;
|
|
||||||
optional uint32 o_uint32 = 6;
|
|
||||||
optional uint32 o_uint32_str = 7;
|
|
||||||
optional uint64 o_uint64 = 8;
|
|
||||||
optional uint64 o_uint64_str = 9;
|
|
||||||
optional sint32 o_sint32 = 10;
|
|
||||||
optional sint32 o_sint32_str = 11;
|
|
||||||
optional sint64 o_sint64 = 12;
|
|
||||||
optional sint64 o_sint64_str = 13;
|
|
||||||
optional float o_float = 14;
|
|
||||||
optional float o_float_str = 15;
|
|
||||||
optional double o_double = 16;
|
|
||||||
optional double o_double_str = 17;
|
|
||||||
optional string o_string = 18;
|
|
||||||
optional bytes o_bytes = 19;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test message for holding special non-finites primitives.
|
|
||||||
message NonFinites {
|
|
||||||
optional float f_nan = 1;
|
|
||||||
optional float f_pinf = 2;
|
|
||||||
optional float f_ninf = 3;
|
|
||||||
optional double d_nan = 4;
|
|
||||||
optional double d_pinf = 5;
|
|
||||||
optional double d_ninf = 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test message for holding repeated primitives.
|
|
||||||
message Repeats {
|
|
||||||
repeated bool r_bool = 1;
|
|
||||||
repeated int32 r_int32 = 2;
|
|
||||||
repeated int64 r_int64 = 3;
|
|
||||||
repeated uint32 r_uint32 = 4;
|
|
||||||
repeated uint64 r_uint64 = 5;
|
|
||||||
repeated sint32 r_sint32 = 6;
|
|
||||||
repeated sint64 r_sint64 = 7;
|
|
||||||
repeated float r_float = 8;
|
|
||||||
repeated double r_double = 9;
|
|
||||||
repeated string r_string = 10;
|
|
||||||
repeated bytes r_bytes = 11;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test message for holding enums and nested messages.
|
|
||||||
message Widget {
|
|
||||||
enum Color {
|
|
||||||
RED = 0;
|
|
||||||
GREEN = 1;
|
|
||||||
BLUE = 2;
|
|
||||||
};
|
|
||||||
optional Color color = 1;
|
|
||||||
repeated Color r_color = 2;
|
|
||||||
|
|
||||||
optional Simple simple = 10;
|
|
||||||
repeated Simple r_simple = 11;
|
|
||||||
|
|
||||||
optional Repeats repeats = 20;
|
|
||||||
repeated Repeats r_repeats = 21;
|
|
||||||
}
|
|
||||||
|
|
||||||
message Maps {
|
|
||||||
map<int64, string> m_int64_str = 1;
|
|
||||||
map<bool, Simple> m_bool_simple = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message MsgWithOneof {
|
|
||||||
oneof union {
|
|
||||||
string title = 1;
|
|
||||||
int64 salary = 2;
|
|
||||||
string Country = 3;
|
|
||||||
string home_address = 4;
|
|
||||||
MsgWithRequired msg_with_required = 5;
|
|
||||||
google.protobuf.NullValue null_value = 6;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message Real {
|
|
||||||
optional double value = 1;
|
|
||||||
extensions 100 to max;
|
|
||||||
}
|
|
||||||
|
|
||||||
extend Real {
|
|
||||||
optional string name = 124;
|
|
||||||
}
|
|
||||||
|
|
||||||
message Complex {
|
|
||||||
extend Real {
|
|
||||||
optional Complex real_extension = 123;
|
|
||||||
}
|
|
||||||
optional double imaginary = 1;
|
|
||||||
extensions 100 to max;
|
|
||||||
}
|
|
||||||
|
|
||||||
message KnownTypes {
|
|
||||||
optional google.protobuf.Any an = 14;
|
|
||||||
optional google.protobuf.Duration dur = 1;
|
|
||||||
optional google.protobuf.Struct st = 12;
|
|
||||||
optional google.protobuf.Timestamp ts = 2;
|
|
||||||
optional google.protobuf.ListValue lv = 15;
|
|
||||||
optional google.protobuf.Value val = 16;
|
|
||||||
|
|
||||||
optional google.protobuf.DoubleValue dbl = 3;
|
|
||||||
optional google.protobuf.FloatValue flt = 4;
|
|
||||||
optional google.protobuf.Int64Value i64 = 5;
|
|
||||||
optional google.protobuf.UInt64Value u64 = 6;
|
|
||||||
optional google.protobuf.Int32Value i32 = 7;
|
|
||||||
optional google.protobuf.UInt32Value u32 = 8;
|
|
||||||
optional google.protobuf.BoolValue bool = 9;
|
|
||||||
optional google.protobuf.StringValue str = 10;
|
|
||||||
optional google.protobuf.BytesValue bytes = 11;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test messages for marshaling/unmarshaling required fields.
|
|
||||||
message MsgWithRequired {
|
|
||||||
required string str = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message MsgWithIndirectRequired {
|
|
||||||
optional MsgWithRequired subm = 1;
|
|
||||||
map<string, MsgWithRequired> map_field = 2;
|
|
||||||
repeated MsgWithRequired slice_field = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
message MsgWithRequiredBytes {
|
|
||||||
required bytes byts = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message MsgWithRequiredWKT {
|
|
||||||
required google.protobuf.StringValue str = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
extend Real {
|
|
||||||
optional MsgWithRequired extm = 125;
|
|
||||||
}
|
|
|
@ -1,378 +0,0 @@
|
||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// source: jsonpb_proto/test3.proto
|
|
||||||
|
|
||||||
package jsonpb_proto
|
|
||||||
|
|
||||||
import (
|
|
||||||
fmt "fmt"
|
|
||||||
proto "github.com/golang/protobuf/proto"
|
|
||||||
math "math"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
|
||||||
var _ = proto.Marshal
|
|
||||||
var _ = fmt.Errorf
|
|
||||||
var _ = math.Inf
|
|
||||||
|
|
||||||
// This is a compile-time assertion to ensure that this generated file
|
|
||||||
// is compatible with the proto package it is being compiled against.
|
|
||||||
// A compilation error at this line likely means your copy of the
|
|
||||||
// proto package needs to be updated.
|
|
||||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
|
||||||
|
|
||||||
type Numeral int32
|
|
||||||
|
|
||||||
const (
|
|
||||||
Numeral_UNKNOWN Numeral = 0
|
|
||||||
Numeral_ARABIC Numeral = 1
|
|
||||||
Numeral_ROMAN Numeral = 2
|
|
||||||
)
|
|
||||||
|
|
||||||
var Numeral_name = map[int32]string{
|
|
||||||
0: "UNKNOWN",
|
|
||||||
1: "ARABIC",
|
|
||||||
2: "ROMAN",
|
|
||||||
}
|
|
||||||
|
|
||||||
var Numeral_value = map[string]int32{
|
|
||||||
"UNKNOWN": 0,
|
|
||||||
"ARABIC": 1,
|
|
||||||
"ROMAN": 2,
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x Numeral) String() string {
|
|
||||||
return proto.EnumName(Numeral_name, int32(x))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (Numeral) EnumDescriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_813baf511b225405, []int{0}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Simple3 struct {
|
|
||||||
Dub float64 `protobuf:"fixed64,1,opt,name=dub,proto3" json:"dub,omitempty"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Simple3) Reset() { *m = Simple3{} }
|
|
||||||
func (m *Simple3) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*Simple3) ProtoMessage() {}
|
|
||||||
func (*Simple3) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_813baf511b225405, []int{0}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Simple3) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_Simple3.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *Simple3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_Simple3.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *Simple3) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_Simple3.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *Simple3) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_Simple3.Size(m)
|
|
||||||
}
|
|
||||||
func (m *Simple3) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_Simple3.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_Simple3 proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *Simple3) GetDub() float64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Dub
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
type SimpleSlice3 struct {
|
|
||||||
Slices []string `protobuf:"bytes,1,rep,name=slices,proto3" json:"slices,omitempty"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SimpleSlice3) Reset() { *m = SimpleSlice3{} }
|
|
||||||
func (m *SimpleSlice3) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*SimpleSlice3) ProtoMessage() {}
|
|
||||||
func (*SimpleSlice3) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_813baf511b225405, []int{1}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SimpleSlice3) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_SimpleSlice3.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *SimpleSlice3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_SimpleSlice3.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *SimpleSlice3) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_SimpleSlice3.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *SimpleSlice3) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_SimpleSlice3.Size(m)
|
|
||||||
}
|
|
||||||
func (m *SimpleSlice3) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_SimpleSlice3.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_SimpleSlice3 proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *SimpleSlice3) GetSlices() []string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Slices
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type SimpleMap3 struct {
|
|
||||||
Stringy map[string]string `protobuf:"bytes,1,rep,name=stringy,proto3" json:"stringy,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SimpleMap3) Reset() { *m = SimpleMap3{} }
|
|
||||||
func (m *SimpleMap3) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*SimpleMap3) ProtoMessage() {}
|
|
||||||
func (*SimpleMap3) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_813baf511b225405, []int{2}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SimpleMap3) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_SimpleMap3.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *SimpleMap3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_SimpleMap3.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *SimpleMap3) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_SimpleMap3.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *SimpleMap3) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_SimpleMap3.Size(m)
|
|
||||||
}
|
|
||||||
func (m *SimpleMap3) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_SimpleMap3.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_SimpleMap3 proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *SimpleMap3) GetStringy() map[string]string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Stringy
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type SimpleNull3 struct {
|
|
||||||
Simple *Simple3 `protobuf:"bytes,1,opt,name=simple,proto3" json:"simple,omitempty"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SimpleNull3) Reset() { *m = SimpleNull3{} }
|
|
||||||
func (m *SimpleNull3) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*SimpleNull3) ProtoMessage() {}
|
|
||||||
func (*SimpleNull3) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_813baf511b225405, []int{3}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SimpleNull3) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_SimpleNull3.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *SimpleNull3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_SimpleNull3.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *SimpleNull3) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_SimpleNull3.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *SimpleNull3) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_SimpleNull3.Size(m)
|
|
||||||
}
|
|
||||||
func (m *SimpleNull3) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_SimpleNull3.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_SimpleNull3 proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *SimpleNull3) GetSimple() *Simple3 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Simple
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Mappy struct {
|
|
||||||
Nummy map[int64]int32 `protobuf:"bytes,1,rep,name=nummy,proto3" json:"nummy,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
|
|
||||||
Strry map[string]string `protobuf:"bytes,2,rep,name=strry,proto3" json:"strry,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
|
||||||
Objjy map[int32]*Simple3 `protobuf:"bytes,3,rep,name=objjy,proto3" json:"objjy,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
|
||||||
Buggy map[int64]string `protobuf:"bytes,4,rep,name=buggy,proto3" json:"buggy,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
|
||||||
Booly map[bool]bool `protobuf:"bytes,5,rep,name=booly,proto3" json:"booly,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
|
|
||||||
Enumy map[string]Numeral `protobuf:"bytes,6,rep,name=enumy,proto3" json:"enumy,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=jsonpb_test.Numeral"`
|
|
||||||
S32Booly map[int32]bool `protobuf:"bytes,7,rep,name=s32booly,proto3" json:"s32booly,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
|
|
||||||
S64Booly map[int64]bool `protobuf:"bytes,8,rep,name=s64booly,proto3" json:"s64booly,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
|
|
||||||
U32Booly map[uint32]bool `protobuf:"bytes,9,rep,name=u32booly,proto3" json:"u32booly,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
|
|
||||||
U64Booly map[uint64]bool `protobuf:"bytes,10,rep,name=u64booly,proto3" json:"u64booly,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Mappy) Reset() { *m = Mappy{} }
|
|
||||||
func (m *Mappy) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*Mappy) ProtoMessage() {}
|
|
||||||
func (*Mappy) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_813baf511b225405, []int{4}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Mappy) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_Mappy.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *Mappy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_Mappy.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *Mappy) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_Mappy.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *Mappy) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_Mappy.Size(m)
|
|
||||||
}
|
|
||||||
func (m *Mappy) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_Mappy.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_Mappy proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *Mappy) GetNummy() map[int64]int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Nummy
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Mappy) GetStrry() map[string]string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Strry
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Mappy) GetObjjy() map[int32]*Simple3 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Objjy
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Mappy) GetBuggy() map[int64]string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Buggy
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Mappy) GetBooly() map[bool]bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.Booly
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Mappy) GetEnumy() map[string]Numeral {
|
|
||||||
if m != nil {
|
|
||||||
return m.Enumy
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Mappy) GetS32Booly() map[int32]bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.S32Booly
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Mappy) GetS64Booly() map[int64]bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.S64Booly
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Mappy) GetU32Booly() map[uint32]bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.U32Booly
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Mappy) GetU64Booly() map[uint64]bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.U64Booly
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterEnum("jsonpb_test.Numeral", Numeral_name, Numeral_value)
|
|
||||||
proto.RegisterType((*Simple3)(nil), "jsonpb_test.Simple3")
|
|
||||||
proto.RegisterType((*SimpleSlice3)(nil), "jsonpb_test.SimpleSlice3")
|
|
||||||
proto.RegisterType((*SimpleMap3)(nil), "jsonpb_test.SimpleMap3")
|
|
||||||
proto.RegisterMapType((map[string]string)(nil), "jsonpb_test.SimpleMap3.StringyEntry")
|
|
||||||
proto.RegisterType((*SimpleNull3)(nil), "jsonpb_test.SimpleNull3")
|
|
||||||
proto.RegisterType((*Mappy)(nil), "jsonpb_test.Mappy")
|
|
||||||
proto.RegisterMapType((map[bool]bool)(nil), "jsonpb_test.Mappy.BoolyEntry")
|
|
||||||
proto.RegisterMapType((map[int64]string)(nil), "jsonpb_test.Mappy.BuggyEntry")
|
|
||||||
proto.RegisterMapType((map[string]Numeral)(nil), "jsonpb_test.Mappy.EnumyEntry")
|
|
||||||
proto.RegisterMapType((map[int64]int32)(nil), "jsonpb_test.Mappy.NummyEntry")
|
|
||||||
proto.RegisterMapType((map[int32]*Simple3)(nil), "jsonpb_test.Mappy.ObjjyEntry")
|
|
||||||
proto.RegisterMapType((map[int32]bool)(nil), "jsonpb_test.Mappy.S32boolyEntry")
|
|
||||||
proto.RegisterMapType((map[int64]bool)(nil), "jsonpb_test.Mappy.S64boolyEntry")
|
|
||||||
proto.RegisterMapType((map[string]string)(nil), "jsonpb_test.Mappy.StrryEntry")
|
|
||||||
proto.RegisterMapType((map[uint32]bool)(nil), "jsonpb_test.Mappy.U32boolyEntry")
|
|
||||||
proto.RegisterMapType((map[uint64]bool)(nil), "jsonpb_test.Mappy.U64boolyEntry")
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("jsonpb_proto/test3.proto", fileDescriptor_813baf511b225405) }
|
|
||||||
|
|
||||||
var fileDescriptor_813baf511b225405 = []byte{
|
|
||||||
// 563 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x95, 0xdd, 0x8a, 0xd3, 0x40,
|
|
||||||
0x14, 0xc7, 0x4d, 0xbb, 0x69, 0x9b, 0xd3, 0x5d, 0x29, 0xc3, 0x22, 0xa1, 0x22, 0x94, 0x22, 0xb2,
|
|
||||||
0x2c, 0x9a, 0x40, 0x23, 0xb2, 0x6c, 0x55, 0x68, 0x65, 0x2f, 0x44, 0x9a, 0x42, 0x4a, 0x11, 0xbc,
|
|
||||||
0x91, 0x64, 0x8d, 0x31, 0x35, 0x5f, 0x24, 0x19, 0x21, 0x6f, 0xe0, 0x2b, 0xf9, 0x76, 0x32, 0x1f,
|
|
||||||
0xd9, 0x4c, 0x4a, 0x86, 0xea, 0xd5, 0x9e, 0x99, 0xf3, 0xff, 0xe5, 0x7c, 0xec, 0xbf, 0x0c, 0xe8,
|
|
||||||
0x87, 0x22, 0x4d, 0x32, 0xef, 0x6b, 0x96, 0xa7, 0x65, 0x6a, 0x96, 0x7e, 0x51, 0x5a, 0x06, 0x8d,
|
|
||||||
0xd1, 0x98, 0x67, 0xc8, 0xdd, 0xfc, 0x29, 0x0c, 0x77, 0x61, 0x9c, 0x45, 0xbe, 0x85, 0x26, 0xd0,
|
|
||||||
0xff, 0x86, 0x3d, 0x5d, 0x99, 0x29, 0x57, 0x8a, 0x43, 0xc2, 0xf9, 0x0b, 0x38, 0x67, 0xc9, 0x5d,
|
|
||||||
0x14, 0xde, 0xfb, 0x16, 0x7a, 0x02, 0x83, 0x82, 0x44, 0x85, 0xae, 0xcc, 0xfa, 0x57, 0x9a, 0xc3,
|
|
||||||
0x4f, 0xf3, 0xdf, 0x0a, 0x00, 0x13, 0x6e, 0xdc, 0xcc, 0x42, 0xef, 0x61, 0x58, 0x94, 0x79, 0x98,
|
|
||||||
0x04, 0x15, 0xd5, 0x8d, 0x17, 0xcf, 0x0d, 0xa1, 0xa4, 0xd1, 0x28, 0x8d, 0x1d, 0x93, 0xdd, 0x25,
|
|
||||||
0x65, 0x5e, 0x39, 0x35, 0x34, 0xbd, 0x85, 0x73, 0x31, 0x41, 0x1a, 0xfb, 0xe9, 0x57, 0xb4, 0x31,
|
|
||||||
0xcd, 0x21, 0x21, 0xba, 0x04, 0xf5, 0x97, 0x1b, 0x61, 0x5f, 0xef, 0xd1, 0x3b, 0x76, 0xb8, 0xed,
|
|
||||||
0xdd, 0x28, 0xf3, 0x25, 0x8c, 0xd9, 0xf7, 0x6d, 0x1c, 0x45, 0x16, 0x7a, 0x09, 0x83, 0x82, 0x1e,
|
|
||||||
0x29, 0x3d, 0x5e, 0x5c, 0x76, 0x74, 0x62, 0x39, 0x5c, 0x33, 0xff, 0xa3, 0x81, 0xba, 0x71, 0xb3,
|
|
||||||
0xac, 0x42, 0x16, 0xa8, 0x09, 0x8e, 0xe3, 0x7a, 0x80, 0x67, 0x2d, 0x8c, 0x4a, 0x0c, 0x9b, 0xe4,
|
|
||||||
0x59, 0xe7, 0x4c, 0x4b, 0xa0, 0xa2, 0xcc, 0xf3, 0x4a, 0xef, 0x49, 0xa1, 0x1d, 0xc9, 0x73, 0x88,
|
|
||||||
0x6a, 0x09, 0x94, 0x7a, 0x87, 0x43, 0xa5, 0xf7, 0xa5, 0xd0, 0x96, 0xe4, 0x39, 0x44, 0xb5, 0x04,
|
|
||||||
0xf2, 0x70, 0x10, 0x54, 0xfa, 0x99, 0x14, 0x5a, 0x93, 0x3c, 0x87, 0xa8, 0x96, 0x42, 0x69, 0x1a,
|
|
||||||
0x55, 0xba, 0x2a, 0x87, 0x48, 0xbe, 0x86, 0x48, 0x4c, 0x20, 0x3f, 0xc1, 0x71, 0xa5, 0x0f, 0xa4,
|
|
||||||
0xd0, 0x1d, 0xc9, 0x73, 0x88, 0x6a, 0xd1, 0x5b, 0x18, 0x15, 0xd6, 0x82, 0x15, 0x1b, 0x52, 0x6e,
|
|
||||||
0xd6, 0xb5, 0x0b, 0x2e, 0x61, 0xe8, 0x03, 0x41, 0xe9, 0x37, 0xaf, 0x19, 0x3d, 0x92, 0xd3, 0x5c,
|
|
||||||
0x52, 0xd3, 0xfc, 0x48, 0x68, 0x5c, 0xd7, 0xd6, 0xa4, 0xf4, 0xbe, 0x5d, 0x1b, 0x0b, 0xb5, 0x71,
|
|
||||||
0x5d, 0x1b, 0xe4, 0x74, 0xbb, 0x76, 0x4d, 0x4c, 0x6f, 0x00, 0x1a, 0x57, 0x88, 0xb6, 0xed, 0x77,
|
|
||||||
0xd8, 0x56, 0x15, 0x6c, 0x4b, 0xc8, 0xc6, 0x1a, 0xff, 0x63, 0xf8, 0xa9, 0x0d, 0xd0, 0xf8, 0x43,
|
|
||||||
0x24, 0x55, 0x46, 0x5e, 0x8b, 0xa4, 0xec, 0x07, 0xd0, 0xee, 0xa4, 0xb1, 0xce, 0xa9, 0x19, 0xb4,
|
|
||||||
0x63, 0xf2, 0x61, 0x2b, 0x22, 0x39, 0xea, 0x20, 0x47, 0x47, 0x33, 0x34, 0x26, 0xea, 0x98, 0xbe,
|
|
||||||
0x35, 0xc3, 0xe3, 0xa3, 0x19, 0x6c, 0x1c, 0xfb, 0xb9, 0x1b, 0x89, 0xdf, 0x5b, 0xc2, 0x45, 0xcb,
|
|
||||||
0x5c, 0x1d, 0x6b, 0x91, 0x37, 0x43, 0x60, 0xf1, 0xff, 0x7b, 0x6a, 0x07, 0xc7, 0xf0, 0x5e, 0x56,
|
|
||||||
0xf9, 0xe2, 0x5f, 0x60, 0x59, 0xe5, 0xb3, 0x13, 0xf0, 0xf5, 0x2b, 0x18, 0xf2, 0x4d, 0xa0, 0x31,
|
|
||||||
0x0c, 0xf7, 0xf6, 0x27, 0x7b, 0xfb, 0xd9, 0x9e, 0x3c, 0x42, 0x00, 0x83, 0x95, 0xb3, 0x5a, 0x7f,
|
|
||||||
0xfc, 0x30, 0x51, 0x90, 0x06, 0xaa, 0xb3, 0xdd, 0xac, 0xec, 0x49, 0x6f, 0xfd, 0xee, 0xcb, 0x32,
|
|
||||||
0x08, 0xcb, 0x1f, 0xd8, 0x33, 0xee, 0xd3, 0xd8, 0x0c, 0xd2, 0xc8, 0x4d, 0x02, 0x93, 0xbe, 0x0f,
|
|
||||||
0x1e, 0xfe, 0x6e, 0x86, 0x49, 0xe9, 0xe7, 0x89, 0x1b, 0xd1, 0x77, 0x83, 0xde, 0x16, 0xa6, 0xf8,
|
|
||||||
0x9e, 0x78, 0x03, 0xfa, 0xc7, 0xfa, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x7c, 0xda, 0x44, 0x24, 0x66,
|
|
||||||
0x06, 0x00, 0x00,
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
option go_package = "github.com/golang/protobuf/internal/testprotos/jsonpb_proto";
|
|
||||||
|
|
||||||
package jsonpb_test;
|
|
||||||
|
|
||||||
message Simple3 {
|
|
||||||
double dub = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message SimpleSlice3 {
|
|
||||||
repeated string slices = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message SimpleMap3 {
|
|
||||||
map<string,string> stringy = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message SimpleNull3 {
|
|
||||||
Simple3 simple = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Numeral {
|
|
||||||
UNKNOWN = 0;
|
|
||||||
ARABIC = 1;
|
|
||||||
ROMAN = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message Mappy {
|
|
||||||
map<int64, int32> nummy = 1;
|
|
||||||
map<string, string> strry = 2;
|
|
||||||
map<int32, Simple3> objjy = 3;
|
|
||||||
map<int64, string> buggy = 4;
|
|
||||||
map<bool, bool> booly = 5;
|
|
||||||
map<string, Numeral> enumy = 6;
|
|
||||||
map<int32, bool> s32booly = 7;
|
|
||||||
map<int64, bool> s64booly = 8;
|
|
||||||
map<uint32, bool> u32booly = 9;
|
|
||||||
map<uint64, bool> u64booly = 10;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,485 +0,0 @@
|
||||||
// Copyright 2010 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// A feature-rich test file for the protocol compiler and libraries.
|
|
||||||
|
|
||||||
syntax = "proto2";
|
|
||||||
|
|
||||||
option go_package = "github.com/golang/protobuf/internal/testprotos/proto2_proto";
|
|
||||||
|
|
||||||
package proto2_test;
|
|
||||||
|
|
||||||
enum FOO { FOO1 = 1; };
|
|
||||||
|
|
||||||
message GoEnum {
|
|
||||||
required FOO foo = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message GoTestField {
|
|
||||||
required string Label = 1;
|
|
||||||
required string Type = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message GoTest {
|
|
||||||
// An enum, for completeness.
|
|
||||||
enum KIND {
|
|
||||||
VOID = 0;
|
|
||||||
|
|
||||||
// Basic types
|
|
||||||
BOOL = 1;
|
|
||||||
BYTES = 2;
|
|
||||||
FINGERPRINT = 3;
|
|
||||||
FLOAT = 4;
|
|
||||||
INT = 5;
|
|
||||||
STRING = 6;
|
|
||||||
TIME = 7;
|
|
||||||
|
|
||||||
// Groupings
|
|
||||||
TUPLE = 8;
|
|
||||||
ARRAY = 9;
|
|
||||||
MAP = 10;
|
|
||||||
|
|
||||||
// Table types
|
|
||||||
TABLE = 11;
|
|
||||||
|
|
||||||
// Functions
|
|
||||||
FUNCTION = 12; // last tag
|
|
||||||
};
|
|
||||||
|
|
||||||
// Some typical parameters
|
|
||||||
required KIND Kind = 1;
|
|
||||||
optional string Table = 2;
|
|
||||||
optional int32 Param = 3;
|
|
||||||
|
|
||||||
// Required, repeated and optional foreign fields.
|
|
||||||
required GoTestField RequiredField = 4;
|
|
||||||
repeated GoTestField RepeatedField = 5;
|
|
||||||
optional GoTestField OptionalField = 6;
|
|
||||||
|
|
||||||
// Required fields of all basic types
|
|
||||||
required bool F_Bool_required = 10;
|
|
||||||
required int32 F_Int32_required = 11;
|
|
||||||
required int64 F_Int64_required = 12;
|
|
||||||
required fixed32 F_Fixed32_required = 13;
|
|
||||||
required fixed64 F_Fixed64_required = 14;
|
|
||||||
required uint32 F_Uint32_required = 15;
|
|
||||||
required uint64 F_Uint64_required = 16;
|
|
||||||
required float F_Float_required = 17;
|
|
||||||
required double F_Double_required = 18;
|
|
||||||
required string F_String_required = 19;
|
|
||||||
required bytes F_Bytes_required = 101;
|
|
||||||
required sint32 F_Sint32_required = 102;
|
|
||||||
required sint64 F_Sint64_required = 103;
|
|
||||||
required sfixed32 F_Sfixed32_required = 104;
|
|
||||||
required sfixed64 F_Sfixed64_required = 105;
|
|
||||||
|
|
||||||
// Repeated fields of all basic types
|
|
||||||
repeated bool F_Bool_repeated = 20;
|
|
||||||
repeated int32 F_Int32_repeated = 21;
|
|
||||||
repeated int64 F_Int64_repeated = 22;
|
|
||||||
repeated fixed32 F_Fixed32_repeated = 23;
|
|
||||||
repeated fixed64 F_Fixed64_repeated = 24;
|
|
||||||
repeated uint32 F_Uint32_repeated = 25;
|
|
||||||
repeated uint64 F_Uint64_repeated = 26;
|
|
||||||
repeated float F_Float_repeated = 27;
|
|
||||||
repeated double F_Double_repeated = 28;
|
|
||||||
repeated string F_String_repeated = 29;
|
|
||||||
repeated bytes F_Bytes_repeated = 201;
|
|
||||||
repeated sint32 F_Sint32_repeated = 202;
|
|
||||||
repeated sint64 F_Sint64_repeated = 203;
|
|
||||||
repeated sfixed32 F_Sfixed32_repeated = 204;
|
|
||||||
repeated sfixed64 F_Sfixed64_repeated = 205;
|
|
||||||
|
|
||||||
// Optional fields of all basic types
|
|
||||||
optional bool F_Bool_optional = 30;
|
|
||||||
optional int32 F_Int32_optional = 31;
|
|
||||||
optional int64 F_Int64_optional = 32;
|
|
||||||
optional fixed32 F_Fixed32_optional = 33;
|
|
||||||
optional fixed64 F_Fixed64_optional = 34;
|
|
||||||
optional uint32 F_Uint32_optional = 35;
|
|
||||||
optional uint64 F_Uint64_optional = 36;
|
|
||||||
optional float F_Float_optional = 37;
|
|
||||||
optional double F_Double_optional = 38;
|
|
||||||
optional string F_String_optional = 39;
|
|
||||||
optional bytes F_Bytes_optional = 301;
|
|
||||||
optional sint32 F_Sint32_optional = 302;
|
|
||||||
optional sint64 F_Sint64_optional = 303;
|
|
||||||
optional sfixed32 F_Sfixed32_optional = 304;
|
|
||||||
optional sfixed64 F_Sfixed64_optional = 305;
|
|
||||||
|
|
||||||
// Default-valued fields of all basic types
|
|
||||||
optional bool F_Bool_defaulted = 40 [default=true];
|
|
||||||
optional int32 F_Int32_defaulted = 41 [default=32];
|
|
||||||
optional int64 F_Int64_defaulted = 42 [default=64];
|
|
||||||
optional fixed32 F_Fixed32_defaulted = 43 [default=320];
|
|
||||||
optional fixed64 F_Fixed64_defaulted = 44 [default=640];
|
|
||||||
optional uint32 F_Uint32_defaulted = 45 [default=3200];
|
|
||||||
optional uint64 F_Uint64_defaulted = 46 [default=6400];
|
|
||||||
optional float F_Float_defaulted = 47 [default=314159.];
|
|
||||||
optional double F_Double_defaulted = 48 [default=271828.];
|
|
||||||
optional string F_String_defaulted = 49 [default="hello, \"world!\"\n"];
|
|
||||||
optional bytes F_Bytes_defaulted = 401 [default="Bignose"];
|
|
||||||
optional sint32 F_Sint32_defaulted = 402 [default = -32];
|
|
||||||
optional sint64 F_Sint64_defaulted = 403 [default = -64];
|
|
||||||
optional sfixed32 F_Sfixed32_defaulted = 404 [default = -32];
|
|
||||||
optional sfixed64 F_Sfixed64_defaulted = 405 [default = -64];
|
|
||||||
|
|
||||||
// Packed repeated fields (no string or bytes).
|
|
||||||
repeated bool F_Bool_repeated_packed = 50 [packed=true];
|
|
||||||
repeated int32 F_Int32_repeated_packed = 51 [packed=true];
|
|
||||||
repeated int64 F_Int64_repeated_packed = 52 [packed=true];
|
|
||||||
repeated fixed32 F_Fixed32_repeated_packed = 53 [packed=true];
|
|
||||||
repeated fixed64 F_Fixed64_repeated_packed = 54 [packed=true];
|
|
||||||
repeated uint32 F_Uint32_repeated_packed = 55 [packed=true];
|
|
||||||
repeated uint64 F_Uint64_repeated_packed = 56 [packed=true];
|
|
||||||
repeated float F_Float_repeated_packed = 57 [packed=true];
|
|
||||||
repeated double F_Double_repeated_packed = 58 [packed=true];
|
|
||||||
repeated sint32 F_Sint32_repeated_packed = 502 [packed=true];
|
|
||||||
repeated sint64 F_Sint64_repeated_packed = 503 [packed=true];
|
|
||||||
repeated sfixed32 F_Sfixed32_repeated_packed = 504 [packed=true];
|
|
||||||
repeated sfixed64 F_Sfixed64_repeated_packed = 505 [packed=true];
|
|
||||||
|
|
||||||
// Required, repeated, and optional groups.
|
|
||||||
required group RequiredGroup = 70 {
|
|
||||||
required string RequiredField = 71;
|
|
||||||
};
|
|
||||||
|
|
||||||
repeated group RepeatedGroup = 80 {
|
|
||||||
required string RequiredField = 81;
|
|
||||||
};
|
|
||||||
|
|
||||||
optional group OptionalGroup = 90 {
|
|
||||||
required string RequiredField = 91;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// For testing a group containing a required field.
|
|
||||||
message GoTestRequiredGroupField {
|
|
||||||
required group Group = 1 {
|
|
||||||
required int32 Field = 2;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// For testing skipping of unrecognized fields.
|
|
||||||
// Numbers are all big, larger than tag numbers in GoTestField,
|
|
||||||
// the message used in the corresponding test.
|
|
||||||
message GoSkipTest {
|
|
||||||
required int32 skip_int32 = 11;
|
|
||||||
required fixed32 skip_fixed32 = 12;
|
|
||||||
required fixed64 skip_fixed64 = 13;
|
|
||||||
required string skip_string = 14;
|
|
||||||
required group SkipGroup = 15 {
|
|
||||||
required int32 group_int32 = 16;
|
|
||||||
required string group_string = 17;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// For testing packed/non-packed decoder switching.
|
|
||||||
// A serialized instance of one should be deserializable as the other.
|
|
||||||
message NonPackedTest {
|
|
||||||
repeated int32 a = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message PackedTest {
|
|
||||||
repeated int32 b = 1 [packed=true];
|
|
||||||
}
|
|
||||||
|
|
||||||
message MaxTag {
|
|
||||||
// Maximum possible tag number.
|
|
||||||
optional string last_field = 536870911;
|
|
||||||
}
|
|
||||||
|
|
||||||
message OldMessage {
|
|
||||||
message Nested {
|
|
||||||
optional string name = 1;
|
|
||||||
}
|
|
||||||
optional Nested nested = 1;
|
|
||||||
|
|
||||||
optional int32 num = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMessage is wire compatible with OldMessage;
|
|
||||||
// imagine it as a future version.
|
|
||||||
message NewMessage {
|
|
||||||
message Nested {
|
|
||||||
optional string name = 1;
|
|
||||||
optional string food_group = 2;
|
|
||||||
}
|
|
||||||
optional Nested nested = 1;
|
|
||||||
|
|
||||||
// This is an int32 in OldMessage.
|
|
||||||
optional int64 num = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Smaller tests for ASCII formatting.
|
|
||||||
|
|
||||||
message InnerMessage {
|
|
||||||
required string host = 1;
|
|
||||||
optional int32 port = 2 [default=4000];
|
|
||||||
optional bool connected = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
message OtherMessage {
|
|
||||||
optional int64 key = 1;
|
|
||||||
optional bytes value = 2;
|
|
||||||
optional float weight = 3;
|
|
||||||
optional InnerMessage inner = 4;
|
|
||||||
|
|
||||||
extensions 100 to max;
|
|
||||||
}
|
|
||||||
|
|
||||||
message RequiredInnerMessage {
|
|
||||||
required InnerMessage leo_finally_won_an_oscar = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message MyMessage {
|
|
||||||
required int32 count = 1;
|
|
||||||
optional string name = 2;
|
|
||||||
optional string quote = 3;
|
|
||||||
repeated string pet = 4;
|
|
||||||
optional InnerMessage inner = 5;
|
|
||||||
repeated OtherMessage others = 6;
|
|
||||||
optional RequiredInnerMessage we_must_go_deeper = 13;
|
|
||||||
repeated InnerMessage rep_inner = 12;
|
|
||||||
|
|
||||||
enum Color {
|
|
||||||
RED = 0;
|
|
||||||
GREEN = 1;
|
|
||||||
BLUE = 2;
|
|
||||||
};
|
|
||||||
optional Color bikeshed = 7;
|
|
||||||
|
|
||||||
optional group SomeGroup = 8 {
|
|
||||||
optional int32 group_field = 9;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This field becomes [][]byte in the generated code.
|
|
||||||
repeated bytes rep_bytes = 10;
|
|
||||||
|
|
||||||
optional double bigfloat = 11;
|
|
||||||
|
|
||||||
extensions 100 to max;
|
|
||||||
}
|
|
||||||
|
|
||||||
message Ext {
|
|
||||||
extend MyMessage {
|
|
||||||
optional Ext more = 103;
|
|
||||||
optional string text = 104;
|
|
||||||
optional int32 number = 105;
|
|
||||||
}
|
|
||||||
|
|
||||||
optional string data = 1;
|
|
||||||
map<int32, int32> map_field = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
extend MyMessage {
|
|
||||||
repeated string greeting = 106;
|
|
||||||
// leave field 200 unregistered for testing
|
|
||||||
}
|
|
||||||
|
|
||||||
message ComplexExtension {
|
|
||||||
optional int32 first = 1;
|
|
||||||
optional int32 second = 2;
|
|
||||||
repeated int32 third = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
extend OtherMessage {
|
|
||||||
optional ComplexExtension complex = 200;
|
|
||||||
repeated ComplexExtension r_complex = 201;
|
|
||||||
}
|
|
||||||
|
|
||||||
message DefaultsMessage {
|
|
||||||
enum DefaultsEnum {
|
|
||||||
ZERO = 0;
|
|
||||||
ONE = 1;
|
|
||||||
TWO = 2;
|
|
||||||
};
|
|
||||||
extensions 100 to max;
|
|
||||||
}
|
|
||||||
|
|
||||||
extend DefaultsMessage {
|
|
||||||
optional double no_default_double = 101;
|
|
||||||
optional float no_default_float = 102;
|
|
||||||
optional int32 no_default_int32 = 103;
|
|
||||||
optional int64 no_default_int64 = 104;
|
|
||||||
optional uint32 no_default_uint32 = 105;
|
|
||||||
optional uint64 no_default_uint64 = 106;
|
|
||||||
optional sint32 no_default_sint32 = 107;
|
|
||||||
optional sint64 no_default_sint64 = 108;
|
|
||||||
optional fixed32 no_default_fixed32 = 109;
|
|
||||||
optional fixed64 no_default_fixed64 = 110;
|
|
||||||
optional sfixed32 no_default_sfixed32 = 111;
|
|
||||||
optional sfixed64 no_default_sfixed64 = 112;
|
|
||||||
optional bool no_default_bool = 113;
|
|
||||||
optional string no_default_string = 114;
|
|
||||||
optional bytes no_default_bytes = 115;
|
|
||||||
optional DefaultsMessage.DefaultsEnum no_default_enum = 116;
|
|
||||||
|
|
||||||
optional double default_double = 201 [default = 3.1415];
|
|
||||||
optional float default_float = 202 [default = 3.14];
|
|
||||||
optional int32 default_int32 = 203 [default = 42];
|
|
||||||
optional int64 default_int64 = 204 [default = 43];
|
|
||||||
optional uint32 default_uint32 = 205 [default = 44];
|
|
||||||
optional uint64 default_uint64 = 206 [default = 45];
|
|
||||||
optional sint32 default_sint32 = 207 [default = 46];
|
|
||||||
optional sint64 default_sint64 = 208 [default = 47];
|
|
||||||
optional fixed32 default_fixed32 = 209 [default = 48];
|
|
||||||
optional fixed64 default_fixed64 = 210 [default = 49];
|
|
||||||
optional sfixed32 default_sfixed32 = 211 [default = 50];
|
|
||||||
optional sfixed64 default_sfixed64 = 212 [default = 51];
|
|
||||||
optional bool default_bool = 213 [default = true];
|
|
||||||
optional string default_string = 214 [default = "Hello, string,def=foo"];
|
|
||||||
optional bytes default_bytes = 215 [default = "Hello, bytes"];
|
|
||||||
optional DefaultsMessage.DefaultsEnum default_enum = 216 [default = ONE];
|
|
||||||
}
|
|
||||||
|
|
||||||
message Empty {
|
|
||||||
}
|
|
||||||
|
|
||||||
message MessageList {
|
|
||||||
repeated group Message = 1 {
|
|
||||||
required string name = 2;
|
|
||||||
required int32 count = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message Strings {
|
|
||||||
optional string string_field = 1;
|
|
||||||
optional bytes bytes_field = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message Defaults {
|
|
||||||
enum Color {
|
|
||||||
RED = 0;
|
|
||||||
GREEN = 1;
|
|
||||||
BLUE = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default-valued fields of all basic types.
|
|
||||||
// Same as GoTest, but copied here to make testing easier.
|
|
||||||
optional bool F_Bool = 1 [default=true];
|
|
||||||
optional int32 F_Int32 = 2 [default=32];
|
|
||||||
optional int64 F_Int64 = 3 [default=64];
|
|
||||||
optional fixed32 F_Fixed32 = 4 [default=320];
|
|
||||||
optional fixed64 F_Fixed64 = 5 [default=640];
|
|
||||||
optional uint32 F_Uint32 = 6 [default=3200];
|
|
||||||
optional uint64 F_Uint64 = 7 [default=6400];
|
|
||||||
optional float F_Float = 8 [default=314159.];
|
|
||||||
optional double F_Double = 9 [default=271828.];
|
|
||||||
optional string F_String = 10 [default="hello, \"world!\"\n"];
|
|
||||||
optional bytes F_Bytes = 11 [default="Bignose"];
|
|
||||||
optional sint32 F_Sint32 = 12 [default=-32];
|
|
||||||
optional sint64 F_Sint64 = 13 [default=-64];
|
|
||||||
optional Color F_Enum = 14 [default=GREEN];
|
|
||||||
|
|
||||||
// More fields with crazy defaults.
|
|
||||||
optional float F_Pinf = 15 [default=inf];
|
|
||||||
optional float F_Ninf = 16 [default=-inf];
|
|
||||||
optional float F_Nan = 17 [default=nan];
|
|
||||||
|
|
||||||
// Sub-message.
|
|
||||||
optional SubDefaults sub = 18;
|
|
||||||
|
|
||||||
// Redundant but explicit defaults.
|
|
||||||
optional string str_zero = 19 [default=""];
|
|
||||||
}
|
|
||||||
|
|
||||||
message SubDefaults {
|
|
||||||
optional int64 n = 1 [default=7];
|
|
||||||
}
|
|
||||||
|
|
||||||
message RepeatedEnum {
|
|
||||||
enum Color {
|
|
||||||
RED = 1;
|
|
||||||
}
|
|
||||||
repeated Color color = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message MoreRepeated {
|
|
||||||
repeated bool bools = 1;
|
|
||||||
repeated bool bools_packed = 2 [packed=true];
|
|
||||||
repeated int32 ints = 3;
|
|
||||||
repeated int32 ints_packed = 4 [packed=true];
|
|
||||||
repeated int64 int64s_packed = 7 [packed=true];
|
|
||||||
repeated string strings = 5;
|
|
||||||
repeated fixed32 fixeds = 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
// GroupOld and GroupNew have the same wire format.
|
|
||||||
// GroupNew has a new field inside a group.
|
|
||||||
|
|
||||||
message GroupOld {
|
|
||||||
optional group G = 101 {
|
|
||||||
optional int32 x = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message GroupNew {
|
|
||||||
optional group G = 101 {
|
|
||||||
optional int32 x = 2;
|
|
||||||
optional int32 y = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message FloatingPoint {
|
|
||||||
required double f = 1;
|
|
||||||
optional bool exact = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message MessageWithMap {
|
|
||||||
map<int32, string> name_mapping = 1;
|
|
||||||
map<sint64, FloatingPoint> msg_mapping = 2;
|
|
||||||
map<bool, bytes> byte_mapping = 3;
|
|
||||||
map<string, string> str_to_str = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
message Oneof {
|
|
||||||
oneof union {
|
|
||||||
bool F_Bool = 1;
|
|
||||||
int32 F_Int32 = 2;
|
|
||||||
int64 F_Int64 = 3;
|
|
||||||
fixed32 F_Fixed32 = 4;
|
|
||||||
fixed64 F_Fixed64 = 5;
|
|
||||||
uint32 F_Uint32 = 6;
|
|
||||||
uint64 F_Uint64 = 7;
|
|
||||||
float F_Float = 8;
|
|
||||||
double F_Double = 9;
|
|
||||||
string F_String = 10;
|
|
||||||
bytes F_Bytes = 11;
|
|
||||||
sint32 F_Sint32 = 12;
|
|
||||||
sint64 F_Sint64 = 13;
|
|
||||||
MyMessage.Color F_Enum = 14;
|
|
||||||
GoTestField F_Message = 15;
|
|
||||||
group F_Group = 16 {
|
|
||||||
optional int32 x = 17;
|
|
||||||
}
|
|
||||||
int32 F_Largest_Tag = 536870911;
|
|
||||||
}
|
|
||||||
|
|
||||||
oneof tormato {
|
|
||||||
int32 value = 100;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message Communique {
|
|
||||||
optional bool make_me_cry = 1;
|
|
||||||
|
|
||||||
// This is a oneof, called "union".
|
|
||||||
oneof union {
|
|
||||||
int32 number = 5;
|
|
||||||
string name = 6;
|
|
||||||
bytes data = 7;
|
|
||||||
double temp_c = 8;
|
|
||||||
MyMessage.Color col = 9;
|
|
||||||
Strings msg = 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message TestUTF8 {
|
|
||||||
optional string scalar = 1;
|
|
||||||
repeated string vector = 2;
|
|
||||||
oneof oneof { string field = 3; }
|
|
||||||
map<string, int64> map_key = 4;
|
|
||||||
map<int64, string> map_value = 5;
|
|
||||||
}
|
|
|
@ -1,579 +0,0 @@
|
||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// source: proto3_proto/test.proto
|
|
||||||
|
|
||||||
package proto3_proto
|
|
||||||
|
|
||||||
import (
|
|
||||||
fmt "fmt"
|
|
||||||
proto2_proto "github.com/golang/protobuf/internal/testprotos/proto2_proto"
|
|
||||||
proto "github.com/golang/protobuf/proto"
|
|
||||||
anypb "google.golang.org/protobuf/types/known/anypb"
|
|
||||||
math "math"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
|
||||||
var _ = proto.Marshal
|
|
||||||
var _ = fmt.Errorf
|
|
||||||
var _ = math.Inf
|
|
||||||
|
|
||||||
// This is a compile-time assertion to ensure that this generated file
|
|
||||||
// is compatible with the proto package it is being compiled against.
|
|
||||||
// A compilation error at this line likely means your copy of the
|
|
||||||
// proto package needs to be updated.
|
|
||||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
|
||||||
|
|
||||||
type Message_Humour int32
|
|
||||||
|
|
||||||
const (
|
|
||||||
Message_UNKNOWN Message_Humour = 0
|
|
||||||
Message_PUNS Message_Humour = 1
|
|
||||||
Message_SLAPSTICK Message_Humour = 2
|
|
||||||
Message_BILL_BAILEY Message_Humour = 3
|
|
||||||
)
|
|
||||||
|
|
||||||
var Message_Humour_name = map[int32]string{
|
|
||||||
0: "UNKNOWN",
|
|
||||||
1: "PUNS",
|
|
||||||
2: "SLAPSTICK",
|
|
||||||
3: "BILL_BAILEY",
|
|
||||||
}
|
|
||||||
|
|
||||||
var Message_Humour_value = map[string]int32{
|
|
||||||
"UNKNOWN": 0,
|
|
||||||
"PUNS": 1,
|
|
||||||
"SLAPSTICK": 2,
|
|
||||||
"BILL_BAILEY": 3,
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x Message_Humour) String() string {
|
|
||||||
return proto.EnumName(Message_Humour_name, int32(x))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (Message_Humour) EnumDescriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_ff83f0b8d2b92afa, []int{0, 0}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Message struct {
|
|
||||||
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
|
||||||
Hilarity Message_Humour `protobuf:"varint,2,opt,name=hilarity,proto3,enum=proto3_test.Message_Humour" json:"hilarity,omitempty"`
|
|
||||||
HeightInCm uint32 `protobuf:"varint,3,opt,name=height_in_cm,json=heightInCm,proto3" json:"height_in_cm,omitempty"`
|
|
||||||
Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"`
|
|
||||||
ResultCount int64 `protobuf:"varint,7,opt,name=result_count,json=resultCount,proto3" json:"result_count,omitempty"`
|
|
||||||
TrueScotsman bool `protobuf:"varint,8,opt,name=true_scotsman,json=trueScotsman,proto3" json:"true_scotsman,omitempty"`
|
|
||||||
Score float32 `protobuf:"fixed32,9,opt,name=score,proto3" json:"score,omitempty"`
|
|
||||||
Key []uint64 `protobuf:"varint,5,rep,packed,name=key,proto3" json:"key,omitempty"`
|
|
||||||
ShortKey []int32 `protobuf:"varint,19,rep,packed,name=short_key,json=shortKey,proto3" json:"short_key,omitempty"`
|
|
||||||
Nested *Nested `protobuf:"bytes,6,opt,name=nested,proto3" json:"nested,omitempty"`
|
|
||||||
RFunny []Message_Humour `protobuf:"varint,16,rep,packed,name=r_funny,json=rFunny,proto3,enum=proto3_test.Message_Humour" json:"r_funny,omitempty"`
|
|
||||||
Terrain map[string]*Nested `protobuf:"bytes,10,rep,name=terrain,proto3" json:"terrain,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
|
||||||
Proto2Field *proto2_proto.SubDefaults `protobuf:"bytes,11,opt,name=proto2_field,json=proto2Field,proto3" json:"proto2_field,omitempty"`
|
|
||||||
Proto2Value map[string]*proto2_proto.SubDefaults `protobuf:"bytes,13,rep,name=proto2_value,json=proto2Value,proto3" json:"proto2_value,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
|
||||||
Anything *anypb.Any `protobuf:"bytes,14,opt,name=anything,proto3" json:"anything,omitempty"`
|
|
||||||
ManyThings []*anypb.Any `protobuf:"bytes,15,rep,name=many_things,json=manyThings,proto3" json:"many_things,omitempty"`
|
|
||||||
Submessage *Message `protobuf:"bytes,17,opt,name=submessage,proto3" json:"submessage,omitempty"`
|
|
||||||
Children []*Message `protobuf:"bytes,18,rep,name=children,proto3" json:"children,omitempty"`
|
|
||||||
StringMap map[string]string `protobuf:"bytes,20,rep,name=string_map,json=stringMap,proto3" json:"string_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) Reset() { *m = Message{} }
|
|
||||||
func (m *Message) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*Message) ProtoMessage() {}
|
|
||||||
func (*Message) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_ff83f0b8d2b92afa, []int{0}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_Message.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_Message.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *Message) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_Message.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *Message) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_Message.Size(m)
|
|
||||||
}
|
|
||||||
func (m *Message) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_Message.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_Message proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *Message) GetName() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Name
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetHilarity() Message_Humour {
|
|
||||||
if m != nil {
|
|
||||||
return m.Hilarity
|
|
||||||
}
|
|
||||||
return Message_UNKNOWN
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetHeightInCm() uint32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.HeightInCm
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetData() []byte {
|
|
||||||
if m != nil {
|
|
||||||
return m.Data
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetResultCount() int64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.ResultCount
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetTrueScotsman() bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.TrueScotsman
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetScore() float32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Score
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetKey() []uint64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Key
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetShortKey() []int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.ShortKey
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetNested() *Nested {
|
|
||||||
if m != nil {
|
|
||||||
return m.Nested
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetRFunny() []Message_Humour {
|
|
||||||
if m != nil {
|
|
||||||
return m.RFunny
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetTerrain() map[string]*Nested {
|
|
||||||
if m != nil {
|
|
||||||
return m.Terrain
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetProto2Field() *proto2_proto.SubDefaults {
|
|
||||||
if m != nil {
|
|
||||||
return m.Proto2Field
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetProto2Value() map[string]*proto2_proto.SubDefaults {
|
|
||||||
if m != nil {
|
|
||||||
return m.Proto2Value
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetAnything() *anypb.Any {
|
|
||||||
if m != nil {
|
|
||||||
return m.Anything
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetManyThings() []*anypb.Any {
|
|
||||||
if m != nil {
|
|
||||||
return m.ManyThings
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetSubmessage() *Message {
|
|
||||||
if m != nil {
|
|
||||||
return m.Submessage
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetChildren() []*Message {
|
|
||||||
if m != nil {
|
|
||||||
return m.Children
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetStringMap() map[string]string {
|
|
||||||
if m != nil {
|
|
||||||
return m.StringMap
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Nested struct {
|
|
||||||
Bunny string `protobuf:"bytes,1,opt,name=bunny,proto3" json:"bunny,omitempty"`
|
|
||||||
Cute bool `protobuf:"varint,2,opt,name=cute,proto3" json:"cute,omitempty"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Nested) Reset() { *m = Nested{} }
|
|
||||||
func (m *Nested) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*Nested) ProtoMessage() {}
|
|
||||||
func (*Nested) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_ff83f0b8d2b92afa, []int{1}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Nested) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_Nested.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *Nested) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_Nested.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *Nested) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_Nested.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *Nested) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_Nested.Size(m)
|
|
||||||
}
|
|
||||||
func (m *Nested) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_Nested.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_Nested proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *Nested) GetBunny() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Bunny
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Nested) GetCute() bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.Cute
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
type MessageWithMap struct {
|
|
||||||
ByteMapping map[bool][]byte `protobuf:"bytes,1,rep,name=byte_mapping,json=byteMapping,proto3" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MessageWithMap) Reset() { *m = MessageWithMap{} }
|
|
||||||
func (m *MessageWithMap) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*MessageWithMap) ProtoMessage() {}
|
|
||||||
func (*MessageWithMap) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_ff83f0b8d2b92afa, []int{2}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MessageWithMap) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_MessageWithMap.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *MessageWithMap) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_MessageWithMap.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *MessageWithMap) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_MessageWithMap.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *MessageWithMap) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_MessageWithMap.Size(m)
|
|
||||||
}
|
|
||||||
func (m *MessageWithMap) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_MessageWithMap.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_MessageWithMap proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *MessageWithMap) GetByteMapping() map[bool][]byte {
|
|
||||||
if m != nil {
|
|
||||||
return m.ByteMapping
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type IntMap struct {
|
|
||||||
Rtt map[int32]int32 `protobuf:"bytes,1,rep,name=rtt,proto3" json:"rtt,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *IntMap) Reset() { *m = IntMap{} }
|
|
||||||
func (m *IntMap) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*IntMap) ProtoMessage() {}
|
|
||||||
func (*IntMap) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_ff83f0b8d2b92afa, []int{3}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *IntMap) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_IntMap.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *IntMap) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_IntMap.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *IntMap) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_IntMap.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *IntMap) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_IntMap.Size(m)
|
|
||||||
}
|
|
||||||
func (m *IntMap) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_IntMap.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_IntMap proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *IntMap) GetRtt() map[int32]int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Rtt
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type IntMaps struct {
|
|
||||||
Maps []*IntMap `protobuf:"bytes,1,rep,name=maps,proto3" json:"maps,omitempty"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *IntMaps) Reset() { *m = IntMaps{} }
|
|
||||||
func (m *IntMaps) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*IntMaps) ProtoMessage() {}
|
|
||||||
func (*IntMaps) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_ff83f0b8d2b92afa, []int{4}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *IntMaps) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_IntMaps.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *IntMaps) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_IntMaps.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *IntMaps) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_IntMaps.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *IntMaps) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_IntMaps.Size(m)
|
|
||||||
}
|
|
||||||
func (m *IntMaps) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_IntMaps.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_IntMaps proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *IntMaps) GetMaps() []*IntMap {
|
|
||||||
if m != nil {
|
|
||||||
return m.Maps
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type TestUTF8 struct {
|
|
||||||
Scalar string `protobuf:"bytes,1,opt,name=scalar,proto3" json:"scalar,omitempty"`
|
|
||||||
Vector []string `protobuf:"bytes,2,rep,name=vector,proto3" json:"vector,omitempty"`
|
|
||||||
// Types that are valid to be assigned to Oneof:
|
|
||||||
// *TestUTF8_Field
|
|
||||||
Oneof isTestUTF8_Oneof `protobuf_oneof:"oneof"`
|
|
||||||
MapKey map[string]int64 `protobuf:"bytes,4,rep,name=map_key,json=mapKey,proto3" json:"map_key,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
|
|
||||||
MapValue map[int64]string `protobuf:"bytes,5,rep,name=map_value,json=mapValue,proto3" json:"map_value,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *TestUTF8) Reset() { *m = TestUTF8{} }
|
|
||||||
func (m *TestUTF8) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*TestUTF8) ProtoMessage() {}
|
|
||||||
func (*TestUTF8) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_ff83f0b8d2b92afa, []int{5}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *TestUTF8) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_TestUTF8.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *TestUTF8) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_TestUTF8.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *TestUTF8) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_TestUTF8.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *TestUTF8) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_TestUTF8.Size(m)
|
|
||||||
}
|
|
||||||
func (m *TestUTF8) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_TestUTF8.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_TestUTF8 proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *TestUTF8) GetScalar() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Scalar
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *TestUTF8) GetVector() []string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Vector
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type isTestUTF8_Oneof interface {
|
|
||||||
isTestUTF8_Oneof()
|
|
||||||
}
|
|
||||||
|
|
||||||
type TestUTF8_Field struct {
|
|
||||||
Field string `protobuf:"bytes,3,opt,name=field,proto3,oneof"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*TestUTF8_Field) isTestUTF8_Oneof() {}
|
|
||||||
|
|
||||||
func (m *TestUTF8) GetOneof() isTestUTF8_Oneof {
|
|
||||||
if m != nil {
|
|
||||||
return m.Oneof
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *TestUTF8) GetField() string {
|
|
||||||
if x, ok := m.GetOneof().(*TestUTF8_Field); ok {
|
|
||||||
return x.Field
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *TestUTF8) GetMapKey() map[string]int64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.MapKey
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *TestUTF8) GetMapValue() map[int64]string {
|
|
||||||
if m != nil {
|
|
||||||
return m.MapValue
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// XXX_OneofWrappers is for the internal use of the proto package.
|
|
||||||
func (*TestUTF8) XXX_OneofWrappers() []interface{} {
|
|
||||||
return []interface{}{
|
|
||||||
(*TestUTF8_Field)(nil),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterEnum("proto3_test.Message_Humour", Message_Humour_name, Message_Humour_value)
|
|
||||||
proto.RegisterType((*Message)(nil), "proto3_test.Message")
|
|
||||||
proto.RegisterMapType((map[string]*proto2_proto.SubDefaults)(nil), "proto3_test.Message.Proto2ValueEntry")
|
|
||||||
proto.RegisterMapType((map[string]string)(nil), "proto3_test.Message.StringMapEntry")
|
|
||||||
proto.RegisterMapType((map[string]*Nested)(nil), "proto3_test.Message.TerrainEntry")
|
|
||||||
proto.RegisterType((*Nested)(nil), "proto3_test.Nested")
|
|
||||||
proto.RegisterType((*MessageWithMap)(nil), "proto3_test.MessageWithMap")
|
|
||||||
proto.RegisterMapType((map[bool][]byte)(nil), "proto3_test.MessageWithMap.ByteMappingEntry")
|
|
||||||
proto.RegisterType((*IntMap)(nil), "proto3_test.IntMap")
|
|
||||||
proto.RegisterMapType((map[int32]int32)(nil), "proto3_test.IntMap.RttEntry")
|
|
||||||
proto.RegisterType((*IntMaps)(nil), "proto3_test.IntMaps")
|
|
||||||
proto.RegisterType((*TestUTF8)(nil), "proto3_test.TestUTF8")
|
|
||||||
proto.RegisterMapType((map[string]int64)(nil), "proto3_test.TestUTF8.MapKeyEntry")
|
|
||||||
proto.RegisterMapType((map[int64]string)(nil), "proto3_test.TestUTF8.MapValueEntry")
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("proto3_proto/test.proto", fileDescriptor_ff83f0b8d2b92afa) }
|
|
||||||
|
|
||||||
var fileDescriptor_ff83f0b8d2b92afa = []byte{
|
|
||||||
// 926 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x55, 0x6d, 0x6f, 0xdb, 0x36,
|
|
||||||
0x10, 0xae, 0x2c, 0xbf, 0xc8, 0x67, 0x3b, 0xf5, 0x98, 0xa0, 0xe3, 0xdc, 0x7d, 0x50, 0x5d, 0x0c,
|
|
||||||
0xd3, 0xb0, 0x41, 0x1e, 0xbc, 0x6e, 0xeb, 0x9a, 0xbd, 0xc5, 0x59, 0x83, 0x18, 0x89, 0x9d, 0x40,
|
|
||||||
0x76, 0xd6, 0x6d, 0x5f, 0x04, 0xda, 0xa1, 0x6d, 0x61, 0x12, 0x65, 0x88, 0x54, 0x01, 0xfd, 0x9c,
|
|
||||||
0xfd, 0xa4, 0xfd, 0xa2, 0x0d, 0x24, 0xe5, 0x54, 0x6e, 0x15, 0xe4, 0x93, 0x79, 0x8f, 0x9f, 0xbb,
|
|
||||||
0xe7, 0x78, 0x77, 0x3c, 0xc1, 0xc7, 0xdb, 0x24, 0x16, 0xf1, 0x37, 0xbe, 0xfa, 0x19, 0x08, 0xca,
|
|
||||||
0x85, 0xab, 0x8e, 0xa8, 0x95, 0xff, 0x21, 0xa1, 0xde, 0x27, 0xeb, 0x38, 0x5e, 0x87, 0x74, 0xa0,
|
|
||||||
0xb0, 0x45, 0xba, 0x1a, 0x10, 0x96, 0x69, 0x5e, 0x4f, 0x07, 0x18, 0x7e, 0x10, 0xa0, 0xff, 0x9f,
|
|
||||||
0x05, 0x8d, 0x09, 0xe5, 0x9c, 0xac, 0x29, 0x42, 0x50, 0x65, 0x24, 0xa2, 0xd8, 0xb0, 0x0d, 0xa7,
|
|
||||||
0xe9, 0xa9, 0x33, 0xfa, 0x1e, 0xac, 0x4d, 0x10, 0x92, 0x24, 0x10, 0x19, 0xae, 0xd8, 0x86, 0x73,
|
|
||||||
0x30, 0x7c, 0xea, 0x16, 0x34, 0xdd, 0xdc, 0xd7, 0x3d, 0x4f, 0xa3, 0x38, 0x4d, 0xbc, 0x3b, 0x32,
|
|
||||||
0xb2, 0xa1, 0xbd, 0xa1, 0xc1, 0x7a, 0x23, 0xfc, 0x80, 0xf9, 0xcb, 0x08, 0x9b, 0xb6, 0xe1, 0x74,
|
|
||||||
0x3c, 0xd0, 0xd8, 0x98, 0x9d, 0x46, 0x52, 0xee, 0x96, 0x08, 0x82, 0xab, 0xb6, 0xe1, 0xb4, 0x3d,
|
|
||||||
0x75, 0x46, 0xcf, 0xa0, 0x9d, 0x50, 0x9e, 0x86, 0xc2, 0x5f, 0xc6, 0x29, 0x13, 0xb8, 0x61, 0x1b,
|
|
||||||
0x8e, 0xe9, 0xb5, 0x34, 0x76, 0x2a, 0x21, 0xf4, 0x1c, 0x3a, 0x22, 0x49, 0xa9, 0xcf, 0x97, 0xb1,
|
|
||||||
0xe0, 0x11, 0x61, 0xd8, 0xb2, 0x0d, 0xc7, 0xf2, 0xda, 0x12, 0x9c, 0xe5, 0x18, 0x3a, 0x82, 0x1a,
|
|
||||||
0x5f, 0xc6, 0x09, 0xc5, 0x4d, 0xdb, 0x70, 0x2a, 0x9e, 0x36, 0x50, 0x17, 0xcc, 0xbf, 0x69, 0x86,
|
|
||||||
0x6b, 0xb6, 0xe9, 0x54, 0x3d, 0x79, 0x44, 0x4f, 0xa1, 0xc9, 0x37, 0x71, 0x22, 0x7c, 0x89, 0x1f,
|
|
||||||
0xda, 0xa6, 0x53, 0xf3, 0x2c, 0x05, 0x5c, 0xd0, 0x0c, 0x7d, 0x09, 0x75, 0x46, 0xb9, 0xa0, 0xb7,
|
|
||||||
0xb8, 0x6e, 0x1b, 0x4e, 0x6b, 0x78, 0xb8, 0x77, 0xf3, 0xa9, 0xfa, 0xcb, 0xcb, 0x29, 0xe8, 0x05,
|
|
||||||
0x34, 0x12, 0x7f, 0x95, 0x32, 0x96, 0xe1, 0xae, 0x6d, 0x3e, 0x54, 0xa7, 0x7a, 0x72, 0x26, 0xa9,
|
|
||||||
0xe8, 0x18, 0x1a, 0x82, 0x26, 0x09, 0x09, 0x18, 0x06, 0xdb, 0x74, 0x5a, 0xc3, 0x67, 0xa5, 0x5e,
|
|
||||||
0x73, 0xcd, 0x79, 0xcd, 0x44, 0x92, 0x79, 0x3b, 0x0f, 0x74, 0x0c, 0xed, 0xbc, 0xad, 0xab, 0x80,
|
|
||||||
0x86, 0xb7, 0xb8, 0xa5, 0xb2, 0xc4, 0x6e, 0x0e, 0xaa, 0x08, 0xb3, 0x74, 0xf1, 0x1b, 0x5d, 0x91,
|
|
||||||
0x34, 0x14, 0xdc, 0xd3, 0xc3, 0x32, 0x3c, 0x93, 0x64, 0x74, 0x7e, 0xe7, 0xfc, 0x96, 0x84, 0x29,
|
|
||||||
0xc5, 0x1d, 0x25, 0xff, 0x59, 0xa9, 0xfc, 0xb5, 0x22, 0xfe, 0x2e, 0x79, 0x3a, 0x85, 0x3c, 0x92,
|
|
||||||
0x42, 0xd0, 0xd7, 0x60, 0x11, 0x96, 0x89, 0x4d, 0xc0, 0xd6, 0xf8, 0x40, 0xa5, 0x70, 0xe4, 0xea,
|
|
||||||
0x49, 0x74, 0x77, 0x93, 0xe8, 0x9e, 0xb0, 0xcc, 0xbb, 0x63, 0xa1, 0x6f, 0xa1, 0x15, 0x11, 0x96,
|
|
||||||
0xf9, 0xca, 0xe2, 0xf8, 0xb1, 0x92, 0x2e, 0x77, 0x02, 0x49, 0x9c, 0x2b, 0x1e, 0x7a, 0x01, 0xc0,
|
|
||||||
0xd3, 0x45, 0xa4, 0x93, 0xc2, 0x1f, 0xe5, 0x52, 0x25, 0x09, 0x7b, 0x05, 0x9e, 0x4c, 0x6f, 0xb9,
|
|
||||||
0x09, 0xc2, 0xdb, 0x84, 0x32, 0x8c, 0x72, 0xa5, 0x32, 0x9f, 0x3b, 0x16, 0x1a, 0x01, 0x70, 0x91,
|
|
||||||
0x04, 0x6c, 0xed, 0x47, 0x64, 0x8b, 0x8f, 0x94, 0xcf, 0xf3, 0xd2, 0xc2, 0xcc, 0x14, 0x6d, 0x42,
|
|
||||||
0xb6, 0xba, 0x2c, 0x4d, 0xbe, 0xb3, 0x7b, 0x57, 0xd0, 0x2e, 0x36, 0x6d, 0x37, 0x7a, 0xfa, 0x69,
|
|
||||||
0xa9, 0xd1, 0xfb, 0x02, 0x6a, 0xba, 0xf2, 0x95, 0xfb, 0x87, 0x4b, 0x33, 0x5e, 0x55, 0x5e, 0x1a,
|
|
||||||
0xbd, 0x3f, 0xa0, 0xfb, 0x7e, 0x1b, 0x4a, 0x82, 0xba, 0xfb, 0x41, 0xef, 0x9f, 0x85, 0x42, 0xe4,
|
|
||||||
0x1f, 0xe1, 0x60, 0xff, 0x1e, 0x25, 0x71, 0x8f, 0x8a, 0x71, 0x9b, 0x05, 0xef, 0xfe, 0x2f, 0x50,
|
|
||||||
0xd7, 0x33, 0x8d, 0x5a, 0xd0, 0xb8, 0x99, 0x5e, 0x4c, 0xaf, 0xde, 0x4c, 0xbb, 0x8f, 0x90, 0x05,
|
|
||||||
0xd5, 0xeb, 0x9b, 0xe9, 0xac, 0x6b, 0xa0, 0x0e, 0x34, 0x67, 0x97, 0x27, 0xd7, 0xb3, 0xf9, 0xf8,
|
|
||||||
0xf4, 0xa2, 0x5b, 0x41, 0x8f, 0xa1, 0x35, 0x1a, 0x5f, 0x5e, 0xfa, 0xa3, 0x93, 0xf1, 0xe5, 0xeb,
|
|
||||||
0x3f, 0xbb, 0x66, 0x7f, 0x08, 0x75, 0x7d, 0x5b, 0x29, 0xb2, 0x50, 0x0f, 0x48, 0x0b, 0x6b, 0x43,
|
|
||||||
0xae, 0x89, 0x65, 0x2a, 0xb4, 0xb2, 0xe5, 0xa9, 0x73, 0xff, 0x1f, 0x03, 0x0e, 0xf2, 0x1e, 0xbc,
|
|
||||||
0x09, 0xc4, 0x66, 0x42, 0xb6, 0xe8, 0x0a, 0xda, 0x8b, 0x4c, 0x50, 0xd9, 0xb2, 0xad, 0x9c, 0x44,
|
|
||||||
0x43, 0xb5, 0xed, 0xab, 0xb2, 0xb6, 0xe5, 0x2e, 0xee, 0x28, 0x13, 0x74, 0xa2, 0xe9, 0xf9, 0x58,
|
|
||||||
0x2f, 0xde, 0x21, 0xbd, 0x9f, 0xa1, 0xfb, 0x3e, 0xa1, 0x58, 0x18, 0xab, 0xa4, 0x30, 0xed, 0x62,
|
|
||||||
0x61, 0xb6, 0x50, 0x1f, 0x33, 0x21, 0x53, 0x73, 0xc1, 0x4c, 0x84, 0xc8, 0x33, 0xfa, 0x74, 0x2f,
|
|
||||||
0x23, 0xcd, 0x70, 0x3d, 0x21, 0x74, 0x06, 0x92, 0xd8, 0xfb, 0x0e, 0xac, 0x1d, 0x50, 0x54, 0xac,
|
|
||||||
0x95, 0x28, 0xd6, 0x8a, 0x8a, 0x43, 0x68, 0xe8, 0x78, 0x1c, 0x7d, 0x0e, 0xd5, 0x88, 0x6c, 0x79,
|
|
||||||
0xae, 0x79, 0x58, 0xa2, 0xe9, 0x29, 0x42, 0xff, 0xdf, 0x0a, 0x58, 0x73, 0xca, 0xc5, 0xcd, 0xfc,
|
|
||||||
0xec, 0x25, 0x7a, 0x02, 0x75, 0xbe, 0x24, 0x21, 0x49, 0xf2, 0x0e, 0xe4, 0x96, 0xc4, 0xdf, 0xd2,
|
|
||||||
0xa5, 0x88, 0x13, 0x5c, 0xb1, 0x4d, 0x89, 0x6b, 0x0b, 0x3d, 0x81, 0x9a, 0xde, 0x3c, 0x72, 0xb9,
|
|
||||||
0x37, 0xcf, 0x1f, 0x79, 0xda, 0x44, 0xaf, 0xa0, 0x11, 0x91, 0xad, 0xda, 0xa9, 0xd5, 0x92, 0xad,
|
|
||||||
0xb6, 0xd3, 0x73, 0x27, 0x64, 0x7b, 0x41, 0x33, 0x7d, 0xf3, 0x7a, 0xa4, 0x0c, 0xf4, 0x2b, 0x34,
|
|
||||||
0xa5, 0xaf, 0xbe, 0x62, 0xad, 0xe4, 0xed, 0x15, 0xbd, 0x0b, 0x2b, 0xc9, 0x8a, 0x72, 0xb3, 0xf7,
|
|
||||||
0x03, 0xb4, 0x0a, 0x81, 0x1f, 0x1a, 0x66, 0xb3, 0xf8, 0x14, 0x8e, 0xa1, 0xb3, 0x17, 0xb5, 0xe8,
|
|
||||||
0x6c, 0x3e, 0xf0, 0x12, 0x46, 0x0d, 0xa8, 0xc5, 0x8c, 0xc6, 0xab, 0xd1, 0x4f, 0x7f, 0x1d, 0xaf,
|
|
||||||
0x03, 0xb1, 0x49, 0x17, 0xee, 0x32, 0x8e, 0x06, 0xeb, 0x38, 0x24, 0x6c, 0xfd, 0xee, 0xa3, 0x1c,
|
|
||||||
0x30, 0x41, 0x13, 0x46, 0x42, 0xf5, 0x15, 0x56, 0x28, 0x1f, 0x14, 0x3f, 0xef, 0x8b, 0xba, 0xb6,
|
|
||||||
0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x10, 0x03, 0x1b, 0x06, 0xf5, 0x07, 0x00, 0x00,
|
|
||||||
}
|
|
|
@ -1,72 +0,0 @@
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
option go_package = "github.com/golang/protobuf/internal/testprotos/proto3_proto";
|
|
||||||
|
|
||||||
import "google/protobuf/any.proto";
|
|
||||||
import "proto2_proto/test.proto";
|
|
||||||
|
|
||||||
package proto3_test;
|
|
||||||
|
|
||||||
message Message {
|
|
||||||
enum Humour {
|
|
||||||
UNKNOWN = 0;
|
|
||||||
PUNS = 1;
|
|
||||||
SLAPSTICK = 2;
|
|
||||||
BILL_BAILEY = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
string name = 1;
|
|
||||||
Humour hilarity = 2;
|
|
||||||
uint32 height_in_cm = 3;
|
|
||||||
bytes data = 4;
|
|
||||||
int64 result_count = 7;
|
|
||||||
bool true_scotsman = 8;
|
|
||||||
float score = 9;
|
|
||||||
|
|
||||||
repeated uint64 key = 5;
|
|
||||||
repeated int32 short_key = 19;
|
|
||||||
Nested nested = 6;
|
|
||||||
repeated Humour r_funny = 16;
|
|
||||||
|
|
||||||
map<string, Nested> terrain = 10;
|
|
||||||
proto2_test.SubDefaults proto2_field = 11;
|
|
||||||
map<string, proto2_test.SubDefaults> proto2_value = 13;
|
|
||||||
|
|
||||||
google.protobuf.Any anything = 14;
|
|
||||||
repeated google.protobuf.Any many_things = 15;
|
|
||||||
|
|
||||||
Message submessage = 17;
|
|
||||||
repeated Message children = 18;
|
|
||||||
|
|
||||||
map<string, string> string_map = 20;
|
|
||||||
}
|
|
||||||
|
|
||||||
message Nested {
|
|
||||||
string bunny = 1;
|
|
||||||
bool cute = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message MessageWithMap {
|
|
||||||
map<bool, bytes> byte_mapping = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
message IntMap {
|
|
||||||
map<int32, int32> rtt = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message IntMaps {
|
|
||||||
repeated IntMap maps = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message TestUTF8 {
|
|
||||||
string scalar = 1;
|
|
||||||
repeated string vector = 2;
|
|
||||||
oneof oneof { string field = 3; }
|
|
||||||
map<string, int64> map_key = 4;
|
|
||||||
map<int64, string> map_value = 5;
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Copyright 2020 The Go Authors. All rights reserved.
|
|
||||||
# Use of this source code is governed by a BSD-style
|
|
||||||
# license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
# NOTE: The integration scripts deliberately do not check to
|
|
||||||
# make sure that the test protos have been regenerated.
|
|
||||||
# It is intentional that older versions of the .pb.go files
|
|
||||||
# are checked in to ensure that they continue to function.
|
|
||||||
#
|
|
||||||
# Versions used:
|
|
||||||
# protoc: v3.9.1
|
|
||||||
# protoc-gen-go: v1.3.2
|
|
||||||
|
|
||||||
for X in $(find . -name "*.proto" | sed "s|^\./||"); do
|
|
||||||
protoc -I$(pwd) --go_out=paths=source_relative:. $X
|
|
||||||
done
|
|
|
@ -1,530 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package jsonpb
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"math"
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"google.golang.org/protobuf/encoding/protojson"
|
|
||||||
protoV2 "google.golang.org/protobuf/proto"
|
|
||||||
"google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
"google.golang.org/protobuf/reflect/protoregistry"
|
|
||||||
)
|
|
||||||
|
|
||||||
const wrapJSONUnmarshalV2 = false
|
|
||||||
|
|
||||||
// UnmarshalNext unmarshals the next JSON object from d into m.
|
|
||||||
func UnmarshalNext(d *json.Decoder, m proto.Message) error {
|
|
||||||
return new(Unmarshaler).UnmarshalNext(d, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unmarshal unmarshals a JSON object from r into m.
|
|
||||||
func Unmarshal(r io.Reader, m proto.Message) error {
|
|
||||||
return new(Unmarshaler).Unmarshal(r, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalString unmarshals a JSON object from s into m.
|
|
||||||
func UnmarshalString(s string, m proto.Message) error {
|
|
||||||
return new(Unmarshaler).Unmarshal(strings.NewReader(s), m)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unmarshaler is a configurable object for converting from a JSON
|
|
||||||
// representation to a protocol buffer object.
|
|
||||||
type Unmarshaler struct {
|
|
||||||
// AllowUnknownFields specifies whether to allow messages to contain
|
|
||||||
// unknown JSON fields, as opposed to failing to unmarshal.
|
|
||||||
AllowUnknownFields bool
|
|
||||||
|
|
||||||
// AnyResolver is used to resolve the google.protobuf.Any well-known type.
|
|
||||||
// If unset, the global registry is used by default.
|
|
||||||
AnyResolver AnyResolver
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONPBUnmarshaler is implemented by protobuf messages that customize the way
|
|
||||||
// they are unmarshaled from JSON. Messages that implement this should also
|
|
||||||
// implement JSONPBMarshaler so that the custom format can be produced.
|
|
||||||
//
|
|
||||||
// The JSON unmarshaling must follow the JSON to proto specification:
|
|
||||||
// https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
||||||
//
|
|
||||||
// Deprecated: Custom types should implement protobuf reflection instead.
|
|
||||||
type JSONPBUnmarshaler interface {
|
|
||||||
UnmarshalJSONPB(*Unmarshaler, []byte) error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unmarshal unmarshals a JSON object from r into m.
|
|
||||||
func (u *Unmarshaler) Unmarshal(r io.Reader, m proto.Message) error {
|
|
||||||
return u.UnmarshalNext(json.NewDecoder(r), m)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalNext unmarshals the next JSON object from d into m.
|
|
||||||
func (u *Unmarshaler) UnmarshalNext(d *json.Decoder, m proto.Message) error {
|
|
||||||
if m == nil {
|
|
||||||
return errors.New("invalid nil message")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse the next JSON object from the stream.
|
|
||||||
raw := json.RawMessage{}
|
|
||||||
if err := d.Decode(&raw); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for custom unmarshalers first since they may not properly
|
|
||||||
// implement protobuf reflection that the logic below relies on.
|
|
||||||
if jsu, ok := m.(JSONPBUnmarshaler); ok {
|
|
||||||
return jsu.UnmarshalJSONPB(u, raw)
|
|
||||||
}
|
|
||||||
|
|
||||||
mr := proto.MessageReflect(m)
|
|
||||||
|
|
||||||
// NOTE: For historical reasons, a top-level null is treated as a noop.
|
|
||||||
// This is incorrect, but kept for compatibility.
|
|
||||||
if string(raw) == "null" && mr.Descriptor().FullName() != "google.protobuf.Value" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if wrapJSONUnmarshalV2 {
|
|
||||||
// NOTE: If input message is non-empty, we need to preserve merge semantics
|
|
||||||
// of the old jsonpb implementation. These semantics are not supported by
|
|
||||||
// the protobuf JSON specification.
|
|
||||||
isEmpty := true
|
|
||||||
mr.Range(func(protoreflect.FieldDescriptor, protoreflect.Value) bool {
|
|
||||||
isEmpty = false // at least one iteration implies non-empty
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
if !isEmpty {
|
|
||||||
// Perform unmarshaling into a newly allocated, empty message.
|
|
||||||
mr = mr.New()
|
|
||||||
|
|
||||||
// Use a defer to copy all unmarshaled fields into the original message.
|
|
||||||
dst := proto.MessageReflect(m)
|
|
||||||
defer mr.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
|
|
||||||
dst.Set(fd, v)
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unmarshal using the v2 JSON unmarshaler.
|
|
||||||
opts := protojson.UnmarshalOptions{
|
|
||||||
DiscardUnknown: u.AllowUnknownFields,
|
|
||||||
}
|
|
||||||
if u.AnyResolver != nil {
|
|
||||||
opts.Resolver = anyResolver{u.AnyResolver}
|
|
||||||
}
|
|
||||||
return opts.Unmarshal(raw, mr.Interface())
|
|
||||||
} else {
|
|
||||||
if err := u.unmarshalMessage(mr, raw); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return protoV2.CheckInitialized(mr.Interface())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unmarshaler) unmarshalMessage(m protoreflect.Message, in []byte) error {
|
|
||||||
md := m.Descriptor()
|
|
||||||
fds := md.Fields()
|
|
||||||
|
|
||||||
if jsu, ok := proto.MessageV1(m.Interface()).(JSONPBUnmarshaler); ok {
|
|
||||||
return jsu.UnmarshalJSONPB(u, in)
|
|
||||||
}
|
|
||||||
|
|
||||||
if string(in) == "null" && md.FullName() != "google.protobuf.Value" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
switch wellKnownType(md.FullName()) {
|
|
||||||
case "Any":
|
|
||||||
var jsonObject map[string]json.RawMessage
|
|
||||||
if err := json.Unmarshal(in, &jsonObject); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
rawTypeURL, ok := jsonObject["@type"]
|
|
||||||
if !ok {
|
|
||||||
return errors.New("Any JSON doesn't have '@type'")
|
|
||||||
}
|
|
||||||
typeURL, err := unquoteString(string(rawTypeURL))
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("can't unmarshal Any's '@type': %q", rawTypeURL)
|
|
||||||
}
|
|
||||||
m.Set(fds.ByNumber(1), protoreflect.ValueOfString(typeURL))
|
|
||||||
|
|
||||||
var m2 protoreflect.Message
|
|
||||||
if u.AnyResolver != nil {
|
|
||||||
mi, err := u.AnyResolver.Resolve(typeURL)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
m2 = proto.MessageReflect(mi)
|
|
||||||
} else {
|
|
||||||
mt, err := protoregistry.GlobalTypes.FindMessageByURL(typeURL)
|
|
||||||
if err != nil {
|
|
||||||
if err == protoregistry.NotFound {
|
|
||||||
return fmt.Errorf("could not resolve Any message type: %v", typeURL)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
m2 = mt.New()
|
|
||||||
}
|
|
||||||
|
|
||||||
if wellKnownType(m2.Descriptor().FullName()) != "" {
|
|
||||||
rawValue, ok := jsonObject["value"]
|
|
||||||
if !ok {
|
|
||||||
return errors.New("Any JSON doesn't have 'value'")
|
|
||||||
}
|
|
||||||
if err := u.unmarshalMessage(m2, rawValue); err != nil {
|
|
||||||
return fmt.Errorf("can't unmarshal Any nested proto %v: %v", typeURL, err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
delete(jsonObject, "@type")
|
|
||||||
rawJSON, err := json.Marshal(jsonObject)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("can't generate JSON for Any's nested proto to be unmarshaled: %v", err)
|
|
||||||
}
|
|
||||||
if err = u.unmarshalMessage(m2, rawJSON); err != nil {
|
|
||||||
return fmt.Errorf("can't unmarshal Any nested proto %v: %v", typeURL, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rawWire, err := protoV2.Marshal(m2.Interface())
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("can't marshal proto %v into Any.Value: %v", typeURL, err)
|
|
||||||
}
|
|
||||||
m.Set(fds.ByNumber(2), protoreflect.ValueOfBytes(rawWire))
|
|
||||||
return nil
|
|
||||||
case "BoolValue", "BytesValue", "StringValue",
|
|
||||||
"Int32Value", "UInt32Value", "FloatValue",
|
|
||||||
"Int64Value", "UInt64Value", "DoubleValue":
|
|
||||||
fd := fds.ByNumber(1)
|
|
||||||
v, err := u.unmarshalValue(m.NewField(fd), in, fd)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
m.Set(fd, v)
|
|
||||||
return nil
|
|
||||||
case "Duration":
|
|
||||||
v, err := unquoteString(string(in))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d, err := time.ParseDuration(v)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("bad Duration: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
sec := d.Nanoseconds() / 1e9
|
|
||||||
nsec := d.Nanoseconds() % 1e9
|
|
||||||
m.Set(fds.ByNumber(1), protoreflect.ValueOfInt64(int64(sec)))
|
|
||||||
m.Set(fds.ByNumber(2), protoreflect.ValueOfInt32(int32(nsec)))
|
|
||||||
return nil
|
|
||||||
case "Timestamp":
|
|
||||||
v, err := unquoteString(string(in))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
t, err := time.Parse(time.RFC3339Nano, v)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("bad Timestamp: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
sec := t.Unix()
|
|
||||||
nsec := t.Nanosecond()
|
|
||||||
m.Set(fds.ByNumber(1), protoreflect.ValueOfInt64(int64(sec)))
|
|
||||||
m.Set(fds.ByNumber(2), protoreflect.ValueOfInt32(int32(nsec)))
|
|
||||||
return nil
|
|
||||||
case "Value":
|
|
||||||
switch {
|
|
||||||
case string(in) == "null":
|
|
||||||
m.Set(fds.ByNumber(1), protoreflect.ValueOfEnum(0))
|
|
||||||
case string(in) == "true":
|
|
||||||
m.Set(fds.ByNumber(4), protoreflect.ValueOfBool(true))
|
|
||||||
case string(in) == "false":
|
|
||||||
m.Set(fds.ByNumber(4), protoreflect.ValueOfBool(false))
|
|
||||||
case hasPrefixAndSuffix('"', in, '"'):
|
|
||||||
s, err := unquoteString(string(in))
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("unrecognized type for Value %q", in)
|
|
||||||
}
|
|
||||||
m.Set(fds.ByNumber(3), protoreflect.ValueOfString(s))
|
|
||||||
case hasPrefixAndSuffix('[', in, ']'):
|
|
||||||
v := m.Mutable(fds.ByNumber(6))
|
|
||||||
return u.unmarshalMessage(v.Message(), in)
|
|
||||||
case hasPrefixAndSuffix('{', in, '}'):
|
|
||||||
v := m.Mutable(fds.ByNumber(5))
|
|
||||||
return u.unmarshalMessage(v.Message(), in)
|
|
||||||
default:
|
|
||||||
f, err := strconv.ParseFloat(string(in), 0)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("unrecognized type for Value %q", in)
|
|
||||||
}
|
|
||||||
m.Set(fds.ByNumber(2), protoreflect.ValueOfFloat64(f))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
case "ListValue":
|
|
||||||
var jsonArray []json.RawMessage
|
|
||||||
if err := json.Unmarshal(in, &jsonArray); err != nil {
|
|
||||||
return fmt.Errorf("bad ListValue: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
lv := m.Mutable(fds.ByNumber(1)).List()
|
|
||||||
for _, raw := range jsonArray {
|
|
||||||
ve := lv.NewElement()
|
|
||||||
if err := u.unmarshalMessage(ve.Message(), raw); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
lv.Append(ve)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
case "Struct":
|
|
||||||
var jsonObject map[string]json.RawMessage
|
|
||||||
if err := json.Unmarshal(in, &jsonObject); err != nil {
|
|
||||||
return fmt.Errorf("bad StructValue: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
mv := m.Mutable(fds.ByNumber(1)).Map()
|
|
||||||
for key, raw := range jsonObject {
|
|
||||||
kv := protoreflect.ValueOf(key).MapKey()
|
|
||||||
vv := mv.NewValue()
|
|
||||||
if err := u.unmarshalMessage(vv.Message(), raw); err != nil {
|
|
||||||
return fmt.Errorf("bad value in StructValue for key %q: %v", key, err)
|
|
||||||
}
|
|
||||||
mv.Set(kv, vv)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var jsonObject map[string]json.RawMessage
|
|
||||||
if err := json.Unmarshal(in, &jsonObject); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle known fields.
|
|
||||||
for i := 0; i < fds.Len(); i++ {
|
|
||||||
fd := fds.Get(i)
|
|
||||||
if fd.IsWeak() && fd.Message().IsPlaceholder() {
|
|
||||||
continue // weak reference is not linked in
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search for any raw JSON value associated with this field.
|
|
||||||
var raw json.RawMessage
|
|
||||||
name := string(fd.Name())
|
|
||||||
if fd.Kind() == protoreflect.GroupKind {
|
|
||||||
name = string(fd.Message().Name())
|
|
||||||
}
|
|
||||||
if v, ok := jsonObject[name]; ok {
|
|
||||||
delete(jsonObject, name)
|
|
||||||
raw = v
|
|
||||||
}
|
|
||||||
name = string(fd.JSONName())
|
|
||||||
if v, ok := jsonObject[name]; ok {
|
|
||||||
delete(jsonObject, name)
|
|
||||||
raw = v
|
|
||||||
}
|
|
||||||
|
|
||||||
field := m.NewField(fd)
|
|
||||||
// Unmarshal the field value.
|
|
||||||
if raw == nil || (string(raw) == "null" && !isSingularWellKnownValue(fd) && !isSingularJSONPBUnmarshaler(field, fd)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
v, err := u.unmarshalValue(field, raw, fd)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
m.Set(fd, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle extension fields.
|
|
||||||
for name, raw := range jsonObject {
|
|
||||||
if !strings.HasPrefix(name, "[") || !strings.HasSuffix(name, "]") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resolve the extension field by name.
|
|
||||||
xname := protoreflect.FullName(name[len("[") : len(name)-len("]")])
|
|
||||||
xt, _ := protoregistry.GlobalTypes.FindExtensionByName(xname)
|
|
||||||
if xt == nil && isMessageSet(md) {
|
|
||||||
xt, _ = protoregistry.GlobalTypes.FindExtensionByName(xname.Append("message_set_extension"))
|
|
||||||
}
|
|
||||||
if xt == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
delete(jsonObject, name)
|
|
||||||
fd := xt.TypeDescriptor()
|
|
||||||
if fd.ContainingMessage().FullName() != m.Descriptor().FullName() {
|
|
||||||
return fmt.Errorf("extension field %q does not extend message %q", xname, m.Descriptor().FullName())
|
|
||||||
}
|
|
||||||
|
|
||||||
field := m.NewField(fd)
|
|
||||||
// Unmarshal the field value.
|
|
||||||
if raw == nil || (string(raw) == "null" && !isSingularWellKnownValue(fd) && !isSingularJSONPBUnmarshaler(field, fd)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
v, err := u.unmarshalValue(field, raw, fd)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
m.Set(fd, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !u.AllowUnknownFields && len(jsonObject) > 0 {
|
|
||||||
for name := range jsonObject {
|
|
||||||
return fmt.Errorf("unknown field %q in %v", name, md.FullName())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isSingularWellKnownValue(fd protoreflect.FieldDescriptor) bool {
|
|
||||||
if fd.Cardinality() == protoreflect.Repeated {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if md := fd.Message(); md != nil {
|
|
||||||
return md.FullName() == "google.protobuf.Value"
|
|
||||||
}
|
|
||||||
if ed := fd.Enum(); ed != nil {
|
|
||||||
return ed.FullName() == "google.protobuf.NullValue"
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func isSingularJSONPBUnmarshaler(v protoreflect.Value, fd protoreflect.FieldDescriptor) bool {
|
|
||||||
if fd.Message() != nil && fd.Cardinality() != protoreflect.Repeated {
|
|
||||||
_, ok := proto.MessageV1(v.Interface()).(JSONPBUnmarshaler)
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unmarshaler) unmarshalValue(v protoreflect.Value, in []byte, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) {
|
|
||||||
switch {
|
|
||||||
case fd.IsList():
|
|
||||||
var jsonArray []json.RawMessage
|
|
||||||
if err := json.Unmarshal(in, &jsonArray); err != nil {
|
|
||||||
return v, err
|
|
||||||
}
|
|
||||||
lv := v.List()
|
|
||||||
for _, raw := range jsonArray {
|
|
||||||
ve, err := u.unmarshalSingularValue(lv.NewElement(), raw, fd)
|
|
||||||
if err != nil {
|
|
||||||
return v, err
|
|
||||||
}
|
|
||||||
lv.Append(ve)
|
|
||||||
}
|
|
||||||
return v, nil
|
|
||||||
case fd.IsMap():
|
|
||||||
var jsonObject map[string]json.RawMessage
|
|
||||||
if err := json.Unmarshal(in, &jsonObject); err != nil {
|
|
||||||
return v, err
|
|
||||||
}
|
|
||||||
kfd := fd.MapKey()
|
|
||||||
vfd := fd.MapValue()
|
|
||||||
mv := v.Map()
|
|
||||||
for key, raw := range jsonObject {
|
|
||||||
var kv protoreflect.MapKey
|
|
||||||
if kfd.Kind() == protoreflect.StringKind {
|
|
||||||
kv = protoreflect.ValueOf(key).MapKey()
|
|
||||||
} else {
|
|
||||||
v, err := u.unmarshalSingularValue(kfd.Default(), []byte(key), kfd)
|
|
||||||
if err != nil {
|
|
||||||
return v, err
|
|
||||||
}
|
|
||||||
kv = v.MapKey()
|
|
||||||
}
|
|
||||||
|
|
||||||
vv, err := u.unmarshalSingularValue(mv.NewValue(), raw, vfd)
|
|
||||||
if err != nil {
|
|
||||||
return v, err
|
|
||||||
}
|
|
||||||
mv.Set(kv, vv)
|
|
||||||
}
|
|
||||||
return v, nil
|
|
||||||
default:
|
|
||||||
return u.unmarshalSingularValue(v, in, fd)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var nonFinite = map[string]float64{
|
|
||||||
`"NaN"`: math.NaN(),
|
|
||||||
`"Infinity"`: math.Inf(+1),
|
|
||||||
`"-Infinity"`: math.Inf(-1),
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unmarshaler) unmarshalSingularValue(v protoreflect.Value, in []byte, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) {
|
|
||||||
switch fd.Kind() {
|
|
||||||
case protoreflect.BoolKind:
|
|
||||||
return unmarshalValue(in, new(bool))
|
|
||||||
case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
|
|
||||||
return unmarshalValue(trimQuote(in), new(int32))
|
|
||||||
case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
|
|
||||||
return unmarshalValue(trimQuote(in), new(int64))
|
|
||||||
case protoreflect.Uint32Kind, protoreflect.Fixed32Kind:
|
|
||||||
return unmarshalValue(trimQuote(in), new(uint32))
|
|
||||||
case protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
|
|
||||||
return unmarshalValue(trimQuote(in), new(uint64))
|
|
||||||
case protoreflect.FloatKind:
|
|
||||||
if f, ok := nonFinite[string(in)]; ok {
|
|
||||||
return protoreflect.ValueOfFloat32(float32(f)), nil
|
|
||||||
}
|
|
||||||
return unmarshalValue(trimQuote(in), new(float32))
|
|
||||||
case protoreflect.DoubleKind:
|
|
||||||
if f, ok := nonFinite[string(in)]; ok {
|
|
||||||
return protoreflect.ValueOfFloat64(float64(f)), nil
|
|
||||||
}
|
|
||||||
return unmarshalValue(trimQuote(in), new(float64))
|
|
||||||
case protoreflect.StringKind:
|
|
||||||
return unmarshalValue(in, new(string))
|
|
||||||
case protoreflect.BytesKind:
|
|
||||||
return unmarshalValue(in, new([]byte))
|
|
||||||
case protoreflect.EnumKind:
|
|
||||||
if hasPrefixAndSuffix('"', in, '"') {
|
|
||||||
vd := fd.Enum().Values().ByName(protoreflect.Name(trimQuote(in)))
|
|
||||||
if vd == nil {
|
|
||||||
return v, fmt.Errorf("unknown value %q for enum %s", in, fd.Enum().FullName())
|
|
||||||
}
|
|
||||||
return protoreflect.ValueOfEnum(vd.Number()), nil
|
|
||||||
}
|
|
||||||
return unmarshalValue(in, new(protoreflect.EnumNumber))
|
|
||||||
case protoreflect.MessageKind, protoreflect.GroupKind:
|
|
||||||
err := u.unmarshalMessage(v.Message(), in)
|
|
||||||
return v, err
|
|
||||||
default:
|
|
||||||
panic(fmt.Sprintf("invalid kind %v", fd.Kind()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func unmarshalValue(in []byte, v interface{}) (protoreflect.Value, error) {
|
|
||||||
err := json.Unmarshal(in, v)
|
|
||||||
return protoreflect.ValueOf(reflect.ValueOf(v).Elem().Interface()), err
|
|
||||||
}
|
|
||||||
|
|
||||||
func unquoteString(in string) (out string, err error) {
|
|
||||||
err = json.Unmarshal([]byte(in), &out)
|
|
||||||
return out, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func hasPrefixAndSuffix(prefix byte, in []byte, suffix byte) bool {
|
|
||||||
if len(in) >= 2 && in[0] == prefix && in[len(in)-1] == suffix {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// trimQuote is like unquoteString but simply strips surrounding quotes.
|
|
||||||
// This is incorrect, but is behavior done by the legacy implementation.
|
|
||||||
func trimQuote(in []byte) []byte {
|
|
||||||
if len(in) >= 2 && in[0] == '"' && in[len(in)-1] == '"' {
|
|
||||||
in = in[1 : len(in)-1]
|
|
||||||
}
|
|
||||||
return in
|
|
||||||
}
|
|
|
@ -1,559 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package jsonpb
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"math"
|
|
||||||
"reflect"
|
|
||||||
"sort"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"google.golang.org/protobuf/encoding/protojson"
|
|
||||||
protoV2 "google.golang.org/protobuf/proto"
|
|
||||||
"google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
"google.golang.org/protobuf/reflect/protoregistry"
|
|
||||||
)
|
|
||||||
|
|
||||||
const wrapJSONMarshalV2 = false
|
|
||||||
|
|
||||||
// Marshaler is a configurable object for marshaling protocol buffer messages
|
|
||||||
// to the specified JSON representation.
|
|
||||||
type Marshaler struct {
|
|
||||||
// OrigName specifies whether to use the original protobuf name for fields.
|
|
||||||
OrigName bool
|
|
||||||
|
|
||||||
// EnumsAsInts specifies whether to render enum values as integers,
|
|
||||||
// as opposed to string values.
|
|
||||||
EnumsAsInts bool
|
|
||||||
|
|
||||||
// EmitDefaults specifies whether to render fields with zero values.
|
|
||||||
EmitDefaults bool
|
|
||||||
|
|
||||||
// Indent controls whether the output is compact or not.
|
|
||||||
// If empty, the output is compact JSON. Otherwise, every JSON object
|
|
||||||
// entry and JSON array value will be on its own line.
|
|
||||||
// Each line will be preceded by repeated copies of Indent, where the
|
|
||||||
// number of copies is the current indentation depth.
|
|
||||||
Indent string
|
|
||||||
|
|
||||||
// AnyResolver is used to resolve the google.protobuf.Any well-known type.
|
|
||||||
// If unset, the global registry is used by default.
|
|
||||||
AnyResolver AnyResolver
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONPBMarshaler is implemented by protobuf messages that customize the
|
|
||||||
// way they are marshaled to JSON. Messages that implement this should also
|
|
||||||
// implement JSONPBUnmarshaler so that the custom format can be parsed.
|
|
||||||
//
|
|
||||||
// The JSON marshaling must follow the proto to JSON specification:
|
|
||||||
// https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
||||||
//
|
|
||||||
// Deprecated: Custom types should implement protobuf reflection instead.
|
|
||||||
type JSONPBMarshaler interface {
|
|
||||||
MarshalJSONPB(*Marshaler) ([]byte, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Marshal serializes a protobuf message as JSON into w.
|
|
||||||
func (jm *Marshaler) Marshal(w io.Writer, m proto.Message) error {
|
|
||||||
b, err := jm.marshal(m)
|
|
||||||
if len(b) > 0 {
|
|
||||||
if _, err := w.Write(b); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalToString serializes a protobuf message as JSON in string form.
|
|
||||||
func (jm *Marshaler) MarshalToString(m proto.Message) (string, error) {
|
|
||||||
b, err := jm.marshal(m)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return string(b), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (jm *Marshaler) marshal(m proto.Message) ([]byte, error) {
|
|
||||||
v := reflect.ValueOf(m)
|
|
||||||
if m == nil || (v.Kind() == reflect.Ptr && v.IsNil()) {
|
|
||||||
return nil, errors.New("Marshal called with nil")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for custom marshalers first since they may not properly
|
|
||||||
// implement protobuf reflection that the logic below relies on.
|
|
||||||
if jsm, ok := m.(JSONPBMarshaler); ok {
|
|
||||||
return jsm.MarshalJSONPB(jm)
|
|
||||||
}
|
|
||||||
|
|
||||||
if wrapJSONMarshalV2 {
|
|
||||||
opts := protojson.MarshalOptions{
|
|
||||||
UseProtoNames: jm.OrigName,
|
|
||||||
UseEnumNumbers: jm.EnumsAsInts,
|
|
||||||
EmitUnpopulated: jm.EmitDefaults,
|
|
||||||
Indent: jm.Indent,
|
|
||||||
}
|
|
||||||
if jm.AnyResolver != nil {
|
|
||||||
opts.Resolver = anyResolver{jm.AnyResolver}
|
|
||||||
}
|
|
||||||
return opts.Marshal(proto.MessageReflect(m).Interface())
|
|
||||||
} else {
|
|
||||||
// Check for unpopulated required fields first.
|
|
||||||
m2 := proto.MessageReflect(m)
|
|
||||||
if err := protoV2.CheckInitialized(m2.Interface()); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
w := jsonWriter{Marshaler: jm}
|
|
||||||
err := w.marshalMessage(m2, "", "")
|
|
||||||
return w.buf, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type jsonWriter struct {
|
|
||||||
*Marshaler
|
|
||||||
buf []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *jsonWriter) write(s string) {
|
|
||||||
w.buf = append(w.buf, s...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *jsonWriter) marshalMessage(m protoreflect.Message, indent, typeURL string) error {
|
|
||||||
if jsm, ok := proto.MessageV1(m.Interface()).(JSONPBMarshaler); ok {
|
|
||||||
b, err := jsm.MarshalJSONPB(w.Marshaler)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if typeURL != "" {
|
|
||||||
// we are marshaling this object to an Any type
|
|
||||||
var js map[string]*json.RawMessage
|
|
||||||
if err = json.Unmarshal(b, &js); err != nil {
|
|
||||||
return fmt.Errorf("type %T produced invalid JSON: %v", m.Interface(), err)
|
|
||||||
}
|
|
||||||
turl, err := json.Marshal(typeURL)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to marshal type URL %q to JSON: %v", typeURL, err)
|
|
||||||
}
|
|
||||||
js["@type"] = (*json.RawMessage)(&turl)
|
|
||||||
if b, err = json.Marshal(js); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
w.write(string(b))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
md := m.Descriptor()
|
|
||||||
fds := md.Fields()
|
|
||||||
|
|
||||||
// Handle well-known types.
|
|
||||||
const secondInNanos = int64(time.Second / time.Nanosecond)
|
|
||||||
switch wellKnownType(md.FullName()) {
|
|
||||||
case "Any":
|
|
||||||
return w.marshalAny(m, indent)
|
|
||||||
case "BoolValue", "BytesValue", "StringValue",
|
|
||||||
"Int32Value", "UInt32Value", "FloatValue",
|
|
||||||
"Int64Value", "UInt64Value", "DoubleValue":
|
|
||||||
fd := fds.ByNumber(1)
|
|
||||||
return w.marshalValue(fd, m.Get(fd), indent)
|
|
||||||
case "Duration":
|
|
||||||
const maxSecondsInDuration = 315576000000
|
|
||||||
// "Generated output always contains 0, 3, 6, or 9 fractional digits,
|
|
||||||
// depending on required precision."
|
|
||||||
s := m.Get(fds.ByNumber(1)).Int()
|
|
||||||
ns := m.Get(fds.ByNumber(2)).Int()
|
|
||||||
if s < -maxSecondsInDuration || s > maxSecondsInDuration {
|
|
||||||
return fmt.Errorf("seconds out of range %v", s)
|
|
||||||
}
|
|
||||||
if ns <= -secondInNanos || ns >= secondInNanos {
|
|
||||||
return fmt.Errorf("ns out of range (%v, %v)", -secondInNanos, secondInNanos)
|
|
||||||
}
|
|
||||||
if (s > 0 && ns < 0) || (s < 0 && ns > 0) {
|
|
||||||
return errors.New("signs of seconds and nanos do not match")
|
|
||||||
}
|
|
||||||
var sign string
|
|
||||||
if s < 0 || ns < 0 {
|
|
||||||
sign, s, ns = "-", -1*s, -1*ns
|
|
||||||
}
|
|
||||||
x := fmt.Sprintf("%s%d.%09d", sign, s, ns)
|
|
||||||
x = strings.TrimSuffix(x, "000")
|
|
||||||
x = strings.TrimSuffix(x, "000")
|
|
||||||
x = strings.TrimSuffix(x, ".000")
|
|
||||||
w.write(fmt.Sprintf(`"%vs"`, x))
|
|
||||||
return nil
|
|
||||||
case "Timestamp":
|
|
||||||
// "RFC 3339, where generated output will always be Z-normalized
|
|
||||||
// and uses 0, 3, 6 or 9 fractional digits."
|
|
||||||
s := m.Get(fds.ByNumber(1)).Int()
|
|
||||||
ns := m.Get(fds.ByNumber(2)).Int()
|
|
||||||
if ns < 0 || ns >= secondInNanos {
|
|
||||||
return fmt.Errorf("ns out of range [0, %v)", secondInNanos)
|
|
||||||
}
|
|
||||||
t := time.Unix(s, ns).UTC()
|
|
||||||
// time.RFC3339Nano isn't exactly right (we need to get 3/6/9 fractional digits).
|
|
||||||
x := t.Format("2006-01-02T15:04:05.000000000")
|
|
||||||
x = strings.TrimSuffix(x, "000")
|
|
||||||
x = strings.TrimSuffix(x, "000")
|
|
||||||
x = strings.TrimSuffix(x, ".000")
|
|
||||||
w.write(fmt.Sprintf(`"%vZ"`, x))
|
|
||||||
return nil
|
|
||||||
case "Value":
|
|
||||||
// JSON value; which is a null, number, string, bool, object, or array.
|
|
||||||
od := md.Oneofs().Get(0)
|
|
||||||
fd := m.WhichOneof(od)
|
|
||||||
if fd == nil {
|
|
||||||
return errors.New("nil Value")
|
|
||||||
}
|
|
||||||
return w.marshalValue(fd, m.Get(fd), indent)
|
|
||||||
case "Struct", "ListValue":
|
|
||||||
// JSON object or array.
|
|
||||||
fd := fds.ByNumber(1)
|
|
||||||
return w.marshalValue(fd, m.Get(fd), indent)
|
|
||||||
}
|
|
||||||
|
|
||||||
w.write("{")
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write("\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
firstField := true
|
|
||||||
if typeURL != "" {
|
|
||||||
if err := w.marshalTypeURL(indent, typeURL); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
firstField = false
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < fds.Len(); {
|
|
||||||
fd := fds.Get(i)
|
|
||||||
if od := fd.ContainingOneof(); od != nil {
|
|
||||||
fd = m.WhichOneof(od)
|
|
||||||
i += od.Fields().Len()
|
|
||||||
if fd == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
|
|
||||||
v := m.Get(fd)
|
|
||||||
|
|
||||||
if !m.Has(fd) {
|
|
||||||
if !w.EmitDefaults || fd.ContainingOneof() != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if fd.Cardinality() != protoreflect.Repeated && (fd.Message() != nil || fd.Syntax() == protoreflect.Proto2) {
|
|
||||||
v = protoreflect.Value{} // use "null" for singular messages or proto2 scalars
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !firstField {
|
|
||||||
w.writeComma()
|
|
||||||
}
|
|
||||||
if err := w.marshalField(fd, v, indent); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
firstField = false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle proto2 extensions.
|
|
||||||
if md.ExtensionRanges().Len() > 0 {
|
|
||||||
// Collect a sorted list of all extension descriptor and values.
|
|
||||||
type ext struct {
|
|
||||||
desc protoreflect.FieldDescriptor
|
|
||||||
val protoreflect.Value
|
|
||||||
}
|
|
||||||
var exts []ext
|
|
||||||
m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
|
|
||||||
if fd.IsExtension() {
|
|
||||||
exts = append(exts, ext{fd, v})
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
sort.Slice(exts, func(i, j int) bool {
|
|
||||||
return exts[i].desc.Number() < exts[j].desc.Number()
|
|
||||||
})
|
|
||||||
|
|
||||||
for _, ext := range exts {
|
|
||||||
if !firstField {
|
|
||||||
w.writeComma()
|
|
||||||
}
|
|
||||||
if err := w.marshalField(ext.desc, ext.val, indent); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
firstField = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write("\n")
|
|
||||||
w.write(indent)
|
|
||||||
}
|
|
||||||
w.write("}")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *jsonWriter) writeComma() {
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write(",\n")
|
|
||||||
} else {
|
|
||||||
w.write(",")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *jsonWriter) marshalAny(m protoreflect.Message, indent string) error {
|
|
||||||
// "If the Any contains a value that has a special JSON mapping,
|
|
||||||
// it will be converted as follows: {"@type": xxx, "value": yyy}.
|
|
||||||
// Otherwise, the value will be converted into a JSON object,
|
|
||||||
// and the "@type" field will be inserted to indicate the actual data type."
|
|
||||||
md := m.Descriptor()
|
|
||||||
typeURL := m.Get(md.Fields().ByNumber(1)).String()
|
|
||||||
rawVal := m.Get(md.Fields().ByNumber(2)).Bytes()
|
|
||||||
|
|
||||||
var m2 protoreflect.Message
|
|
||||||
if w.AnyResolver != nil {
|
|
||||||
mi, err := w.AnyResolver.Resolve(typeURL)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
m2 = proto.MessageReflect(mi)
|
|
||||||
} else {
|
|
||||||
mt, err := protoregistry.GlobalTypes.FindMessageByURL(typeURL)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
m2 = mt.New()
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := protoV2.Unmarshal(rawVal, m2.Interface()); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if wellKnownType(m2.Descriptor().FullName()) == "" {
|
|
||||||
return w.marshalMessage(m2, indent, typeURL)
|
|
||||||
}
|
|
||||||
|
|
||||||
w.write("{")
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write("\n")
|
|
||||||
}
|
|
||||||
if err := w.marshalTypeURL(indent, typeURL); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
w.writeComma()
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write(indent)
|
|
||||||
w.write(w.Indent)
|
|
||||||
w.write(`"value": `)
|
|
||||||
} else {
|
|
||||||
w.write(`"value":`)
|
|
||||||
}
|
|
||||||
if err := w.marshalMessage(m2, indent+w.Indent, ""); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write("\n")
|
|
||||||
w.write(indent)
|
|
||||||
}
|
|
||||||
w.write("}")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *jsonWriter) marshalTypeURL(indent, typeURL string) error {
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write(indent)
|
|
||||||
w.write(w.Indent)
|
|
||||||
}
|
|
||||||
w.write(`"@type":`)
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write(" ")
|
|
||||||
}
|
|
||||||
b, err := json.Marshal(typeURL)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
w.write(string(b))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// marshalField writes field description and value to the Writer.
|
|
||||||
func (w *jsonWriter) marshalField(fd protoreflect.FieldDescriptor, v protoreflect.Value, indent string) error {
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write(indent)
|
|
||||||
w.write(w.Indent)
|
|
||||||
}
|
|
||||||
w.write(`"`)
|
|
||||||
switch {
|
|
||||||
case fd.IsExtension():
|
|
||||||
// For message set, use the fname of the message as the extension name.
|
|
||||||
name := string(fd.FullName())
|
|
||||||
if isMessageSet(fd.ContainingMessage()) {
|
|
||||||
name = strings.TrimSuffix(name, ".message_set_extension")
|
|
||||||
}
|
|
||||||
|
|
||||||
w.write("[" + name + "]")
|
|
||||||
case w.OrigName:
|
|
||||||
name := string(fd.Name())
|
|
||||||
if fd.Kind() == protoreflect.GroupKind {
|
|
||||||
name = string(fd.Message().Name())
|
|
||||||
}
|
|
||||||
w.write(name)
|
|
||||||
default:
|
|
||||||
w.write(string(fd.JSONName()))
|
|
||||||
}
|
|
||||||
w.write(`":`)
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write(" ")
|
|
||||||
}
|
|
||||||
return w.marshalValue(fd, v, indent)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *jsonWriter) marshalValue(fd protoreflect.FieldDescriptor, v protoreflect.Value, indent string) error {
|
|
||||||
switch {
|
|
||||||
case fd.IsList():
|
|
||||||
w.write("[")
|
|
||||||
comma := ""
|
|
||||||
lv := v.List()
|
|
||||||
for i := 0; i < lv.Len(); i++ {
|
|
||||||
w.write(comma)
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write("\n")
|
|
||||||
w.write(indent)
|
|
||||||
w.write(w.Indent)
|
|
||||||
w.write(w.Indent)
|
|
||||||
}
|
|
||||||
if err := w.marshalSingularValue(fd, lv.Get(i), indent+w.Indent); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
comma = ","
|
|
||||||
}
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write("\n")
|
|
||||||
w.write(indent)
|
|
||||||
w.write(w.Indent)
|
|
||||||
}
|
|
||||||
w.write("]")
|
|
||||||
return nil
|
|
||||||
case fd.IsMap():
|
|
||||||
kfd := fd.MapKey()
|
|
||||||
vfd := fd.MapValue()
|
|
||||||
mv := v.Map()
|
|
||||||
|
|
||||||
// Collect a sorted list of all map keys and values.
|
|
||||||
type entry struct{ key, val protoreflect.Value }
|
|
||||||
var entries []entry
|
|
||||||
mv.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool {
|
|
||||||
entries = append(entries, entry{k.Value(), v})
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
sort.Slice(entries, func(i, j int) bool {
|
|
||||||
switch kfd.Kind() {
|
|
||||||
case protoreflect.BoolKind:
|
|
||||||
return !entries[i].key.Bool() && entries[j].key.Bool()
|
|
||||||
case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
|
|
||||||
return entries[i].key.Int() < entries[j].key.Int()
|
|
||||||
case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
|
|
||||||
return entries[i].key.Uint() < entries[j].key.Uint()
|
|
||||||
case protoreflect.StringKind:
|
|
||||||
return entries[i].key.String() < entries[j].key.String()
|
|
||||||
default:
|
|
||||||
panic("invalid kind")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
w.write(`{`)
|
|
||||||
comma := ""
|
|
||||||
for _, entry := range entries {
|
|
||||||
w.write(comma)
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write("\n")
|
|
||||||
w.write(indent)
|
|
||||||
w.write(w.Indent)
|
|
||||||
w.write(w.Indent)
|
|
||||||
}
|
|
||||||
|
|
||||||
s := fmt.Sprint(entry.key.Interface())
|
|
||||||
b, err := json.Marshal(s)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
w.write(string(b))
|
|
||||||
|
|
||||||
w.write(`:`)
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write(` `)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := w.marshalSingularValue(vfd, entry.val, indent+w.Indent); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
comma = ","
|
|
||||||
}
|
|
||||||
if w.Indent != "" {
|
|
||||||
w.write("\n")
|
|
||||||
w.write(indent)
|
|
||||||
w.write(w.Indent)
|
|
||||||
}
|
|
||||||
w.write(`}`)
|
|
||||||
return nil
|
|
||||||
default:
|
|
||||||
return w.marshalSingularValue(fd, v, indent)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *jsonWriter) marshalSingularValue(fd protoreflect.FieldDescriptor, v protoreflect.Value, indent string) error {
|
|
||||||
switch {
|
|
||||||
case !v.IsValid():
|
|
||||||
w.write("null")
|
|
||||||
return nil
|
|
||||||
case fd.Message() != nil:
|
|
||||||
return w.marshalMessage(v.Message(), indent+w.Indent, "")
|
|
||||||
case fd.Enum() != nil:
|
|
||||||
if fd.Enum().FullName() == "google.protobuf.NullValue" {
|
|
||||||
w.write("null")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
vd := fd.Enum().Values().ByNumber(v.Enum())
|
|
||||||
if vd == nil || w.EnumsAsInts {
|
|
||||||
w.write(strconv.Itoa(int(v.Enum())))
|
|
||||||
} else {
|
|
||||||
w.write(`"` + string(vd.Name()) + `"`)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
default:
|
|
||||||
switch v.Interface().(type) {
|
|
||||||
case float32, float64:
|
|
||||||
switch {
|
|
||||||
case math.IsInf(v.Float(), +1):
|
|
||||||
w.write(`"Infinity"`)
|
|
||||||
return nil
|
|
||||||
case math.IsInf(v.Float(), -1):
|
|
||||||
w.write(`"-Infinity"`)
|
|
||||||
return nil
|
|
||||||
case math.IsNaN(v.Float()):
|
|
||||||
w.write(`"NaN"`)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
case int64, uint64:
|
|
||||||
w.write(fmt.Sprintf(`"%d"`, v.Interface()))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
b, err := json.Marshal(v.Interface())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
w.write(string(b))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,69 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package jsonpb provides functionality to marshal and unmarshal between a
|
|
||||||
// protocol buffer message and JSON. It follows the specification at
|
|
||||||
// https://developers.google.com/protocol-buffers/docs/proto3#json.
|
|
||||||
//
|
|
||||||
// Do not rely on the default behavior of the standard encoding/json package
|
|
||||||
// when called on generated message types as it does not operate correctly.
|
|
||||||
//
|
|
||||||
// Deprecated: Use the "google.golang.org/protobuf/encoding/protojson"
|
|
||||||
// package instead.
|
|
||||||
package jsonpb
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
"google.golang.org/protobuf/reflect/protoregistry"
|
|
||||||
"google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AnyResolver takes a type URL, present in an Any message,
|
|
||||||
// and resolves it into an instance of the associated message.
|
|
||||||
type AnyResolver interface {
|
|
||||||
Resolve(typeURL string) (proto.Message, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type anyResolver struct{ AnyResolver }
|
|
||||||
|
|
||||||
func (r anyResolver) FindMessageByName(message protoreflect.FullName) (protoreflect.MessageType, error) {
|
|
||||||
return r.FindMessageByURL(string(message))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r anyResolver) FindMessageByURL(url string) (protoreflect.MessageType, error) {
|
|
||||||
m, err := r.Resolve(url)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return protoimpl.X.MessageTypeOf(m), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r anyResolver) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) {
|
|
||||||
return protoregistry.GlobalTypes.FindExtensionByName(field)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r anyResolver) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) {
|
|
||||||
return protoregistry.GlobalTypes.FindExtensionByNumber(message, field)
|
|
||||||
}
|
|
||||||
|
|
||||||
func wellKnownType(s protoreflect.FullName) string {
|
|
||||||
if s.Parent() == "google.protobuf" {
|
|
||||||
switch s.Name() {
|
|
||||||
case "Empty", "Any",
|
|
||||||
"BoolValue", "BytesValue", "StringValue",
|
|
||||||
"Int32Value", "UInt32Value", "FloatValue",
|
|
||||||
"Int64Value", "UInt64Value", "DoubleValue",
|
|
||||||
"Duration", "Timestamp",
|
|
||||||
"NullValue", "Struct", "Value", "ListValue":
|
|
||||||
return string(s.Name())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func isMessageSet(md protoreflect.MessageDescriptor) bool {
|
|
||||||
ms, ok := md.(interface{ IsMessageSet() bool })
|
|
||||||
return ok && ms.IsMessageSet()
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,115 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package proto_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"google.golang.org/protobuf/testing/protopack"
|
|
||||||
|
|
||||||
pb2 "github.com/golang/protobuf/internal/testprotos/proto2_proto"
|
|
||||||
pb3 "github.com/golang/protobuf/internal/testprotos/proto3_proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
var rawFields = protopack.Message{
|
|
||||||
protopack.Tag{5, protopack.Fixed32Type}, protopack.Uint32(4041331395),
|
|
||||||
}.Marshal()
|
|
||||||
|
|
||||||
func TestDiscardUnknown(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
desc string
|
|
||||||
in, want proto.Message
|
|
||||||
}{{
|
|
||||||
desc: "Nil",
|
|
||||||
in: nil, want: nil, // Should not panic
|
|
||||||
}, {
|
|
||||||
desc: "NilPtr",
|
|
||||||
in: (*pb3.Message)(nil), want: (*pb3.Message)(nil), // Should not panic
|
|
||||||
}, {
|
|
||||||
desc: "Nested",
|
|
||||||
in: &pb3.Message{
|
|
||||||
Name: "Aaron",
|
|
||||||
Nested: &pb3.Nested{Cute: true, XXX_unrecognized: []byte(rawFields)},
|
|
||||||
XXX_unrecognized: []byte(rawFields),
|
|
||||||
},
|
|
||||||
want: &pb3.Message{
|
|
||||||
Name: "Aaron",
|
|
||||||
Nested: &pb3.Nested{Cute: true},
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
desc: "Slice",
|
|
||||||
in: &pb3.Message{
|
|
||||||
Name: "Aaron",
|
|
||||||
Children: []*pb3.Message{
|
|
||||||
{Name: "Sarah", XXX_unrecognized: []byte(rawFields)},
|
|
||||||
{Name: "Abraham", XXX_unrecognized: []byte(rawFields)},
|
|
||||||
},
|
|
||||||
XXX_unrecognized: []byte(rawFields),
|
|
||||||
},
|
|
||||||
want: &pb3.Message{
|
|
||||||
Name: "Aaron",
|
|
||||||
Children: []*pb3.Message{
|
|
||||||
{Name: "Sarah"},
|
|
||||||
{Name: "Abraham"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
desc: "OneOf",
|
|
||||||
in: &pb2.Communique{
|
|
||||||
Union: &pb2.Communique_Msg{&pb2.Strings{
|
|
||||||
StringField: proto.String("123"),
|
|
||||||
XXX_unrecognized: []byte(rawFields),
|
|
||||||
}},
|
|
||||||
XXX_unrecognized: []byte(rawFields),
|
|
||||||
},
|
|
||||||
want: &pb2.Communique{
|
|
||||||
Union: &pb2.Communique_Msg{&pb2.Strings{StringField: proto.String("123")}},
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
desc: "Map",
|
|
||||||
in: &pb2.MessageWithMap{MsgMapping: map[int64]*pb2.FloatingPoint{
|
|
||||||
0x4002: &pb2.FloatingPoint{
|
|
||||||
Exact: proto.Bool(true),
|
|
||||||
XXX_unrecognized: []byte(rawFields),
|
|
||||||
},
|
|
||||||
}},
|
|
||||||
want: &pb2.MessageWithMap{MsgMapping: map[int64]*pb2.FloatingPoint{
|
|
||||||
0x4002: &pb2.FloatingPoint{Exact: proto.Bool(true)},
|
|
||||||
}},
|
|
||||||
}, {
|
|
||||||
desc: "Extension",
|
|
||||||
in: func() proto.Message {
|
|
||||||
m := &pb2.MyMessage{
|
|
||||||
Count: proto.Int32(42),
|
|
||||||
Somegroup: &pb2.MyMessage_SomeGroup{
|
|
||||||
GroupField: proto.Int32(6),
|
|
||||||
XXX_unrecognized: []byte(rawFields),
|
|
||||||
},
|
|
||||||
XXX_unrecognized: []byte(rawFields),
|
|
||||||
}
|
|
||||||
proto.SetExtension(m, pb2.E_Ext_More, &pb2.Ext{
|
|
||||||
Data: proto.String("extension"),
|
|
||||||
XXX_unrecognized: []byte(rawFields),
|
|
||||||
})
|
|
||||||
return m
|
|
||||||
}(),
|
|
||||||
want: func() proto.Message {
|
|
||||||
m := &pb2.MyMessage{
|
|
||||||
Count: proto.Int32(42),
|
|
||||||
Somegroup: &pb2.MyMessage_SomeGroup{GroupField: proto.Int32(6)},
|
|
||||||
}
|
|
||||||
proto.SetExtension(m, pb2.E_Ext_More, &pb2.Ext{Data: proto.String("extension")})
|
|
||||||
return m
|
|
||||||
}(),
|
|
||||||
}}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
proto.DiscardUnknown(tt.in)
|
|
||||||
if !proto.Equal(tt.in, tt.want) {
|
|
||||||
t.Errorf("test %s, expected unknown fields to be discarded\ngot %v\nwant %v", tt.desc, tt.in, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,645 +0,0 @@
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package proto_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
|
|
||||||
pb2 "github.com/golang/protobuf/internal/testprotos/proto2_proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestGetExtensionsWithMissingExtensions(t *testing.T) {
|
|
||||||
msg := &pb2.MyMessage{}
|
|
||||||
ext1 := &pb2.Ext{}
|
|
||||||
if err := proto.SetExtension(msg, pb2.E_Ext_More, ext1); err != nil {
|
|
||||||
t.Fatalf("Could not set ext1: %s", err)
|
|
||||||
}
|
|
||||||
exts, err := proto.GetExtensions(msg, []*proto.ExtensionDesc{
|
|
||||||
pb2.E_Ext_More,
|
|
||||||
pb2.E_Ext_Text,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("GetExtensions() failed: %s", err)
|
|
||||||
}
|
|
||||||
if exts[0] != ext1 {
|
|
||||||
t.Errorf("ext1 not in returned extensions: %T %v", exts[0], exts[0])
|
|
||||||
}
|
|
||||||
if exts[1] != nil {
|
|
||||||
t.Errorf("ext2 in returned extensions: %T %v", exts[1], exts[1])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetExtensionForIncompleteDesc(t *testing.T) {
|
|
||||||
msg := &pb2.MyMessage{Count: proto.Int32(0)}
|
|
||||||
extdesc1 := &proto.ExtensionDesc{
|
|
||||||
ExtendedType: (*pb2.MyMessage)(nil),
|
|
||||||
ExtensionType: (*bool)(nil),
|
|
||||||
Field: 123456789,
|
|
||||||
Name: "a.b",
|
|
||||||
Tag: "varint,123456789,opt",
|
|
||||||
}
|
|
||||||
ext1 := proto.Bool(true)
|
|
||||||
if err := proto.SetExtension(msg, extdesc1, ext1); err != nil {
|
|
||||||
t.Fatalf("Could not set ext1: %s", err)
|
|
||||||
}
|
|
||||||
extdesc2 := &proto.ExtensionDesc{
|
|
||||||
ExtendedType: (*pb2.MyMessage)(nil),
|
|
||||||
ExtensionType: ([]byte)(nil),
|
|
||||||
Field: 123456790,
|
|
||||||
Name: "a.c",
|
|
||||||
Tag: "bytes,123456790,opt",
|
|
||||||
}
|
|
||||||
ext2 := []byte{0, 1, 2, 3, 4, 5, 6, 7}
|
|
||||||
if err := proto.SetExtension(msg, extdesc2, ext2); err != nil {
|
|
||||||
t.Fatalf("Could not set ext2: %s", err)
|
|
||||||
}
|
|
||||||
extdesc3 := &proto.ExtensionDesc{
|
|
||||||
ExtendedType: (*pb2.MyMessage)(nil),
|
|
||||||
ExtensionType: (*pb2.Ext)(nil),
|
|
||||||
Field: 123456791,
|
|
||||||
Name: "a.d",
|
|
||||||
Tag: "bytes,123456791,opt",
|
|
||||||
}
|
|
||||||
ext3 := &pb2.Ext{Data: proto.String("foo")}
|
|
||||||
if err := proto.SetExtension(msg, extdesc3, ext3); err != nil {
|
|
||||||
t.Fatalf("Could not set ext3: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
b, err := proto.Marshal(msg)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Could not marshal msg: %v", err)
|
|
||||||
}
|
|
||||||
if err := proto.Unmarshal(b, msg); err != nil {
|
|
||||||
t.Fatalf("Could not unmarshal into msg: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var expected proto.Buffer
|
|
||||||
if err := expected.EncodeVarint(uint64((extdesc1.Field << 3) | proto.WireVarint)); err != nil {
|
|
||||||
t.Fatalf("failed to compute expected prefix for ext1: %s", err)
|
|
||||||
}
|
|
||||||
if err := expected.EncodeVarint(1 /* bool true */); err != nil {
|
|
||||||
t.Fatalf("failed to compute expected value for ext1: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if b, err := proto.GetExtension(msg, &proto.ExtensionDesc{Field: extdesc1.Field}); err != nil {
|
|
||||||
t.Fatalf("Failed to get raw value for ext1: %s", err)
|
|
||||||
} else if !reflect.DeepEqual(b, expected.Bytes()) {
|
|
||||||
t.Fatalf("Raw value for ext1: got %v, want %v", b, expected.Bytes())
|
|
||||||
}
|
|
||||||
|
|
||||||
expected = proto.Buffer{} // reset
|
|
||||||
if err := expected.EncodeVarint(uint64((extdesc2.Field << 3) | proto.WireBytes)); err != nil {
|
|
||||||
t.Fatalf("failed to compute expected prefix for ext2: %s", err)
|
|
||||||
}
|
|
||||||
if err := expected.EncodeRawBytes(ext2); err != nil {
|
|
||||||
t.Fatalf("failed to compute expected value for ext2: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if b, err := proto.GetExtension(msg, &proto.ExtensionDesc{Field: extdesc2.Field}); err != nil {
|
|
||||||
t.Fatalf("Failed to get raw value for ext2: %s", err)
|
|
||||||
} else if !reflect.DeepEqual(b, expected.Bytes()) {
|
|
||||||
t.Fatalf("Raw value for ext2: got %v, want %v", b, expected.Bytes())
|
|
||||||
}
|
|
||||||
|
|
||||||
expected = proto.Buffer{} // reset
|
|
||||||
if err := expected.EncodeVarint(uint64((extdesc3.Field << 3) | proto.WireBytes)); err != nil {
|
|
||||||
t.Fatalf("failed to compute expected prefix for ext3: %s", err)
|
|
||||||
}
|
|
||||||
if b, err := proto.Marshal(ext3); err != nil {
|
|
||||||
t.Fatalf("failed to compute expected value for ext3: %s", err)
|
|
||||||
} else if err := expected.EncodeRawBytes(b); err != nil {
|
|
||||||
t.Fatalf("failed to compute expected value for ext3: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if b, err := proto.GetExtension(msg, &proto.ExtensionDesc{Field: extdesc3.Field}); err != nil {
|
|
||||||
t.Fatalf("Failed to get raw value for ext3: %s", err)
|
|
||||||
} else if !reflect.DeepEqual(b, expected.Bytes()) {
|
|
||||||
t.Fatalf("Raw value for ext3: got %v, want %v", b, expected.Bytes())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestExtensionDescsWithUnregisteredExtensions(t *testing.T) {
|
|
||||||
msg := &pb2.MyMessage{Count: proto.Int32(0)}
|
|
||||||
extdesc1 := pb2.E_Ext_More
|
|
||||||
if descs, err := proto.ExtensionDescs(msg); len(descs) != 0 || err != nil {
|
|
||||||
t.Errorf("proto.ExtensionDescs: got %d descs, error %v; want 0, nil", len(descs), err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ext1 := &pb2.Ext{}
|
|
||||||
if err := proto.SetExtension(msg, extdesc1, ext1); err != nil {
|
|
||||||
t.Fatalf("Could not set ext1: %s", err)
|
|
||||||
}
|
|
||||||
extdesc2 := &proto.ExtensionDesc{
|
|
||||||
ExtendedType: (*pb2.MyMessage)(nil),
|
|
||||||
ExtensionType: (*bool)(nil),
|
|
||||||
Field: 123456789,
|
|
||||||
Name: "a.b",
|
|
||||||
Tag: "varint,123456789,opt",
|
|
||||||
}
|
|
||||||
ext2 := proto.Bool(false)
|
|
||||||
if err := proto.SetExtension(msg, extdesc2, ext2); err != nil {
|
|
||||||
t.Fatalf("Could not set ext2: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
b, err := proto.Marshal(msg)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Could not marshal msg: %v", err)
|
|
||||||
}
|
|
||||||
if err := proto.Unmarshal(b, msg); err != nil {
|
|
||||||
t.Fatalf("Could not unmarshal into msg: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
descs, err := proto.ExtensionDescs(msg)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("proto.ExtensionDescs: got error %v", err)
|
|
||||||
}
|
|
||||||
sortExtDescs(descs)
|
|
||||||
wantDescs := []*proto.ExtensionDesc{extdesc1, {Field: extdesc2.Field}}
|
|
||||||
if !reflect.DeepEqual(descs, wantDescs) {
|
|
||||||
t.Errorf("proto.ExtensionDescs(msg) sorted extension ids: got %+v, want %+v", descs, wantDescs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type ExtensionDescSlice []*proto.ExtensionDesc
|
|
||||||
|
|
||||||
func (s ExtensionDescSlice) Len() int { return len(s) }
|
|
||||||
func (s ExtensionDescSlice) Less(i, j int) bool { return s[i].Field < s[j].Field }
|
|
||||||
func (s ExtensionDescSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
|
||||||
|
|
||||||
func sortExtDescs(s []*proto.ExtensionDesc) {
|
|
||||||
sort.Sort(ExtensionDescSlice(s))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetExtensionStability(t *testing.T) {
|
|
||||||
check := func(m *pb2.MyMessage) bool {
|
|
||||||
ext1, err := proto.GetExtension(m, pb2.E_Ext_More)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("GetExtension() failed: %s", err)
|
|
||||||
}
|
|
||||||
ext2, err := proto.GetExtension(m, pb2.E_Ext_More)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("GetExtension() failed: %s", err)
|
|
||||||
}
|
|
||||||
return ext1 == ext2
|
|
||||||
}
|
|
||||||
msg := &pb2.MyMessage{Count: proto.Int32(4)}
|
|
||||||
ext0 := &pb2.Ext{}
|
|
||||||
if err := proto.SetExtension(msg, pb2.E_Ext_More, ext0); err != nil {
|
|
||||||
t.Fatalf("Could not set ext1: %s", ext0)
|
|
||||||
}
|
|
||||||
if !check(msg) {
|
|
||||||
t.Errorf("GetExtension() not stable before marshaling")
|
|
||||||
}
|
|
||||||
bb, err := proto.Marshal(msg)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Marshal() failed: %s", err)
|
|
||||||
}
|
|
||||||
msg1 := &pb2.MyMessage{}
|
|
||||||
err = proto.Unmarshal(bb, msg1)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Unmarshal() failed: %s", err)
|
|
||||||
}
|
|
||||||
if !check(msg1) {
|
|
||||||
t.Errorf("GetExtension() not stable after unmarshaling")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetExtensionDefaults(t *testing.T) {
|
|
||||||
var setFloat64 float64 = 1
|
|
||||||
var setFloat32 float32 = 2
|
|
||||||
var setInt32 int32 = 3
|
|
||||||
var setInt64 int64 = 4
|
|
||||||
var setUint32 uint32 = 5
|
|
||||||
var setUint64 uint64 = 6
|
|
||||||
var setBool = true
|
|
||||||
var setBool2 = false
|
|
||||||
var setString = "Goodnight string"
|
|
||||||
var setBytes = []byte("Goodnight bytes")
|
|
||||||
var setEnum = pb2.DefaultsMessage_TWO
|
|
||||||
|
|
||||||
type testcase struct {
|
|
||||||
ext *proto.ExtensionDesc // Extension we are testing.
|
|
||||||
want interface{} // Expected value of extension, or nil (meaning that GetExtension will fail).
|
|
||||||
def interface{} // Expected value of extension after ClearExtension().
|
|
||||||
}
|
|
||||||
tests := []testcase{
|
|
||||||
{pb2.E_NoDefaultDouble, setFloat64, nil},
|
|
||||||
{pb2.E_NoDefaultFloat, setFloat32, nil},
|
|
||||||
{pb2.E_NoDefaultInt32, setInt32, nil},
|
|
||||||
{pb2.E_NoDefaultInt64, setInt64, nil},
|
|
||||||
{pb2.E_NoDefaultUint32, setUint32, nil},
|
|
||||||
{pb2.E_NoDefaultUint64, setUint64, nil},
|
|
||||||
{pb2.E_NoDefaultSint32, setInt32, nil},
|
|
||||||
{pb2.E_NoDefaultSint64, setInt64, nil},
|
|
||||||
{pb2.E_NoDefaultFixed32, setUint32, nil},
|
|
||||||
{pb2.E_NoDefaultFixed64, setUint64, nil},
|
|
||||||
{pb2.E_NoDefaultSfixed32, setInt32, nil},
|
|
||||||
{pb2.E_NoDefaultSfixed64, setInt64, nil},
|
|
||||||
{pb2.E_NoDefaultBool, setBool, nil},
|
|
||||||
{pb2.E_NoDefaultBool, setBool2, nil},
|
|
||||||
{pb2.E_NoDefaultString, setString, nil},
|
|
||||||
{pb2.E_NoDefaultBytes, setBytes, nil},
|
|
||||||
{pb2.E_NoDefaultEnum, setEnum, nil},
|
|
||||||
{pb2.E_DefaultDouble, setFloat64, float64(3.1415)},
|
|
||||||
{pb2.E_DefaultFloat, setFloat32, float32(3.14)},
|
|
||||||
{pb2.E_DefaultInt32, setInt32, int32(42)},
|
|
||||||
{pb2.E_DefaultInt64, setInt64, int64(43)},
|
|
||||||
{pb2.E_DefaultUint32, setUint32, uint32(44)},
|
|
||||||
{pb2.E_DefaultUint64, setUint64, uint64(45)},
|
|
||||||
{pb2.E_DefaultSint32, setInt32, int32(46)},
|
|
||||||
{pb2.E_DefaultSint64, setInt64, int64(47)},
|
|
||||||
{pb2.E_DefaultFixed32, setUint32, uint32(48)},
|
|
||||||
{pb2.E_DefaultFixed64, setUint64, uint64(49)},
|
|
||||||
{pb2.E_DefaultSfixed32, setInt32, int32(50)},
|
|
||||||
{pb2.E_DefaultSfixed64, setInt64, int64(51)},
|
|
||||||
{pb2.E_DefaultBool, setBool, true},
|
|
||||||
{pb2.E_DefaultBool, setBool2, true},
|
|
||||||
{pb2.E_DefaultString, setString, "Hello, string,def=foo"},
|
|
||||||
{pb2.E_DefaultBytes, setBytes, []byte("Hello, bytes")},
|
|
||||||
{pb2.E_DefaultEnum, setEnum, pb2.DefaultsMessage_ONE},
|
|
||||||
}
|
|
||||||
|
|
||||||
checkVal := func(t *testing.T, name string, test testcase, msg *pb2.DefaultsMessage, valWant interface{}) {
|
|
||||||
t.Run(name, func(t *testing.T) {
|
|
||||||
val, err := proto.GetExtension(msg, test.ext)
|
|
||||||
if err != nil {
|
|
||||||
if valWant != nil {
|
|
||||||
t.Errorf("GetExtension(): %s", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if want := proto.ErrMissingExtension; err != want {
|
|
||||||
t.Errorf("Unexpected error: got %v, want %v", err, want)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// All proto2 extension values are either a pointer to a value or a slice of values.
|
|
||||||
ty := reflect.TypeOf(val)
|
|
||||||
tyWant := reflect.TypeOf(test.ext.ExtensionType)
|
|
||||||
if got, want := ty, tyWant; got != want {
|
|
||||||
t.Errorf("unexpected reflect.TypeOf(): got %v want %v", got, want)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
tye := ty.Elem()
|
|
||||||
tyeWant := tyWant.Elem()
|
|
||||||
if got, want := tye, tyeWant; got != want {
|
|
||||||
t.Errorf("unexpected reflect.TypeOf().Elem(): got %v want %v", got, want)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check the name of the type of the value.
|
|
||||||
// If it is an enum it will be type int32 with the name of the enum.
|
|
||||||
if got, want := tye.Name(), tye.Name(); got != want {
|
|
||||||
t.Errorf("unexpected reflect.TypeOf().Elem().Name(): got %v want %v", got, want)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check that value is what we expect.
|
|
||||||
// If we have a pointer in val, get the value it points to.
|
|
||||||
valExp := val
|
|
||||||
if ty.Kind() == reflect.Ptr {
|
|
||||||
valExp = reflect.ValueOf(val).Elem().Interface()
|
|
||||||
}
|
|
||||||
if got, want := valExp, valWant; !reflect.DeepEqual(got, want) {
|
|
||||||
t.Errorf("unexpected reflect.DeepEqual(): got %v want %v", got, want)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
setTo := func(test testcase) interface{} {
|
|
||||||
setTo := reflect.ValueOf(test.want)
|
|
||||||
if typ := reflect.TypeOf(test.ext.ExtensionType); typ.Kind() == reflect.Ptr {
|
|
||||||
setTo = reflect.New(typ).Elem()
|
|
||||||
setTo.Set(reflect.New(setTo.Type().Elem()))
|
|
||||||
setTo.Elem().Set(reflect.ValueOf(test.want))
|
|
||||||
}
|
|
||||||
return setTo.Interface()
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, test := range tests {
|
|
||||||
msg := &pb2.DefaultsMessage{}
|
|
||||||
name := test.ext.Name
|
|
||||||
|
|
||||||
// Check the initial value.
|
|
||||||
checkVal(t, name+"/initial", test, msg, test.def)
|
|
||||||
|
|
||||||
// Set the per-type value and check value.
|
|
||||||
if err := proto.SetExtension(msg, test.ext, setTo(test)); err != nil {
|
|
||||||
t.Errorf("%s: SetExtension(): %v", name, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
checkVal(t, name+"/set", test, msg, test.want)
|
|
||||||
|
|
||||||
// Set and check the value.
|
|
||||||
proto.ClearExtension(msg, test.ext)
|
|
||||||
checkVal(t, name+"/cleared", test, msg, test.def)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNilMessage(t *testing.T) {
|
|
||||||
name := "nil interface"
|
|
||||||
if got, err := proto.GetExtension(nil, pb2.E_Ext_More); err == nil {
|
|
||||||
t.Errorf("%s: got %T %v, expected to fail", name, got, got)
|
|
||||||
} else if !strings.Contains(err.Error(), "extendable") {
|
|
||||||
t.Errorf("%s: got error %v, expected not-extendable error", name, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Regression tests: all functions of the Extension API
|
|
||||||
// used to panic when passed (*M)(nil), where M is a concrete message
|
|
||||||
// type. Now they handle this gracefully as a no-op or reported error.
|
|
||||||
var nilMsg *pb2.MyMessage
|
|
||||||
desc := pb2.E_Ext_More
|
|
||||||
|
|
||||||
isNotExtendable := func(err error) bool {
|
|
||||||
return strings.Contains(fmt.Sprint(err), "not an extendable")
|
|
||||||
}
|
|
||||||
|
|
||||||
if proto.HasExtension(nilMsg, desc) {
|
|
||||||
t.Error("HasExtension(nil) = true")
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := proto.GetExtensions(nilMsg, []*proto.ExtensionDesc{desc}); !isNotExtendable(err) {
|
|
||||||
t.Errorf("GetExtensions(nil) = %q (wrong error)", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := proto.ExtensionDescs(nilMsg); !isNotExtendable(err) {
|
|
||||||
t.Errorf("ExtensionDescs(nil) = %q (wrong error)", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := proto.SetExtension(nilMsg, desc, nil); !isNotExtendable(err) {
|
|
||||||
t.Errorf("SetExtension(nil) = %q (wrong error)", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
proto.ClearExtension(nilMsg, desc) // no-op
|
|
||||||
proto.ClearAllExtensions(nilMsg) // no-op
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestExtensionsRoundTrip(t *testing.T) {
|
|
||||||
msg := &pb2.MyMessage{}
|
|
||||||
ext1 := &pb2.Ext{
|
|
||||||
Data: proto.String("hi"),
|
|
||||||
}
|
|
||||||
ext2 := &pb2.Ext{
|
|
||||||
Data: proto.String("there"),
|
|
||||||
}
|
|
||||||
exists := proto.HasExtension(msg, pb2.E_Ext_More)
|
|
||||||
if exists {
|
|
||||||
t.Error("Extension More present unexpectedly")
|
|
||||||
}
|
|
||||||
if err := proto.SetExtension(msg, pb2.E_Ext_More, ext1); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
if err := proto.SetExtension(msg, pb2.E_Ext_More, ext2); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
e, err := proto.GetExtension(msg, pb2.E_Ext_More)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
x, ok := e.(*pb2.Ext)
|
|
||||||
if !ok {
|
|
||||||
t.Errorf("e has type %T, expected test_proto.Ext", e)
|
|
||||||
} else if *x.Data != "there" {
|
|
||||||
t.Errorf("SetExtension failed to overwrite, got %+v, not 'there'", x)
|
|
||||||
}
|
|
||||||
proto.ClearExtension(msg, pb2.E_Ext_More)
|
|
||||||
if _, err = proto.GetExtension(msg, pb2.E_Ext_More); err != proto.ErrMissingExtension {
|
|
||||||
t.Errorf("got %v, expected ErrMissingExtension", e)
|
|
||||||
}
|
|
||||||
if err := proto.SetExtension(msg, pb2.E_Ext_More, 12); err == nil {
|
|
||||||
t.Error("expected some sort of type mismatch error, got nil")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNilExtension(t *testing.T) {
|
|
||||||
msg := &pb2.MyMessage{
|
|
||||||
Count: proto.Int32(1),
|
|
||||||
}
|
|
||||||
if err := proto.SetExtension(msg, pb2.E_Ext_Text, proto.String("hello")); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if err := proto.SetExtension(msg, pb2.E_Ext_More, (*pb2.Ext)(nil)); err == nil {
|
|
||||||
t.Error("expected SetExtension to fail due to a nil extension")
|
|
||||||
} else if want := fmt.Sprintf("proto: SetExtension called with nil value of type %T", new(pb2.Ext)); err.Error() != want {
|
|
||||||
t.Errorf("expected error %v, got %v", want, err)
|
|
||||||
}
|
|
||||||
// Note: if the behavior of Marshal is ever changed to ignore nil extensions, update
|
|
||||||
// this test to verify that E_Ext_Text is properly propagated through marshal->unmarshal.
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMarshalUnmarshalRepeatedExtension(t *testing.T) {
|
|
||||||
// Add a repeated extension to the result.
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
ext []*pb2.ComplexExtension
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
"two fields",
|
|
||||||
[]*pb2.ComplexExtension{
|
|
||||||
{First: proto.Int32(7)},
|
|
||||||
{Second: proto.Int32(11)},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repeated field",
|
|
||||||
[]*pb2.ComplexExtension{
|
|
||||||
{Third: []int32{1000}},
|
|
||||||
{Third: []int32{2000}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"two fields and repeated field",
|
|
||||||
[]*pb2.ComplexExtension{
|
|
||||||
{Third: []int32{1000}},
|
|
||||||
{First: proto.Int32(9)},
|
|
||||||
{Second: proto.Int32(21)},
|
|
||||||
{Third: []int32{2000}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, test := range tests {
|
|
||||||
// Marshal message with a repeated extension.
|
|
||||||
msg1 := new(pb2.OtherMessage)
|
|
||||||
err := proto.SetExtension(msg1, pb2.E_RComplex, test.ext)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("[%s] Error setting extension: %v", test.name, err)
|
|
||||||
}
|
|
||||||
b, err := proto.Marshal(msg1)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("[%s] Error marshaling message: %v", test.name, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unmarshal and read the merged proto.
|
|
||||||
msg2 := new(pb2.OtherMessage)
|
|
||||||
err = proto.Unmarshal(b, msg2)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err)
|
|
||||||
}
|
|
||||||
e, err := proto.GetExtension(msg2, pb2.E_RComplex)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("[%s] Error getting extension: %v", test.name, err)
|
|
||||||
}
|
|
||||||
ext := e.([]*pb2.ComplexExtension)
|
|
||||||
if ext == nil {
|
|
||||||
t.Fatalf("[%s] Invalid extension", test.name)
|
|
||||||
}
|
|
||||||
if len(ext) != len(test.ext) {
|
|
||||||
t.Errorf("[%s] Wrong length of ComplexExtension: got: %v want: %v\n", test.name, len(ext), len(test.ext))
|
|
||||||
}
|
|
||||||
for i := range test.ext {
|
|
||||||
if !proto.Equal(ext[i], test.ext[i]) {
|
|
||||||
t.Errorf("[%s] Wrong value for ComplexExtension[%d]: got: %v want: %v\n", test.name, i, ext[i], test.ext[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestUnmarshalRepeatingNonRepeatedExtension(t *testing.T) {
|
|
||||||
// We may see multiple instances of the same extension in the wire
|
|
||||||
// format. For example, the proto compiler may encode custom options in
|
|
||||||
// this way. Here, we verify that we merge the extensions together.
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
ext []*pb2.ComplexExtension
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
"two fields",
|
|
||||||
[]*pb2.ComplexExtension{
|
|
||||||
{First: proto.Int32(7)},
|
|
||||||
{Second: proto.Int32(11)},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repeated field",
|
|
||||||
[]*pb2.ComplexExtension{
|
|
||||||
{Third: []int32{1000}},
|
|
||||||
{Third: []int32{2000}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"two fields and repeated field",
|
|
||||||
[]*pb2.ComplexExtension{
|
|
||||||
{Third: []int32{1000}},
|
|
||||||
{First: proto.Int32(9)},
|
|
||||||
{Second: proto.Int32(21)},
|
|
||||||
{Third: []int32{2000}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, test := range tests {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
var want pb2.ComplexExtension
|
|
||||||
|
|
||||||
// Generate a serialized representation of a repeated extension
|
|
||||||
// by catenating bytes together.
|
|
||||||
for i, e := range test.ext {
|
|
||||||
// Merge to create the wanted proto.
|
|
||||||
proto.Merge(&want, e)
|
|
||||||
|
|
||||||
// serialize the message
|
|
||||||
msg := new(pb2.OtherMessage)
|
|
||||||
err := proto.SetExtension(msg, pb2.E_Complex, e)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("[%s] Error setting extension %d: %v", test.name, i, err)
|
|
||||||
}
|
|
||||||
b, err := proto.Marshal(msg)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("[%s] Error marshaling message %d: %v", test.name, i, err)
|
|
||||||
}
|
|
||||||
buf.Write(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unmarshal and read the merged proto.
|
|
||||||
msg2 := new(pb2.OtherMessage)
|
|
||||||
err := proto.Unmarshal(buf.Bytes(), msg2)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err)
|
|
||||||
}
|
|
||||||
e, err := proto.GetExtension(msg2, pb2.E_Complex)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("[%s] Error getting extension: %v", test.name, err)
|
|
||||||
}
|
|
||||||
ext := e.(*pb2.ComplexExtension)
|
|
||||||
if ext == nil {
|
|
||||||
t.Fatalf("[%s] Invalid extension", test.name)
|
|
||||||
}
|
|
||||||
if !proto.Equal(ext, &want) {
|
|
||||||
t.Errorf("[%s] Wrong value for ComplexExtension: got: %s want: %s\n", test.name, ext, &want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestClearAllExtensions(t *testing.T) {
|
|
||||||
// unregistered extension
|
|
||||||
desc := &proto.ExtensionDesc{
|
|
||||||
ExtendedType: (*pb2.MyMessage)(nil),
|
|
||||||
ExtensionType: (*bool)(nil),
|
|
||||||
Field: 101010100,
|
|
||||||
Name: "emptyextension",
|
|
||||||
Tag: "varint,0,opt",
|
|
||||||
}
|
|
||||||
m := &pb2.MyMessage{}
|
|
||||||
if proto.HasExtension(m, desc) {
|
|
||||||
t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m))
|
|
||||||
}
|
|
||||||
if err := proto.SetExtension(m, desc, proto.Bool(true)); err != nil {
|
|
||||||
t.Errorf("proto.SetExtension(m, desc, true): got error %q, want nil", err)
|
|
||||||
}
|
|
||||||
if !proto.HasExtension(m, desc) {
|
|
||||||
t.Errorf("proto.HasExtension(%s): got false, want true", proto.MarshalTextString(m))
|
|
||||||
}
|
|
||||||
proto.ClearAllExtensions(m)
|
|
||||||
if proto.HasExtension(m, desc) {
|
|
||||||
t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMarshalRace(t *testing.T) {
|
|
||||||
ext := &pb2.Ext{}
|
|
||||||
m := &pb2.MyMessage{Count: proto.Int32(4)}
|
|
||||||
if err := proto.SetExtension(m, pb2.E_Ext_More, ext); err != nil {
|
|
||||||
t.Fatalf("proto.SetExtension(m, desc, true): got error %q, want nil", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
b, err := proto.Marshal(m)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Could not marshal message: %v", err)
|
|
||||||
}
|
|
||||||
if err := proto.Unmarshal(b, m); err != nil {
|
|
||||||
t.Fatalf("Could not unmarshal message: %v", err)
|
|
||||||
}
|
|
||||||
// after Unmarshal, the extension is in undecoded form.
|
|
||||||
// GetExtension will decode it lazily. Make sure this does
|
|
||||||
// not race against Marshal.
|
|
||||||
|
|
||||||
wg := sync.WaitGroup{}
|
|
||||||
errs := make(chan error, 3)
|
|
||||||
for n := 3; n > 0; n-- {
|
|
||||||
wg.Add(1)
|
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
_, err := proto.Marshal(m)
|
|
||||||
errs <- err
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
wg.Wait()
|
|
||||||
close(errs)
|
|
||||||
|
|
||||||
for err = range errs {
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,379 +0,0 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package proto_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
|
|
||||||
pb2 "github.com/golang/protobuf/internal/testprotos/proto2_proto"
|
|
||||||
pb3 "github.com/golang/protobuf/internal/testprotos/proto3_proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
var cloneTestMessage = &pb2.MyMessage{
|
|
||||||
Count: proto.Int32(42),
|
|
||||||
Name: proto.String("Dave"),
|
|
||||||
Pet: []string{"bunny", "kitty", "horsey"},
|
|
||||||
Inner: &pb2.InnerMessage{
|
|
||||||
Host: proto.String("niles"),
|
|
||||||
Port: proto.Int32(9099),
|
|
||||||
Connected: proto.Bool(true),
|
|
||||||
},
|
|
||||||
Others: []*pb2.OtherMessage{
|
|
||||||
{
|
|
||||||
Value: []byte("some bytes"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Somegroup: &pb2.MyMessage_SomeGroup{
|
|
||||||
GroupField: proto.Int32(6),
|
|
||||||
},
|
|
||||||
RepBytes: [][]byte{[]byte("sham"), []byte("wow")},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
ext := &pb2.Ext{
|
|
||||||
Data: proto.String("extension"),
|
|
||||||
}
|
|
||||||
if err := proto.SetExtension(cloneTestMessage, pb2.E_Ext_More, ext); err != nil {
|
|
||||||
panic("SetExtension: " + err.Error())
|
|
||||||
}
|
|
||||||
if err := proto.SetExtension(cloneTestMessage, pb2.E_Ext_Text, proto.String("hello")); err != nil {
|
|
||||||
panic("SetExtension: " + err.Error())
|
|
||||||
}
|
|
||||||
if err := proto.SetExtension(cloneTestMessage, pb2.E_Greeting, []string{"one", "two"}); err != nil {
|
|
||||||
panic("SetExtension: " + err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestClone(t *testing.T) {
|
|
||||||
// Create a clone using a marshal/unmarshal roundtrip.
|
|
||||||
vanilla := new(pb2.MyMessage)
|
|
||||||
b, err := proto.Marshal(cloneTestMessage)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("unexpected Marshal error: %v", err)
|
|
||||||
}
|
|
||||||
if err := proto.Unmarshal(b, vanilla); err != nil {
|
|
||||||
t.Errorf("unexpected Unarshal error: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a clone using Clone and verify that it is equal to the original.
|
|
||||||
m := proto.Clone(cloneTestMessage).(*pb2.MyMessage)
|
|
||||||
if !proto.Equal(m, cloneTestMessage) {
|
|
||||||
t.Fatalf("Clone(%v) = %v", cloneTestMessage, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mutate the clone, which should not affect the original.
|
|
||||||
x1, err := proto.GetExtension(m, pb2.E_Ext_More)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("unexpected GetExtension(%v) error: %v", pb2.E_Ext_More.Name, err)
|
|
||||||
}
|
|
||||||
x2, err := proto.GetExtension(m, pb2.E_Ext_Text)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("unexpected GetExtension(%v) error: %v", pb2.E_Ext_Text.Name, err)
|
|
||||||
}
|
|
||||||
x3, err := proto.GetExtension(m, pb2.E_Greeting)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("unexpected GetExtension(%v) error: %v", pb2.E_Greeting.Name, err)
|
|
||||||
}
|
|
||||||
*m.Inner.Port++
|
|
||||||
*(x1.(*pb2.Ext)).Data = "blah blah"
|
|
||||||
*(x2.(*string)) = "goodbye"
|
|
||||||
x3.([]string)[0] = "zero"
|
|
||||||
if !proto.Equal(cloneTestMessage, vanilla) {
|
|
||||||
t.Fatalf("mutation on original detected:\ngot %v\nwant %v", cloneTestMessage, vanilla)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCloneNil(t *testing.T) {
|
|
||||||
var m *pb2.MyMessage
|
|
||||||
if c := proto.Clone(m); !proto.Equal(m, c) {
|
|
||||||
t.Errorf("Clone(%v) = %v", m, c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var mergeTests = []struct {
|
|
||||||
src, dst, want proto.Message
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
src: &pb2.MyMessage{
|
|
||||||
Count: proto.Int32(42),
|
|
||||||
},
|
|
||||||
dst: &pb2.MyMessage{
|
|
||||||
Name: proto.String("Dave"),
|
|
||||||
},
|
|
||||||
want: &pb2.MyMessage{
|
|
||||||
Count: proto.Int32(42),
|
|
||||||
Name: proto.String("Dave"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.MyMessage{
|
|
||||||
Inner: &pb2.InnerMessage{
|
|
||||||
Host: proto.String("hey"),
|
|
||||||
Connected: proto.Bool(true),
|
|
||||||
},
|
|
||||||
Pet: []string{"horsey"},
|
|
||||||
Others: []*pb2.OtherMessage{
|
|
||||||
{
|
|
||||||
Value: []byte("some bytes"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
dst: &pb2.MyMessage{
|
|
||||||
Inner: &pb2.InnerMessage{
|
|
||||||
Host: proto.String("niles"),
|
|
||||||
Port: proto.Int32(9099),
|
|
||||||
},
|
|
||||||
Pet: []string{"bunny", "kitty"},
|
|
||||||
Others: []*pb2.OtherMessage{
|
|
||||||
{
|
|
||||||
Key: proto.Int64(31415926535),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// Explicitly test a src=nil field
|
|
||||||
Inner: nil,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &pb2.MyMessage{
|
|
||||||
Inner: &pb2.InnerMessage{
|
|
||||||
Host: proto.String("hey"),
|
|
||||||
Connected: proto.Bool(true),
|
|
||||||
Port: proto.Int32(9099),
|
|
||||||
},
|
|
||||||
Pet: []string{"bunny", "kitty", "horsey"},
|
|
||||||
Others: []*pb2.OtherMessage{
|
|
||||||
{
|
|
||||||
Key: proto.Int64(31415926535),
|
|
||||||
},
|
|
||||||
{},
|
|
||||||
{
|
|
||||||
Value: []byte("some bytes"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.MyMessage{
|
|
||||||
RepBytes: [][]byte{[]byte("wow")},
|
|
||||||
},
|
|
||||||
dst: &pb2.MyMessage{
|
|
||||||
Somegroup: &pb2.MyMessage_SomeGroup{
|
|
||||||
GroupField: proto.Int32(6),
|
|
||||||
},
|
|
||||||
RepBytes: [][]byte{[]byte("sham")},
|
|
||||||
},
|
|
||||||
want: &pb2.MyMessage{
|
|
||||||
Somegroup: &pb2.MyMessage_SomeGroup{
|
|
||||||
GroupField: proto.Int32(6),
|
|
||||||
},
|
|
||||||
RepBytes: [][]byte{[]byte("sham"), []byte("wow")},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// Check that a scalar bytes field replaces rather than appends.
|
|
||||||
{
|
|
||||||
src: &pb2.OtherMessage{Value: []byte("foo")},
|
|
||||||
dst: &pb2.OtherMessage{Value: []byte("bar")},
|
|
||||||
want: &pb2.OtherMessage{Value: []byte("foo")},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.MessageWithMap{
|
|
||||||
NameMapping: map[int32]string{6: "Nigel"},
|
|
||||||
MsgMapping: map[int64]*pb2.FloatingPoint{
|
|
||||||
0x4001: &pb2.FloatingPoint{F: proto.Float64(2.0)},
|
|
||||||
0x4002: &pb2.FloatingPoint{
|
|
||||||
F: proto.Float64(2.0),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
ByteMapping: map[bool][]byte{true: []byte("wowsa")},
|
|
||||||
},
|
|
||||||
dst: &pb2.MessageWithMap{
|
|
||||||
NameMapping: map[int32]string{
|
|
||||||
6: "Bruce", // should be overwritten
|
|
||||||
7: "Andrew",
|
|
||||||
},
|
|
||||||
MsgMapping: map[int64]*pb2.FloatingPoint{
|
|
||||||
0x4002: &pb2.FloatingPoint{
|
|
||||||
F: proto.Float64(3.0),
|
|
||||||
Exact: proto.Bool(true),
|
|
||||||
}, // the entire message should be overwritten
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &pb2.MessageWithMap{
|
|
||||||
NameMapping: map[int32]string{
|
|
||||||
6: "Nigel",
|
|
||||||
7: "Andrew",
|
|
||||||
},
|
|
||||||
MsgMapping: map[int64]*pb2.FloatingPoint{
|
|
||||||
0x4001: &pb2.FloatingPoint{F: proto.Float64(2.0)},
|
|
||||||
0x4002: &pb2.FloatingPoint{
|
|
||||||
F: proto.Float64(2.0),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
ByteMapping: map[bool][]byte{true: []byte("wowsa")},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// proto3 shouldn't merge zero values,
|
|
||||||
// in the same way that proto2 shouldn't merge nils.
|
|
||||||
{
|
|
||||||
src: &pb3.Message{
|
|
||||||
Name: "Aaron",
|
|
||||||
Data: []byte(""), // zero value, but not nil
|
|
||||||
},
|
|
||||||
dst: &pb3.Message{
|
|
||||||
HeightInCm: 176,
|
|
||||||
Data: []byte("texas!"),
|
|
||||||
},
|
|
||||||
want: &pb3.Message{
|
|
||||||
Name: "Aaron",
|
|
||||||
HeightInCm: 176,
|
|
||||||
Data: []byte("texas!"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{ // Oneof fields should merge by assignment.
|
|
||||||
src: &pb2.Communique{Union: &pb2.Communique_Number{41}},
|
|
||||||
dst: &pb2.Communique{Union: &pb2.Communique_Name{"Bobby Tables"}},
|
|
||||||
want: &pb2.Communique{Union: &pb2.Communique_Number{41}},
|
|
||||||
},
|
|
||||||
{ // Oneof nil is the same as not set.
|
|
||||||
src: &pb2.Communique{},
|
|
||||||
dst: &pb2.Communique{Union: &pb2.Communique_Name{"Bobby Tables"}},
|
|
||||||
want: &pb2.Communique{Union: &pb2.Communique_Name{"Bobby Tables"}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.Communique{Union: &pb2.Communique_Number{1337}},
|
|
||||||
dst: &pb2.Communique{},
|
|
||||||
want: &pb2.Communique{Union: &pb2.Communique_Number{1337}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.Communique{Union: &pb2.Communique_Col{pb2.MyMessage_RED}},
|
|
||||||
dst: &pb2.Communique{},
|
|
||||||
want: &pb2.Communique{Union: &pb2.Communique_Col{pb2.MyMessage_RED}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.Communique{Union: &pb2.Communique_Data{[]byte("hello")}},
|
|
||||||
dst: &pb2.Communique{},
|
|
||||||
want: &pb2.Communique{Union: &pb2.Communique_Data{[]byte("hello")}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.Communique{Union: &pb2.Communique_Msg{&pb2.Strings{BytesField: []byte{1, 2, 3}}}},
|
|
||||||
dst: &pb2.Communique{},
|
|
||||||
want: &pb2.Communique{Union: &pb2.Communique_Msg{&pb2.Strings{BytesField: []byte{1, 2, 3}}}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.Communique{Union: &pb2.Communique_Msg{}},
|
|
||||||
dst: &pb2.Communique{},
|
|
||||||
want: &pb2.Communique{Union: &pb2.Communique_Msg{}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.Communique{Union: &pb2.Communique_Msg{&pb2.Strings{StringField: proto.String("123")}}},
|
|
||||||
dst: &pb2.Communique{Union: &pb2.Communique_Msg{&pb2.Strings{BytesField: []byte{1, 2, 3}}}},
|
|
||||||
want: &pb2.Communique{Union: &pb2.Communique_Msg{&pb2.Strings{StringField: proto.String("123"), BytesField: []byte{1, 2, 3}}}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb3.Message{
|
|
||||||
Terrain: map[string]*pb3.Nested{
|
|
||||||
"kay_a": &pb3.Nested{Cute: true}, // replace
|
|
||||||
"kay_b": &pb3.Nested{Bunny: "rabbit"}, // insert
|
|
||||||
},
|
|
||||||
},
|
|
||||||
dst: &pb3.Message{
|
|
||||||
Terrain: map[string]*pb3.Nested{
|
|
||||||
"kay_a": &pb3.Nested{Bunny: "lost"}, // replaced
|
|
||||||
"kay_c": &pb3.Nested{Bunny: "bunny"}, // keep
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &pb3.Message{
|
|
||||||
Terrain: map[string]*pb3.Nested{
|
|
||||||
"kay_a": &pb3.Nested{Cute: true},
|
|
||||||
"kay_b": &pb3.Nested{Bunny: "rabbit"},
|
|
||||||
"kay_c": &pb3.Nested{Bunny: "bunny"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.GoTest{
|
|
||||||
F_BoolRepeated: []bool{},
|
|
||||||
F_Int32Repeated: []int32{},
|
|
||||||
F_Int64Repeated: []int64{},
|
|
||||||
F_Uint32Repeated: []uint32{},
|
|
||||||
F_Uint64Repeated: []uint64{},
|
|
||||||
F_FloatRepeated: []float32{},
|
|
||||||
F_DoubleRepeated: []float64{},
|
|
||||||
F_StringRepeated: []string{},
|
|
||||||
F_BytesRepeated: [][]byte{},
|
|
||||||
},
|
|
||||||
dst: &pb2.GoTest{},
|
|
||||||
want: &pb2.GoTest{
|
|
||||||
F_BoolRepeated: []bool{},
|
|
||||||
F_Int32Repeated: []int32{},
|
|
||||||
F_Int64Repeated: []int64{},
|
|
||||||
F_Uint32Repeated: []uint32{},
|
|
||||||
F_Uint64Repeated: []uint64{},
|
|
||||||
F_FloatRepeated: []float32{},
|
|
||||||
F_DoubleRepeated: []float64{},
|
|
||||||
F_StringRepeated: []string{},
|
|
||||||
F_BytesRepeated: [][]byte{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.GoTest{},
|
|
||||||
dst: &pb2.GoTest{
|
|
||||||
F_BoolRepeated: []bool{},
|
|
||||||
F_Int32Repeated: []int32{},
|
|
||||||
F_Int64Repeated: []int64{},
|
|
||||||
F_Uint32Repeated: []uint32{},
|
|
||||||
F_Uint64Repeated: []uint64{},
|
|
||||||
F_FloatRepeated: []float32{},
|
|
||||||
F_DoubleRepeated: []float64{},
|
|
||||||
F_StringRepeated: []string{},
|
|
||||||
F_BytesRepeated: [][]byte{},
|
|
||||||
},
|
|
||||||
want: &pb2.GoTest{
|
|
||||||
F_BoolRepeated: []bool{},
|
|
||||||
F_Int32Repeated: []int32{},
|
|
||||||
F_Int64Repeated: []int64{},
|
|
||||||
F_Uint32Repeated: []uint32{},
|
|
||||||
F_Uint64Repeated: []uint64{},
|
|
||||||
F_FloatRepeated: []float32{},
|
|
||||||
F_DoubleRepeated: []float64{},
|
|
||||||
F_StringRepeated: []string{},
|
|
||||||
F_BytesRepeated: [][]byte{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.GoTest{
|
|
||||||
F_BytesRepeated: [][]byte{nil, []byte{}, []byte{0}},
|
|
||||||
},
|
|
||||||
dst: &pb2.GoTest{},
|
|
||||||
want: &pb2.GoTest{
|
|
||||||
F_BytesRepeated: [][]byte{nil, []byte{}, []byte{0}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &pb2.MyMessage{
|
|
||||||
Others: []*pb2.OtherMessage{},
|
|
||||||
},
|
|
||||||
dst: &pb2.MyMessage{},
|
|
||||||
want: &pb2.MyMessage{
|
|
||||||
Others: []*pb2.OtherMessage{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMerge(t *testing.T) {
|
|
||||||
for _, m := range mergeTests {
|
|
||||||
got := proto.Clone(m.dst)
|
|
||||||
if !proto.Equal(got, m.dst) {
|
|
||||||
t.Errorf("Clone()\ngot %v\nwant %v", got, m.dst)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
proto.Merge(got, m.src)
|
|
||||||
if !proto.Equal(got, m.want) {
|
|
||||||
t.Errorf("Merge(%v, %v)\ngot %v\nwant %v", m.dst, m.src, got, m.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,218 +0,0 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package proto_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
|
|
||||||
pb2 "github.com/golang/protobuf/internal/testprotos/proto2_proto"
|
|
||||||
pb3 "github.com/golang/protobuf/internal/testprotos/proto3_proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Four identical base messages.
|
|
||||||
// The init function adds extensions to some of them.
|
|
||||||
var messageWithoutExtension = &pb2.MyMessage{Count: proto.Int32(7)}
|
|
||||||
var messageWithExtension1a = &pb2.MyMessage{Count: proto.Int32(7)}
|
|
||||||
var messageWithExtension1b = &pb2.MyMessage{Count: proto.Int32(7)}
|
|
||||||
var messageWithExtension2 = &pb2.MyMessage{Count: proto.Int32(7)}
|
|
||||||
var messageWithExtension3a = &pb2.MyMessage{Count: proto.Int32(7)}
|
|
||||||
var messageWithExtension3b = &pb2.MyMessage{Count: proto.Int32(7)}
|
|
||||||
var messageWithExtension3c = &pb2.MyMessage{Count: proto.Int32(7)}
|
|
||||||
|
|
||||||
// Two messages with non-message extensions.
|
|
||||||
var messageWithInt32Extension1 = &pb2.MyMessage{Count: proto.Int32(8)}
|
|
||||||
var messageWithInt32Extension2 = &pb2.MyMessage{Count: proto.Int32(8)}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
ext1 := &pb2.Ext{Data: proto.String("Kirk")}
|
|
||||||
ext2 := &pb2.Ext{Data: proto.String("Picard")}
|
|
||||||
|
|
||||||
// messageWithExtension1a has ext1, but never marshals it.
|
|
||||||
if err := proto.SetExtension(messageWithExtension1a, pb2.E_Ext_More, ext1); err != nil {
|
|
||||||
panic("proto.SetExtension on 1a failed: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
// messageWithExtension1b is the unmarshaled form of messageWithExtension1a.
|
|
||||||
if err := proto.SetExtension(messageWithExtension1b, pb2.E_Ext_More, ext1); err != nil {
|
|
||||||
panic("proto.SetExtension on 1b failed: " + err.Error())
|
|
||||||
}
|
|
||||||
buf, err := proto.Marshal(messageWithExtension1b)
|
|
||||||
if err != nil {
|
|
||||||
panic("proto.Marshal of 1b failed: " + err.Error())
|
|
||||||
}
|
|
||||||
messageWithExtension1b.Reset()
|
|
||||||
if err := proto.Unmarshal(buf, messageWithExtension1b); err != nil {
|
|
||||||
panic("proto.Unmarshal of 1b failed: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
// messageWithExtension2 has ext2.
|
|
||||||
if err := proto.SetExtension(messageWithExtension2, pb2.E_Ext_More, ext2); err != nil {
|
|
||||||
panic("proto.SetExtension on 2 failed: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := proto.SetExtension(messageWithInt32Extension1, pb2.E_Ext_Number, proto.Int32(23)); err != nil {
|
|
||||||
panic("proto.SetExtension on Int32-1 failed: " + err.Error())
|
|
||||||
}
|
|
||||||
if err := proto.SetExtension(messageWithInt32Extension1, pb2.E_Ext_Number, proto.Int32(24)); err != nil {
|
|
||||||
panic("proto.SetExtension on Int32-2 failed: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
// messageWithExtension3{a,b,c} has unregistered extension.
|
|
||||||
if proto.RegisteredExtensions(messageWithExtension3a)[200] != nil {
|
|
||||||
panic("expect extension 200 unregistered")
|
|
||||||
}
|
|
||||||
bytes := []byte{
|
|
||||||
0xc0, 0x0c, 0x01, // id=200, wiretype=0 (varint), data=1
|
|
||||||
}
|
|
||||||
bytes2 := []byte{
|
|
||||||
0xc0, 0x0c, 0x02, // id=200, wiretype=0 (varint), data=2
|
|
||||||
}
|
|
||||||
proto.SetRawExtension(messageWithExtension3a, 200, bytes)
|
|
||||||
proto.SetRawExtension(messageWithExtension3b, 200, bytes)
|
|
||||||
proto.SetRawExtension(messageWithExtension3c, 200, bytes2)
|
|
||||||
}
|
|
||||||
|
|
||||||
var EqualTests = []struct {
|
|
||||||
desc string
|
|
||||||
a, b proto.Message
|
|
||||||
exp bool
|
|
||||||
}{
|
|
||||||
{"different types", &pb2.GoEnum{}, &pb2.GoTestField{}, false},
|
|
||||||
{"equal empty", &pb2.GoEnum{}, &pb2.GoEnum{}, true},
|
|
||||||
{"nil vs nil", nil, nil, true},
|
|
||||||
{"typed nil vs typed nil", (*pb2.GoEnum)(nil), (*pb2.GoEnum)(nil), true},
|
|
||||||
{"typed nil vs empty", (*pb2.GoEnum)(nil), &pb2.GoEnum{}, false},
|
|
||||||
{"different typed nil", (*pb2.GoEnum)(nil), (*pb2.GoTestField)(nil), false},
|
|
||||||
|
|
||||||
{"one set field, one unset field", &pb2.GoTestField{Label: proto.String("foo")}, &pb2.GoTestField{}, false},
|
|
||||||
{"one set field zero, one unset field", &pb2.GoTest{Param: proto.Int32(0)}, &pb2.GoTest{}, false},
|
|
||||||
{"different set fields", &pb2.GoTestField{Label: proto.String("foo")}, &pb2.GoTestField{Label: proto.String("bar")}, false},
|
|
||||||
{"equal set", &pb2.GoTestField{Label: proto.String("foo")}, &pb2.GoTestField{Label: proto.String("foo")}, true},
|
|
||||||
|
|
||||||
{"repeated, one set", &pb2.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb2.GoTest{}, false},
|
|
||||||
{"repeated, different length", &pb2.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb2.GoTest{F_Int32Repeated: []int32{2}}, false},
|
|
||||||
{"repeated, different value", &pb2.GoTest{F_Int32Repeated: []int32{2}}, &pb2.GoTest{F_Int32Repeated: []int32{3}}, false},
|
|
||||||
{"repeated, equal", &pb2.GoTest{F_Int32Repeated: []int32{2, 4}}, &pb2.GoTest{F_Int32Repeated: []int32{2, 4}}, true},
|
|
||||||
{"repeated, nil equal nil", &pb2.GoTest{F_Int32Repeated: nil}, &pb2.GoTest{F_Int32Repeated: nil}, true},
|
|
||||||
{"repeated, nil equal empty", &pb2.GoTest{F_Int32Repeated: nil}, &pb2.GoTest{F_Int32Repeated: []int32{}}, true},
|
|
||||||
{"repeated, empty equal nil", &pb2.GoTest{F_Int32Repeated: []int32{}}, &pb2.GoTest{F_Int32Repeated: nil}, true},
|
|
||||||
|
|
||||||
{
|
|
||||||
"nested, different",
|
|
||||||
&pb2.GoTest{RequiredField: &pb2.GoTestField{Label: proto.String("foo")}},
|
|
||||||
&pb2.GoTest{RequiredField: &pb2.GoTestField{Label: proto.String("bar")}},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"nested, equal",
|
|
||||||
&pb2.GoTest{RequiredField: &pb2.GoTestField{Label: proto.String("wow")}},
|
|
||||||
&pb2.GoTest{RequiredField: &pb2.GoTestField{Label: proto.String("wow")}},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
|
|
||||||
{"bytes", &pb2.OtherMessage{Value: []byte("foo")}, &pb2.OtherMessage{Value: []byte("foo")}, true},
|
|
||||||
{"bytes, empty", &pb2.OtherMessage{Value: []byte{}}, &pb2.OtherMessage{Value: []byte{}}, true},
|
|
||||||
{"bytes, empty vs nil", &pb2.OtherMessage{Value: []byte{}}, &pb2.OtherMessage{Value: nil}, false},
|
|
||||||
{
|
|
||||||
"repeated bytes",
|
|
||||||
&pb2.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}},
|
|
||||||
&pb2.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
// In proto3, []byte{} and []byte(nil) are equal.
|
|
||||||
{"proto3 bytes, empty vs nil", &pb3.Message{Data: []byte{}}, &pb3.Message{Data: nil}, true},
|
|
||||||
|
|
||||||
{"extension vs. no extension", messageWithoutExtension, messageWithExtension1a, false},
|
|
||||||
{"extension vs. same extension", messageWithExtension1a, messageWithExtension1b, true},
|
|
||||||
{"extension vs. different extension", messageWithExtension1a, messageWithExtension2, false},
|
|
||||||
|
|
||||||
{"int32 extension vs. itself", messageWithInt32Extension1, messageWithInt32Extension1, true},
|
|
||||||
{"int32 extension vs. a different int32", messageWithInt32Extension1, messageWithInt32Extension2, false},
|
|
||||||
|
|
||||||
{"unregistered extension same", messageWithExtension3a, messageWithExtension3b, true},
|
|
||||||
{"unregistered extension different", messageWithExtension3a, messageWithExtension3c, false},
|
|
||||||
|
|
||||||
{
|
|
||||||
"message with group",
|
|
||||||
&pb2.MyMessage{
|
|
||||||
Count: proto.Int32(1),
|
|
||||||
Somegroup: &pb2.MyMessage_SomeGroup{
|
|
||||||
GroupField: proto.Int32(5),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
&pb2.MyMessage{
|
|
||||||
Count: proto.Int32(1),
|
|
||||||
Somegroup: &pb2.MyMessage_SomeGroup{
|
|
||||||
GroupField: proto.Int32(5),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"map same",
|
|
||||||
&pb2.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}},
|
|
||||||
&pb2.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"map different entry",
|
|
||||||
&pb2.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}},
|
|
||||||
&pb2.MessageWithMap{NameMapping: map[int32]string{2: "Rob"}},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"map different key only",
|
|
||||||
&pb2.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}},
|
|
||||||
&pb2.MessageWithMap{NameMapping: map[int32]string{2: "Ken"}},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"map different value only",
|
|
||||||
&pb2.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}},
|
|
||||||
&pb2.MessageWithMap{NameMapping: map[int32]string{1: "Rob"}},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"zero-length maps same",
|
|
||||||
&pb2.MessageWithMap{NameMapping: map[int32]string{}},
|
|
||||||
&pb2.MessageWithMap{NameMapping: nil},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orders in map don't matter",
|
|
||||||
&pb2.MessageWithMap{NameMapping: map[int32]string{1: "Ken", 2: "Rob"}},
|
|
||||||
&pb2.MessageWithMap{NameMapping: map[int32]string{2: "Rob", 1: "Ken"}},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"oneof same",
|
|
||||||
&pb2.Communique{Union: &pb2.Communique_Number{41}},
|
|
||||||
&pb2.Communique{Union: &pb2.Communique_Number{41}},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"oneof one nil",
|
|
||||||
&pb2.Communique{Union: &pb2.Communique_Number{41}},
|
|
||||||
&pb2.Communique{},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"oneof different",
|
|
||||||
&pb2.Communique{Union: &pb2.Communique_Number{41}},
|
|
||||||
&pb2.Communique{Union: &pb2.Communique_Name{"Bobby Tables"}},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestEqual(t *testing.T) {
|
|
||||||
for _, tc := range EqualTests {
|
|
||||||
if res := proto.Equal(tc.a, tc.b); res != tc.exp {
|
|
||||||
t.Errorf("%v: Equal(%v, %v) = %v, want %v", tc.desc, tc.a, tc.b, res, tc.exp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,37 +0,0 @@
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package proto_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
|
|
||||||
descpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestRegistry(t *testing.T) {
|
|
||||||
file := new(descpb.DescriptorProto).ProtoReflect().Descriptor().ParentFile()
|
|
||||||
path := file.Path()
|
|
||||||
pkg := file.Package()
|
|
||||||
if got := proto.FileDescriptor(path); len(got) == 0 {
|
|
||||||
t.Errorf("FileDescriptor(%q) = empty, want non-empty", path)
|
|
||||||
}
|
|
||||||
|
|
||||||
name := protoreflect.FullName(pkg + ".FieldDescriptorProto_Label")
|
|
||||||
if got := proto.EnumValueMap(string(name)); len(got) == 0 {
|
|
||||||
t.Errorf("EnumValueMap(%q) = empty, want non-empty", name)
|
|
||||||
}
|
|
||||||
|
|
||||||
msg := new(descpb.EnumDescriptorProto_EnumReservedRange)
|
|
||||||
name = msg.ProtoReflect().Descriptor().FullName()
|
|
||||||
wantType := reflect.TypeOf(msg)
|
|
||||||
gotType := proto.MessageType(string(name))
|
|
||||||
if gotType != wantType {
|
|
||||||
t.Errorf("MessageType(%q) = %v, want %v", name, gotType, wantType)
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,200 +0,0 @@
|
||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// source: github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto
|
|
||||||
|
|
||||||
package descriptor
|
|
||||||
|
|
||||||
import (
|
|
||||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
descriptorpb "google.golang.org/protobuf/types/descriptorpb"
|
|
||||||
reflect "reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Symbols defined in public import of google/protobuf/descriptor.proto.
|
|
||||||
|
|
||||||
type FieldDescriptorProto_Type = descriptorpb.FieldDescriptorProto_Type
|
|
||||||
|
|
||||||
const FieldDescriptorProto_TYPE_DOUBLE = descriptorpb.FieldDescriptorProto_TYPE_DOUBLE
|
|
||||||
const FieldDescriptorProto_TYPE_FLOAT = descriptorpb.FieldDescriptorProto_TYPE_FLOAT
|
|
||||||
const FieldDescriptorProto_TYPE_INT64 = descriptorpb.FieldDescriptorProto_TYPE_INT64
|
|
||||||
const FieldDescriptorProto_TYPE_UINT64 = descriptorpb.FieldDescriptorProto_TYPE_UINT64
|
|
||||||
const FieldDescriptorProto_TYPE_INT32 = descriptorpb.FieldDescriptorProto_TYPE_INT32
|
|
||||||
const FieldDescriptorProto_TYPE_FIXED64 = descriptorpb.FieldDescriptorProto_TYPE_FIXED64
|
|
||||||
const FieldDescriptorProto_TYPE_FIXED32 = descriptorpb.FieldDescriptorProto_TYPE_FIXED32
|
|
||||||
const FieldDescriptorProto_TYPE_BOOL = descriptorpb.FieldDescriptorProto_TYPE_BOOL
|
|
||||||
const FieldDescriptorProto_TYPE_STRING = descriptorpb.FieldDescriptorProto_TYPE_STRING
|
|
||||||
const FieldDescriptorProto_TYPE_GROUP = descriptorpb.FieldDescriptorProto_TYPE_GROUP
|
|
||||||
const FieldDescriptorProto_TYPE_MESSAGE = descriptorpb.FieldDescriptorProto_TYPE_MESSAGE
|
|
||||||
const FieldDescriptorProto_TYPE_BYTES = descriptorpb.FieldDescriptorProto_TYPE_BYTES
|
|
||||||
const FieldDescriptorProto_TYPE_UINT32 = descriptorpb.FieldDescriptorProto_TYPE_UINT32
|
|
||||||
const FieldDescriptorProto_TYPE_ENUM = descriptorpb.FieldDescriptorProto_TYPE_ENUM
|
|
||||||
const FieldDescriptorProto_TYPE_SFIXED32 = descriptorpb.FieldDescriptorProto_TYPE_SFIXED32
|
|
||||||
const FieldDescriptorProto_TYPE_SFIXED64 = descriptorpb.FieldDescriptorProto_TYPE_SFIXED64
|
|
||||||
const FieldDescriptorProto_TYPE_SINT32 = descriptorpb.FieldDescriptorProto_TYPE_SINT32
|
|
||||||
const FieldDescriptorProto_TYPE_SINT64 = descriptorpb.FieldDescriptorProto_TYPE_SINT64
|
|
||||||
|
|
||||||
var FieldDescriptorProto_Type_name = descriptorpb.FieldDescriptorProto_Type_name
|
|
||||||
var FieldDescriptorProto_Type_value = descriptorpb.FieldDescriptorProto_Type_value
|
|
||||||
|
|
||||||
type FieldDescriptorProto_Label = descriptorpb.FieldDescriptorProto_Label
|
|
||||||
|
|
||||||
const FieldDescriptorProto_LABEL_OPTIONAL = descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL
|
|
||||||
const FieldDescriptorProto_LABEL_REQUIRED = descriptorpb.FieldDescriptorProto_LABEL_REQUIRED
|
|
||||||
const FieldDescriptorProto_LABEL_REPEATED = descriptorpb.FieldDescriptorProto_LABEL_REPEATED
|
|
||||||
|
|
||||||
var FieldDescriptorProto_Label_name = descriptorpb.FieldDescriptorProto_Label_name
|
|
||||||
var FieldDescriptorProto_Label_value = descriptorpb.FieldDescriptorProto_Label_value
|
|
||||||
|
|
||||||
type FileOptions_OptimizeMode = descriptorpb.FileOptions_OptimizeMode
|
|
||||||
|
|
||||||
const FileOptions_SPEED = descriptorpb.FileOptions_SPEED
|
|
||||||
const FileOptions_CODE_SIZE = descriptorpb.FileOptions_CODE_SIZE
|
|
||||||
const FileOptions_LITE_RUNTIME = descriptorpb.FileOptions_LITE_RUNTIME
|
|
||||||
|
|
||||||
var FileOptions_OptimizeMode_name = descriptorpb.FileOptions_OptimizeMode_name
|
|
||||||
var FileOptions_OptimizeMode_value = descriptorpb.FileOptions_OptimizeMode_value
|
|
||||||
|
|
||||||
type FieldOptions_CType = descriptorpb.FieldOptions_CType
|
|
||||||
|
|
||||||
const FieldOptions_STRING = descriptorpb.FieldOptions_STRING
|
|
||||||
const FieldOptions_CORD = descriptorpb.FieldOptions_CORD
|
|
||||||
const FieldOptions_STRING_PIECE = descriptorpb.FieldOptions_STRING_PIECE
|
|
||||||
|
|
||||||
var FieldOptions_CType_name = descriptorpb.FieldOptions_CType_name
|
|
||||||
var FieldOptions_CType_value = descriptorpb.FieldOptions_CType_value
|
|
||||||
|
|
||||||
type FieldOptions_JSType = descriptorpb.FieldOptions_JSType
|
|
||||||
|
|
||||||
const FieldOptions_JS_NORMAL = descriptorpb.FieldOptions_JS_NORMAL
|
|
||||||
const FieldOptions_JS_STRING = descriptorpb.FieldOptions_JS_STRING
|
|
||||||
const FieldOptions_JS_NUMBER = descriptorpb.FieldOptions_JS_NUMBER
|
|
||||||
|
|
||||||
var FieldOptions_JSType_name = descriptorpb.FieldOptions_JSType_name
|
|
||||||
var FieldOptions_JSType_value = descriptorpb.FieldOptions_JSType_value
|
|
||||||
|
|
||||||
type MethodOptions_IdempotencyLevel = descriptorpb.MethodOptions_IdempotencyLevel
|
|
||||||
|
|
||||||
const MethodOptions_IDEMPOTENCY_UNKNOWN = descriptorpb.MethodOptions_IDEMPOTENCY_UNKNOWN
|
|
||||||
const MethodOptions_NO_SIDE_EFFECTS = descriptorpb.MethodOptions_NO_SIDE_EFFECTS
|
|
||||||
const MethodOptions_IDEMPOTENT = descriptorpb.MethodOptions_IDEMPOTENT
|
|
||||||
|
|
||||||
var MethodOptions_IdempotencyLevel_name = descriptorpb.MethodOptions_IdempotencyLevel_name
|
|
||||||
var MethodOptions_IdempotencyLevel_value = descriptorpb.MethodOptions_IdempotencyLevel_value
|
|
||||||
|
|
||||||
type FileDescriptorSet = descriptorpb.FileDescriptorSet
|
|
||||||
type FileDescriptorProto = descriptorpb.FileDescriptorProto
|
|
||||||
type DescriptorProto = descriptorpb.DescriptorProto
|
|
||||||
type ExtensionRangeOptions = descriptorpb.ExtensionRangeOptions
|
|
||||||
type FieldDescriptorProto = descriptorpb.FieldDescriptorProto
|
|
||||||
type OneofDescriptorProto = descriptorpb.OneofDescriptorProto
|
|
||||||
type EnumDescriptorProto = descriptorpb.EnumDescriptorProto
|
|
||||||
type EnumValueDescriptorProto = descriptorpb.EnumValueDescriptorProto
|
|
||||||
type ServiceDescriptorProto = descriptorpb.ServiceDescriptorProto
|
|
||||||
type MethodDescriptorProto = descriptorpb.MethodDescriptorProto
|
|
||||||
|
|
||||||
const Default_MethodDescriptorProto_ClientStreaming = descriptorpb.Default_MethodDescriptorProto_ClientStreaming
|
|
||||||
const Default_MethodDescriptorProto_ServerStreaming = descriptorpb.Default_MethodDescriptorProto_ServerStreaming
|
|
||||||
|
|
||||||
type FileOptions = descriptorpb.FileOptions
|
|
||||||
|
|
||||||
const Default_FileOptions_JavaMultipleFiles = descriptorpb.Default_FileOptions_JavaMultipleFiles
|
|
||||||
const Default_FileOptions_JavaStringCheckUtf8 = descriptorpb.Default_FileOptions_JavaStringCheckUtf8
|
|
||||||
const Default_FileOptions_OptimizeFor = descriptorpb.Default_FileOptions_OptimizeFor
|
|
||||||
const Default_FileOptions_CcGenericServices = descriptorpb.Default_FileOptions_CcGenericServices
|
|
||||||
const Default_FileOptions_JavaGenericServices = descriptorpb.Default_FileOptions_JavaGenericServices
|
|
||||||
const Default_FileOptions_PyGenericServices = descriptorpb.Default_FileOptions_PyGenericServices
|
|
||||||
const Default_FileOptions_PhpGenericServices = descriptorpb.Default_FileOptions_PhpGenericServices
|
|
||||||
const Default_FileOptions_Deprecated = descriptorpb.Default_FileOptions_Deprecated
|
|
||||||
const Default_FileOptions_CcEnableArenas = descriptorpb.Default_FileOptions_CcEnableArenas
|
|
||||||
|
|
||||||
type MessageOptions = descriptorpb.MessageOptions
|
|
||||||
|
|
||||||
const Default_MessageOptions_MessageSetWireFormat = descriptorpb.Default_MessageOptions_MessageSetWireFormat
|
|
||||||
const Default_MessageOptions_NoStandardDescriptorAccessor = descriptorpb.Default_MessageOptions_NoStandardDescriptorAccessor
|
|
||||||
const Default_MessageOptions_Deprecated = descriptorpb.Default_MessageOptions_Deprecated
|
|
||||||
|
|
||||||
type FieldOptions = descriptorpb.FieldOptions
|
|
||||||
|
|
||||||
const Default_FieldOptions_Ctype = descriptorpb.Default_FieldOptions_Ctype
|
|
||||||
const Default_FieldOptions_Jstype = descriptorpb.Default_FieldOptions_Jstype
|
|
||||||
const Default_FieldOptions_Lazy = descriptorpb.Default_FieldOptions_Lazy
|
|
||||||
const Default_FieldOptions_Deprecated = descriptorpb.Default_FieldOptions_Deprecated
|
|
||||||
const Default_FieldOptions_Weak = descriptorpb.Default_FieldOptions_Weak
|
|
||||||
|
|
||||||
type OneofOptions = descriptorpb.OneofOptions
|
|
||||||
type EnumOptions = descriptorpb.EnumOptions
|
|
||||||
|
|
||||||
const Default_EnumOptions_Deprecated = descriptorpb.Default_EnumOptions_Deprecated
|
|
||||||
|
|
||||||
type EnumValueOptions = descriptorpb.EnumValueOptions
|
|
||||||
|
|
||||||
const Default_EnumValueOptions_Deprecated = descriptorpb.Default_EnumValueOptions_Deprecated
|
|
||||||
|
|
||||||
type ServiceOptions = descriptorpb.ServiceOptions
|
|
||||||
|
|
||||||
const Default_ServiceOptions_Deprecated = descriptorpb.Default_ServiceOptions_Deprecated
|
|
||||||
|
|
||||||
type MethodOptions = descriptorpb.MethodOptions
|
|
||||||
|
|
||||||
const Default_MethodOptions_Deprecated = descriptorpb.Default_MethodOptions_Deprecated
|
|
||||||
const Default_MethodOptions_IdempotencyLevel = descriptorpb.Default_MethodOptions_IdempotencyLevel
|
|
||||||
|
|
||||||
type UninterpretedOption = descriptorpb.UninterpretedOption
|
|
||||||
type SourceCodeInfo = descriptorpb.SourceCodeInfo
|
|
||||||
type GeneratedCodeInfo = descriptorpb.GeneratedCodeInfo
|
|
||||||
type DescriptorProto_ExtensionRange = descriptorpb.DescriptorProto_ExtensionRange
|
|
||||||
type DescriptorProto_ReservedRange = descriptorpb.DescriptorProto_ReservedRange
|
|
||||||
type EnumDescriptorProto_EnumReservedRange = descriptorpb.EnumDescriptorProto_EnumReservedRange
|
|
||||||
type UninterpretedOption_NamePart = descriptorpb.UninterpretedOption_NamePart
|
|
||||||
type SourceCodeInfo_Location = descriptorpb.SourceCodeInfo_Location
|
|
||||||
type GeneratedCodeInfo_Annotation = descriptorpb.GeneratedCodeInfo_Annotation
|
|
||||||
|
|
||||||
var File_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto protoreflect.FileDescriptor
|
|
||||||
|
|
||||||
var file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_rawDesc = []byte{
|
|
||||||
0x0a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c,
|
|
||||||
0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x72, 0x6f,
|
|
||||||
0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72,
|
|
||||||
0x69, 0x70, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72,
|
|
||||||
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,
|
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
|
|
||||||
0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68,
|
|
||||||
0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72,
|
|
||||||
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65,
|
|
||||||
0x6e, 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x3b,
|
|
||||||
0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72,
|
|
||||||
0x6f, 0x74, 0x6f, 0x32,
|
|
||||||
}
|
|
||||||
|
|
||||||
var file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_goTypes = []interface{}{}
|
|
||||||
var file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_depIdxs = []int32{
|
|
||||||
0, // [0:0] is the sub-list for method output_type
|
|
||||||
0, // [0:0] is the sub-list for method input_type
|
|
||||||
0, // [0:0] is the sub-list for extension type_name
|
|
||||||
0, // [0:0] is the sub-list for extension extendee
|
|
||||||
0, // [0:0] is the sub-list for field type_name
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_init() }
|
|
||||||
func file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_init() {
|
|
||||||
if File_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
type x struct{}
|
|
||||||
out := protoimpl.TypeBuilder{
|
|
||||||
File: protoimpl.DescBuilder{
|
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
|
||||||
RawDescriptor: file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_rawDesc,
|
|
||||||
NumEnums: 0,
|
|
||||||
NumMessages: 0,
|
|
||||||
NumExtensions: 0,
|
|
||||||
NumServices: 0,
|
|
||||||
},
|
|
||||||
GoTypes: file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_goTypes,
|
|
||||||
DependencyIndexes: file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_depIdxs,
|
|
||||||
}.Build()
|
|
||||||
File_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto = out.File
|
|
||||||
file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_rawDesc = nil
|
|
||||||
file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_goTypes = nil
|
|
||||||
file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_depIdxs = nil
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,88 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package remap handles tracking the locations of Go tokens in a source text
|
|
||||||
// across a rewrite by the Go formatter.
|
|
||||||
package remap
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"go/scanner"
|
|
||||||
"go/token"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A Location represents a span of byte offsets in the source text.
|
|
||||||
type Location struct {
|
|
||||||
Pos, End int // End is exclusive
|
|
||||||
}
|
|
||||||
|
|
||||||
// A Map represents a mapping between token locations in an input source text
|
|
||||||
// and locations in the correspnding output text.
|
|
||||||
type Map map[Location]Location
|
|
||||||
|
|
||||||
// Find reports whether the specified span is recorded by m, and if so returns
|
|
||||||
// the new location it was mapped to. If the input span was not found, the
|
|
||||||
// returned location is the same as the input.
|
|
||||||
func (m Map) Find(pos, end int) (Location, bool) {
|
|
||||||
key := Location{
|
|
||||||
Pos: pos,
|
|
||||||
End: end,
|
|
||||||
}
|
|
||||||
if loc, ok := m[key]; ok {
|
|
||||||
return loc, true
|
|
||||||
}
|
|
||||||
return key, false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m Map) add(opos, oend, npos, nend int) {
|
|
||||||
m[Location{Pos: opos, End: oend}] = Location{Pos: npos, End: nend}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute constructs a location mapping from input to output. An error is
|
|
||||||
// reported if any of the tokens of output cannot be mapped.
|
|
||||||
func Compute(input, output []byte) (Map, error) {
|
|
||||||
itok := tokenize(input)
|
|
||||||
otok := tokenize(output)
|
|
||||||
if len(itok) != len(otok) {
|
|
||||||
return nil, fmt.Errorf("wrong number of tokens, %d ≠ %d", len(itok), len(otok))
|
|
||||||
}
|
|
||||||
m := make(Map)
|
|
||||||
for i, ti := range itok {
|
|
||||||
to := otok[i]
|
|
||||||
if ti.Token != to.Token {
|
|
||||||
return nil, fmt.Errorf("token %d type mismatch: %s ≠ %s", i+1, ti, to)
|
|
||||||
}
|
|
||||||
m.add(ti.pos, ti.end, to.pos, to.end)
|
|
||||||
}
|
|
||||||
return m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// tokinfo records the span and type of a source token.
|
|
||||||
type tokinfo struct {
|
|
||||||
pos, end int
|
|
||||||
token.Token
|
|
||||||
}
|
|
||||||
|
|
||||||
func tokenize(src []byte) []tokinfo {
|
|
||||||
fs := token.NewFileSet()
|
|
||||||
var s scanner.Scanner
|
|
||||||
s.Init(fs.AddFile("src", fs.Base(), len(src)), src, nil, scanner.ScanComments)
|
|
||||||
var info []tokinfo
|
|
||||||
for {
|
|
||||||
pos, next, lit := s.Scan()
|
|
||||||
switch next {
|
|
||||||
case token.SEMICOLON:
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
info = append(info, tokinfo{
|
|
||||||
pos: int(pos - 1),
|
|
||||||
end: int(pos + token.Pos(len(lit)) - 1),
|
|
||||||
Token: next,
|
|
||||||
})
|
|
||||||
if next == token.EOF {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return info
|
|
||||||
}
|
|
|
@ -1,55 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package remap
|
|
||||||
|
|
||||||
import (
|
|
||||||
"go/format"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestErrors(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
in, out string
|
|
||||||
}{
|
|
||||||
{"", "x"},
|
|
||||||
{"x", ""},
|
|
||||||
{"var x int = 5\n", "var x = 5\n"},
|
|
||||||
{"these are \"one\" thing", "those are 'another' thing"},
|
|
||||||
}
|
|
||||||
for _, test := range tests {
|
|
||||||
m, err := Compute([]byte(test.in), []byte(test.out))
|
|
||||||
if err != nil {
|
|
||||||
t.Logf("Got expected error: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
t.Errorf("Compute(%q, %q): got %+v, wanted error", test.in, test.out, m)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMatching(t *testing.T) {
|
|
||||||
// The input is a source text that will be rearranged by the formatter.
|
|
||||||
const input = `package foo
|
|
||||||
var s int
|
|
||||||
func main(){}
|
|
||||||
`
|
|
||||||
|
|
||||||
output, err := format.Source([]byte(input))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Formatting failed: %v", err)
|
|
||||||
}
|
|
||||||
m, err := Compute([]byte(input), output)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Unexpected error: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify that the mapped locations have the same text.
|
|
||||||
for key, val := range m {
|
|
||||||
want := input[key.Pos:key.End]
|
|
||||||
got := string(output[val.Pos:val.End])
|
|
||||||
if got != want {
|
|
||||||
t.Errorf("Token at %d:%d: got %q, want %q", key.Pos, key.End, got, want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,521 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package grpc is deprecated.
|
|
||||||
//
|
|
||||||
// This package is excluded from the Go protocol buffer compatibility guarantee
|
|
||||||
// and may be deleted at some point in the future.
|
|
||||||
//
|
|
||||||
// Deprecated: Do not use.
|
|
||||||
package grpc
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
pb "github.com/golang/protobuf/protoc-gen-go/descriptor"
|
|
||||||
"github.com/golang/protobuf/protoc-gen-go/generator"
|
|
||||||
)
|
|
||||||
|
|
||||||
// generatedCodeVersion indicates a version of the generated code.
|
|
||||||
// It is incremented whenever an incompatibility between the generated code and
|
|
||||||
// the grpc package is introduced; the generated code references
|
|
||||||
// a constant, grpc.SupportPackageIsVersionN (where N is generatedCodeVersion).
|
|
||||||
const generatedCodeVersion = 6
|
|
||||||
|
|
||||||
// Paths for packages used by code generated in this file,
|
|
||||||
// relative to the import_prefix of the generator.Generator.
|
|
||||||
const (
|
|
||||||
contextPkgPath = "context"
|
|
||||||
grpcPkgPath = "google.golang.org/grpc"
|
|
||||||
codePkgPath = "google.golang.org/grpc/codes"
|
|
||||||
statusPkgPath = "google.golang.org/grpc/status"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
generator.RegisterPlugin(new(grpc))
|
|
||||||
}
|
|
||||||
|
|
||||||
// grpc is an implementation of the Go protocol buffer compiler's
|
|
||||||
// plugin architecture. It generates bindings for gRPC support.
|
|
||||||
type grpc struct {
|
|
||||||
gen *generator.Generator
|
|
||||||
}
|
|
||||||
|
|
||||||
// Name returns the name of this plugin, "grpc".
|
|
||||||
func (g *grpc) Name() string {
|
|
||||||
return "grpc"
|
|
||||||
}
|
|
||||||
|
|
||||||
// The names for packages imported in the generated code.
|
|
||||||
// They may vary from the final path component of the import path
|
|
||||||
// if the name is used by other packages.
|
|
||||||
var (
|
|
||||||
contextPkg string
|
|
||||||
grpcPkg string
|
|
||||||
)
|
|
||||||
|
|
||||||
// Init initializes the plugin.
|
|
||||||
func (g *grpc) Init(gen *generator.Generator) {
|
|
||||||
g.gen = gen
|
|
||||||
}
|
|
||||||
|
|
||||||
// Given a type name defined in a .proto, return its object.
|
|
||||||
// Also record that we're using it, to guarantee the associated import.
|
|
||||||
func (g *grpc) objectNamed(name string) generator.Object {
|
|
||||||
g.gen.RecordTypeUse(name)
|
|
||||||
return g.gen.ObjectNamed(name)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Given a type name defined in a .proto, return its name as we will print it.
|
|
||||||
func (g *grpc) typeName(str string) string {
|
|
||||||
return g.gen.TypeName(g.objectNamed(str))
|
|
||||||
}
|
|
||||||
|
|
||||||
// P forwards to g.gen.P.
|
|
||||||
func (g *grpc) P(args ...interface{}) { g.gen.P(args...) }
|
|
||||||
|
|
||||||
// Generate generates code for the services in the given file.
|
|
||||||
func (g *grpc) Generate(file *generator.FileDescriptor) {
|
|
||||||
if len(file.FileDescriptorProto.Service) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
contextPkg = string(g.gen.AddImport(contextPkgPath))
|
|
||||||
grpcPkg = string(g.gen.AddImport(grpcPkgPath))
|
|
||||||
|
|
||||||
g.P("// Reference imports to suppress errors if they are not otherwise used.")
|
|
||||||
g.P("var _ ", contextPkg, ".Context")
|
|
||||||
g.P("var _ ", grpcPkg, ".ClientConnInterface")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
// Assert version compatibility.
|
|
||||||
g.P("// This is a compile-time assertion to ensure that this generated file")
|
|
||||||
g.P("// is compatible with the grpc package it is being compiled against.")
|
|
||||||
g.P("const _ = ", grpcPkg, ".SupportPackageIsVersion", generatedCodeVersion)
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
for i, service := range file.FileDescriptorProto.Service {
|
|
||||||
g.generateService(file, service, i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenerateImports generates the import declaration for this file.
|
|
||||||
func (g *grpc) GenerateImports(file *generator.FileDescriptor) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// reservedClientName records whether a client name is reserved on the client side.
|
|
||||||
var reservedClientName = map[string]bool{
|
|
||||||
// TODO: do we need any in gRPC?
|
|
||||||
}
|
|
||||||
|
|
||||||
func unexport(s string) string { return strings.ToLower(s[:1]) + s[1:] }
|
|
||||||
|
|
||||||
// deprecationComment is the standard comment added to deprecated
|
|
||||||
// messages, fields, enums, and enum values.
|
|
||||||
var deprecationComment = "// Deprecated: Do not use."
|
|
||||||
|
|
||||||
// generateService generates all the code for the named service.
|
|
||||||
func (g *grpc) generateService(file *generator.FileDescriptor, service *pb.ServiceDescriptorProto, index int) {
|
|
||||||
path := fmt.Sprintf("6,%d", index) // 6 means service.
|
|
||||||
|
|
||||||
origServName := service.GetName()
|
|
||||||
fullServName := origServName
|
|
||||||
if pkg := file.GetPackage(); pkg != "" {
|
|
||||||
fullServName = pkg + "." + fullServName
|
|
||||||
}
|
|
||||||
servName := generator.CamelCase(origServName)
|
|
||||||
deprecated := service.GetOptions().GetDeprecated()
|
|
||||||
|
|
||||||
g.P()
|
|
||||||
g.P(fmt.Sprintf(`// %sClient is the client API for %s service.
|
|
||||||
//
|
|
||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.`, servName, servName))
|
|
||||||
|
|
||||||
// Client interface.
|
|
||||||
if deprecated {
|
|
||||||
g.P("//")
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.P("type ", servName, "Client interface {")
|
|
||||||
for i, method := range service.Method {
|
|
||||||
g.gen.PrintComments(fmt.Sprintf("%s,2,%d", path, i)) // 2 means method in a service.
|
|
||||||
if method.GetOptions().GetDeprecated() {
|
|
||||||
g.P("//")
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.P(g.generateClientSignature(servName, method))
|
|
||||||
}
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
// Client structure.
|
|
||||||
g.P("type ", unexport(servName), "Client struct {")
|
|
||||||
g.P("cc ", grpcPkg, ".ClientConnInterface")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
// NewClient factory.
|
|
||||||
if deprecated {
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.P("func New", servName, "Client (cc ", grpcPkg, ".ClientConnInterface) ", servName, "Client {")
|
|
||||||
g.P("return &", unexport(servName), "Client{cc}")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
var methodIndex, streamIndex int
|
|
||||||
serviceDescVar := "_" + servName + "_serviceDesc"
|
|
||||||
// Client method implementations.
|
|
||||||
for _, method := range service.Method {
|
|
||||||
var descExpr string
|
|
||||||
if !method.GetServerStreaming() && !method.GetClientStreaming() {
|
|
||||||
// Unary RPC method
|
|
||||||
descExpr = fmt.Sprintf("&%s.Methods[%d]", serviceDescVar, methodIndex)
|
|
||||||
methodIndex++
|
|
||||||
} else {
|
|
||||||
// Streaming RPC method
|
|
||||||
descExpr = fmt.Sprintf("&%s.Streams[%d]", serviceDescVar, streamIndex)
|
|
||||||
streamIndex++
|
|
||||||
}
|
|
||||||
g.generateClientMethod(servName, fullServName, serviceDescVar, method, descExpr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Server interface.
|
|
||||||
serverType := servName + "Server"
|
|
||||||
g.P("// ", serverType, " is the server API for ", servName, " service.")
|
|
||||||
if deprecated {
|
|
||||||
g.P("//")
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.P("type ", serverType, " interface {")
|
|
||||||
for i, method := range service.Method {
|
|
||||||
g.gen.PrintComments(fmt.Sprintf("%s,2,%d", path, i)) // 2 means method in a service.
|
|
||||||
if method.GetOptions().GetDeprecated() {
|
|
||||||
g.P("//")
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.P(g.generateServerSignature(servName, method))
|
|
||||||
}
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
// Server Unimplemented struct for forward compatibility.
|
|
||||||
if deprecated {
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.generateUnimplementedServer(servName, service)
|
|
||||||
|
|
||||||
// Server registration.
|
|
||||||
if deprecated {
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.P("func Register", servName, "Server(s *", grpcPkg, ".Server, srv ", serverType, ") {")
|
|
||||||
g.P("s.RegisterService(&", serviceDescVar, `, srv)`)
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
// Server handler implementations.
|
|
||||||
var handlerNames []string
|
|
||||||
for _, method := range service.Method {
|
|
||||||
hname := g.generateServerMethod(servName, fullServName, method)
|
|
||||||
handlerNames = append(handlerNames, hname)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Service descriptor.
|
|
||||||
g.P("var ", serviceDescVar, " = ", grpcPkg, ".ServiceDesc {")
|
|
||||||
g.P("ServiceName: ", strconv.Quote(fullServName), ",")
|
|
||||||
g.P("HandlerType: (*", serverType, ")(nil),")
|
|
||||||
g.P("Methods: []", grpcPkg, ".MethodDesc{")
|
|
||||||
for i, method := range service.Method {
|
|
||||||
if method.GetServerStreaming() || method.GetClientStreaming() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
g.P("{")
|
|
||||||
g.P("MethodName: ", strconv.Quote(method.GetName()), ",")
|
|
||||||
g.P("Handler: ", handlerNames[i], ",")
|
|
||||||
g.P("},")
|
|
||||||
}
|
|
||||||
g.P("},")
|
|
||||||
g.P("Streams: []", grpcPkg, ".StreamDesc{")
|
|
||||||
for i, method := range service.Method {
|
|
||||||
if !method.GetServerStreaming() && !method.GetClientStreaming() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
g.P("{")
|
|
||||||
g.P("StreamName: ", strconv.Quote(method.GetName()), ",")
|
|
||||||
g.P("Handler: ", handlerNames[i], ",")
|
|
||||||
if method.GetServerStreaming() {
|
|
||||||
g.P("ServerStreams: true,")
|
|
||||||
}
|
|
||||||
if method.GetClientStreaming() {
|
|
||||||
g.P("ClientStreams: true,")
|
|
||||||
}
|
|
||||||
g.P("},")
|
|
||||||
}
|
|
||||||
g.P("},")
|
|
||||||
g.P("Metadata: \"", file.GetName(), "\",")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
|
|
||||||
// generateUnimplementedServer creates the unimplemented server struct
|
|
||||||
func (g *grpc) generateUnimplementedServer(servName string, service *pb.ServiceDescriptorProto) {
|
|
||||||
serverType := servName + "Server"
|
|
||||||
g.P("// Unimplemented", serverType, " can be embedded to have forward compatible implementations.")
|
|
||||||
g.P("type Unimplemented", serverType, " struct {")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
// Unimplemented<service_name>Server's concrete methods
|
|
||||||
for _, method := range service.Method {
|
|
||||||
g.generateServerMethodConcrete(servName, method)
|
|
||||||
}
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
|
|
||||||
// generateServerMethodConcrete returns unimplemented methods which ensure forward compatibility
|
|
||||||
func (g *grpc) generateServerMethodConcrete(servName string, method *pb.MethodDescriptorProto) {
|
|
||||||
header := g.generateServerSignatureWithParamNames(servName, method)
|
|
||||||
g.P("func (*Unimplemented", servName, "Server) ", header, " {")
|
|
||||||
var nilArg string
|
|
||||||
if !method.GetServerStreaming() && !method.GetClientStreaming() {
|
|
||||||
nilArg = "nil, "
|
|
||||||
}
|
|
||||||
methName := generator.CamelCase(method.GetName())
|
|
||||||
statusPkg := string(g.gen.AddImport(statusPkgPath))
|
|
||||||
codePkg := string(g.gen.AddImport(codePkgPath))
|
|
||||||
g.P("return ", nilArg, statusPkg, `.Errorf(`, codePkg, `.Unimplemented, "method `, methName, ` not implemented")`)
|
|
||||||
g.P("}")
|
|
||||||
}
|
|
||||||
|
|
||||||
// generateClientSignature returns the client-side signature for a method.
|
|
||||||
func (g *grpc) generateClientSignature(servName string, method *pb.MethodDescriptorProto) string {
|
|
||||||
origMethName := method.GetName()
|
|
||||||
methName := generator.CamelCase(origMethName)
|
|
||||||
if reservedClientName[methName] {
|
|
||||||
methName += "_"
|
|
||||||
}
|
|
||||||
reqArg := ", in *" + g.typeName(method.GetInputType())
|
|
||||||
if method.GetClientStreaming() {
|
|
||||||
reqArg = ""
|
|
||||||
}
|
|
||||||
respName := "*" + g.typeName(method.GetOutputType())
|
|
||||||
if method.GetServerStreaming() || method.GetClientStreaming() {
|
|
||||||
respName = servName + "_" + generator.CamelCase(origMethName) + "Client"
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%s(ctx %s.Context%s, opts ...%s.CallOption) (%s, error)", methName, contextPkg, reqArg, grpcPkg, respName)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g *grpc) generateClientMethod(servName, fullServName, serviceDescVar string, method *pb.MethodDescriptorProto, descExpr string) {
|
|
||||||
sname := fmt.Sprintf("/%s/%s", fullServName, method.GetName())
|
|
||||||
methName := generator.CamelCase(method.GetName())
|
|
||||||
inType := g.typeName(method.GetInputType())
|
|
||||||
outType := g.typeName(method.GetOutputType())
|
|
||||||
|
|
||||||
if method.GetOptions().GetDeprecated() {
|
|
||||||
g.P(deprecationComment)
|
|
||||||
}
|
|
||||||
g.P("func (c *", unexport(servName), "Client) ", g.generateClientSignature(servName, method), "{")
|
|
||||||
if !method.GetServerStreaming() && !method.GetClientStreaming() {
|
|
||||||
g.P("out := new(", outType, ")")
|
|
||||||
// TODO: Pass descExpr to Invoke.
|
|
||||||
g.P(`err := c.cc.Invoke(ctx, "`, sname, `", in, out, opts...)`)
|
|
||||||
g.P("if err != nil { return nil, err }")
|
|
||||||
g.P("return out, nil")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
streamType := unexport(servName) + methName + "Client"
|
|
||||||
g.P("stream, err := c.cc.NewStream(ctx, ", descExpr, `, "`, sname, `", opts...)`)
|
|
||||||
g.P("if err != nil { return nil, err }")
|
|
||||||
g.P("x := &", streamType, "{stream}")
|
|
||||||
if !method.GetClientStreaming() {
|
|
||||||
g.P("if err := x.ClientStream.SendMsg(in); err != nil { return nil, err }")
|
|
||||||
g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }")
|
|
||||||
}
|
|
||||||
g.P("return x, nil")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
genSend := method.GetClientStreaming()
|
|
||||||
genRecv := method.GetServerStreaming()
|
|
||||||
genCloseAndRecv := !method.GetServerStreaming()
|
|
||||||
|
|
||||||
// Stream auxiliary types and methods.
|
|
||||||
g.P("type ", servName, "_", methName, "Client interface {")
|
|
||||||
if genSend {
|
|
||||||
g.P("Send(*", inType, ") error")
|
|
||||||
}
|
|
||||||
if genRecv {
|
|
||||||
g.P("Recv() (*", outType, ", error)")
|
|
||||||
}
|
|
||||||
if genCloseAndRecv {
|
|
||||||
g.P("CloseAndRecv() (*", outType, ", error)")
|
|
||||||
}
|
|
||||||
g.P(grpcPkg, ".ClientStream")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
g.P("type ", streamType, " struct {")
|
|
||||||
g.P(grpcPkg, ".ClientStream")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
if genSend {
|
|
||||||
g.P("func (x *", streamType, ") Send(m *", inType, ") error {")
|
|
||||||
g.P("return x.ClientStream.SendMsg(m)")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
if genRecv {
|
|
||||||
g.P("func (x *", streamType, ") Recv() (*", outType, ", error) {")
|
|
||||||
g.P("m := new(", outType, ")")
|
|
||||||
g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }")
|
|
||||||
g.P("return m, nil")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
if genCloseAndRecv {
|
|
||||||
g.P("func (x *", streamType, ") CloseAndRecv() (*", outType, ", error) {")
|
|
||||||
g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }")
|
|
||||||
g.P("m := new(", outType, ")")
|
|
||||||
g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }")
|
|
||||||
g.P("return m, nil")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// generateServerSignatureWithParamNames returns the server-side signature for a method with parameter names.
|
|
||||||
func (g *grpc) generateServerSignatureWithParamNames(servName string, method *pb.MethodDescriptorProto) string {
|
|
||||||
origMethName := method.GetName()
|
|
||||||
methName := generator.CamelCase(origMethName)
|
|
||||||
if reservedClientName[methName] {
|
|
||||||
methName += "_"
|
|
||||||
}
|
|
||||||
|
|
||||||
var reqArgs []string
|
|
||||||
ret := "error"
|
|
||||||
if !method.GetServerStreaming() && !method.GetClientStreaming() {
|
|
||||||
reqArgs = append(reqArgs, "ctx "+contextPkg+".Context")
|
|
||||||
ret = "(*" + g.typeName(method.GetOutputType()) + ", error)"
|
|
||||||
}
|
|
||||||
if !method.GetClientStreaming() {
|
|
||||||
reqArgs = append(reqArgs, "req *"+g.typeName(method.GetInputType()))
|
|
||||||
}
|
|
||||||
if method.GetServerStreaming() || method.GetClientStreaming() {
|
|
||||||
reqArgs = append(reqArgs, "srv "+servName+"_"+generator.CamelCase(origMethName)+"Server")
|
|
||||||
}
|
|
||||||
|
|
||||||
return methName + "(" + strings.Join(reqArgs, ", ") + ") " + ret
|
|
||||||
}
|
|
||||||
|
|
||||||
// generateServerSignature returns the server-side signature for a method.
|
|
||||||
func (g *grpc) generateServerSignature(servName string, method *pb.MethodDescriptorProto) string {
|
|
||||||
origMethName := method.GetName()
|
|
||||||
methName := generator.CamelCase(origMethName)
|
|
||||||
if reservedClientName[methName] {
|
|
||||||
methName += "_"
|
|
||||||
}
|
|
||||||
|
|
||||||
var reqArgs []string
|
|
||||||
ret := "error"
|
|
||||||
if !method.GetServerStreaming() && !method.GetClientStreaming() {
|
|
||||||
reqArgs = append(reqArgs, contextPkg+".Context")
|
|
||||||
ret = "(*" + g.typeName(method.GetOutputType()) + ", error)"
|
|
||||||
}
|
|
||||||
if !method.GetClientStreaming() {
|
|
||||||
reqArgs = append(reqArgs, "*"+g.typeName(method.GetInputType()))
|
|
||||||
}
|
|
||||||
if method.GetServerStreaming() || method.GetClientStreaming() {
|
|
||||||
reqArgs = append(reqArgs, servName+"_"+generator.CamelCase(origMethName)+"Server")
|
|
||||||
}
|
|
||||||
|
|
||||||
return methName + "(" + strings.Join(reqArgs, ", ") + ") " + ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g *grpc) generateServerMethod(servName, fullServName string, method *pb.MethodDescriptorProto) string {
|
|
||||||
methName := generator.CamelCase(method.GetName())
|
|
||||||
hname := fmt.Sprintf("_%s_%s_Handler", servName, methName)
|
|
||||||
inType := g.typeName(method.GetInputType())
|
|
||||||
outType := g.typeName(method.GetOutputType())
|
|
||||||
|
|
||||||
if !method.GetServerStreaming() && !method.GetClientStreaming() {
|
|
||||||
g.P("func ", hname, "(srv interface{}, ctx ", contextPkg, ".Context, dec func(interface{}) error, interceptor ", grpcPkg, ".UnaryServerInterceptor) (interface{}, error) {")
|
|
||||||
g.P("in := new(", inType, ")")
|
|
||||||
g.P("if err := dec(in); err != nil { return nil, err }")
|
|
||||||
g.P("if interceptor == nil { return srv.(", servName, "Server).", methName, "(ctx, in) }")
|
|
||||||
g.P("info := &", grpcPkg, ".UnaryServerInfo{")
|
|
||||||
g.P("Server: srv,")
|
|
||||||
g.P("FullMethod: ", strconv.Quote(fmt.Sprintf("/%s/%s", fullServName, methName)), ",")
|
|
||||||
g.P("}")
|
|
||||||
g.P("handler := func(ctx ", contextPkg, ".Context, req interface{}) (interface{}, error) {")
|
|
||||||
g.P("return srv.(", servName, "Server).", methName, "(ctx, req.(*", inType, "))")
|
|
||||||
g.P("}")
|
|
||||||
g.P("return interceptor(ctx, in, info, handler)")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
return hname
|
|
||||||
}
|
|
||||||
streamType := unexport(servName) + methName + "Server"
|
|
||||||
g.P("func ", hname, "(srv interface{}, stream ", grpcPkg, ".ServerStream) error {")
|
|
||||||
if !method.GetClientStreaming() {
|
|
||||||
g.P("m := new(", inType, ")")
|
|
||||||
g.P("if err := stream.RecvMsg(m); err != nil { return err }")
|
|
||||||
g.P("return srv.(", servName, "Server).", methName, "(m, &", streamType, "{stream})")
|
|
||||||
} else {
|
|
||||||
g.P("return srv.(", servName, "Server).", methName, "(&", streamType, "{stream})")
|
|
||||||
}
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
genSend := method.GetServerStreaming()
|
|
||||||
genSendAndClose := !method.GetServerStreaming()
|
|
||||||
genRecv := method.GetClientStreaming()
|
|
||||||
|
|
||||||
// Stream auxiliary types and methods.
|
|
||||||
g.P("type ", servName, "_", methName, "Server interface {")
|
|
||||||
if genSend {
|
|
||||||
g.P("Send(*", outType, ") error")
|
|
||||||
}
|
|
||||||
if genSendAndClose {
|
|
||||||
g.P("SendAndClose(*", outType, ") error")
|
|
||||||
}
|
|
||||||
if genRecv {
|
|
||||||
g.P("Recv() (*", inType, ", error)")
|
|
||||||
}
|
|
||||||
g.P(grpcPkg, ".ServerStream")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
g.P("type ", streamType, " struct {")
|
|
||||||
g.P(grpcPkg, ".ServerStream")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
|
|
||||||
if genSend {
|
|
||||||
g.P("func (x *", streamType, ") Send(m *", outType, ") error {")
|
|
||||||
g.P("return x.ServerStream.SendMsg(m)")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
if genSendAndClose {
|
|
||||||
g.P("func (x *", streamType, ") SendAndClose(m *", outType, ") error {")
|
|
||||||
g.P("return x.ServerStream.SendMsg(m)")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
if genRecv {
|
|
||||||
g.P("func (x *", streamType, ") Recv() (*", inType, ", error) {")
|
|
||||||
g.P("m := new(", inType, ")")
|
|
||||||
g.P("if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err }")
|
|
||||||
g.P("return m, nil")
|
|
||||||
g.P("}")
|
|
||||||
g.P()
|
|
||||||
}
|
|
||||||
|
|
||||||
return hname
|
|
||||||
}
|
|
|
@ -1,74 +0,0 @@
|
||||||
// Copyright 2010 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// protoc-gen-go is a plugin for the Google protocol buffer compiler to generate
|
|
||||||
// Go code. Install it by building this program and making it accessible within
|
|
||||||
// your PATH with the name:
|
|
||||||
// protoc-gen-go
|
|
||||||
//
|
|
||||||
// The 'go' suffix becomes part of the argument for the protocol compiler,
|
|
||||||
// such that it can be invoked as:
|
|
||||||
// protoc --go_out=paths=source_relative:. path/to/file.proto
|
|
||||||
//
|
|
||||||
// This generates Go bindings for the protocol buffer defined by file.proto.
|
|
||||||
// With that input, the output will be written to:
|
|
||||||
// path/to/file.pb.go
|
|
||||||
//
|
|
||||||
// See the README and documentation for protocol buffers to learn more:
|
|
||||||
// https://developers.google.com/protocol-buffers/
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/internal/gengogrpc"
|
|
||||||
gengo "google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo"
|
|
||||||
"google.golang.org/protobuf/compiler/protogen"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var (
|
|
||||||
flags flag.FlagSet
|
|
||||||
plugins = flags.String("plugins", "", "list of plugins to enable (supported values: grpc)")
|
|
||||||
importPrefix = flags.String("import_prefix", "", "prefix to prepend to import paths")
|
|
||||||
)
|
|
||||||
importRewriteFunc := func(importPath protogen.GoImportPath) protogen.GoImportPath {
|
|
||||||
switch importPath {
|
|
||||||
case "context", "fmt", "math":
|
|
||||||
return importPath
|
|
||||||
}
|
|
||||||
if *importPrefix != "" {
|
|
||||||
return protogen.GoImportPath(*importPrefix) + importPath
|
|
||||||
}
|
|
||||||
return importPath
|
|
||||||
}
|
|
||||||
protogen.Options{
|
|
||||||
ParamFunc: flags.Set,
|
|
||||||
ImportRewriteFunc: importRewriteFunc,
|
|
||||||
}.Run(func(gen *protogen.Plugin) error {
|
|
||||||
grpc := false
|
|
||||||
for _, plugin := range strings.Split(*plugins, ",") {
|
|
||||||
switch plugin {
|
|
||||||
case "grpc":
|
|
||||||
grpc = true
|
|
||||||
case "":
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("protoc-gen-go: unknown plugin %q", plugin)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, f := range gen.Files {
|
|
||||||
if !f.Generate {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
g := gengo.GenerateFile(gen, f)
|
|
||||||
if grpc {
|
|
||||||
gengogrpc.GenerateFileContent(gen, f, g)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gen.SupportedFeatures = gengo.SupportedFeatures
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// source: github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto
|
|
||||||
|
|
||||||
package plugin_go
|
|
||||||
|
|
||||||
import (
|
|
||||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
pluginpb "google.golang.org/protobuf/types/pluginpb"
|
|
||||||
reflect "reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Symbols defined in public import of google/protobuf/compiler/plugin.proto.
|
|
||||||
|
|
||||||
type CodeGeneratorResponse_Feature = pluginpb.CodeGeneratorResponse_Feature
|
|
||||||
|
|
||||||
const CodeGeneratorResponse_FEATURE_NONE = pluginpb.CodeGeneratorResponse_FEATURE_NONE
|
|
||||||
const CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL = pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL
|
|
||||||
|
|
||||||
var CodeGeneratorResponse_Feature_name = pluginpb.CodeGeneratorResponse_Feature_name
|
|
||||||
var CodeGeneratorResponse_Feature_value = pluginpb.CodeGeneratorResponse_Feature_value
|
|
||||||
|
|
||||||
type Version = pluginpb.Version
|
|
||||||
type CodeGeneratorRequest = pluginpb.CodeGeneratorRequest
|
|
||||||
type CodeGeneratorResponse = pluginpb.CodeGeneratorResponse
|
|
||||||
type CodeGeneratorResponse_File = pluginpb.CodeGeneratorResponse_File
|
|
||||||
|
|
||||||
var File_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto protoreflect.FileDescriptor
|
|
||||||
|
|
||||||
var file_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto_rawDesc = []byte{
|
|
||||||
0x0a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c,
|
|
||||||
0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x72, 0x6f,
|
|
||||||
0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69,
|
|
||||||
0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x25,
|
|
||||||
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f,
|
|
||||||
0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,
|
|
||||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
|
|
||||||
0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
|
||||||
0x62, 0x75, 0x66, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x67,
|
|
||||||
0x6f, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x3b, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f,
|
|
||||||
0x67, 0x6f, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32,
|
|
||||||
}
|
|
||||||
|
|
||||||
var file_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto_goTypes = []interface{}{}
|
|
||||||
var file_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto_depIdxs = []int32{
|
|
||||||
0, // [0:0] is the sub-list for method output_type
|
|
||||||
0, // [0:0] is the sub-list for method input_type
|
|
||||||
0, // [0:0] is the sub-list for extension type_name
|
|
||||||
0, // [0:0] is the sub-list for extension extendee
|
|
||||||
0, // [0:0] is the sub-list for field type_name
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { file_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto_init() }
|
|
||||||
func file_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto_init() {
|
|
||||||
if File_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
type x struct{}
|
|
||||||
out := protoimpl.TypeBuilder{
|
|
||||||
File: protoimpl.DescBuilder{
|
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
|
||||||
RawDescriptor: file_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto_rawDesc,
|
|
||||||
NumEnums: 0,
|
|
||||||
NumMessages: 0,
|
|
||||||
NumExtensions: 0,
|
|
||||||
NumServices: 0,
|
|
||||||
},
|
|
||||||
GoTypes: file_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto_goTypes,
|
|
||||||
DependencyIndexes: file_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto_depIdxs,
|
|
||||||
}.Build()
|
|
||||||
File_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto = out.File
|
|
||||||
file_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto_rawDesc = nil
|
|
||||||
file_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto_goTypes = nil
|
|
||||||
file_github_com_golang_protobuf_protoc_gen_go_plugin_plugin_proto_depIdxs = nil
|
|
||||||
}
|
|
|
@ -12,17 +12,17 @@ require (
|
||||||
require (
|
require (
|
||||||
github.com/fatih/color v1.13.0 // indirect
|
github.com/fatih/color v1.13.0 // indirect
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb // indirect
|
github.com/hashicorp/yamux v0.1.1 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.12 // indirect
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.14 // indirect
|
github.com/mattn/go-isatty v0.0.16 // indirect
|
||||||
github.com/mitchellh/go-testing-interface v1.0.0 // indirect
|
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
|
||||||
github.com/oklog/run v1.0.0 // indirect
|
github.com/oklog/run v1.1.0 // indirect
|
||||||
golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2 // indirect
|
golang.org/x/net v0.1.0 // indirect
|
||||||
golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a // indirect
|
golang.org/x/sys v0.1.0 // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.4.0 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4 // indirect
|
google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55 // indirect
|
||||||
google.golang.org/grpc v1.45.0 // indirect
|
google.golang.org/grpc v1.50.1 // indirect
|
||||||
google.golang.org/protobuf v1.28.0 // indirect
|
google.golang.org/protobuf v1.28.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
replace github.com/golang/protobuf => ../../../pkg/golang-protobuf
|
replace github.com/golang/protobuf => ../../../pkg/golang-protobuf
|
|
@ -56,17 +56,27 @@ github.com/hashicorp/go-plugin v1.4.5 h1:oTE/oQR4eghggRg8VY7PAz3dr++VwDNBGCcOfIv
|
||||||
github.com/hashicorp/go-plugin v1.4.5/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s=
|
github.com/hashicorp/go-plugin v1.4.5/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s=
|
||||||
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M=
|
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M=
|
||||||
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
||||||
|
github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
|
||||||
|
github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
|
||||||
github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE=
|
github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE=
|
||||||
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||||
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
|
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
|
||||||
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||||
|
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||||
|
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
|
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
|
||||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||||
|
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
|
||||||
|
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
|
github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
|
||||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
||||||
|
github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU=
|
||||||
|
github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8=
|
||||||
github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=
|
github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=
|
||||||
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
||||||
|
github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
|
||||||
|
github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
@ -93,6 +103,8 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2 h1:6mzvA99KwZxbOrxww4EvWVQUnN1+xEu9tafK5ZxkYeA=
|
golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2 h1:6mzvA99KwZxbOrxww4EvWVQUnN1+xEu9tafK5ZxkYeA=
|
||||||
golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
|
golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
|
||||||
|
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
@ -113,12 +125,17 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||||
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a h1:N2T1jUrTQE9Re6TFF5PhvEHXHCguynGhKjWVsIUt5cY=
|
golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a h1:N2T1jUrTQE9Re6TFF5PhvEHXHCguynGhKjWVsIUt5cY=
|
||||||
golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
|
||||||
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
|
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
|
||||||
|
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
|
@ -135,6 +152,8 @@ google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfG
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4 h1:myaecH64R0bIEDjNORIel4iXubqzaHU1K2z8ajBwWcM=
|
google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4 h1:myaecH64R0bIEDjNORIel4iXubqzaHU1K2z8ajBwWcM=
|
||||||
google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
||||||
|
google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55 h1:U1u4KB2kx6KR/aJDjQ97hZ15wQs8ZPvDcGcRynBhkvg=
|
||||||
|
google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55/go.mod h1:45EK0dUbEZ2NHjCeAd2LXmyjAgGUGrpGROgjhC3ADck=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||||
|
@ -143,6 +162,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M=
|
google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M=
|
||||||
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
|
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
|
||||||
|
google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY=
|
||||||
|
google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
@ -156,6 +177,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
||||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
|
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||||
|
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
|
Loading…
Reference in a new issue