mirror of
https://github.com/hashicorp/vault.git
synced 2026-05-06 04:46:25 +02:00
Add Database v5 interface with gRPC client & server (#9641)
* Add new Database v5 interface with gRPC client & server This is primarily for making password policies available to the DB engine, however since there are a number of other problems with the current interface this is getting an overhaul to a more gRPC request/response approach for easier future compatibility. This is the first in a series of PRs to add support for password policies in the combined database engine
This commit is contained in:
parent
fd71582572
commit
6478665b5e
1
Makefile
1
Makefile
@ -204,6 +204,7 @@ proto:
|
||||
protoc helper/identity/mfa/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||
protoc helper/identity/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||
protoc sdk/database/dbplugin/*.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||
protoc sdk/database/newdbplugin/proto/*.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||
protoc sdk/plugin/pb/*.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||
sed -i -e 's/Id/ID/' vault/request_forwarding_service.pb.go
|
||||
sed -i -e 's/Idp/IDP/' -e 's/Url/URL/' -e 's/Id/ID/' -e 's/IDentity/Identity/' -e 's/EntityId/EntityID/' -e 's/Api/API/' -e 's/Qr/QR/' -e 's/Totp/TOTP/' -e 's/Mfa/MFA/' -e 's/Pingid/PingID/' -e 's/protobuf:"/sentinel:"" protobuf:"/' -e 's/namespaceId/namespaceID/' -e 's/Ttl/TTL/' -e 's/BoundCidrs/BoundCIDRs/' helper/identity/types.pb.go helper/identity/mfa/types.pb.go helper/storagepacker/types.pb.go sdk/plugin/pb/backend.pb.go sdk/logical/identity.pb.go
|
||||
|
||||
2
go.mod
2
go.mod
@ -151,7 +151,7 @@ require (
|
||||
golang.org/x/tools v0.0.0-20200521155704-91d71f6c2f04
|
||||
google.golang.org/api v0.29.0
|
||||
google.golang.org/grpc v1.29.1
|
||||
google.golang.org/protobuf v1.24.0
|
||||
google.golang.org/protobuf v1.25.0
|
||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce
|
||||
gopkg.in/ory-am/dockertest.v3 v3.3.4
|
||||
gopkg.in/square/go-jose.v2 v2.5.1
|
||||
|
||||
3
go.sum
3
go.sum
@ -374,6 +374,7 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY=
|
||||
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
|
||||
github.com/google/go-metrics-stackdriver v0.2.0 h1:rbs2sxHAPn2OtUj9JdR/Gij1YKGl0BTVD0augB+HEjE=
|
||||
@ -1284,6 +1285,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
|
||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM=
|
||||
|
||||
@ -67,11 +67,6 @@ type Database interface {
|
||||
// Close attempts to close the underlying database connection that was
|
||||
// established by the backend.
|
||||
Close() error
|
||||
|
||||
// DEPRECATED: Will be removed in a future plugin version bump.
|
||||
// Initialize is a backwards-compatible implementation that simply calls
|
||||
// Init, dropping the saveConfig, and returning the err.
|
||||
Initialize(ctx context.Context, config map[string]interface{}, verifyConnection bool) (err error)
|
||||
}
|
||||
|
||||
// PluginFactory is used to build plugin database types. It wraps the database
|
||||
|
||||
506
sdk/database/newdbplugin/conversions_test.go
Normal file
506
sdk/database/newdbplugin/conversions_test.go
Normal file
@ -0,0 +1,506 @@
|
||||
package newdbplugin
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
"unicode"
|
||||
|
||||
"github.com/hashicorp/vault/sdk/database/newdbplugin/proto"
|
||||
|
||||
"google.golang.org/protobuf/types/known/structpb"
|
||||
"google.golang.org/protobuf/types/known/timestamppb"
|
||||
)
|
||||
|
||||
func TestConversionsHaveAllFields(t *testing.T) {
|
||||
t.Run("initReqToProto", func(t *testing.T) {
|
||||
req := InitializeRequest{
|
||||
Config: map[string]interface{}{
|
||||
"foo": map[string]interface{}{
|
||||
"bar": "baz",
|
||||
},
|
||||
},
|
||||
VerifyConnection: true,
|
||||
}
|
||||
|
||||
protoReq, err := initReqToProto(req)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to convert request to proto request: %s", err)
|
||||
}
|
||||
|
||||
values := getAllGetterValues(protoReq)
|
||||
if len(values) == 0 {
|
||||
// Probably a test failure - the protos used in these tests should have Get functions on them
|
||||
t.Fatalf("No values found from Get functions!")
|
||||
}
|
||||
|
||||
for _, gtr := range values {
|
||||
err := assertAllFieldsSet(fmt.Sprintf("InitializeRequest.%s", gtr.name), gtr.value)
|
||||
if err != nil {
|
||||
t.Fatalf("%s", err)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("newUserReqToProto", func(t *testing.T) {
|
||||
req := NewUserRequest{
|
||||
UsernameConfig: UsernameMetadata{
|
||||
DisplayName: "dispName",
|
||||
RoleName: "roleName",
|
||||
},
|
||||
Statements: Statements{
|
||||
Commands: []string{
|
||||
"statement",
|
||||
},
|
||||
},
|
||||
RollbackStatements: Statements{
|
||||
Commands: []string{
|
||||
"rollback_statement",
|
||||
},
|
||||
},
|
||||
Password: "password",
|
||||
Expiration: time.Now(),
|
||||
}
|
||||
|
||||
protoReq, err := newUserReqToProto(req)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to convert request to proto request: %s", err)
|
||||
}
|
||||
|
||||
values := getAllGetterValues(protoReq)
|
||||
if len(values) == 0 {
|
||||
// Probably a test failure - the protos used in these tests should have Get functions on them
|
||||
t.Fatalf("No values found from Get functions!")
|
||||
}
|
||||
|
||||
for _, gtr := range values {
|
||||
err := assertAllFieldsSet(fmt.Sprintf("NewUserRequest.%s", gtr.name), gtr.value)
|
||||
if err != nil {
|
||||
t.Fatalf("%s", err)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("updateUserReqToProto", func(t *testing.T) {
|
||||
req := UpdateUserRequest{
|
||||
Username: "username",
|
||||
Password: &ChangePassword{
|
||||
NewPassword: "newpassword",
|
||||
Statements: Statements{
|
||||
Commands: []string{
|
||||
"statement",
|
||||
},
|
||||
},
|
||||
},
|
||||
Expiration: &ChangeExpiration{
|
||||
NewExpiration: time.Now(),
|
||||
Statements: Statements{
|
||||
Commands: []string{
|
||||
"statement",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
protoReq, err := updateUserReqToProto(req)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to convert request to proto request: %s", err)
|
||||
}
|
||||
|
||||
values := getAllGetterValues(protoReq)
|
||||
if len(values) == 0 {
|
||||
// Probably a test failure - the protos used in these tests should have Get functions on them
|
||||
t.Fatalf("No values found from Get functions!")
|
||||
}
|
||||
|
||||
for _, gtr := range values {
|
||||
err := assertAllFieldsSet(fmt.Sprintf("UpdateUserRequest.%s", gtr.name), gtr.value)
|
||||
if err != nil {
|
||||
t.Fatalf("%s", err)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("deleteUserReqToProto", func(t *testing.T) {
|
||||
req := DeleteUserRequest{
|
||||
Username: "username",
|
||||
Statements: Statements{
|
||||
Commands: []string{
|
||||
"statement",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
protoReq, err := deleteUserReqToProto(req)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to convert request to proto request: %s", err)
|
||||
}
|
||||
|
||||
values := getAllGetterValues(protoReq)
|
||||
if len(values) == 0 {
|
||||
// Probably a test failure - the protos used in these tests should have Get functions on them
|
||||
t.Fatalf("No values found from Get functions!")
|
||||
}
|
||||
|
||||
for _, gtr := range values {
|
||||
err := assertAllFieldsSet(fmt.Sprintf("DeleteUserRequest.%s", gtr.name), gtr.value)
|
||||
if err != nil {
|
||||
t.Fatalf("%s", err)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("getUpdateUserRequest", func(t *testing.T) {
|
||||
req := &proto.UpdateUserRequest{
|
||||
Username: "username",
|
||||
Password: &proto.ChangePassword{
|
||||
NewPassword: "newpass",
|
||||
Statements: &proto.Statements{
|
||||
Commands: []string{
|
||||
"statement",
|
||||
},
|
||||
},
|
||||
},
|
||||
Expiration: &proto.ChangeExpiration{
|
||||
NewExpiration: timestamppb.Now(),
|
||||
Statements: &proto.Statements{
|
||||
Commands: []string{
|
||||
"statement",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
protoReq, err := getUpdateUserRequest(req)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to convert request to proto request: %s", err)
|
||||
}
|
||||
|
||||
err = assertAllFieldsSet("proto.UpdateUserRequest", protoReq)
|
||||
if err != nil {
|
||||
t.Fatalf("%s", err)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
type getter struct {
|
||||
name string
|
||||
value interface{}
|
||||
}
|
||||
|
||||
func getAllGetterValues(value interface{}) (values []getter) {
|
||||
typ := reflect.TypeOf(value)
|
||||
val := reflect.ValueOf(value)
|
||||
for i := 0; i < typ.NumMethod(); i++ {
|
||||
method := typ.Method(i)
|
||||
if !strings.HasPrefix(method.Name, "Get") {
|
||||
continue
|
||||
}
|
||||
valMethod := val.Method(i)
|
||||
resp := valMethod.Call(nil)
|
||||
getVal := resp[0].Interface()
|
||||
gtr := getter{
|
||||
name: strings.TrimPrefix(method.Name, "Get"),
|
||||
value: getVal,
|
||||
}
|
||||
values = append(values, gtr)
|
||||
}
|
||||
return values
|
||||
}
|
||||
|
||||
// Ensures the assertion works properly
|
||||
func TestAssertAllFieldsSet(t *testing.T) {
|
||||
type testCase struct {
|
||||
value interface{}
|
||||
expectErr bool
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"zero int": {
|
||||
value: 0,
|
||||
expectErr: true,
|
||||
},
|
||||
"non-zero int": {
|
||||
value: 1,
|
||||
expectErr: false,
|
||||
},
|
||||
"zero float64": {
|
||||
value: 0.0,
|
||||
expectErr: true,
|
||||
},
|
||||
"non-zero float64": {
|
||||
value: 1.0,
|
||||
expectErr: false,
|
||||
},
|
||||
"empty string": {
|
||||
value: "",
|
||||
expectErr: true,
|
||||
},
|
||||
"true boolean": {
|
||||
value: true,
|
||||
expectErr: false,
|
||||
},
|
||||
"false boolean": { // False is an exception to the "is zero" rule
|
||||
value: false,
|
||||
expectErr: false,
|
||||
},
|
||||
"blank struct": {
|
||||
value: struct{}{},
|
||||
expectErr: true,
|
||||
},
|
||||
"non-blank but empty struct": {
|
||||
value: struct {
|
||||
str string
|
||||
}{
|
||||
str: "",
|
||||
},
|
||||
expectErr: true,
|
||||
},
|
||||
"non-empty string": {
|
||||
value: "foo",
|
||||
expectErr: false,
|
||||
},
|
||||
"non-empty struct": {
|
||||
value: struct {
|
||||
str string
|
||||
}{
|
||||
str: "foo",
|
||||
},
|
||||
expectErr: false,
|
||||
},
|
||||
"empty nested struct": {
|
||||
value: struct {
|
||||
Str string
|
||||
Substruct struct {
|
||||
Substr string
|
||||
}
|
||||
}{
|
||||
Str: "foo",
|
||||
Substruct: struct {
|
||||
Substr string
|
||||
}{}, // Empty sub-field
|
||||
},
|
||||
expectErr: true,
|
||||
},
|
||||
"filled nested struct": {
|
||||
value: struct {
|
||||
str string
|
||||
substruct struct {
|
||||
substr string
|
||||
}
|
||||
}{
|
||||
str: "foo",
|
||||
substruct: struct {
|
||||
substr string
|
||||
}{
|
||||
substr: "sub-foo",
|
||||
},
|
||||
},
|
||||
expectErr: false,
|
||||
},
|
||||
"nil map": {
|
||||
value: map[string]string(nil),
|
||||
expectErr: true,
|
||||
},
|
||||
"empty map": {
|
||||
value: map[string]string{},
|
||||
expectErr: true,
|
||||
},
|
||||
"filled map": {
|
||||
value: map[string]string{
|
||||
"foo": "bar",
|
||||
"int": "42",
|
||||
},
|
||||
expectErr: false,
|
||||
},
|
||||
"map with empty string value": {
|
||||
value: map[string]string{
|
||||
"foo": "",
|
||||
},
|
||||
expectErr: true,
|
||||
},
|
||||
"nested map with empty string value": {
|
||||
value: map[string]interface{}{
|
||||
"bar": "baz",
|
||||
"foo": map[string]interface{}{
|
||||
"subfoo": "",
|
||||
},
|
||||
},
|
||||
expectErr: true,
|
||||
},
|
||||
"nil slice": {
|
||||
value: []string(nil),
|
||||
expectErr: true,
|
||||
},
|
||||
"empty slice": {
|
||||
value: []string{},
|
||||
expectErr: true,
|
||||
},
|
||||
"filled slice": {
|
||||
value: []string{
|
||||
"foo",
|
||||
},
|
||||
expectErr: false,
|
||||
},
|
||||
"slice with empty string value": {
|
||||
value: []string{
|
||||
"",
|
||||
},
|
||||
expectErr: true,
|
||||
},
|
||||
"empty structpb": {
|
||||
value: newStructPb(t, map[string]interface{}{}),
|
||||
expectErr: true,
|
||||
},
|
||||
"filled structpb": {
|
||||
value: newStructPb(t, map[string]interface{}{
|
||||
"foo": "bar",
|
||||
"int": 42,
|
||||
}),
|
||||
expectErr: false,
|
||||
},
|
||||
|
||||
"pointer to zero int": {
|
||||
value: intPtr(0),
|
||||
expectErr: true,
|
||||
},
|
||||
"pointer to non-zero int": {
|
||||
value: intPtr(1),
|
||||
expectErr: false,
|
||||
},
|
||||
"pointer to zero float64": {
|
||||
value: float64Ptr(0.0),
|
||||
expectErr: true,
|
||||
},
|
||||
"pointer to non-zero float64": {
|
||||
value: float64Ptr(1.0),
|
||||
expectErr: false,
|
||||
},
|
||||
"pointer to nil string": {
|
||||
value: new(string),
|
||||
expectErr: true,
|
||||
},
|
||||
"pointer to non-nil string": {
|
||||
value: strPtr("foo"),
|
||||
expectErr: false,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
err := assertAllFieldsSet("", test.value)
|
||||
if test.expectErr && err == nil {
|
||||
t.Fatalf("err expected, got nil")
|
||||
}
|
||||
if !test.expectErr && err != nil {
|
||||
t.Fatalf("no error expected, got: %s", err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func assertAllFieldsSet(name string, val interface{}) error {
|
||||
if val == nil {
|
||||
return fmt.Errorf("value is nil")
|
||||
}
|
||||
|
||||
rVal := reflect.ValueOf(val)
|
||||
return assertAllFieldsSetValue(name, rVal)
|
||||
}
|
||||
|
||||
func assertAllFieldsSetValue(name string, rVal reflect.Value) error {
|
||||
// All booleans are allowed - we don't have a way of differentiating between
|
||||
// and intentional false and a missing false
|
||||
if rVal.Kind() == reflect.Bool {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Primitives fall through here
|
||||
if rVal.IsZero() {
|
||||
return fmt.Errorf("%s is zero", name)
|
||||
}
|
||||
|
||||
switch rVal.Kind() {
|
||||
case reflect.Ptr, reflect.Interface:
|
||||
return assertAllFieldsSetValue(name, rVal.Elem())
|
||||
case reflect.Struct:
|
||||
return assertAllFieldsSetStruct(name, rVal)
|
||||
case reflect.Map:
|
||||
if rVal.Len() == 0 {
|
||||
return fmt.Errorf("%s (map type) is empty", name)
|
||||
}
|
||||
|
||||
iter := rVal.MapRange()
|
||||
for iter.Next() {
|
||||
k := iter.Key()
|
||||
v := iter.Value()
|
||||
|
||||
err := assertAllFieldsSetValue(fmt.Sprintf("%s[%s]", name, k), v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
case reflect.Slice:
|
||||
if rVal.Len() == 0 {
|
||||
return fmt.Errorf("%s (slice type) is empty", name)
|
||||
}
|
||||
for i := 0; i < rVal.Len(); i++ {
|
||||
sliceVal := rVal.Index(i)
|
||||
err := assertAllFieldsSetValue(fmt.Sprintf("%s[%d]", name, i), sliceVal)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func assertAllFieldsSetStruct(name string, rVal reflect.Value) error {
|
||||
switch rVal.Type() {
|
||||
case reflect.TypeOf(timestamppb.Timestamp{}):
|
||||
ts := rVal.Interface().(timestamppb.Timestamp)
|
||||
if ts.AsTime().IsZero() {
|
||||
return fmt.Errorf("%s is zero", name)
|
||||
}
|
||||
return nil
|
||||
default:
|
||||
for i := 0; i < rVal.NumField(); i++ {
|
||||
field := rVal.Field(i)
|
||||
fieldName := rVal.Type().Field(i)
|
||||
|
||||
// Skip fields that aren't exported
|
||||
if unicode.IsLower([]rune(fieldName.Name)[0]) {
|
||||
continue
|
||||
}
|
||||
|
||||
err := assertAllFieldsSetValue(fmt.Sprintf("%s.%s", name, fieldName.Name), field)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func intPtr(i int) *int {
|
||||
return &i
|
||||
}
|
||||
|
||||
func float64Ptr(f float64) *float64 {
|
||||
return &f
|
||||
}
|
||||
func strPtr(str string) *string {
|
||||
return &str
|
||||
}
|
||||
|
||||
func newStructPb(t *testing.T, m map[string]interface{}) *structpb.Struct {
|
||||
t.Helper()
|
||||
|
||||
s, err := structpb.NewStruct(m)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to convert map to struct: %s", err)
|
||||
}
|
||||
return s
|
||||
}
|
||||
178
sdk/database/newdbplugin/database.go
Normal file
178
sdk/database/newdbplugin/database.go
Normal file
@ -0,0 +1,178 @@
|
||||
package newdbplugin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Database to manipulate users within an external system (typically a database).
|
||||
type Database interface {
|
||||
// Initialize the database plugin. This is the equivalent of a constructor for the
|
||||
// database object itself.
|
||||
Initialize(ctx context.Context, req InitializeRequest) (InitializeResponse, error)
|
||||
|
||||
// NewUser creates a new user within the database. This user is temporary in that it
|
||||
// will exist until the TTL expires.
|
||||
NewUser(ctx context.Context, req NewUserRequest) (NewUserResponse, error)
|
||||
|
||||
// UpdateUser updates an existing user within the database.
|
||||
UpdateUser(ctx context.Context, req UpdateUserRequest) (UpdateUserResponse, error)
|
||||
|
||||
// DeleteUser from the database. This should not error if the user didn't
|
||||
// exist prior to this call.
|
||||
DeleteUser(ctx context.Context, req DeleteUserRequest) (DeleteUserResponse, error)
|
||||
|
||||
// Type returns the Name for the particular database backend implementation.
|
||||
// This type name is usually set as a constant within the database backend
|
||||
// implementation, e.g. "mysql" for the MySQL database backend. This is used
|
||||
// for things like metrics and logging. No behavior is switched on this.
|
||||
Type() (string, error)
|
||||
|
||||
// Close attempts to close the underlying database connection that was
|
||||
// established by the backend.
|
||||
Close() error
|
||||
}
|
||||
|
||||
// ///////////////////////////////////////////////////////////////////////////
|
||||
// Database Request & Response Objects
|
||||
// These request and response objects are *not* protobuf types because gRPC does not
|
||||
// support all types that we need in a nice way. For instance, gRPC does not support
|
||||
// map[string]interface{}. It does have an `Any` type, but converting it to a map
|
||||
// requires extensive use of reflection and knowing what types to support ahead of
|
||||
// time. Instead these types are made as user-friendly as possible so the conversion
|
||||
// between protobuf types and request/response objects is handled by Vault developers
|
||||
// rather than needing to be handled by external plugin developers.
|
||||
// ///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ///////////////////////////////////////////////////////
|
||||
// Initialize()
|
||||
// ///////////////////////////////////////////////////////
|
||||
|
||||
// InitializeRequest contains all information needed to initialize a database plugin.
|
||||
type InitializeRequest struct {
|
||||
// Config to initialize the database with. This can include things like connection details,
|
||||
// a "root" username & password, etc. This will not include all configuration items specified
|
||||
// when configuring the database. Some values will be stripped out by the database engine
|
||||
// prior to being passed to the plugin.
|
||||
Config map[string]interface{}
|
||||
|
||||
// VerifyConnection during initialization. If true, a connection should be made to the
|
||||
// database to verify the connection can be made. If false, no connection should be made
|
||||
// on initialization.
|
||||
VerifyConnection bool
|
||||
}
|
||||
|
||||
// InitializeResponse returns any information Vault needs to know after initializing
|
||||
// a database plugin.
|
||||
type InitializeResponse struct {
|
||||
// Config that should be saved in Vault. This may differ from the config in the request,
|
||||
// but should contain everything required to Initialize the database.
|
||||
// REQUIRED in order to save the configuration into Vault after initialization
|
||||
Config map[string]interface{}
|
||||
}
|
||||
|
||||
// ///////////////////////////////////////////////////////
|
||||
// NewUser()
|
||||
// ///////////////////////////////////////////////////////
|
||||
|
||||
// NewUserRequest request a new user is created
|
||||
type NewUserRequest struct {
|
||||
// UsernameConfig is metadata that can be used to generate a username
|
||||
// within the database plugin
|
||||
UsernameConfig UsernameMetadata
|
||||
|
||||
// Statements is an ordered list of commands to run within the database when
|
||||
// creating a new user. This frequently includes permissions to give the
|
||||
// user or similar actions.
|
||||
Statements Statements
|
||||
|
||||
// RollbackStatements is an ordered list of commands to run within the database
|
||||
// if the new user creation process fails.
|
||||
RollbackStatements Statements
|
||||
|
||||
// Password credentials to use when creating the user
|
||||
Password string
|
||||
|
||||
// Expiration of the user. Not all database plugins will support this.
|
||||
Expiration time.Time
|
||||
}
|
||||
|
||||
// UsernameMetadata is metadata the database plugin can use to generate a username
|
||||
type UsernameMetadata struct {
|
||||
DisplayName string
|
||||
RoleName string
|
||||
}
|
||||
|
||||
// NewUserResponse returns any information Vault needs to know after creating a new user.
|
||||
type NewUserResponse struct {
|
||||
// Username of the user created within the database.
|
||||
// REQUIRED so Vault knows the name of the user that was created
|
||||
Username string
|
||||
}
|
||||
|
||||
// ///////////////////////////////////////////////////////
|
||||
// UpdateUser()
|
||||
// ///////////////////////////////////////////////////////
|
||||
|
||||
type UpdateUserRequest struct {
|
||||
// Username to make changes to.
|
||||
Username string
|
||||
|
||||
// Password indicates the new password to change to.
|
||||
// If nil, no change is requested.
|
||||
Password *ChangePassword
|
||||
|
||||
// Expiration indicates the new expiration date to change to.
|
||||
// If nil, no change is requested.
|
||||
Expiration *ChangeExpiration
|
||||
}
|
||||
|
||||
// ChangePassword of a given user
|
||||
type ChangePassword struct {
|
||||
// NewPassword for the user
|
||||
NewPassword string
|
||||
|
||||
// Statements is an ordered list of commands to run within the database
|
||||
// when changing the user's password.
|
||||
Statements Statements
|
||||
}
|
||||
|
||||
// ChangeExpiration of a given user
|
||||
type ChangeExpiration struct {
|
||||
// NewExpiration of the user
|
||||
NewExpiration time.Time
|
||||
|
||||
// Statements is an ordered list of commands to run within the database
|
||||
// when changing the user's expiration.
|
||||
Statements Statements
|
||||
}
|
||||
|
||||
type UpdateUserResponse struct{}
|
||||
|
||||
// ///////////////////////////////////////////////////////
|
||||
// DeleteUser()
|
||||
// ///////////////////////////////////////////////////////
|
||||
|
||||
type DeleteUserRequest struct {
|
||||
// Username to delete from the database
|
||||
Username string
|
||||
|
||||
// Statements is an ordered list of commands to run within the database
|
||||
// when deleting a user.
|
||||
Statements Statements
|
||||
}
|
||||
|
||||
type DeleteUserResponse struct{}
|
||||
|
||||
// ///////////////////////////////////////////////////////
|
||||
// Used across multiple functions
|
||||
// ///////////////////////////////////////////////////////
|
||||
|
||||
// Statements wraps a collection of statements to run in a database when an
|
||||
// operation is performed (create, update, etc.). This is a struct rather than
|
||||
// a string slice so we can easily add more information to this in the future.
|
||||
type Statements struct {
|
||||
// Commands is an ordered list of commands to execute in the database.
|
||||
// These commands may include templated fields such as {{username}} and {{password}}
|
||||
Commands []string
|
||||
}
|
||||
254
sdk/database/newdbplugin/grpc_client.go
Normal file
254
sdk/database/newdbplugin/grpc_client.go
Normal file
@ -0,0 +1,254 @@
|
||||
package newdbplugin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
"github.com/hashicorp/vault/sdk/database/newdbplugin/proto"
|
||||
"github.com/hashicorp/vault/sdk/helper/pluginutil"
|
||||
)
|
||||
|
||||
var (
|
||||
_ Database = gRPCClient{}
|
||||
|
||||
ErrPluginShutdown = errors.New("plugin shutdown")
|
||||
)
|
||||
|
||||
type gRPCClient struct {
|
||||
client proto.DatabaseClient
|
||||
doneCtx context.Context
|
||||
}
|
||||
|
||||
func (c gRPCClient) Initialize(ctx context.Context, req InitializeRequest) (InitializeResponse, error) {
|
||||
rpcReq, err := initReqToProto(req)
|
||||
if err != nil {
|
||||
return InitializeResponse{}, err
|
||||
}
|
||||
|
||||
rpcResp, err := c.client.Initialize(ctx, rpcReq)
|
||||
if err != nil {
|
||||
return InitializeResponse{}, fmt.Errorf("unable to initialize: %s", err.Error())
|
||||
}
|
||||
|
||||
return initRespFromProto(rpcResp)
|
||||
}
|
||||
|
||||
func initReqToProto(req InitializeRequest) (*proto.InitializeRequest, error) {
|
||||
config, err := mapToStruct(req.Config)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to marshal config: %w", err)
|
||||
}
|
||||
|
||||
rpcReq := &proto.InitializeRequest{
|
||||
ConfigData: config,
|
||||
VerifyConnection: req.VerifyConnection,
|
||||
}
|
||||
return rpcReq, nil
|
||||
}
|
||||
|
||||
func initRespFromProto(rpcResp *proto.InitializeResponse) (InitializeResponse, error) {
|
||||
newConfig := structToMap(rpcResp.GetConfigData())
|
||||
|
||||
resp := InitializeResponse{
|
||||
Config: newConfig,
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c gRPCClient) NewUser(ctx context.Context, req NewUserRequest) (NewUserResponse, error) {
|
||||
ctx, cancel := context.WithCancel(ctx)
|
||||
quitCh := pluginutil.CtxCancelIfCanceled(cancel, c.doneCtx)
|
||||
defer close(quitCh)
|
||||
defer cancel()
|
||||
|
||||
rpcReq, err := newUserReqToProto(req)
|
||||
if err != nil {
|
||||
return NewUserResponse{}, err
|
||||
}
|
||||
|
||||
rpcResp, err := c.client.NewUser(ctx, rpcReq)
|
||||
if err != nil {
|
||||
if c.doneCtx.Err() != nil {
|
||||
return NewUserResponse{}, ErrPluginShutdown
|
||||
}
|
||||
return NewUserResponse{}, fmt.Errorf("unable to create new user: %w", err)
|
||||
}
|
||||
|
||||
return newUserRespFromProto(rpcResp)
|
||||
}
|
||||
|
||||
func newUserReqToProto(req NewUserRequest) (*proto.NewUserRequest, error) {
|
||||
if req.Password == "" {
|
||||
return nil, fmt.Errorf("missing password")
|
||||
}
|
||||
|
||||
expiration, err := ptypes.TimestampProto(req.Expiration)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to marshal expiration date: %w", err)
|
||||
}
|
||||
|
||||
rpcReq := &proto.NewUserRequest{
|
||||
UsernameConfig: &proto.UsernameConfig{
|
||||
DisplayName: req.UsernameConfig.DisplayName,
|
||||
RoleName: req.UsernameConfig.RoleName,
|
||||
},
|
||||
Password: req.Password,
|
||||
Expiration: expiration,
|
||||
Statements: &proto.Statements{
|
||||
Commands: req.Statements.Commands,
|
||||
},
|
||||
RollbackStatements: &proto.Statements{
|
||||
Commands: req.RollbackStatements.Commands,
|
||||
},
|
||||
}
|
||||
return rpcReq, nil
|
||||
}
|
||||
|
||||
func newUserRespFromProto(rpcResp *proto.NewUserResponse) (NewUserResponse, error) {
|
||||
resp := NewUserResponse{
|
||||
Username: rpcResp.GetUsername(),
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c gRPCClient) UpdateUser(ctx context.Context, req UpdateUserRequest) (UpdateUserResponse, error) {
|
||||
rpcReq, err := updateUserReqToProto(req)
|
||||
if err != nil {
|
||||
return UpdateUserResponse{}, err
|
||||
}
|
||||
|
||||
rpcResp, err := c.client.UpdateUser(ctx, rpcReq)
|
||||
if err != nil {
|
||||
if c.doneCtx.Err() != nil {
|
||||
return UpdateUserResponse{}, ErrPluginShutdown
|
||||
}
|
||||
|
||||
return UpdateUserResponse{}, fmt.Errorf("unable to update user: %w", err)
|
||||
}
|
||||
|
||||
return updateUserRespFromProto(rpcResp)
|
||||
}
|
||||
|
||||
func updateUserReqToProto(req UpdateUserRequest) (*proto.UpdateUserRequest, error) {
|
||||
if req.Username == "" {
|
||||
return nil, fmt.Errorf("missing username")
|
||||
}
|
||||
|
||||
if (req.Password == nil || req.Password.NewPassword == "") &&
|
||||
(req.Expiration == nil || req.Expiration.NewExpiration.IsZero()) {
|
||||
return nil, fmt.Errorf("missing changes")
|
||||
}
|
||||
|
||||
expiration, err := expirationToProto(req.Expiration)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to parse new expiration date: %w", err)
|
||||
}
|
||||
|
||||
var password *proto.ChangePassword
|
||||
if req.Password != nil && req.Password.NewPassword != "" {
|
||||
password = &proto.ChangePassword{
|
||||
NewPassword: req.Password.NewPassword,
|
||||
Statements: &proto.Statements{
|
||||
Commands: req.Password.Statements.Commands,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
rpcReq := &proto.UpdateUserRequest{
|
||||
Username: req.Username,
|
||||
Password: password,
|
||||
Expiration: expiration,
|
||||
}
|
||||
return rpcReq, nil
|
||||
}
|
||||
|
||||
func updateUserRespFromProto(rpcResp *proto.UpdateUserResponse) (UpdateUserResponse, error) {
|
||||
// Placeholder for future conversion if data is returned
|
||||
return UpdateUserResponse{}, nil
|
||||
}
|
||||
|
||||
func expirationToProto(exp *ChangeExpiration) (*proto.ChangeExpiration, error) {
|
||||
if exp == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
expiration, err := ptypes.TimestampProto(exp.NewExpiration)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
changeExp := &proto.ChangeExpiration{
|
||||
NewExpiration: expiration,
|
||||
Statements: &proto.Statements{
|
||||
Commands: exp.Statements.Commands,
|
||||
},
|
||||
}
|
||||
return changeExp, nil
|
||||
}
|
||||
|
||||
func (c gRPCClient) DeleteUser(ctx context.Context, req DeleteUserRequest) (DeleteUserResponse, error) {
|
||||
rpcReq, err := deleteUserReqToProto(req)
|
||||
if err != nil {
|
||||
return DeleteUserResponse{}, err
|
||||
}
|
||||
|
||||
rpcResp, err := c.client.DeleteUser(ctx, rpcReq)
|
||||
if err != nil {
|
||||
if c.doneCtx.Err() != nil {
|
||||
return DeleteUserResponse{}, ErrPluginShutdown
|
||||
}
|
||||
return DeleteUserResponse{}, fmt.Errorf("unable to update user: %w", err)
|
||||
}
|
||||
|
||||
return deleteUserRespFromProto(rpcResp)
|
||||
}
|
||||
|
||||
func deleteUserReqToProto(req DeleteUserRequest) (*proto.DeleteUserRequest, error) {
|
||||
if req.Username == "" {
|
||||
return nil, fmt.Errorf("missing username")
|
||||
}
|
||||
|
||||
rpcReq := &proto.DeleteUserRequest{
|
||||
Username: req.Username,
|
||||
Statements: &proto.Statements{
|
||||
Commands: req.Statements.Commands,
|
||||
},
|
||||
}
|
||||
return rpcReq, nil
|
||||
}
|
||||
|
||||
func deleteUserRespFromProto(rpcResp *proto.DeleteUserResponse) (DeleteUserResponse, error) {
|
||||
// Placeholder for future conversion if data is returned
|
||||
return DeleteUserResponse{}, nil
|
||||
}
|
||||
|
||||
func (c gRPCClient) Type() (string, error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
|
||||
defer cancel()
|
||||
|
||||
typeResp, err := c.client.Type(ctx, &proto.Empty{})
|
||||
if err != nil {
|
||||
if c.doneCtx.Err() != nil {
|
||||
return "", ErrPluginShutdown
|
||||
}
|
||||
return "", fmt.Errorf("unable to get database plugin type: %w", err)
|
||||
}
|
||||
return typeResp.GetType(), nil
|
||||
}
|
||||
|
||||
func (c gRPCClient) Close() error {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
|
||||
defer cancel()
|
||||
|
||||
_, err := c.client.Close(ctx, &proto.Empty{})
|
||||
if err != nil {
|
||||
if c.doneCtx.Err() != nil {
|
||||
return ErrPluginShutdown
|
||||
}
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
537
sdk/database/newdbplugin/grpc_client_test.go
Normal file
537
sdk/database/newdbplugin/grpc_client_test.go
Normal file
@ -0,0 +1,537 @@
|
||||
package newdbplugin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/vault/sdk/database/newdbplugin/proto"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
func TestGRPCClient_Initialize(t *testing.T) {
|
||||
type testCase struct {
|
||||
client proto.DatabaseClient
|
||||
req InitializeRequest
|
||||
expectedResp InitializeResponse
|
||||
assertErr errorAssertion
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"bad config": {
|
||||
client: fakeClient{},
|
||||
req: InitializeRequest{
|
||||
Config: map[string]interface{}{
|
||||
"foo": badJSONValue{},
|
||||
},
|
||||
},
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"database error": {
|
||||
client: fakeClient{
|
||||
initErr: errors.New("initialize error"),
|
||||
},
|
||||
req: InitializeRequest{
|
||||
Config: map[string]interface{}{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"happy path": {
|
||||
client: fakeClient{
|
||||
initResp: &proto.InitializeResponse{
|
||||
ConfigData: marshal(t, map[string]interface{}{
|
||||
"foo": "bar",
|
||||
"baz": "biz",
|
||||
}),
|
||||
},
|
||||
},
|
||||
req: InitializeRequest{
|
||||
Config: map[string]interface{}{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
expectedResp: InitializeResponse{
|
||||
Config: map[string]interface{}{
|
||||
"foo": "bar",
|
||||
"baz": "biz",
|
||||
},
|
||||
},
|
||||
assertErr: assertErrNil,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
c := gRPCClient{
|
||||
client: test.client,
|
||||
doneCtx: nil,
|
||||
}
|
||||
|
||||
// Context doesn't need to timeout since this is just passed through
|
||||
ctx := context.Background()
|
||||
|
||||
resp, err := c.Initialize(ctx, test.req)
|
||||
test.assertErr(t, err)
|
||||
|
||||
if !reflect.DeepEqual(resp, test.expectedResp) {
|
||||
t.Fatalf("Actual response: %#v\nExpected response: %#v", resp, test.expectedResp)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGRPCClient_NewUser(t *testing.T) {
|
||||
runningCtx := context.Background()
|
||||
cancelledCtx, cancel := context.WithCancel(context.Background())
|
||||
cancel()
|
||||
|
||||
type testCase struct {
|
||||
client proto.DatabaseClient
|
||||
req NewUserRequest
|
||||
doneCtx context.Context
|
||||
expectedResp NewUserResponse
|
||||
assertErr errorAssertion
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"missing password": {
|
||||
client: fakeClient{},
|
||||
req: NewUserRequest{
|
||||
Password: "",
|
||||
Expiration: time.Now(),
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"bad expiration": {
|
||||
client: fakeClient{},
|
||||
req: NewUserRequest{
|
||||
Password: "njkvcb8y934u90grsnkjl",
|
||||
Expiration: invalidExpiration,
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"database error": {
|
||||
client: fakeClient{
|
||||
newUserErr: errors.New("new user error"),
|
||||
},
|
||||
req: NewUserRequest{
|
||||
Password: "njkvcb8y934u90grsnkjl",
|
||||
Expiration: time.Now(),
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"plugin shut down": {
|
||||
client: fakeClient{
|
||||
newUserErr: errors.New("new user error"),
|
||||
},
|
||||
req: NewUserRequest{
|
||||
Password: "njkvcb8y934u90grsnkjl",
|
||||
Expiration: time.Now(),
|
||||
},
|
||||
doneCtx: cancelledCtx,
|
||||
assertErr: assertErrEquals(ErrPluginShutdown),
|
||||
},
|
||||
"happy path": {
|
||||
client: fakeClient{
|
||||
newUserResp: &proto.NewUserResponse{
|
||||
Username: "new_user",
|
||||
},
|
||||
},
|
||||
req: NewUserRequest{
|
||||
Password: "njkvcb8y934u90grsnkjl",
|
||||
Expiration: time.Now(),
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
expectedResp: NewUserResponse{
|
||||
Username: "new_user",
|
||||
},
|
||||
assertErr: assertErrNil,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
c := gRPCClient{
|
||||
client: test.client,
|
||||
doneCtx: test.doneCtx,
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
resp, err := c.NewUser(ctx, test.req)
|
||||
test.assertErr(t, err)
|
||||
|
||||
if !reflect.DeepEqual(resp, test.expectedResp) {
|
||||
t.Fatalf("Actual response: %#v\nExpected response: %#v", resp, test.expectedResp)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGRPCClient_UpdateUser(t *testing.T) {
|
||||
runningCtx := context.Background()
|
||||
cancelledCtx, cancel := context.WithCancel(context.Background())
|
||||
cancel()
|
||||
|
||||
type testCase struct {
|
||||
client proto.DatabaseClient
|
||||
req UpdateUserRequest
|
||||
doneCtx context.Context
|
||||
assertErr errorAssertion
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"missing username": {
|
||||
client: fakeClient{},
|
||||
req: UpdateUserRequest{},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"missing changes": {
|
||||
client: fakeClient{},
|
||||
req: UpdateUserRequest{
|
||||
Username: "user",
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"empty password": {
|
||||
client: fakeClient{},
|
||||
req: UpdateUserRequest{
|
||||
Username: "user",
|
||||
Password: &ChangePassword{
|
||||
NewPassword: "",
|
||||
},
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"zero expiration": {
|
||||
client: fakeClient{},
|
||||
req: UpdateUserRequest{
|
||||
Username: "user",
|
||||
Expiration: &ChangeExpiration{
|
||||
NewExpiration: time.Time{},
|
||||
},
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"bad expiration": {
|
||||
client: fakeClient{},
|
||||
req: UpdateUserRequest{
|
||||
Username: "user",
|
||||
Expiration: &ChangeExpiration{
|
||||
NewExpiration: invalidExpiration,
|
||||
},
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"database error": {
|
||||
client: fakeClient{
|
||||
updateUserErr: errors.New("update user error"),
|
||||
},
|
||||
req: UpdateUserRequest{
|
||||
Username: "user",
|
||||
Password: &ChangePassword{
|
||||
NewPassword: "asdf",
|
||||
},
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"plugin shut down": {
|
||||
client: fakeClient{
|
||||
updateUserErr: errors.New("update user error"),
|
||||
},
|
||||
req: UpdateUserRequest{
|
||||
Username: "user",
|
||||
Password: &ChangePassword{
|
||||
NewPassword: "asdf",
|
||||
},
|
||||
},
|
||||
doneCtx: cancelledCtx,
|
||||
assertErr: assertErrEquals(ErrPluginShutdown),
|
||||
},
|
||||
"happy path - change password": {
|
||||
client: fakeClient{},
|
||||
req: UpdateUserRequest{
|
||||
Username: "user",
|
||||
Password: &ChangePassword{
|
||||
NewPassword: "asdf",
|
||||
},
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNil,
|
||||
},
|
||||
"happy path - change expiration": {
|
||||
client: fakeClient{},
|
||||
req: UpdateUserRequest{
|
||||
Username: "user",
|
||||
Expiration: &ChangeExpiration{
|
||||
NewExpiration: time.Now(),
|
||||
},
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNil,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
c := gRPCClient{
|
||||
client: test.client,
|
||||
doneCtx: test.doneCtx,
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
_, err := c.UpdateUser(ctx, test.req)
|
||||
test.assertErr(t, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGRPCClient_DeleteUser(t *testing.T) {
|
||||
runningCtx := context.Background()
|
||||
cancelledCtx, cancel := context.WithCancel(context.Background())
|
||||
cancel()
|
||||
|
||||
type testCase struct {
|
||||
client proto.DatabaseClient
|
||||
req DeleteUserRequest
|
||||
doneCtx context.Context
|
||||
assertErr errorAssertion
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"missing username": {
|
||||
client: fakeClient{},
|
||||
req: DeleteUserRequest{},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"database error": {
|
||||
client: fakeClient{
|
||||
deleteUserErr: errors.New("delete user error'"),
|
||||
},
|
||||
req: DeleteUserRequest{
|
||||
Username: "user",
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"plugin shut down": {
|
||||
client: fakeClient{
|
||||
deleteUserErr: errors.New("delete user error'"),
|
||||
},
|
||||
req: DeleteUserRequest{
|
||||
Username: "user",
|
||||
},
|
||||
doneCtx: cancelledCtx,
|
||||
assertErr: assertErrEquals(ErrPluginShutdown),
|
||||
},
|
||||
"happy path": {
|
||||
client: fakeClient{},
|
||||
req: DeleteUserRequest{
|
||||
Username: "user",
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNil,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
c := gRPCClient{
|
||||
client: test.client,
|
||||
doneCtx: test.doneCtx,
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
_, err := c.DeleteUser(ctx, test.req)
|
||||
test.assertErr(t, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGRPCClient_Type(t *testing.T) {
|
||||
runningCtx := context.Background()
|
||||
cancelledCtx, cancel := context.WithCancel(context.Background())
|
||||
cancel()
|
||||
|
||||
type testCase struct {
|
||||
client proto.DatabaseClient
|
||||
doneCtx context.Context
|
||||
expectedType string
|
||||
assertErr errorAssertion
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"database error": {
|
||||
client: fakeClient{
|
||||
typeErr: errors.New("type error"),
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"plugin shut down": {
|
||||
client: fakeClient{
|
||||
typeErr: errors.New("type error"),
|
||||
},
|
||||
doneCtx: cancelledCtx,
|
||||
assertErr: assertErrEquals(ErrPluginShutdown),
|
||||
},
|
||||
"happy path": {
|
||||
client: fakeClient{
|
||||
typeResp: &proto.TypeResponse{
|
||||
Type: "test type",
|
||||
},
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
expectedType: "test type",
|
||||
assertErr: assertErrNil,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
c := gRPCClient{
|
||||
client: test.client,
|
||||
doneCtx: test.doneCtx,
|
||||
}
|
||||
|
||||
dbType, err := c.Type()
|
||||
test.assertErr(t, err)
|
||||
|
||||
if dbType != test.expectedType {
|
||||
t.Fatalf("Actual type: %s Expected type: %s", dbType, test.expectedType)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGRPCClient_Close(t *testing.T) {
|
||||
runningCtx := context.Background()
|
||||
cancelledCtx, cancel := context.WithCancel(context.Background())
|
||||
cancel()
|
||||
|
||||
type testCase struct {
|
||||
client proto.DatabaseClient
|
||||
doneCtx context.Context
|
||||
assertErr errorAssertion
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"database error": {
|
||||
client: fakeClient{
|
||||
typeErr: errors.New("type error"),
|
||||
},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNotNil,
|
||||
},
|
||||
"plugin shut down": {
|
||||
client: fakeClient{
|
||||
typeErr: errors.New("type error"),
|
||||
},
|
||||
doneCtx: cancelledCtx,
|
||||
assertErr: assertErrEquals(ErrPluginShutdown),
|
||||
},
|
||||
"happy path": {
|
||||
client: fakeClient{},
|
||||
doneCtx: runningCtx,
|
||||
assertErr: assertErrNil,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
c := gRPCClient{
|
||||
client: test.client,
|
||||
doneCtx: test.doneCtx,
|
||||
}
|
||||
|
||||
err := c.Close()
|
||||
test.assertErr(t, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
type errorAssertion func(*testing.T, error)
|
||||
|
||||
func assertErrNotNil(t *testing.T, err error) {
|
||||
t.Helper()
|
||||
if err == nil {
|
||||
t.Fatalf("err expected, got nil")
|
||||
}
|
||||
}
|
||||
|
||||
func assertErrNil(t *testing.T, err error) {
|
||||
t.Helper()
|
||||
if err != nil {
|
||||
t.Fatalf("no error expected, got: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
func assertErrEquals(expectedErr error) errorAssertion {
|
||||
return func(t *testing.T, err error) {
|
||||
t.Helper()
|
||||
if err != expectedErr {
|
||||
t.Fatalf("Actual err: %#v Expected err: %#v", err, expectedErr)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var _ proto.DatabaseClient = fakeClient{}
|
||||
|
||||
type fakeClient struct {
|
||||
initResp *proto.InitializeResponse
|
||||
initErr error
|
||||
|
||||
newUserResp *proto.NewUserResponse
|
||||
newUserErr error
|
||||
|
||||
updateUserResp *proto.UpdateUserResponse
|
||||
updateUserErr error
|
||||
|
||||
deleteUserResp *proto.DeleteUserResponse
|
||||
deleteUserErr error
|
||||
|
||||
typeResp *proto.TypeResponse
|
||||
typeErr error
|
||||
|
||||
closeErr error
|
||||
}
|
||||
|
||||
func (f fakeClient) Initialize(context.Context, *proto.InitializeRequest, ...grpc.CallOption) (*proto.InitializeResponse, error) {
|
||||
return f.initResp, f.initErr
|
||||
}
|
||||
|
||||
func (f fakeClient) NewUser(context.Context, *proto.NewUserRequest, ...grpc.CallOption) (*proto.NewUserResponse, error) {
|
||||
return f.newUserResp, f.newUserErr
|
||||
}
|
||||
|
||||
func (f fakeClient) UpdateUser(context.Context, *proto.UpdateUserRequest, ...grpc.CallOption) (*proto.UpdateUserResponse, error) {
|
||||
return f.updateUserResp, f.updateUserErr
|
||||
}
|
||||
|
||||
func (f fakeClient) DeleteUser(context.Context, *proto.DeleteUserRequest, ...grpc.CallOption) (*proto.DeleteUserResponse, error) {
|
||||
return f.deleteUserResp, f.deleteUserErr
|
||||
}
|
||||
|
||||
func (f fakeClient) Type(context.Context, *proto.Empty, ...grpc.CallOption) (*proto.TypeResponse, error) {
|
||||
return f.typeResp, f.typeErr
|
||||
}
|
||||
|
||||
func (f fakeClient) Close(context.Context, *proto.Empty, ...grpc.CallOption) (*proto.Empty, error) {
|
||||
return &proto.Empty{}, f.typeErr
|
||||
}
|
||||
190
sdk/database/newdbplugin/grpc_server.go
Normal file
190
sdk/database/newdbplugin/grpc_server.go
Normal file
@ -0,0 +1,190 @@
|
||||
package newdbplugin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
"github.com/hashicorp/vault/sdk/database/newdbplugin/proto"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
var _ proto.DatabaseServer = gRPCServer{}
|
||||
|
||||
type gRPCServer struct {
|
||||
impl Database
|
||||
}
|
||||
|
||||
// Initialize the database plugin
|
||||
func (g gRPCServer) Initialize(ctx context.Context, request *proto.InitializeRequest) (*proto.InitializeResponse, error) {
|
||||
rawConfig := structToMap(request.ConfigData)
|
||||
|
||||
dbReq := InitializeRequest{
|
||||
Config: rawConfig,
|
||||
VerifyConnection: request.VerifyConnection,
|
||||
}
|
||||
|
||||
dbResp, err := g.impl.Initialize(ctx, dbReq)
|
||||
if err != nil {
|
||||
return &proto.InitializeResponse{}, status.Errorf(codes.Internal, "failed to initialize: %s", err)
|
||||
}
|
||||
|
||||
newConfig, err := mapToStruct(dbResp.Config)
|
||||
if err != nil {
|
||||
return &proto.InitializeResponse{}, status.Errorf(codes.Internal, "failed to marshal new config to JSON: %s", err)
|
||||
}
|
||||
|
||||
resp := &proto.InitializeResponse{
|
||||
ConfigData: newConfig,
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (g gRPCServer) NewUser(ctx context.Context, req *proto.NewUserRequest) (*proto.NewUserResponse, error) {
|
||||
if req.GetUsernameConfig() == nil {
|
||||
return &proto.NewUserResponse{}, status.Errorf(codes.InvalidArgument, "missing username config")
|
||||
}
|
||||
|
||||
var expiration time.Time
|
||||
|
||||
if req.GetExpiration() != nil {
|
||||
exp, err := ptypes.Timestamp(req.GetExpiration())
|
||||
if err != nil {
|
||||
return &proto.NewUserResponse{}, status.Errorf(codes.InvalidArgument, "unable to parse expiration date: %s", err)
|
||||
}
|
||||
expiration = exp
|
||||
}
|
||||
|
||||
dbReq := NewUserRequest{
|
||||
UsernameConfig: UsernameMetadata{
|
||||
DisplayName: req.GetUsernameConfig().GetDisplayName(),
|
||||
RoleName: req.GetUsernameConfig().GetRoleName(),
|
||||
},
|
||||
Password: req.GetPassword(),
|
||||
Expiration: expiration,
|
||||
Statements: getStatementsFromProto(req.GetStatements()),
|
||||
RollbackStatements: getStatementsFromProto(req.GetRollbackStatements()),
|
||||
}
|
||||
|
||||
dbResp, err := g.impl.NewUser(ctx, dbReq)
|
||||
if err != nil {
|
||||
return &proto.NewUserResponse{}, status.Errorf(codes.Internal, "unable to create new user: %s", err)
|
||||
}
|
||||
|
||||
resp := &proto.NewUserResponse{
|
||||
Username: dbResp.Username,
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (g gRPCServer) UpdateUser(ctx context.Context, req *proto.UpdateUserRequest) (*proto.UpdateUserResponse, error) {
|
||||
if req.GetUsername() == "" {
|
||||
return &proto.UpdateUserResponse{}, status.Errorf(codes.InvalidArgument, "no username provided")
|
||||
}
|
||||
|
||||
dbReq, err := getUpdateUserRequest(req)
|
||||
if err != nil {
|
||||
return &proto.UpdateUserResponse{}, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
_, err = g.impl.UpdateUser(ctx, dbReq)
|
||||
if err != nil {
|
||||
return &proto.UpdateUserResponse{}, status.Errorf(codes.Internal, "unable to update user: %s", err)
|
||||
}
|
||||
return &proto.UpdateUserResponse{}, nil
|
||||
}
|
||||
|
||||
func getUpdateUserRequest(req *proto.UpdateUserRequest) (UpdateUserRequest, error) {
|
||||
var password *ChangePassword
|
||||
if req.GetPassword() != nil && req.GetPassword().GetNewPassword() != "" {
|
||||
password = &ChangePassword{
|
||||
NewPassword: req.GetPassword().GetNewPassword(),
|
||||
Statements: getStatementsFromProto(req.GetPassword().GetStatements()),
|
||||
}
|
||||
}
|
||||
|
||||
var expiration *ChangeExpiration
|
||||
if req.GetExpiration() != nil && req.GetExpiration().GetNewExpiration() != nil {
|
||||
newExpiration, err := ptypes.Timestamp(req.GetExpiration().GetNewExpiration())
|
||||
if err != nil {
|
||||
return UpdateUserRequest{}, fmt.Errorf("unable to parse new expiration: %w", err)
|
||||
}
|
||||
|
||||
expiration = &ChangeExpiration{
|
||||
NewExpiration: newExpiration,
|
||||
Statements: getStatementsFromProto(req.GetExpiration().GetStatements()),
|
||||
}
|
||||
}
|
||||
|
||||
dbReq := UpdateUserRequest{
|
||||
Username: req.GetUsername(),
|
||||
Password: password,
|
||||
Expiration: expiration,
|
||||
}
|
||||
|
||||
if !hasChange(dbReq) {
|
||||
return UpdateUserRequest{}, fmt.Errorf("update user request has no changes")
|
||||
}
|
||||
|
||||
return dbReq, nil
|
||||
}
|
||||
|
||||
func hasChange(dbReq UpdateUserRequest) bool {
|
||||
if dbReq.Password != nil && dbReq.Password.NewPassword != "" {
|
||||
return true
|
||||
}
|
||||
if dbReq.Expiration != nil && !dbReq.Expiration.NewExpiration.IsZero() {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (g gRPCServer) DeleteUser(ctx context.Context, req *proto.DeleteUserRequest) (*proto.DeleteUserResponse, error) {
|
||||
if req.GetUsername() == "" {
|
||||
return &proto.DeleteUserResponse{}, status.Errorf(codes.InvalidArgument, "no username provided")
|
||||
}
|
||||
dbReq := DeleteUserRequest{
|
||||
Username: req.GetUsername(),
|
||||
Statements: getStatementsFromProto(req.GetStatements()),
|
||||
}
|
||||
|
||||
_, err := g.impl.DeleteUser(ctx, dbReq)
|
||||
if err != nil {
|
||||
return &proto.DeleteUserResponse{}, status.Errorf(codes.Internal, "unable to delete user: %s", err)
|
||||
}
|
||||
return &proto.DeleteUserResponse{}, nil
|
||||
}
|
||||
|
||||
func (g gRPCServer) Type(ctx context.Context, _ *proto.Empty) (*proto.TypeResponse, error) {
|
||||
t, err := g.impl.Type()
|
||||
if err != nil {
|
||||
return &proto.TypeResponse{}, status.Errorf(codes.Internal, "unable to retrieve type: %s", err)
|
||||
}
|
||||
|
||||
resp := &proto.TypeResponse{
|
||||
Type: t,
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (g gRPCServer) Close(ctx context.Context, _ *proto.Empty) (*proto.Empty, error) {
|
||||
err := g.impl.Close()
|
||||
if err != nil {
|
||||
return &proto.Empty{}, status.Errorf(codes.Internal, "unable to close database plugin: %s", err)
|
||||
}
|
||||
return &proto.Empty{}, nil
|
||||
}
|
||||
|
||||
func getStatementsFromProto(protoStmts *proto.Statements) (statements Statements) {
|
||||
if protoStmts == nil {
|
||||
return statements
|
||||
}
|
||||
cmds := protoStmts.GetCommands()
|
||||
statements = Statements{
|
||||
Commands: cmds,
|
||||
}
|
||||
return statements
|
||||
}
|
||||
692
sdk/database/newdbplugin/grpc_server_test.go
Normal file
692
sdk/database/newdbplugin/grpc_server_test.go
Normal file
@ -0,0 +1,692 @@
|
||||
package newdbplugin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"google.golang.org/protobuf/types/known/structpb"
|
||||
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
"github.com/golang/protobuf/ptypes/timestamp"
|
||||
"github.com/hashicorp/vault/sdk/database/newdbplugin/proto"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
var (
|
||||
// Before minValidSeconds in ptypes package
|
||||
invalidExpiration = time.Date(0, 1, 1, 0, 0, 0, 0, time.UTC)
|
||||
)
|
||||
|
||||
func TestGRPCServer_Initialize(t *testing.T) {
|
||||
type testCase struct {
|
||||
db Database
|
||||
req *proto.InitializeRequest
|
||||
expectedResp *proto.InitializeResponse
|
||||
expectErr bool
|
||||
expectCode codes.Code
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"database errored": {
|
||||
db: fakeDatabase{
|
||||
initErr: errors.New("initialization error"),
|
||||
},
|
||||
req: &proto.InitializeRequest{},
|
||||
expectedResp: &proto.InitializeResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.Internal,
|
||||
},
|
||||
"newConfig can't marshal to JSON": {
|
||||
db: fakeDatabase{
|
||||
initResp: InitializeResponse{
|
||||
Config: map[string]interface{}{
|
||||
"bad-data": badJSONValue{},
|
||||
},
|
||||
},
|
||||
},
|
||||
req: &proto.InitializeRequest{},
|
||||
expectedResp: &proto.InitializeResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.Internal,
|
||||
},
|
||||
"happy path with config data": {
|
||||
db: fakeDatabase{
|
||||
initResp: InitializeResponse{
|
||||
Config: map[string]interface{}{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
req: &proto.InitializeRequest{
|
||||
ConfigData: marshal(t, map[string]interface{}{
|
||||
"foo": "bar",
|
||||
}),
|
||||
},
|
||||
expectedResp: &proto.InitializeResponse{
|
||||
ConfigData: marshal(t, map[string]interface{}{
|
||||
"foo": "bar",
|
||||
}),
|
||||
},
|
||||
expectErr: false,
|
||||
expectCode: codes.OK,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
g := gRPCServer{
|
||||
impl: test.db,
|
||||
}
|
||||
|
||||
// Context doesn't need to timeout since this is just passed through
|
||||
ctx := context.Background()
|
||||
|
||||
resp, err := g.Initialize(ctx, test.req)
|
||||
if test.expectErr && err == nil {
|
||||
t.Fatalf("err expected, got nil")
|
||||
}
|
||||
if !test.expectErr && err != nil {
|
||||
t.Fatalf("no error expected, got: %s", err)
|
||||
}
|
||||
|
||||
actualCode := status.Code(err)
|
||||
if actualCode != test.expectCode {
|
||||
t.Fatalf("Actual code: %s Expected code: %s", actualCode, test.expectCode)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(resp, test.expectedResp) {
|
||||
t.Fatalf("Actual response: %#v\nExpected response: %#v", resp, test.expectedResp)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestCoerceFloatsToInt(t *testing.T) {
|
||||
type testCase struct {
|
||||
input map[string]interface{}
|
||||
expected map[string]interface{}
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"no numbers": {
|
||||
input: map[string]interface{}{
|
||||
"foo": "bar",
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
"raw integers": {
|
||||
input: map[string]interface{}{
|
||||
"foo": 42,
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"foo": 42,
|
||||
},
|
||||
},
|
||||
"floats ": {
|
||||
input: map[string]interface{}{
|
||||
"foo": 42.2,
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"foo": 42.2,
|
||||
},
|
||||
},
|
||||
"floats coerced to ints": {
|
||||
input: map[string]interface{}{
|
||||
"foo": float64(42),
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"foo": int64(42),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
actual := copyMap(test.input)
|
||||
coerceFloatsToInt(actual)
|
||||
if !reflect.DeepEqual(actual, test.expected) {
|
||||
t.Fatalf("Actual: %#v\nExpected: %#v", actual, test.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func copyMap(m map[string]interface{}) map[string]interface{} {
|
||||
newMap := map[string]interface{}{}
|
||||
for k, v := range m {
|
||||
newMap[k] = v
|
||||
}
|
||||
return newMap
|
||||
}
|
||||
|
||||
func TestGRPCServer_NewUser(t *testing.T) {
|
||||
type testCase struct {
|
||||
db Database
|
||||
req *proto.NewUserRequest
|
||||
expectedResp *proto.NewUserResponse
|
||||
expectErr bool
|
||||
expectCode codes.Code
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"missing username config": {
|
||||
db: fakeDatabase{},
|
||||
req: &proto.NewUserRequest{},
|
||||
expectedResp: &proto.NewUserResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.InvalidArgument,
|
||||
},
|
||||
"bad expiration": {
|
||||
db: fakeDatabase{},
|
||||
req: &proto.NewUserRequest{
|
||||
UsernameConfig: &proto.UsernameConfig{
|
||||
DisplayName: "dispname",
|
||||
RoleName: "rolename",
|
||||
},
|
||||
Expiration: ×tamp.Timestamp{
|
||||
Seconds: invalidExpiration.Unix(),
|
||||
},
|
||||
},
|
||||
expectedResp: &proto.NewUserResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.InvalidArgument,
|
||||
},
|
||||
"database error": {
|
||||
db: fakeDatabase{
|
||||
newUserErr: errors.New("new user error"),
|
||||
},
|
||||
req: &proto.NewUserRequest{
|
||||
UsernameConfig: &proto.UsernameConfig{
|
||||
DisplayName: "dispname",
|
||||
RoleName: "rolename",
|
||||
},
|
||||
Expiration: ptypes.TimestampNow(),
|
||||
},
|
||||
expectedResp: &proto.NewUserResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.Internal,
|
||||
},
|
||||
"happy path with expiration": {
|
||||
db: fakeDatabase{
|
||||
newUserResp: NewUserResponse{
|
||||
Username: "someuser_foo",
|
||||
},
|
||||
},
|
||||
req: &proto.NewUserRequest{
|
||||
UsernameConfig: &proto.UsernameConfig{
|
||||
DisplayName: "dispname",
|
||||
RoleName: "rolename",
|
||||
},
|
||||
Expiration: ptypes.TimestampNow(),
|
||||
},
|
||||
expectedResp: &proto.NewUserResponse{
|
||||
Username: "someuser_foo",
|
||||
},
|
||||
expectErr: false,
|
||||
expectCode: codes.OK,
|
||||
},
|
||||
"happy path without expiration": {
|
||||
db: fakeDatabase{
|
||||
newUserResp: NewUserResponse{
|
||||
Username: "someuser_foo",
|
||||
},
|
||||
},
|
||||
req: &proto.NewUserRequest{
|
||||
UsernameConfig: &proto.UsernameConfig{
|
||||
DisplayName: "dispname",
|
||||
RoleName: "rolename",
|
||||
},
|
||||
},
|
||||
expectedResp: &proto.NewUserResponse{
|
||||
Username: "someuser_foo",
|
||||
},
|
||||
expectErr: false,
|
||||
expectCode: codes.OK,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
g := gRPCServer{
|
||||
impl: test.db,
|
||||
}
|
||||
|
||||
// Context doesn't need to timeout since this is just passed through
|
||||
ctx := context.Background()
|
||||
|
||||
resp, err := g.NewUser(ctx, test.req)
|
||||
if test.expectErr && err == nil {
|
||||
t.Fatalf("err expected, got nil")
|
||||
}
|
||||
if !test.expectErr && err != nil {
|
||||
t.Fatalf("no error expected, got: %s", err)
|
||||
}
|
||||
|
||||
actualCode := status.Code(err)
|
||||
if actualCode != test.expectCode {
|
||||
t.Fatalf("Actual code: %s Expected code: %s", actualCode, test.expectCode)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(resp, test.expectedResp) {
|
||||
t.Fatalf("Actual response: %#v\nExpected response: %#v", resp, test.expectedResp)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGRPCServer_UpdateUser(t *testing.T) {
|
||||
type testCase struct {
|
||||
db Database
|
||||
req *proto.UpdateUserRequest
|
||||
expectedResp *proto.UpdateUserResponse
|
||||
expectErr bool
|
||||
expectCode codes.Code
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"missing username": {
|
||||
db: fakeDatabase{},
|
||||
req: &proto.UpdateUserRequest{},
|
||||
expectedResp: &proto.UpdateUserResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.InvalidArgument,
|
||||
},
|
||||
"missing changes": {
|
||||
db: fakeDatabase{},
|
||||
req: &proto.UpdateUserRequest{
|
||||
Username: "someuser",
|
||||
},
|
||||
expectedResp: &proto.UpdateUserResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.InvalidArgument,
|
||||
},
|
||||
"database error": {
|
||||
db: fakeDatabase{
|
||||
updateUserErr: errors.New("update user error"),
|
||||
},
|
||||
req: &proto.UpdateUserRequest{
|
||||
Username: "someuser",
|
||||
Password: &proto.ChangePassword{
|
||||
NewPassword: "90ughaino",
|
||||
},
|
||||
},
|
||||
expectedResp: &proto.UpdateUserResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.Internal,
|
||||
},
|
||||
"bad expiration date": {
|
||||
db: fakeDatabase{},
|
||||
req: &proto.UpdateUserRequest{
|
||||
Username: "someuser",
|
||||
Expiration: &proto.ChangeExpiration{
|
||||
NewExpiration: ×tamp.Timestamp{
|
||||
// Before minValidSeconds in ptypes package
|
||||
Seconds: invalidExpiration.Unix(),
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedResp: &proto.UpdateUserResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.InvalidArgument,
|
||||
},
|
||||
"change password happy path": {
|
||||
db: fakeDatabase{},
|
||||
req: &proto.UpdateUserRequest{
|
||||
Username: "someuser",
|
||||
Password: &proto.ChangePassword{
|
||||
NewPassword: "90ughaino",
|
||||
},
|
||||
},
|
||||
expectedResp: &proto.UpdateUserResponse{},
|
||||
expectErr: false,
|
||||
expectCode: codes.OK,
|
||||
},
|
||||
"change expiration happy path": {
|
||||
db: fakeDatabase{},
|
||||
req: &proto.UpdateUserRequest{
|
||||
Username: "someuser",
|
||||
Expiration: &proto.ChangeExpiration{
|
||||
NewExpiration: ptypes.TimestampNow(),
|
||||
},
|
||||
},
|
||||
expectedResp: &proto.UpdateUserResponse{},
|
||||
expectErr: false,
|
||||
expectCode: codes.OK,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
g := gRPCServer{
|
||||
impl: test.db,
|
||||
}
|
||||
|
||||
// Context doesn't need to timeout since this is just passed through
|
||||
ctx := context.Background()
|
||||
|
||||
resp, err := g.UpdateUser(ctx, test.req)
|
||||
if test.expectErr && err == nil {
|
||||
t.Fatalf("err expected, got nil")
|
||||
}
|
||||
if !test.expectErr && err != nil {
|
||||
t.Fatalf("no error expected, got: %s", err)
|
||||
}
|
||||
|
||||
actualCode := status.Code(err)
|
||||
if actualCode != test.expectCode {
|
||||
t.Fatalf("Actual code: %s Expected code: %s", actualCode, test.expectCode)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(resp, test.expectedResp) {
|
||||
t.Fatalf("Actual response: %#v\nExpected response: %#v", resp, test.expectedResp)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGRPCServer_DeleteUser(t *testing.T) {
|
||||
type testCase struct {
|
||||
db Database
|
||||
req *proto.DeleteUserRequest
|
||||
expectedResp *proto.DeleteUserResponse
|
||||
expectErr bool
|
||||
expectCode codes.Code
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"missing username": {
|
||||
db: fakeDatabase{},
|
||||
req: &proto.DeleteUserRequest{},
|
||||
expectedResp: &proto.DeleteUserResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.InvalidArgument,
|
||||
},
|
||||
"database error": {
|
||||
db: fakeDatabase{
|
||||
deleteUserErr: errors.New("delete user error"),
|
||||
},
|
||||
req: &proto.DeleteUserRequest{
|
||||
Username: "someuser",
|
||||
},
|
||||
expectedResp: &proto.DeleteUserResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.Internal,
|
||||
},
|
||||
"happy path": {
|
||||
db: fakeDatabase{},
|
||||
req: &proto.DeleteUserRequest{
|
||||
Username: "someuser",
|
||||
},
|
||||
expectedResp: &proto.DeleteUserResponse{},
|
||||
expectErr: false,
|
||||
expectCode: codes.OK,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
g := gRPCServer{
|
||||
impl: test.db,
|
||||
}
|
||||
|
||||
// Context doesn't need to timeout since this is just passed through
|
||||
ctx := context.Background()
|
||||
|
||||
resp, err := g.DeleteUser(ctx, test.req)
|
||||
if test.expectErr && err == nil {
|
||||
t.Fatalf("err expected, got nil")
|
||||
}
|
||||
if !test.expectErr && err != nil {
|
||||
t.Fatalf("no error expected, got: %s", err)
|
||||
}
|
||||
|
||||
actualCode := status.Code(err)
|
||||
if actualCode != test.expectCode {
|
||||
t.Fatalf("Actual code: %s Expected code: %s", actualCode, test.expectCode)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(resp, test.expectedResp) {
|
||||
t.Fatalf("Actual response: %#v\nExpected response: %#v", resp, test.expectedResp)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGRPCServer_Type(t *testing.T) {
|
||||
type testCase struct {
|
||||
db Database
|
||||
expectedResp *proto.TypeResponse
|
||||
expectErr bool
|
||||
expectCode codes.Code
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"database error": {
|
||||
db: fakeDatabase{
|
||||
typeErr: errors.New("type error"),
|
||||
},
|
||||
expectedResp: &proto.TypeResponse{},
|
||||
expectErr: true,
|
||||
expectCode: codes.Internal,
|
||||
},
|
||||
"happy path": {
|
||||
db: fakeDatabase{
|
||||
typeResp: "fake database",
|
||||
},
|
||||
expectedResp: &proto.TypeResponse{
|
||||
Type: "fake database",
|
||||
},
|
||||
expectErr: false,
|
||||
expectCode: codes.OK,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
g := gRPCServer{
|
||||
impl: test.db,
|
||||
}
|
||||
|
||||
// Context doesn't need to timeout since this is just passed through
|
||||
ctx := context.Background()
|
||||
|
||||
resp, err := g.Type(ctx, &proto.Empty{})
|
||||
if test.expectErr && err == nil {
|
||||
t.Fatalf("err expected, got nil")
|
||||
}
|
||||
if !test.expectErr && err != nil {
|
||||
t.Fatalf("no error expected, got: %s", err)
|
||||
}
|
||||
|
||||
actualCode := status.Code(err)
|
||||
if actualCode != test.expectCode {
|
||||
t.Fatalf("Actual code: %s Expected code: %s", actualCode, test.expectCode)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(resp, test.expectedResp) {
|
||||
t.Fatalf("Actual response: %#v\nExpected response: %#v", resp, test.expectedResp)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGRPCServer_Close(t *testing.T) {
|
||||
type testCase struct {
|
||||
db Database
|
||||
expectErr bool
|
||||
expectCode codes.Code
|
||||
}
|
||||
|
||||
tests := map[string]testCase{
|
||||
"database error": {
|
||||
db: fakeDatabase{
|
||||
closeErr: errors.New("close error"),
|
||||
},
|
||||
expectErr: true,
|
||||
expectCode: codes.Internal,
|
||||
},
|
||||
"happy path": {
|
||||
db: fakeDatabase{},
|
||||
expectErr: false,
|
||||
expectCode: codes.OK,
|
||||
},
|
||||
}
|
||||
|
||||
for name, test := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
g := gRPCServer{
|
||||
impl: test.db,
|
||||
}
|
||||
|
||||
// Context doesn't need to timeout since this is just passed through
|
||||
ctx := context.Background()
|
||||
|
||||
_, err := g.Close(ctx, &proto.Empty{})
|
||||
if test.expectErr && err == nil {
|
||||
t.Fatalf("err expected, got nil")
|
||||
}
|
||||
if !test.expectErr && err != nil {
|
||||
t.Fatalf("no error expected, got: %s", err)
|
||||
}
|
||||
|
||||
actualCode := status.Code(err)
|
||||
if actualCode != test.expectCode {
|
||||
t.Fatalf("Actual code: %s Expected code: %s", actualCode, test.expectCode)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func marshal(t *testing.T, m map[string]interface{}) *structpb.Struct {
|
||||
t.Helper()
|
||||
|
||||
strct, err := mapToStruct(m)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to marshal to protobuf: %s", err)
|
||||
}
|
||||
return strct
|
||||
}
|
||||
|
||||
type badJSONValue struct{}
|
||||
|
||||
func (badJSONValue) MarshalJSON() ([]byte, error) {
|
||||
return nil, fmt.Errorf("this cannot be marshalled to JSON")
|
||||
}
|
||||
|
||||
func (badJSONValue) UnmarshalJSON([]byte) error {
|
||||
return fmt.Errorf("this cannot be unmarshalled from JSON")
|
||||
}
|
||||
|
||||
var _ Database = fakeDatabase{}
|
||||
|
||||
type fakeDatabase struct {
|
||||
initResp InitializeResponse
|
||||
initErr error
|
||||
|
||||
newUserResp NewUserResponse
|
||||
newUserErr error
|
||||
|
||||
updateUserResp UpdateUserResponse
|
||||
updateUserErr error
|
||||
|
||||
deleteUserResp DeleteUserResponse
|
||||
deleteUserErr error
|
||||
|
||||
typeResp string
|
||||
typeErr error
|
||||
|
||||
closeErr error
|
||||
}
|
||||
|
||||
func (e fakeDatabase) Initialize(ctx context.Context, req InitializeRequest) (InitializeResponse, error) {
|
||||
return e.initResp, e.initErr
|
||||
}
|
||||
|
||||
func (e fakeDatabase) NewUser(ctx context.Context, req NewUserRequest) (NewUserResponse, error) {
|
||||
return e.newUserResp, e.newUserErr
|
||||
}
|
||||
|
||||
func (e fakeDatabase) UpdateUser(ctx context.Context, req UpdateUserRequest) (UpdateUserResponse, error) {
|
||||
return e.updateUserResp, e.updateUserErr
|
||||
}
|
||||
|
||||
func (e fakeDatabase) DeleteUser(ctx context.Context, req DeleteUserRequest) (DeleteUserResponse, error) {
|
||||
return e.deleteUserResp, e.deleteUserErr
|
||||
}
|
||||
|
||||
func (e fakeDatabase) Type() (string, error) {
|
||||
return e.typeResp, e.typeErr
|
||||
}
|
||||
|
||||
func (e fakeDatabase) Close() error {
|
||||
return e.closeErr
|
||||
}
|
||||
|
||||
var _ Database = &recordingDatabase{}
|
||||
|
||||
type recordingDatabase struct {
|
||||
initializeCalls int
|
||||
newUserCalls int
|
||||
updateUserCalls int
|
||||
deleteUserCalls int
|
||||
typeCalls int
|
||||
closeCalls int
|
||||
|
||||
// recordingDatabase can act as middleware so we can record the calls to other test Database implementations
|
||||
next Database
|
||||
}
|
||||
|
||||
func (f *recordingDatabase) Initialize(ctx context.Context, req InitializeRequest) (InitializeResponse, error) {
|
||||
f.initializeCalls++
|
||||
if f.next == nil {
|
||||
return InitializeResponse{}, nil
|
||||
}
|
||||
return f.next.Initialize(ctx, req)
|
||||
}
|
||||
|
||||
func (f *recordingDatabase) NewUser(ctx context.Context, req NewUserRequest) (NewUserResponse, error) {
|
||||
f.newUserCalls++
|
||||
if f.next == nil {
|
||||
return NewUserResponse{}, nil
|
||||
}
|
||||
return f.next.NewUser(ctx, req)
|
||||
}
|
||||
|
||||
func (f *recordingDatabase) UpdateUser(ctx context.Context, req UpdateUserRequest) (UpdateUserResponse, error) {
|
||||
f.updateUserCalls++
|
||||
if f.next == nil {
|
||||
return UpdateUserResponse{}, nil
|
||||
}
|
||||
return f.next.UpdateUser(ctx, req)
|
||||
}
|
||||
|
||||
func (f *recordingDatabase) DeleteUser(ctx context.Context, req DeleteUserRequest) (DeleteUserResponse, error) {
|
||||
f.deleteUserCalls++
|
||||
if f.next == nil {
|
||||
return DeleteUserResponse{}, nil
|
||||
}
|
||||
return f.next.DeleteUser(ctx, req)
|
||||
}
|
||||
|
||||
func (f *recordingDatabase) Type() (string, error) {
|
||||
f.typeCalls++
|
||||
if f.next == nil {
|
||||
return "recordingDatabase", nil
|
||||
}
|
||||
return f.next.Type()
|
||||
}
|
||||
|
||||
func (f *recordingDatabase) Close() error {
|
||||
f.closeCalls++
|
||||
if f.next == nil {
|
||||
return nil
|
||||
}
|
||||
return f.next.Close()
|
||||
}
|
||||
36
sdk/database/newdbplugin/marshalling.go
Normal file
36
sdk/database/newdbplugin/marshalling.go
Normal file
@ -0,0 +1,36 @@
|
||||
package newdbplugin
|
||||
|
||||
import (
|
||||
"math"
|
||||
|
||||
"google.golang.org/protobuf/types/known/structpb"
|
||||
)
|
||||
|
||||
func mapToStruct(m map[string]interface{}) (*structpb.Struct, error) {
|
||||
return structpb.NewStruct(m)
|
||||
}
|
||||
|
||||
func structToMap(strct *structpb.Struct) map[string]interface{} {
|
||||
m := strct.AsMap()
|
||||
coerceFloatsToInt(m)
|
||||
return m
|
||||
}
|
||||
|
||||
// coerceFloatsToInt if the floats can be coerced to an integer without losing data
|
||||
func coerceFloatsToInt(m map[string]interface{}) {
|
||||
for k, v := range m {
|
||||
fVal, ok := v.(float64)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if isInt(fVal) {
|
||||
m[k] = int64(fVal)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// isInt attempts to determine if the given floating point number could be represented as an integer without losing data
|
||||
// This does not work for very large floats, however in this usage that's okay since we don't expect numbers that large.
|
||||
func isInt(f float64) bool {
|
||||
return math.Floor(f) == f
|
||||
}
|
||||
1409
sdk/database/newdbplugin/proto/database.pb.go
Normal file
1409
sdk/database/newdbplugin/proto/database.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
95
sdk/database/newdbplugin/proto/database.proto
Normal file
95
sdk/database/newdbplugin/proto/database.proto
Normal file
@ -0,0 +1,95 @@
|
||||
syntax = "proto3";
|
||||
package newdbplugin; // TODO: Update name
|
||||
|
||||
option go_package = "github.com/hashicorp/vault/sdk/database/newdbplugin/proto";
|
||||
|
||||
import "google/protobuf/struct.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
|
||||
/////////////////
|
||||
// Initialize()
|
||||
/////////////////
|
||||
message InitializeRequest {
|
||||
google.protobuf.Struct config_data = 1;
|
||||
bool verify_connection = 2;
|
||||
}
|
||||
|
||||
message InitializeResponse {
|
||||
google.protobuf.Struct config_data = 1;
|
||||
}
|
||||
/////////////////
|
||||
// NewUser()
|
||||
/////////////////
|
||||
|
||||
message NewUserRequest {
|
||||
UsernameConfig username_config = 1;
|
||||
string password = 2;
|
||||
google.protobuf.Timestamp expiration = 3;
|
||||
Statements statements = 4;
|
||||
Statements rollback_statements = 5;
|
||||
}
|
||||
|
||||
message UsernameConfig {
|
||||
string display_name = 1;
|
||||
string role_name = 2;
|
||||
}
|
||||
|
||||
message NewUserResponse {
|
||||
string username = 1;
|
||||
}
|
||||
|
||||
/////////////////
|
||||
// UpdateUser()
|
||||
/////////////////
|
||||
message UpdateUserRequest {
|
||||
string username = 1;
|
||||
ChangePassword password = 2;
|
||||
ChangeExpiration expiration = 3;
|
||||
}
|
||||
|
||||
message ChangePassword {
|
||||
string new_password = 1;
|
||||
Statements statements = 2;
|
||||
}
|
||||
|
||||
message ChangeExpiration {
|
||||
google.protobuf.Timestamp new_expiration = 1;
|
||||
Statements statements = 2;
|
||||
}
|
||||
|
||||
message UpdateUserResponse {}
|
||||
|
||||
/////////////////
|
||||
// DeleteUser()
|
||||
/////////////////
|
||||
message DeleteUserRequest {
|
||||
string username = 1;
|
||||
Statements statements = 2;
|
||||
}
|
||||
|
||||
message DeleteUserResponse {}
|
||||
|
||||
/////////////////
|
||||
// Type()
|
||||
/////////////////
|
||||
message TypeResponse {
|
||||
string Type = 1;
|
||||
}
|
||||
|
||||
/////////////////
|
||||
// General purpose
|
||||
/////////////////
|
||||
message Statements {
|
||||
repeated string Commands = 1;
|
||||
}
|
||||
|
||||
message Empty {}
|
||||
|
||||
service Database {
|
||||
rpc Initialize(InitializeRequest) returns (InitializeResponse);
|
||||
rpc NewUser(NewUserRequest) returns (NewUserResponse);
|
||||
rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
|
||||
rpc DeleteUser(DeleteUserRequest) returns (DeleteUserResponse);
|
||||
rpc Type(Empty) returns (TypeResponse);
|
||||
rpc Close(Empty) returns (Empty);
|
||||
}
|
||||
@ -51,7 +51,7 @@ require (
|
||||
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect
|
||||
google.golang.org/grpc v1.29.1
|
||||
google.golang.org/protobuf v1.24.0
|
||||
google.golang.org/protobuf v1.25.0
|
||||
gopkg.in/square/go-jose.v2 v2.5.1 // indirect
|
||||
gotest.tools/v3 v3.0.2 // indirect
|
||||
)
|
||||
|
||||
@ -122,6 +122,7 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc=
|
||||
@ -406,6 +407,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
|
||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
||||
5
vendor/github.com/hashicorp/vault/sdk/database/dbplugin/plugin.go
generated
vendored
5
vendor/github.com/hashicorp/vault/sdk/database/dbplugin/plugin.go
generated
vendored
@ -67,11 +67,6 @@ type Database interface {
|
||||
// Close attempts to close the underlying database connection that was
|
||||
// established by the backend.
|
||||
Close() error
|
||||
|
||||
// DEPRECATED: Will be removed in a future plugin version bump.
|
||||
// Initialize is a backwards-compatible implementation that simply calls
|
||||
// Init, dropping the saveConfig, and returning the err.
|
||||
Initialize(ctx context.Context, config map[string]interface{}, verifyConnection bool) (err error)
|
||||
}
|
||||
|
||||
// PluginFactory is used to build plugin database types. It wraps the database
|
||||
|
||||
59
vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go
generated
vendored
59
vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go
generated
vendored
@ -19,8 +19,7 @@ import (
|
||||
"google.golang.org/protobuf/compiler/protogen"
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/encoding/tag"
|
||||
"google.golang.org/protobuf/internal/fieldnum"
|
||||
"google.golang.org/protobuf/internal/genname"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/version"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/runtime/protoimpl"
|
||||
@ -37,9 +36,14 @@ var GenerateVersionMarkers = true
|
||||
|
||||
// Standard library dependencies.
|
||||
const (
|
||||
base64Package = protogen.GoImportPath("encoding/base64")
|
||||
mathPackage = protogen.GoImportPath("math")
|
||||
reflectPackage = protogen.GoImportPath("reflect")
|
||||
sortPackage = protogen.GoImportPath("sort")
|
||||
stringsPackage = protogen.GoImportPath("strings")
|
||||
syncPackage = protogen.GoImportPath("sync")
|
||||
timePackage = protogen.GoImportPath("time")
|
||||
utf8Package = protogen.GoImportPath("unicode/utf8")
|
||||
)
|
||||
|
||||
// Protobuf library dependencies.
|
||||
@ -48,11 +52,13 @@ const (
|
||||
// patched to support unique build environments that impose restrictions
|
||||
// on the dependencies of generated source code.
|
||||
var (
|
||||
protoPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/proto")
|
||||
protoifacePackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/runtime/protoiface")
|
||||
protoimplPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/runtime/protoimpl")
|
||||
protoreflectPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/reflect/protoreflect")
|
||||
protoV1Package goImportPath = protogen.GoImportPath("github.com/golang/protobuf/proto")
|
||||
protoPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/proto")
|
||||
protoifacePackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/runtime/protoiface")
|
||||
protoimplPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/runtime/protoimpl")
|
||||
protojsonPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/encoding/protojson")
|
||||
protoreflectPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/reflect/protoreflect")
|
||||
protoregistryPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/reflect/protoregistry")
|
||||
protoV1Package goImportPath = protogen.GoImportPath("github.com/golang/protobuf/proto")
|
||||
)
|
||||
|
||||
type goImportPath interface {
|
||||
@ -66,10 +72,12 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated
|
||||
g := gen.NewGeneratedFile(filename, file.GoImportPath)
|
||||
f := newFileInfo(file)
|
||||
|
||||
genStandaloneComments(g, f, fieldnum.FileDescriptorProto_Syntax)
|
||||
genStandaloneComments(g, f, int32(genid.FileDescriptorProto_Syntax_field_number))
|
||||
genGeneratedHeader(gen, g, f)
|
||||
genStandaloneComments(g, f, fieldnum.FileDescriptorProto_Package)
|
||||
g.P("package ", f.GoPackageName)
|
||||
genStandaloneComments(g, f, int32(genid.FileDescriptorProto_Package_field_number))
|
||||
|
||||
packageDoc := genPackageKnownComment(f)
|
||||
g.P(packageDoc, "package ", f.GoPackageName)
|
||||
g.P()
|
||||
|
||||
// Emit a static check that enforces a minimum version of the proto package.
|
||||
@ -329,6 +337,7 @@ func genMessage(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) {
|
||||
g.P("}")
|
||||
g.P()
|
||||
|
||||
genMessageKnownFunctions(g, f, m)
|
||||
genMessageDefaultDecls(g, f, m)
|
||||
genMessageMethods(g, f, m)
|
||||
genMessageOneofWrapperTypes(g, f, m)
|
||||
@ -343,19 +352,19 @@ func genMessageFields(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) {
|
||||
}
|
||||
|
||||
func genMessageInternalFields(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo, sf *structFields) {
|
||||
g.P(genname.State, " ", protoimplPackage.Ident("MessageState"))
|
||||
sf.append(genname.State)
|
||||
g.P(genname.SizeCache, " ", protoimplPackage.Ident("SizeCache"))
|
||||
sf.append(genname.SizeCache)
|
||||
g.P(genid.State_goname, " ", protoimplPackage.Ident("MessageState"))
|
||||
sf.append(genid.State_goname)
|
||||
g.P(genid.SizeCache_goname, " ", protoimplPackage.Ident("SizeCache"))
|
||||
sf.append(genid.SizeCache_goname)
|
||||
if m.hasWeak {
|
||||
g.P(genname.WeakFields, " ", protoimplPackage.Ident("WeakFields"))
|
||||
sf.append(genname.WeakFields)
|
||||
g.P(genid.WeakFields_goname, " ", protoimplPackage.Ident("WeakFields"))
|
||||
sf.append(genid.WeakFields_goname)
|
||||
}
|
||||
g.P(genname.UnknownFields, " ", protoimplPackage.Ident("UnknownFields"))
|
||||
sf.append(genname.UnknownFields)
|
||||
g.P(genid.UnknownFields_goname, " ", protoimplPackage.Ident("UnknownFields"))
|
||||
sf.append(genid.UnknownFields_goname)
|
||||
if m.Desc.ExtensionRanges().Len() > 0 {
|
||||
g.P(genname.ExtensionFields, " ", protoimplPackage.Ident("ExtensionFields"))
|
||||
sf.append(genname.ExtensionFields)
|
||||
g.P(genid.ExtensionFields_goname, " ", protoimplPackage.Ident("ExtensionFields"))
|
||||
sf.append(genid.ExtensionFields_goname)
|
||||
}
|
||||
if sf.count > 0 {
|
||||
g.P()
|
||||
@ -416,7 +425,7 @@ func genMessageField(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo, fie
|
||||
|
||||
name := field.GoName
|
||||
if field.Desc.IsWeak() {
|
||||
name = genname.WeakFieldPrefix + name
|
||||
name = genid.WeakFieldPrefix_goname + name
|
||||
}
|
||||
g.Annotate(m.GoIdent.GoName+"."+name, field.Location)
|
||||
leadingComments := appendDeprecationSuffix(field.Comments.Leading,
|
||||
@ -577,9 +586,9 @@ func genMessageGetterMethods(g *protogen.GeneratedFile, f *fileInfo, m *messageI
|
||||
g.P(leadingComments, "func (x *", m.GoIdent, ") Get", field.GoName, "() ", protoPackage.Ident("Message"), "{")
|
||||
g.P("var w ", protoimplPackage.Ident("WeakFields"))
|
||||
g.P("if x != nil {")
|
||||
g.P("w = x.", genname.WeakFields)
|
||||
g.P("w = x.", genid.WeakFields_goname)
|
||||
if m.isTracked {
|
||||
g.P("_ = x.", genname.WeakFieldPrefix+field.GoName)
|
||||
g.P("_ = x.", genid.WeakFieldPrefix_goname+field.GoName)
|
||||
}
|
||||
g.P("}")
|
||||
g.P("return ", protoimplPackage.Ident("X"), ".GetWeak(w, ", field.Desc.Number(), ", ", strconv.Quote(string(field.Message.Desc.FullName())), ")")
|
||||
@ -625,9 +634,9 @@ func genMessageSetterMethods(g *protogen.GeneratedFile, f *fileInfo, m *messageI
|
||||
g.P(leadingComments, "func (x *", m.GoIdent, ") Set", field.GoName, "(v ", protoPackage.Ident("Message"), ") {")
|
||||
g.P("var w *", protoimplPackage.Ident("WeakFields"))
|
||||
g.P("if x != nil {")
|
||||
g.P("w = &x.", genname.WeakFields)
|
||||
g.P("w = &x.", genid.WeakFields_goname)
|
||||
if m.isTracked {
|
||||
g.P("_ = x.", genname.WeakFieldPrefix+field.GoName)
|
||||
g.P("_ = x.", genid.WeakFieldPrefix_goname+field.GoName)
|
||||
}
|
||||
g.P("}")
|
||||
g.P(protoimplPackage.Ident("X"), ".SetWeak(w, ", field.Desc.Number(), ", ", strconv.Quote(string(field.Message.Desc.FullName())), ", v)")
|
||||
|
||||
1077
vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/well_known_types.go
generated
vendored
Normal file
1077
vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/well_known_types.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
24
vendor/google.golang.org/protobuf/compiler/protogen/protogen.go
generated
vendored
24
vendor/google.golang.org/protobuf/compiler/protogen/protogen.go
generated
vendored
@ -30,7 +30,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"google.golang.org/protobuf/encoding/prototext"
|
||||
"google.golang.org/protobuf/internal/fieldnum"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/reflect/protodesc"
|
||||
@ -625,9 +625,9 @@ type Enum struct {
|
||||
func newEnum(gen *Plugin, f *File, parent *Message, desc protoreflect.EnumDescriptor) *Enum {
|
||||
var loc Location
|
||||
if parent != nil {
|
||||
loc = parent.Location.appendPath(fieldnum.DescriptorProto_EnumType, int32(desc.Index()))
|
||||
loc = parent.Location.appendPath(int32(genid.DescriptorProto_EnumType_field_number), int32(desc.Index()))
|
||||
} else {
|
||||
loc = f.location(fieldnum.FileDescriptorProto_EnumType, int32(desc.Index()))
|
||||
loc = f.location(int32(genid.FileDescriptorProto_EnumType_field_number), int32(desc.Index()))
|
||||
}
|
||||
enum := &Enum{
|
||||
Desc: desc,
|
||||
@ -664,7 +664,7 @@ func newEnumValue(gen *Plugin, f *File, message *Message, enum *Enum, desc proto
|
||||
parentIdent = message.GoIdent
|
||||
}
|
||||
name := parentIdent.GoName + "_" + string(desc.Name())
|
||||
loc := enum.Location.appendPath(fieldnum.EnumDescriptorProto_Value, int32(desc.Index()))
|
||||
loc := enum.Location.appendPath(int32(genid.EnumDescriptorProto_Value_field_number), int32(desc.Index()))
|
||||
return &EnumValue{
|
||||
Desc: desc,
|
||||
GoIdent: f.GoImportPath.Ident(name),
|
||||
@ -694,9 +694,9 @@ type Message struct {
|
||||
func newMessage(gen *Plugin, f *File, parent *Message, desc protoreflect.MessageDescriptor) *Message {
|
||||
var loc Location
|
||||
if parent != nil {
|
||||
loc = parent.Location.appendPath(fieldnum.DescriptorProto_NestedType, int32(desc.Index()))
|
||||
loc = parent.Location.appendPath(int32(genid.DescriptorProto_NestedType_field_number), int32(desc.Index()))
|
||||
} else {
|
||||
loc = f.location(fieldnum.FileDescriptorProto_MessageType, int32(desc.Index()))
|
||||
loc = f.location(int32(genid.FileDescriptorProto_MessageType_field_number), int32(desc.Index()))
|
||||
}
|
||||
message := &Message{
|
||||
Desc: desc,
|
||||
@ -852,11 +852,11 @@ func newField(gen *Plugin, f *File, message *Message, desc protoreflect.FieldDes
|
||||
var loc Location
|
||||
switch {
|
||||
case desc.IsExtension() && message == nil:
|
||||
loc = f.location(fieldnum.FileDescriptorProto_Extension, int32(desc.Index()))
|
||||
loc = f.location(int32(genid.FileDescriptorProto_Extension_field_number), int32(desc.Index()))
|
||||
case desc.IsExtension() && message != nil:
|
||||
loc = message.Location.appendPath(fieldnum.DescriptorProto_Extension, int32(desc.Index()))
|
||||
loc = message.Location.appendPath(int32(genid.DescriptorProto_Extension_field_number), int32(desc.Index()))
|
||||
default:
|
||||
loc = message.Location.appendPath(fieldnum.DescriptorProto_Field, int32(desc.Index()))
|
||||
loc = message.Location.appendPath(int32(genid.DescriptorProto_Field_field_number), int32(desc.Index()))
|
||||
}
|
||||
camelCased := strs.GoCamelCase(string(desc.Name()))
|
||||
var parentPrefix string
|
||||
@ -927,7 +927,7 @@ type Oneof struct {
|
||||
}
|
||||
|
||||
func newOneof(gen *Plugin, f *File, message *Message, desc protoreflect.OneofDescriptor) *Oneof {
|
||||
loc := message.Location.appendPath(fieldnum.DescriptorProto_OneofDecl, int32(desc.Index()))
|
||||
loc := message.Location.appendPath(int32(genid.DescriptorProto_OneofDecl_field_number), int32(desc.Index()))
|
||||
camelCased := strs.GoCamelCase(string(desc.Name()))
|
||||
parentPrefix := message.GoIdent.GoName + "_"
|
||||
return &Oneof{
|
||||
@ -959,7 +959,7 @@ type Service struct {
|
||||
}
|
||||
|
||||
func newService(gen *Plugin, f *File, desc protoreflect.ServiceDescriptor) *Service {
|
||||
loc := f.location(fieldnum.FileDescriptorProto_Service, int32(desc.Index()))
|
||||
loc := f.location(int32(genid.FileDescriptorProto_Service_field_number), int32(desc.Index()))
|
||||
service := &Service{
|
||||
Desc: desc,
|
||||
GoName: strs.GoCamelCase(string(desc.Name())),
|
||||
@ -988,7 +988,7 @@ type Method struct {
|
||||
}
|
||||
|
||||
func newMethod(gen *Plugin, f *File, service *Service, desc protoreflect.MethodDescriptor) *Method {
|
||||
loc := service.Location.appendPath(fieldnum.ServiceDescriptorProto_Method, int32(desc.Index()))
|
||||
loc := service.Location.appendPath(int32(genid.ServiceDescriptorProto_Method_field_number), int32(desc.Index()))
|
||||
method := &Method{
|
||||
Desc: desc,
|
||||
GoName: strs.GoCamelCase(string(desc.Name())),
|
||||
|
||||
691
vendor/google.golang.org/protobuf/encoding/protojson/decode.go
generated
vendored
Normal file
691
vendor/google.golang.org/protobuf/encoding/protojson/decode.go
generated
vendored
Normal file
@ -0,0 +1,691 @@
|
||||
// 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 protojson
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"math"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"google.golang.org/protobuf/internal/encoding/json"
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/internal/set"
|
||||
"google.golang.org/protobuf/proto"
|
||||
pref "google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
)
|
||||
|
||||
// Unmarshal reads the given []byte into the given proto.Message.
|
||||
func Unmarshal(b []byte, m proto.Message) error {
|
||||
return UnmarshalOptions{}.Unmarshal(b, m)
|
||||
}
|
||||
|
||||
// UnmarshalOptions is a configurable JSON format parser.
|
||||
type UnmarshalOptions struct {
|
||||
pragma.NoUnkeyedLiterals
|
||||
|
||||
// If AllowPartial is set, input for messages that will result in missing
|
||||
// required fields will not return an error.
|
||||
AllowPartial bool
|
||||
|
||||
// If DiscardUnknown is set, unknown fields are ignored.
|
||||
DiscardUnknown bool
|
||||
|
||||
// Resolver is used for looking up types when unmarshaling
|
||||
// google.protobuf.Any messages or extension fields.
|
||||
// If nil, this defaults to using protoregistry.GlobalTypes.
|
||||
Resolver interface {
|
||||
protoregistry.MessageTypeResolver
|
||||
protoregistry.ExtensionTypeResolver
|
||||
}
|
||||
}
|
||||
|
||||
// Unmarshal reads the given []byte and populates the given proto.Message using
|
||||
// options in UnmarshalOptions object. It will clear the message first before
|
||||
// setting the fields. If it returns an error, the given message may be
|
||||
// partially set.
|
||||
func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error {
|
||||
return o.unmarshal(b, m)
|
||||
}
|
||||
|
||||
// unmarshal is a centralized function that all unmarshal operations go through.
|
||||
// For profiling purposes, avoid changing the name of this function or
|
||||
// introducing other code paths for unmarshal that do not go through this.
|
||||
func (o UnmarshalOptions) unmarshal(b []byte, m proto.Message) error {
|
||||
proto.Reset(m)
|
||||
|
||||
if o.Resolver == nil {
|
||||
o.Resolver = protoregistry.GlobalTypes
|
||||
}
|
||||
|
||||
dec := decoder{json.NewDecoder(b), o}
|
||||
if err := dec.unmarshalMessage(m.ProtoReflect(), false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Check for EOF.
|
||||
tok, err := dec.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if tok.Kind() != json.EOF {
|
||||
return dec.unexpectedTokenError(tok)
|
||||
}
|
||||
|
||||
if o.AllowPartial {
|
||||
return nil
|
||||
}
|
||||
return proto.CheckInitialized(m)
|
||||
}
|
||||
|
||||
type decoder struct {
|
||||
*json.Decoder
|
||||
opts UnmarshalOptions
|
||||
}
|
||||
|
||||
// newError returns an error object with position info.
|
||||
func (d decoder) newError(pos int, f string, x ...interface{}) error {
|
||||
line, column := d.Position(pos)
|
||||
head := fmt.Sprintf("(line %d:%d): ", line, column)
|
||||
return errors.New(head+f, x...)
|
||||
}
|
||||
|
||||
// unexpectedTokenError returns a syntax error for the given unexpected token.
|
||||
func (d decoder) unexpectedTokenError(tok json.Token) error {
|
||||
return d.syntaxError(tok.Pos(), "unexpected token %s", tok.RawString())
|
||||
}
|
||||
|
||||
// syntaxError returns a syntax error for given position.
|
||||
func (d decoder) syntaxError(pos int, f string, x ...interface{}) error {
|
||||
line, column := d.Position(pos)
|
||||
head := fmt.Sprintf("syntax error (line %d:%d): ", line, column)
|
||||
return errors.New(head+f, x...)
|
||||
}
|
||||
|
||||
// unmarshalMessage unmarshals a message into the given protoreflect.Message.
|
||||
func (d decoder) unmarshalMessage(m pref.Message, skipTypeURL bool) error {
|
||||
if unmarshal := wellKnownTypeUnmarshaler(m.Descriptor().FullName()); unmarshal != nil {
|
||||
return unmarshal(d, m)
|
||||
}
|
||||
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if tok.Kind() != json.ObjectOpen {
|
||||
return d.unexpectedTokenError(tok)
|
||||
}
|
||||
|
||||
if err := d.unmarshalFields(m, skipTypeURL); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// unmarshalFields unmarshals the fields into the given protoreflect.Message.
|
||||
func (d decoder) unmarshalFields(m pref.Message, skipTypeURL bool) error {
|
||||
messageDesc := m.Descriptor()
|
||||
if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) {
|
||||
return errors.New("no support for proto1 MessageSets")
|
||||
}
|
||||
|
||||
var seenNums set.Ints
|
||||
var seenOneofs set.Ints
|
||||
fieldDescs := messageDesc.Fields()
|
||||
for {
|
||||
// Read field name.
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch tok.Kind() {
|
||||
default:
|
||||
return d.unexpectedTokenError(tok)
|
||||
case json.ObjectClose:
|
||||
return nil
|
||||
case json.Name:
|
||||
// Continue below.
|
||||
}
|
||||
|
||||
name := tok.Name()
|
||||
// Unmarshaling a non-custom embedded message in Any will contain the
|
||||
// JSON field "@type" which should be skipped because it is not a field
|
||||
// of the embedded message, but simply an artifact of the Any format.
|
||||
if skipTypeURL && name == "@type" {
|
||||
d.Read()
|
||||
continue
|
||||
}
|
||||
|
||||
// Get the FieldDescriptor.
|
||||
var fd pref.FieldDescriptor
|
||||
if strings.HasPrefix(name, "[") && strings.HasSuffix(name, "]") {
|
||||
// Only extension names are in [name] format.
|
||||
extName := pref.FullName(name[1 : len(name)-1])
|
||||
extType, err := d.findExtension(extName)
|
||||
if err != nil && err != protoregistry.NotFound {
|
||||
return d.newError(tok.Pos(), "unable to resolve %s: %v", tok.RawString(), err)
|
||||
}
|
||||
if extType != nil {
|
||||
fd = extType.TypeDescriptor()
|
||||
if !messageDesc.ExtensionRanges().Has(fd.Number()) || fd.ContainingMessage().FullName() != messageDesc.FullName() {
|
||||
return d.newError(tok.Pos(), "message %v cannot be extended by %v", messageDesc.FullName(), fd.FullName())
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// The name can either be the JSON name or the proto field name.
|
||||
fd = fieldDescs.ByJSONName(name)
|
||||
if fd == nil {
|
||||
fd = fieldDescs.ByName(pref.Name(name))
|
||||
if fd == nil {
|
||||
// The proto name of a group field is in all lowercase,
|
||||
// while the textual field name is the group message name.
|
||||
gd := fieldDescs.ByName(pref.Name(strings.ToLower(name)))
|
||||
if gd != nil && gd.Kind() == pref.GroupKind && gd.Message().Name() == pref.Name(name) {
|
||||
fd = gd
|
||||
}
|
||||
} else if fd.Kind() == pref.GroupKind && fd.Message().Name() != pref.Name(name) {
|
||||
fd = nil // reset since field name is actually the message name
|
||||
}
|
||||
}
|
||||
}
|
||||
if flags.ProtoLegacy {
|
||||
if fd != nil && fd.IsWeak() && fd.Message().IsPlaceholder() {
|
||||
fd = nil // reset since the weak reference is not linked in
|
||||
}
|
||||
}
|
||||
|
||||
if fd == nil {
|
||||
// Field is unknown.
|
||||
if d.opts.DiscardUnknown {
|
||||
if err := d.skipJSONValue(); err != nil {
|
||||
return err
|
||||
}
|
||||
continue
|
||||
}
|
||||
return d.newError(tok.Pos(), "unknown field %v", tok.RawString())
|
||||
}
|
||||
|
||||
// Do not allow duplicate fields.
|
||||
num := uint64(fd.Number())
|
||||
if seenNums.Has(num) {
|
||||
return d.newError(tok.Pos(), "duplicate field %v", tok.RawString())
|
||||
}
|
||||
seenNums.Set(num)
|
||||
|
||||
// No need to set values for JSON null unless the field type is
|
||||
// google.protobuf.Value or google.protobuf.NullValue.
|
||||
if tok, _ := d.Peek(); tok.Kind() == json.Null && !isKnownValue(fd) && !isNullValue(fd) {
|
||||
d.Read()
|
||||
continue
|
||||
}
|
||||
|
||||
switch {
|
||||
case fd.IsList():
|
||||
list := m.Mutable(fd).List()
|
||||
if err := d.unmarshalList(list, fd); err != nil {
|
||||
return err
|
||||
}
|
||||
case fd.IsMap():
|
||||
mmap := m.Mutable(fd).Map()
|
||||
if err := d.unmarshalMap(mmap, fd); err != nil {
|
||||
return err
|
||||
}
|
||||
default:
|
||||
// If field is a oneof, check if it has already been set.
|
||||
if od := fd.ContainingOneof(); od != nil {
|
||||
idx := uint64(od.Index())
|
||||
if seenOneofs.Has(idx) {
|
||||
return d.newError(tok.Pos(), "error parsing %s, oneof %v is already set", tok.RawString(), od.FullName())
|
||||
}
|
||||
seenOneofs.Set(idx)
|
||||
}
|
||||
|
||||
// Required or optional fields.
|
||||
if err := d.unmarshalSingular(m, fd); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// findExtension returns protoreflect.ExtensionType from the resolver if found.
|
||||
func (d decoder) findExtension(xtName pref.FullName) (pref.ExtensionType, error) {
|
||||
xt, err := d.opts.Resolver.FindExtensionByName(xtName)
|
||||
if err == nil {
|
||||
return xt, nil
|
||||
}
|
||||
return messageset.FindMessageSetExtension(d.opts.Resolver, xtName)
|
||||
}
|
||||
|
||||
func isKnownValue(fd pref.FieldDescriptor) bool {
|
||||
md := fd.Message()
|
||||
return md != nil && md.FullName() == genid.Value_message_fullname
|
||||
}
|
||||
|
||||
func isNullValue(fd pref.FieldDescriptor) bool {
|
||||
ed := fd.Enum()
|
||||
return ed != nil && ed.FullName() == genid.NullValue_enum_fullname
|
||||
}
|
||||
|
||||
// unmarshalSingular unmarshals to the non-repeated field specified
|
||||
// by the given FieldDescriptor.
|
||||
func (d decoder) unmarshalSingular(m pref.Message, fd pref.FieldDescriptor) error {
|
||||
var val pref.Value
|
||||
var err error
|
||||
switch fd.Kind() {
|
||||
case pref.MessageKind, pref.GroupKind:
|
||||
val = m.NewField(fd)
|
||||
err = d.unmarshalMessage(val.Message(), false)
|
||||
default:
|
||||
val, err = d.unmarshalScalar(fd)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
m.Set(fd, val)
|
||||
return nil
|
||||
}
|
||||
|
||||
// unmarshalScalar unmarshals to a scalar/enum protoreflect.Value specified by
|
||||
// the given FieldDescriptor.
|
||||
func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) {
|
||||
const b32 int = 32
|
||||
const b64 int = 64
|
||||
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return pref.Value{}, err
|
||||
}
|
||||
|
||||
kind := fd.Kind()
|
||||
switch kind {
|
||||
case pref.BoolKind:
|
||||
if tok.Kind() == json.Bool {
|
||||
return pref.ValueOfBool(tok.Bool()), nil
|
||||
}
|
||||
|
||||
case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
|
||||
if v, ok := unmarshalInt(tok, b32); ok {
|
||||
return v, nil
|
||||
}
|
||||
|
||||
case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
|
||||
if v, ok := unmarshalInt(tok, b64); ok {
|
||||
return v, nil
|
||||
}
|
||||
|
||||
case pref.Uint32Kind, pref.Fixed32Kind:
|
||||
if v, ok := unmarshalUint(tok, b32); ok {
|
||||
return v, nil
|
||||
}
|
||||
|
||||
case pref.Uint64Kind, pref.Fixed64Kind:
|
||||
if v, ok := unmarshalUint(tok, b64); ok {
|
||||
return v, nil
|
||||
}
|
||||
|
||||
case pref.FloatKind:
|
||||
if v, ok := unmarshalFloat(tok, b32); ok {
|
||||
return v, nil
|
||||
}
|
||||
|
||||
case pref.DoubleKind:
|
||||
if v, ok := unmarshalFloat(tok, b64); ok {
|
||||
return v, nil
|
||||
}
|
||||
|
||||
case pref.StringKind:
|
||||
if tok.Kind() == json.String {
|
||||
return pref.ValueOfString(tok.ParsedString()), nil
|
||||
}
|
||||
|
||||
case pref.BytesKind:
|
||||
if v, ok := unmarshalBytes(tok); ok {
|
||||
return v, nil
|
||||
}
|
||||
|
||||
case pref.EnumKind:
|
||||
if v, ok := unmarshalEnum(tok, fd); ok {
|
||||
return v, nil
|
||||
}
|
||||
|
||||
default:
|
||||
panic(fmt.Sprintf("unmarshalScalar: invalid scalar kind %v", kind))
|
||||
}
|
||||
|
||||
return pref.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString())
|
||||
}
|
||||
|
||||
func unmarshalInt(tok json.Token, bitSize int) (pref.Value, bool) {
|
||||
switch tok.Kind() {
|
||||
case json.Number:
|
||||
return getInt(tok, bitSize)
|
||||
|
||||
case json.String:
|
||||
// Decode number from string.
|
||||
s := strings.TrimSpace(tok.ParsedString())
|
||||
if len(s) != len(tok.ParsedString()) {
|
||||
return pref.Value{}, false
|
||||
}
|
||||
dec := json.NewDecoder([]byte(s))
|
||||
tok, err := dec.Read()
|
||||
if err != nil {
|
||||
return pref.Value{}, false
|
||||
}
|
||||
return getInt(tok, bitSize)
|
||||
}
|
||||
return pref.Value{}, false
|
||||
}
|
||||
|
||||
func getInt(tok json.Token, bitSize int) (pref.Value, bool) {
|
||||
n, ok := tok.Int(bitSize)
|
||||
if !ok {
|
||||
return pref.Value{}, false
|
||||
}
|
||||
if bitSize == 32 {
|
||||
return pref.ValueOfInt32(int32(n)), true
|
||||
}
|
||||
return pref.ValueOfInt64(n), true
|
||||
}
|
||||
|
||||
func unmarshalUint(tok json.Token, bitSize int) (pref.Value, bool) {
|
||||
switch tok.Kind() {
|
||||
case json.Number:
|
||||
return getUint(tok, bitSize)
|
||||
|
||||
case json.String:
|
||||
// Decode number from string.
|
||||
s := strings.TrimSpace(tok.ParsedString())
|
||||
if len(s) != len(tok.ParsedString()) {
|
||||
return pref.Value{}, false
|
||||
}
|
||||
dec := json.NewDecoder([]byte(s))
|
||||
tok, err := dec.Read()
|
||||
if err != nil {
|
||||
return pref.Value{}, false
|
||||
}
|
||||
return getUint(tok, bitSize)
|
||||
}
|
||||
return pref.Value{}, false
|
||||
}
|
||||
|
||||
func getUint(tok json.Token, bitSize int) (pref.Value, bool) {
|
||||
n, ok := tok.Uint(bitSize)
|
||||
if !ok {
|
||||
return pref.Value{}, false
|
||||
}
|
||||
if bitSize == 32 {
|
||||
return pref.ValueOfUint32(uint32(n)), true
|
||||
}
|
||||
return pref.ValueOfUint64(n), true
|
||||
}
|
||||
|
||||
func unmarshalFloat(tok json.Token, bitSize int) (pref.Value, bool) {
|
||||
switch tok.Kind() {
|
||||
case json.Number:
|
||||
return getFloat(tok, bitSize)
|
||||
|
||||
case json.String:
|
||||
s := tok.ParsedString()
|
||||
switch s {
|
||||
case "NaN":
|
||||
if bitSize == 32 {
|
||||
return pref.ValueOfFloat32(float32(math.NaN())), true
|
||||
}
|
||||
return pref.ValueOfFloat64(math.NaN()), true
|
||||
case "Infinity":
|
||||
if bitSize == 32 {
|
||||
return pref.ValueOfFloat32(float32(math.Inf(+1))), true
|
||||
}
|
||||
return pref.ValueOfFloat64(math.Inf(+1)), true
|
||||
case "-Infinity":
|
||||
if bitSize == 32 {
|
||||
return pref.ValueOfFloat32(float32(math.Inf(-1))), true
|
||||
}
|
||||
return pref.ValueOfFloat64(math.Inf(-1)), true
|
||||
}
|
||||
|
||||
// Decode number from string.
|
||||
if len(s) != len(strings.TrimSpace(s)) {
|
||||
return pref.Value{}, false
|
||||
}
|
||||
dec := json.NewDecoder([]byte(s))
|
||||
tok, err := dec.Read()
|
||||
if err != nil {
|
||||
return pref.Value{}, false
|
||||
}
|
||||
return getFloat(tok, bitSize)
|
||||
}
|
||||
return pref.Value{}, false
|
||||
}
|
||||
|
||||
func getFloat(tok json.Token, bitSize int) (pref.Value, bool) {
|
||||
n, ok := tok.Float(bitSize)
|
||||
if !ok {
|
||||
return pref.Value{}, false
|
||||
}
|
||||
if bitSize == 32 {
|
||||
return pref.ValueOfFloat32(float32(n)), true
|
||||
}
|
||||
return pref.ValueOfFloat64(n), true
|
||||
}
|
||||
|
||||
func unmarshalBytes(tok json.Token) (pref.Value, bool) {
|
||||
if tok.Kind() != json.String {
|
||||
return pref.Value{}, false
|
||||
}
|
||||
|
||||
s := tok.ParsedString()
|
||||
enc := base64.StdEncoding
|
||||
if strings.ContainsAny(s, "-_") {
|
||||
enc = base64.URLEncoding
|
||||
}
|
||||
if len(s)%4 != 0 {
|
||||
enc = enc.WithPadding(base64.NoPadding)
|
||||
}
|
||||
b, err := enc.DecodeString(s)
|
||||
if err != nil {
|
||||
return pref.Value{}, false
|
||||
}
|
||||
return pref.ValueOfBytes(b), true
|
||||
}
|
||||
|
||||
func unmarshalEnum(tok json.Token, fd pref.FieldDescriptor) (pref.Value, bool) {
|
||||
switch tok.Kind() {
|
||||
case json.String:
|
||||
// Lookup EnumNumber based on name.
|
||||
s := tok.ParsedString()
|
||||
if enumVal := fd.Enum().Values().ByName(pref.Name(s)); enumVal != nil {
|
||||
return pref.ValueOfEnum(enumVal.Number()), true
|
||||
}
|
||||
|
||||
case json.Number:
|
||||
if n, ok := tok.Int(32); ok {
|
||||
return pref.ValueOfEnum(pref.EnumNumber(n)), true
|
||||
}
|
||||
|
||||
case json.Null:
|
||||
// This is only valid for google.protobuf.NullValue.
|
||||
if isNullValue(fd) {
|
||||
return pref.ValueOfEnum(0), true
|
||||
}
|
||||
}
|
||||
|
||||
return pref.Value{}, false
|
||||
}
|
||||
|
||||
func (d decoder) unmarshalList(list pref.List, fd pref.FieldDescriptor) error {
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if tok.Kind() != json.ArrayOpen {
|
||||
return d.unexpectedTokenError(tok)
|
||||
}
|
||||
|
||||
switch fd.Kind() {
|
||||
case pref.MessageKind, pref.GroupKind:
|
||||
for {
|
||||
tok, err := d.Peek()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if tok.Kind() == json.ArrayClose {
|
||||
d.Read()
|
||||
return nil
|
||||
}
|
||||
|
||||
val := list.NewElement()
|
||||
if err := d.unmarshalMessage(val.Message(), false); err != nil {
|
||||
return err
|
||||
}
|
||||
list.Append(val)
|
||||
}
|
||||
default:
|
||||
for {
|
||||
tok, err := d.Peek()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if tok.Kind() == json.ArrayClose {
|
||||
d.Read()
|
||||
return nil
|
||||
}
|
||||
|
||||
val, err := d.unmarshalScalar(fd)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
list.Append(val)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d decoder) unmarshalMap(mmap pref.Map, fd pref.FieldDescriptor) error {
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if tok.Kind() != json.ObjectOpen {
|
||||
return d.unexpectedTokenError(tok)
|
||||
}
|
||||
|
||||
// Determine ahead whether map entry is a scalar type or a message type in
|
||||
// order to call the appropriate unmarshalMapValue func inside the for loop
|
||||
// below.
|
||||
var unmarshalMapValue func() (pref.Value, error)
|
||||
switch fd.MapValue().Kind() {
|
||||
case pref.MessageKind, pref.GroupKind:
|
||||
unmarshalMapValue = func() (pref.Value, error) {
|
||||
val := mmap.NewValue()
|
||||
if err := d.unmarshalMessage(val.Message(), false); err != nil {
|
||||
return pref.Value{}, err
|
||||
}
|
||||
return val, nil
|
||||
}
|
||||
default:
|
||||
unmarshalMapValue = func() (pref.Value, error) {
|
||||
return d.unmarshalScalar(fd.MapValue())
|
||||
}
|
||||
}
|
||||
|
||||
Loop:
|
||||
for {
|
||||
// Read field name.
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch tok.Kind() {
|
||||
default:
|
||||
return d.unexpectedTokenError(tok)
|
||||
case json.ObjectClose:
|
||||
break Loop
|
||||
case json.Name:
|
||||
// Continue.
|
||||
}
|
||||
|
||||
// Unmarshal field name.
|
||||
pkey, err := d.unmarshalMapKey(tok, fd.MapKey())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Check for duplicate field name.
|
||||
if mmap.Has(pkey) {
|
||||
return d.newError(tok.Pos(), "duplicate map key %v", tok.RawString())
|
||||
}
|
||||
|
||||
// Read and unmarshal field value.
|
||||
pval, err := unmarshalMapValue()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
mmap.Set(pkey, pval)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// unmarshalMapKey converts given token of Name kind into a protoreflect.MapKey.
|
||||
// A map key type is any integral or string type.
|
||||
func (d decoder) unmarshalMapKey(tok json.Token, fd pref.FieldDescriptor) (pref.MapKey, error) {
|
||||
const b32 = 32
|
||||
const b64 = 64
|
||||
const base10 = 10
|
||||
|
||||
name := tok.Name()
|
||||
kind := fd.Kind()
|
||||
switch kind {
|
||||
case pref.StringKind:
|
||||
return pref.ValueOfString(name).MapKey(), nil
|
||||
|
||||
case pref.BoolKind:
|
||||
switch name {
|
||||
case "true":
|
||||
return pref.ValueOfBool(true).MapKey(), nil
|
||||
case "false":
|
||||
return pref.ValueOfBool(false).MapKey(), nil
|
||||
}
|
||||
|
||||
case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
|
||||
if n, err := strconv.ParseInt(name, base10, b32); err == nil {
|
||||
return pref.ValueOfInt32(int32(n)).MapKey(), nil
|
||||
}
|
||||
|
||||
case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
|
||||
if n, err := strconv.ParseInt(name, base10, b64); err == nil {
|
||||
return pref.ValueOfInt64(int64(n)).MapKey(), nil
|
||||
}
|
||||
|
||||
case pref.Uint32Kind, pref.Fixed32Kind:
|
||||
if n, err := strconv.ParseUint(name, base10, b32); err == nil {
|
||||
return pref.ValueOfUint32(uint32(n)).MapKey(), nil
|
||||
}
|
||||
|
||||
case pref.Uint64Kind, pref.Fixed64Kind:
|
||||
if n, err := strconv.ParseUint(name, base10, b64); err == nil {
|
||||
return pref.ValueOfUint64(uint64(n)).MapKey(), nil
|
||||
}
|
||||
|
||||
default:
|
||||
panic(fmt.Sprintf("invalid kind for map key: %v", kind))
|
||||
}
|
||||
|
||||
return pref.MapKey{}, d.newError(tok.Pos(), "invalid value for %v key: %s", kind, tok.RawString())
|
||||
}
|
||||
11
vendor/google.golang.org/protobuf/encoding/protojson/doc.go
generated
vendored
Normal file
11
vendor/google.golang.org/protobuf/encoding/protojson/doc.go
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
// 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 protojson marshals and unmarshals protocol buffer messages as JSON
|
||||
// format. It follows the guide at
|
||||
// https://developers.google.com/protocol-buffers/docs/proto3#json.
|
||||
//
|
||||
// This package produces a different output than the standard "encoding/json"
|
||||
// package, which does not operate correctly on protocol buffer messages.
|
||||
package protojson
|
||||
402
vendor/google.golang.org/protobuf/encoding/protojson/encode.go
generated
vendored
Normal file
402
vendor/google.golang.org/protobuf/encoding/protojson/encode.go
generated
vendored
Normal file
@ -0,0 +1,402 @@
|
||||
// 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 protojson
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
"google.golang.org/protobuf/internal/encoding/json"
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/proto"
|
||||
pref "google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
)
|
||||
|
||||
const defaultIndent = " "
|
||||
|
||||
// Format formats the message as a multiline string.
|
||||
// This function is only intended for human consumption and ignores errors.
|
||||
// Do not depend on the output being stable. It may change over time across
|
||||
// different versions of the program.
|
||||
func Format(m proto.Message) string {
|
||||
return MarshalOptions{Multiline: true}.Format(m)
|
||||
}
|
||||
|
||||
// Marshal writes the given proto.Message in JSON format using default options.
|
||||
// Do not depend on the output being stable. It may change over time across
|
||||
// different versions of the program.
|
||||
func Marshal(m proto.Message) ([]byte, error) {
|
||||
return MarshalOptions{}.Marshal(m)
|
||||
}
|
||||
|
||||
// MarshalOptions is a configurable JSON format marshaler.
|
||||
type MarshalOptions struct {
|
||||
pragma.NoUnkeyedLiterals
|
||||
|
||||
// Multiline specifies whether the marshaler should format the output in
|
||||
// indented-form with every textual element on a new line.
|
||||
// If Indent is an empty string, then an arbitrary indent is chosen.
|
||||
Multiline bool
|
||||
|
||||
// Indent specifies the set of indentation characters to use in a multiline
|
||||
// formatted output such that every entry is preceded by Indent and
|
||||
// terminated by a newline. If non-empty, then Multiline is treated as true.
|
||||
// Indent can only be composed of space or tab characters.
|
||||
Indent string
|
||||
|
||||
// AllowPartial allows messages that have missing required fields to marshal
|
||||
// without returning an error. If AllowPartial is false (the default),
|
||||
// Marshal will return error if there are any missing required fields.
|
||||
AllowPartial bool
|
||||
|
||||
// UseProtoNames uses proto field name instead of lowerCamelCase name in JSON
|
||||
// field names.
|
||||
UseProtoNames bool
|
||||
|
||||
// UseEnumNumbers emits enum values as numbers.
|
||||
UseEnumNumbers bool
|
||||
|
||||
// EmitUnpopulated specifies whether to emit unpopulated fields. It does not
|
||||
// emit unpopulated oneof fields or unpopulated extension fields.
|
||||
// The JSON value emitted for unpopulated fields are as follows:
|
||||
// ╔═══════╤════════════════════════════╗
|
||||
// ║ JSON │ Protobuf field ║
|
||||
// ╠═══════╪════════════════════════════╣
|
||||
// ║ false │ proto3 boolean fields ║
|
||||
// ║ 0 │ proto3 numeric fields ║
|
||||
// ║ "" │ proto3 string/bytes fields ║
|
||||
// ║ null │ proto2 scalar fields ║
|
||||
// ║ null │ message fields ║
|
||||
// ║ [] │ list fields ║
|
||||
// ║ {} │ map fields ║
|
||||
// ╚═══════╧════════════════════════════╝
|
||||
EmitUnpopulated bool
|
||||
|
||||
// Resolver is used for looking up types when expanding google.protobuf.Any
|
||||
// messages. If nil, this defaults to using protoregistry.GlobalTypes.
|
||||
Resolver interface {
|
||||
protoregistry.ExtensionTypeResolver
|
||||
protoregistry.MessageTypeResolver
|
||||
}
|
||||
}
|
||||
|
||||
// Format formats the message as a string.
|
||||
// This method is only intended for human consumption and ignores errors.
|
||||
// Do not depend on the output being stable. It may change over time across
|
||||
// different versions of the program.
|
||||
func (o MarshalOptions) Format(m proto.Message) string {
|
||||
if m == nil || !m.ProtoReflect().IsValid() {
|
||||
return "<nil>" // invalid syntax, but okay since this is for debugging
|
||||
}
|
||||
o.AllowPartial = true
|
||||
b, _ := o.Marshal(m)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
// Marshal marshals the given proto.Message in the JSON format using options in
|
||||
// MarshalOptions. Do not depend on the output being stable. It may change over
|
||||
// time across different versions of the program.
|
||||
func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) {
|
||||
return o.marshal(m)
|
||||
}
|
||||
|
||||
// marshal is a centralized function that all marshal operations go through.
|
||||
// For profiling purposes, avoid changing the name of this function or
|
||||
// introducing other code paths for marshal that do not go through this.
|
||||
func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) {
|
||||
if o.Multiline && o.Indent == "" {
|
||||
o.Indent = defaultIndent
|
||||
}
|
||||
if o.Resolver == nil {
|
||||
o.Resolver = protoregistry.GlobalTypes
|
||||
}
|
||||
|
||||
internalEnc, err := json.NewEncoder(o.Indent)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Treat nil message interface as an empty message,
|
||||
// in which case the output in an empty JSON object.
|
||||
if m == nil {
|
||||
return []byte("{}"), nil
|
||||
}
|
||||
|
||||
enc := encoder{internalEnc, o}
|
||||
if err := enc.marshalMessage(m.ProtoReflect()); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if o.AllowPartial {
|
||||
return enc.Bytes(), nil
|
||||
}
|
||||
return enc.Bytes(), proto.CheckInitialized(m)
|
||||
}
|
||||
|
||||
type encoder struct {
|
||||
*json.Encoder
|
||||
opts MarshalOptions
|
||||
}
|
||||
|
||||
// marshalMessage marshals the given protoreflect.Message.
|
||||
func (e encoder) marshalMessage(m pref.Message) error {
|
||||
if marshal := wellKnownTypeMarshaler(m.Descriptor().FullName()); marshal != nil {
|
||||
return marshal(e, m)
|
||||
}
|
||||
|
||||
e.StartObject()
|
||||
defer e.EndObject()
|
||||
if err := e.marshalFields(m); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// marshalFields marshals the fields in the given protoreflect.Message.
|
||||
func (e encoder) marshalFields(m pref.Message) error {
|
||||
messageDesc := m.Descriptor()
|
||||
if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) {
|
||||
return errors.New("no support for proto1 MessageSets")
|
||||
}
|
||||
|
||||
// Marshal out known fields.
|
||||
fieldDescs := messageDesc.Fields()
|
||||
for i := 0; i < fieldDescs.Len(); {
|
||||
fd := fieldDescs.Get(i)
|
||||
if od := fd.ContainingOneof(); od != nil {
|
||||
fd = m.WhichOneof(od)
|
||||
i += od.Fields().Len()
|
||||
if fd == nil {
|
||||
continue // unpopulated oneofs are not affected by EmitUnpopulated
|
||||
}
|
||||
} else {
|
||||
i++
|
||||
}
|
||||
|
||||
val := m.Get(fd)
|
||||
if !m.Has(fd) {
|
||||
if !e.opts.EmitUnpopulated {
|
||||
continue
|
||||
}
|
||||
isProto2Scalar := fd.Syntax() == pref.Proto2 && fd.Default().IsValid()
|
||||
isSingularMessage := fd.Cardinality() != pref.Repeated && fd.Message() != nil
|
||||
if isProto2Scalar || isSingularMessage {
|
||||
// Use invalid value to emit null.
|
||||
val = pref.Value{}
|
||||
}
|
||||
}
|
||||
|
||||
name := fd.JSONName()
|
||||
if e.opts.UseProtoNames {
|
||||
name = string(fd.Name())
|
||||
// Use type name for group field name.
|
||||
if fd.Kind() == pref.GroupKind {
|
||||
name = string(fd.Message().Name())
|
||||
}
|
||||
}
|
||||
if err := e.WriteName(name); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := e.marshalValue(val, fd); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Marshal out extensions.
|
||||
if err := e.marshalExtensions(m); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// marshalValue marshals the given protoreflect.Value.
|
||||
func (e encoder) marshalValue(val pref.Value, fd pref.FieldDescriptor) error {
|
||||
switch {
|
||||
case fd.IsList():
|
||||
return e.marshalList(val.List(), fd)
|
||||
case fd.IsMap():
|
||||
return e.marshalMap(val.Map(), fd)
|
||||
default:
|
||||
return e.marshalSingular(val, fd)
|
||||
}
|
||||
}
|
||||
|
||||
// marshalSingular marshals the given non-repeated field value. This includes
|
||||
// all scalar types, enums, messages, and groups.
|
||||
func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error {
|
||||
if !val.IsValid() {
|
||||
e.WriteNull()
|
||||
return nil
|
||||
}
|
||||
|
||||
switch kind := fd.Kind(); kind {
|
||||
case pref.BoolKind:
|
||||
e.WriteBool(val.Bool())
|
||||
|
||||
case pref.StringKind:
|
||||
if e.WriteString(val.String()) != nil {
|
||||
return errors.InvalidUTF8(string(fd.FullName()))
|
||||
}
|
||||
|
||||
case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
|
||||
e.WriteInt(val.Int())
|
||||
|
||||
case pref.Uint32Kind, pref.Fixed32Kind:
|
||||
e.WriteUint(val.Uint())
|
||||
|
||||
case pref.Int64Kind, pref.Sint64Kind, pref.Uint64Kind,
|
||||
pref.Sfixed64Kind, pref.Fixed64Kind:
|
||||
// 64-bit integers are written out as JSON string.
|
||||
e.WriteString(val.String())
|
||||
|
||||
case pref.FloatKind:
|
||||
// Encoder.WriteFloat handles the special numbers NaN and infinites.
|
||||
e.WriteFloat(val.Float(), 32)
|
||||
|
||||
case pref.DoubleKind:
|
||||
// Encoder.WriteFloat handles the special numbers NaN and infinites.
|
||||
e.WriteFloat(val.Float(), 64)
|
||||
|
||||
case pref.BytesKind:
|
||||
e.WriteString(base64.StdEncoding.EncodeToString(val.Bytes()))
|
||||
|
||||
case pref.EnumKind:
|
||||
if fd.Enum().FullName() == genid.NullValue_enum_fullname {
|
||||
e.WriteNull()
|
||||
} else {
|
||||
desc := fd.Enum().Values().ByNumber(val.Enum())
|
||||
if e.opts.UseEnumNumbers || desc == nil {
|
||||
e.WriteInt(int64(val.Enum()))
|
||||
} else {
|
||||
e.WriteString(string(desc.Name()))
|
||||
}
|
||||
}
|
||||
|
||||
case pref.MessageKind, pref.GroupKind:
|
||||
if err := e.marshalMessage(val.Message()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
default:
|
||||
panic(fmt.Sprintf("%v has unknown kind: %v", fd.FullName(), kind))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// marshalList marshals the given protoreflect.List.
|
||||
func (e encoder) marshalList(list pref.List, fd pref.FieldDescriptor) error {
|
||||
e.StartArray()
|
||||
defer e.EndArray()
|
||||
|
||||
for i := 0; i < list.Len(); i++ {
|
||||
item := list.Get(i)
|
||||
if err := e.marshalSingular(item, fd); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type mapEntry struct {
|
||||
key pref.MapKey
|
||||
value pref.Value
|
||||
}
|
||||
|
||||
// marshalMap marshals given protoreflect.Map.
|
||||
func (e encoder) marshalMap(mmap pref.Map, fd pref.FieldDescriptor) error {
|
||||
e.StartObject()
|
||||
defer e.EndObject()
|
||||
|
||||
// Get a sorted list based on keyType first.
|
||||
entries := make([]mapEntry, 0, mmap.Len())
|
||||
mmap.Range(func(key pref.MapKey, val pref.Value) bool {
|
||||
entries = append(entries, mapEntry{key: key, value: val})
|
||||
return true
|
||||
})
|
||||
sortMap(fd.MapKey().Kind(), entries)
|
||||
|
||||
// Write out sorted list.
|
||||
for _, entry := range entries {
|
||||
if err := e.WriteName(entry.key.String()); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := e.marshalSingular(entry.value, fd.MapValue()); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// sortMap orders list based on value of key field for deterministic ordering.
|
||||
func sortMap(keyKind pref.Kind, values []mapEntry) {
|
||||
sort.Slice(values, func(i, j int) bool {
|
||||
switch keyKind {
|
||||
case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind,
|
||||
pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
|
||||
return values[i].key.Int() < values[j].key.Int()
|
||||
|
||||
case pref.Uint32Kind, pref.Fixed32Kind,
|
||||
pref.Uint64Kind, pref.Fixed64Kind:
|
||||
return values[i].key.Uint() < values[j].key.Uint()
|
||||
}
|
||||
return values[i].key.String() < values[j].key.String()
|
||||
})
|
||||
}
|
||||
|
||||
// marshalExtensions marshals extension fields.
|
||||
func (e encoder) marshalExtensions(m pref.Message) error {
|
||||
type entry struct {
|
||||
key string
|
||||
value pref.Value
|
||||
desc pref.FieldDescriptor
|
||||
}
|
||||
|
||||
// Get a sorted list based on field key first.
|
||||
var entries []entry
|
||||
m.Range(func(fd pref.FieldDescriptor, v pref.Value) bool {
|
||||
if !fd.IsExtension() {
|
||||
return true
|
||||
}
|
||||
|
||||
// For MessageSet extensions, the name used is the parent message.
|
||||
name := fd.FullName()
|
||||
if messageset.IsMessageSetExtension(fd) {
|
||||
name = name.Parent()
|
||||
}
|
||||
|
||||
// Use [name] format for JSON field name.
|
||||
entries = append(entries, entry{
|
||||
key: string(name),
|
||||
value: v,
|
||||
desc: fd,
|
||||
})
|
||||
return true
|
||||
})
|
||||
|
||||
// Sort extensions lexicographically.
|
||||
sort.Slice(entries, func(i, j int) bool {
|
||||
return entries[i].key < entries[j].key
|
||||
})
|
||||
|
||||
// Write out sorted list.
|
||||
for _, entry := range entries {
|
||||
// JSON field name is the proto field name enclosed in [], similar to
|
||||
// textproto. This is consistent with Go v1 lib. C++ lib v3.7.0 does not
|
||||
// marshal out extension fields.
|
||||
if err := e.WriteName("[" + entry.key + "]"); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := e.marshalValue(entry.value, entry.desc); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
885
vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go
generated
vendored
Normal file
885
vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go
generated
vendored
Normal file
@ -0,0 +1,885 @@
|
||||
// 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 protojson
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"google.golang.org/protobuf/internal/encoding/json"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/proto"
|
||||
pref "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type marshalFunc func(encoder, pref.Message) error
|
||||
|
||||
// wellKnownTypeMarshaler returns a marshal function if the message type
|
||||
// has specialized serialization behavior. It returns nil otherwise.
|
||||
func wellKnownTypeMarshaler(name pref.FullName) marshalFunc {
|
||||
if name.Parent() == genid.GoogleProtobuf_package {
|
||||
switch name.Name() {
|
||||
case genid.Any_message_name:
|
||||
return encoder.marshalAny
|
||||
case genid.Timestamp_message_name:
|
||||
return encoder.marshalTimestamp
|
||||
case genid.Duration_message_name:
|
||||
return encoder.marshalDuration
|
||||
case genid.BoolValue_message_name,
|
||||
genid.Int32Value_message_name,
|
||||
genid.Int64Value_message_name,
|
||||
genid.UInt32Value_message_name,
|
||||
genid.UInt64Value_message_name,
|
||||
genid.FloatValue_message_name,
|
||||
genid.DoubleValue_message_name,
|
||||
genid.StringValue_message_name,
|
||||
genid.BytesValue_message_name:
|
||||
return encoder.marshalWrapperType
|
||||
case genid.Struct_message_name:
|
||||
return encoder.marshalStruct
|
||||
case genid.ListValue_message_name:
|
||||
return encoder.marshalListValue
|
||||
case genid.Value_message_name:
|
||||
return encoder.marshalKnownValue
|
||||
case genid.FieldMask_message_name:
|
||||
return encoder.marshalFieldMask
|
||||
case genid.Empty_message_name:
|
||||
return encoder.marshalEmpty
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type unmarshalFunc func(decoder, pref.Message) error
|
||||
|
||||
// wellKnownTypeUnmarshaler returns a unmarshal function if the message type
|
||||
// has specialized serialization behavior. It returns nil otherwise.
|
||||
func wellKnownTypeUnmarshaler(name pref.FullName) unmarshalFunc {
|
||||
if name.Parent() == genid.GoogleProtobuf_package {
|
||||
switch name.Name() {
|
||||
case genid.Any_message_name:
|
||||
return decoder.unmarshalAny
|
||||
case genid.Timestamp_message_name:
|
||||
return decoder.unmarshalTimestamp
|
||||
case genid.Duration_message_name:
|
||||
return decoder.unmarshalDuration
|
||||
case genid.BoolValue_message_name,
|
||||
genid.Int32Value_message_name,
|
||||
genid.Int64Value_message_name,
|
||||
genid.UInt32Value_message_name,
|
||||
genid.UInt64Value_message_name,
|
||||
genid.FloatValue_message_name,
|
||||
genid.DoubleValue_message_name,
|
||||
genid.StringValue_message_name,
|
||||
genid.BytesValue_message_name:
|
||||
return decoder.unmarshalWrapperType
|
||||
case genid.Struct_message_name:
|
||||
return decoder.unmarshalStruct
|
||||
case genid.ListValue_message_name:
|
||||
return decoder.unmarshalListValue
|
||||
case genid.Value_message_name:
|
||||
return decoder.unmarshalKnownValue
|
||||
case genid.FieldMask_message_name:
|
||||
return decoder.unmarshalFieldMask
|
||||
case genid.Empty_message_name:
|
||||
return decoder.unmarshalEmpty
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// The JSON representation of an Any message uses the regular representation of
|
||||
// the deserialized, embedded message, with an additional field `@type` which
|
||||
// contains the type URL. If the embedded message type is well-known and has a
|
||||
// custom JSON representation, that representation will be embedded adding a
|
||||
// field `value` which holds the custom JSON in addition to the `@type` field.
|
||||
|
||||
func (e encoder) marshalAny(m pref.Message) error {
|
||||
fds := m.Descriptor().Fields()
|
||||
fdType := fds.ByNumber(genid.Any_TypeUrl_field_number)
|
||||
fdValue := fds.ByNumber(genid.Any_Value_field_number)
|
||||
|
||||
// Start writing the JSON object.
|
||||
e.StartObject()
|
||||
defer e.EndObject()
|
||||
|
||||
if !m.Has(fdType) {
|
||||
if !m.Has(fdValue) {
|
||||
// If message is empty, marshal out empty JSON object.
|
||||
return nil
|
||||
} else {
|
||||
// Return error if type_url field is not set, but value is set.
|
||||
return errors.New("%s: %v is not set", genid.Any_message_fullname, genid.Any_TypeUrl_field_name)
|
||||
}
|
||||
}
|
||||
|
||||
typeVal := m.Get(fdType)
|
||||
valueVal := m.Get(fdValue)
|
||||
|
||||
// Marshal out @type field.
|
||||
typeURL := typeVal.String()
|
||||
e.WriteName("@type")
|
||||
if err := e.WriteString(typeURL); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Resolve the type in order to unmarshal value field.
|
||||
emt, err := e.opts.Resolver.FindMessageByURL(typeURL)
|
||||
if err != nil {
|
||||
return errors.New("%s: unable to resolve %q: %v", genid.Any_message_fullname, typeURL, err)
|
||||
}
|
||||
|
||||
em := emt.New()
|
||||
err = proto.UnmarshalOptions{
|
||||
AllowPartial: true, // never check required fields inside an Any
|
||||
Resolver: e.opts.Resolver,
|
||||
}.Unmarshal(valueVal.Bytes(), em.Interface())
|
||||
if err != nil {
|
||||
return errors.New("%s: unable to unmarshal %q: %v", genid.Any_message_fullname, typeURL, err)
|
||||
}
|
||||
|
||||
// If type of value has custom JSON encoding, marshal out a field "value"
|
||||
// with corresponding custom JSON encoding of the embedded message as a
|
||||
// field.
|
||||
if marshal := wellKnownTypeMarshaler(emt.Descriptor().FullName()); marshal != nil {
|
||||
e.WriteName("value")
|
||||
return marshal(e, em)
|
||||
}
|
||||
|
||||
// Else, marshal out the embedded message's fields in this Any object.
|
||||
if err := e.marshalFields(em); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d decoder) unmarshalAny(m pref.Message) error {
|
||||
// Peek to check for json.ObjectOpen to avoid advancing a read.
|
||||
start, err := d.Peek()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if start.Kind() != json.ObjectOpen {
|
||||
return d.unexpectedTokenError(start)
|
||||
}
|
||||
|
||||
// Use another decoder to parse the unread bytes for @type field. This
|
||||
// avoids advancing a read from current decoder because the current JSON
|
||||
// object may contain the fields of the embedded type.
|
||||
dec := decoder{d.Clone(), UnmarshalOptions{}}
|
||||
tok, err := findTypeURL(dec)
|
||||
switch err {
|
||||
case errEmptyObject:
|
||||
// An empty JSON object translates to an empty Any message.
|
||||
d.Read() // Read json.ObjectOpen.
|
||||
d.Read() // Read json.ObjectClose.
|
||||
return nil
|
||||
|
||||
case errMissingType:
|
||||
if d.opts.DiscardUnknown {
|
||||
// Treat all fields as unknowns, similar to an empty object.
|
||||
return d.skipJSONValue()
|
||||
}
|
||||
// Use start.Pos() for line position.
|
||||
return d.newError(start.Pos(), err.Error())
|
||||
|
||||
default:
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
typeURL := tok.ParsedString()
|
||||
emt, err := d.opts.Resolver.FindMessageByURL(typeURL)
|
||||
if err != nil {
|
||||
return d.newError(tok.Pos(), "unable to resolve %v: %q", tok.RawString(), err)
|
||||
}
|
||||
|
||||
// Create new message for the embedded message type and unmarshal into it.
|
||||
em := emt.New()
|
||||
if unmarshal := wellKnownTypeUnmarshaler(emt.Descriptor().FullName()); unmarshal != nil {
|
||||
// If embedded message is a custom type,
|
||||
// unmarshal the JSON "value" field into it.
|
||||
if err := d.unmarshalAnyValue(unmarshal, em); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
// Else unmarshal the current JSON object into it.
|
||||
if err := d.unmarshalMessage(em, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
// Serialize the embedded message and assign the resulting bytes to the
|
||||
// proto value field.
|
||||
b, err := proto.MarshalOptions{
|
||||
AllowPartial: true, // No need to check required fields inside an Any.
|
||||
Deterministic: true,
|
||||
}.Marshal(em.Interface())
|
||||
if err != nil {
|
||||
return d.newError(start.Pos(), "error in marshaling Any.value field: %v", err)
|
||||
}
|
||||
|
||||
fds := m.Descriptor().Fields()
|
||||
fdType := fds.ByNumber(genid.Any_TypeUrl_field_number)
|
||||
fdValue := fds.ByNumber(genid.Any_Value_field_number)
|
||||
|
||||
m.Set(fdType, pref.ValueOfString(typeURL))
|
||||
m.Set(fdValue, pref.ValueOfBytes(b))
|
||||
return nil
|
||||
}
|
||||
|
||||
var errEmptyObject = fmt.Errorf(`empty object`)
|
||||
var errMissingType = fmt.Errorf(`missing "@type" field`)
|
||||
|
||||
// findTypeURL returns the token for the "@type" field value from the given
|
||||
// JSON bytes. It is expected that the given bytes start with json.ObjectOpen.
|
||||
// It returns errEmptyObject if the JSON object is empty or errMissingType if
|
||||
// @type field does not exist. It returns other error if the @type field is not
|
||||
// valid or other decoding issues.
|
||||
func findTypeURL(d decoder) (json.Token, error) {
|
||||
var typeURL string
|
||||
var typeTok json.Token
|
||||
numFields := 0
|
||||
// Skip start object.
|
||||
d.Read()
|
||||
|
||||
Loop:
|
||||
for {
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return json.Token{}, err
|
||||
}
|
||||
|
||||
switch tok.Kind() {
|
||||
case json.ObjectClose:
|
||||
if typeURL == "" {
|
||||
// Did not find @type field.
|
||||
if numFields > 0 {
|
||||
return json.Token{}, errMissingType
|
||||
}
|
||||
return json.Token{}, errEmptyObject
|
||||
}
|
||||
break Loop
|
||||
|
||||
case json.Name:
|
||||
numFields++
|
||||
if tok.Name() != "@type" {
|
||||
// Skip value.
|
||||
if err := d.skipJSONValue(); err != nil {
|
||||
return json.Token{}, err
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
// Return error if this was previously set already.
|
||||
if typeURL != "" {
|
||||
return json.Token{}, d.newError(tok.Pos(), `duplicate "@type" field`)
|
||||
}
|
||||
// Read field value.
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return json.Token{}, err
|
||||
}
|
||||
if tok.Kind() != json.String {
|
||||
return json.Token{}, d.newError(tok.Pos(), `@type field value is not a string: %v`, tok.RawString())
|
||||
}
|
||||
typeURL = tok.ParsedString()
|
||||
if typeURL == "" {
|
||||
return json.Token{}, d.newError(tok.Pos(), `@type field contains empty value`)
|
||||
}
|
||||
typeTok = tok
|
||||
}
|
||||
}
|
||||
|
||||
return typeTok, nil
|
||||
}
|
||||
|
||||
// skipJSONValue parses a JSON value (null, boolean, string, number, object and
|
||||
// array) in order to advance the read to the next JSON value. It relies on
|
||||
// the decoder returning an error if the types are not in valid sequence.
|
||||
func (d decoder) skipJSONValue() error {
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// Only need to continue reading for objects and arrays.
|
||||
switch tok.Kind() {
|
||||
case json.ObjectOpen:
|
||||
for {
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch tok.Kind() {
|
||||
case json.ObjectClose:
|
||||
return nil
|
||||
case json.Name:
|
||||
// Skip object field value.
|
||||
if err := d.skipJSONValue(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case json.ArrayOpen:
|
||||
for {
|
||||
tok, err := d.Peek()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch tok.Kind() {
|
||||
case json.ArrayClose:
|
||||
d.Read()
|
||||
return nil
|
||||
default:
|
||||
// Skip array item.
|
||||
if err := d.skipJSONValue(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// unmarshalAnyValue unmarshals the given custom-type message from the JSON
|
||||
// object's "value" field.
|
||||
func (d decoder) unmarshalAnyValue(unmarshal unmarshalFunc, m pref.Message) error {
|
||||
// Skip ObjectOpen, and start reading the fields.
|
||||
d.Read()
|
||||
|
||||
var found bool // Used for detecting duplicate "value".
|
||||
for {
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch tok.Kind() {
|
||||
case json.ObjectClose:
|
||||
if !found {
|
||||
return d.newError(tok.Pos(), `missing "value" field`)
|
||||
}
|
||||
return nil
|
||||
|
||||
case json.Name:
|
||||
switch tok.Name() {
|
||||
case "@type":
|
||||
// Skip the value as this was previously parsed already.
|
||||
d.Read()
|
||||
|
||||
case "value":
|
||||
if found {
|
||||
return d.newError(tok.Pos(), `duplicate "value" field`)
|
||||
}
|
||||
// Unmarshal the field value into the given message.
|
||||
if err := unmarshal(d, m); err != nil {
|
||||
return err
|
||||
}
|
||||
found = true
|
||||
|
||||
default:
|
||||
if d.opts.DiscardUnknown {
|
||||
if err := d.skipJSONValue(); err != nil {
|
||||
return err
|
||||
}
|
||||
continue
|
||||
}
|
||||
return d.newError(tok.Pos(), "unknown field %v", tok.RawString())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Wrapper types are encoded as JSON primitives like string, number or boolean.
|
||||
|
||||
func (e encoder) marshalWrapperType(m pref.Message) error {
|
||||
fd := m.Descriptor().Fields().ByNumber(genid.WrapperValue_Value_field_number)
|
||||
val := m.Get(fd)
|
||||
return e.marshalSingular(val, fd)
|
||||
}
|
||||
|
||||
func (d decoder) unmarshalWrapperType(m pref.Message) error {
|
||||
fd := m.Descriptor().Fields().ByNumber(genid.WrapperValue_Value_field_number)
|
||||
val, err := d.unmarshalScalar(fd)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
m.Set(fd, val)
|
||||
return nil
|
||||
}
|
||||
|
||||
// The JSON representation for Empty is an empty JSON object.
|
||||
|
||||
func (e encoder) marshalEmpty(pref.Message) error {
|
||||
e.StartObject()
|
||||
e.EndObject()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d decoder) unmarshalEmpty(pref.Message) error {
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if tok.Kind() != json.ObjectOpen {
|
||||
return d.unexpectedTokenError(tok)
|
||||
}
|
||||
|
||||
for {
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch tok.Kind() {
|
||||
case json.ObjectClose:
|
||||
return nil
|
||||
|
||||
case json.Name:
|
||||
if d.opts.DiscardUnknown {
|
||||
if err := d.skipJSONValue(); err != nil {
|
||||
return err
|
||||
}
|
||||
continue
|
||||
}
|
||||
return d.newError(tok.Pos(), "unknown field %v", tok.RawString())
|
||||
|
||||
default:
|
||||
return d.unexpectedTokenError(tok)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The JSON representation for Struct is a JSON object that contains the encoded
|
||||
// Struct.fields map and follows the serialization rules for a map.
|
||||
|
||||
func (e encoder) marshalStruct(m pref.Message) error {
|
||||
fd := m.Descriptor().Fields().ByNumber(genid.Struct_Fields_field_number)
|
||||
return e.marshalMap(m.Get(fd).Map(), fd)
|
||||
}
|
||||
|
||||
func (d decoder) unmarshalStruct(m pref.Message) error {
|
||||
fd := m.Descriptor().Fields().ByNumber(genid.Struct_Fields_field_number)
|
||||
return d.unmarshalMap(m.Mutable(fd).Map(), fd)
|
||||
}
|
||||
|
||||
// The JSON representation for ListValue is JSON array that contains the encoded
|
||||
// ListValue.values repeated field and follows the serialization rules for a
|
||||
// repeated field.
|
||||
|
||||
func (e encoder) marshalListValue(m pref.Message) error {
|
||||
fd := m.Descriptor().Fields().ByNumber(genid.ListValue_Values_field_number)
|
||||
return e.marshalList(m.Get(fd).List(), fd)
|
||||
}
|
||||
|
||||
func (d decoder) unmarshalListValue(m pref.Message) error {
|
||||
fd := m.Descriptor().Fields().ByNumber(genid.ListValue_Values_field_number)
|
||||
return d.unmarshalList(m.Mutable(fd).List(), fd)
|
||||
}
|
||||
|
||||
// The JSON representation for a Value is dependent on the oneof field that is
|
||||
// set. Each of the field in the oneof has its own custom serialization rule. A
|
||||
// Value message needs to be a oneof field set, else it is an error.
|
||||
|
||||
func (e encoder) marshalKnownValue(m pref.Message) error {
|
||||
od := m.Descriptor().Oneofs().ByName(genid.Value_Kind_oneof_name)
|
||||
fd := m.WhichOneof(od)
|
||||
if fd == nil {
|
||||
return errors.New("%s: none of the oneof fields is set", genid.Value_message_fullname)
|
||||
}
|
||||
return e.marshalSingular(m.Get(fd), fd)
|
||||
}
|
||||
|
||||
func (d decoder) unmarshalKnownValue(m pref.Message) error {
|
||||
tok, err := d.Peek()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var fd pref.FieldDescriptor
|
||||
var val pref.Value
|
||||
switch tok.Kind() {
|
||||
case json.Null:
|
||||
d.Read()
|
||||
fd = m.Descriptor().Fields().ByNumber(genid.Value_NullValue_field_number)
|
||||
val = pref.ValueOfEnum(0)
|
||||
|
||||
case json.Bool:
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fd = m.Descriptor().Fields().ByNumber(genid.Value_BoolValue_field_number)
|
||||
val = pref.ValueOfBool(tok.Bool())
|
||||
|
||||
case json.Number:
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fd = m.Descriptor().Fields().ByNumber(genid.Value_NumberValue_field_number)
|
||||
var ok bool
|
||||
val, ok = unmarshalFloat(tok, 64)
|
||||
if !ok {
|
||||
return d.newError(tok.Pos(), "invalid %v: %v", genid.Value_message_fullname, tok.RawString())
|
||||
}
|
||||
|
||||
case json.String:
|
||||
// A JSON string may have been encoded from the number_value field,
|
||||
// e.g. "NaN", "Infinity", etc. Parsing a proto double type also allows
|
||||
// for it to be in JSON string form. Given this custom encoding spec,
|
||||
// however, there is no way to identify that and hence a JSON string is
|
||||
// always assigned to the string_value field, which means that certain
|
||||
// encoding cannot be parsed back to the same field.
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fd = m.Descriptor().Fields().ByNumber(genid.Value_StringValue_field_number)
|
||||
val = pref.ValueOfString(tok.ParsedString())
|
||||
|
||||
case json.ObjectOpen:
|
||||
fd = m.Descriptor().Fields().ByNumber(genid.Value_StructValue_field_number)
|
||||
val = m.NewField(fd)
|
||||
if err := d.unmarshalStruct(val.Message()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
case json.ArrayOpen:
|
||||
fd = m.Descriptor().Fields().ByNumber(genid.Value_ListValue_field_number)
|
||||
val = m.NewField(fd)
|
||||
if err := d.unmarshalListValue(val.Message()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
default:
|
||||
return d.newError(tok.Pos(), "invalid %v: %v", genid.Value_message_fullname, tok.RawString())
|
||||
}
|
||||
|
||||
m.Set(fd, val)
|
||||
return nil
|
||||
}
|
||||
|
||||
// The JSON representation for a Duration is a JSON string that ends in the
|
||||
// suffix "s" (indicating seconds) and is preceded by the number of seconds,
|
||||
// with nanoseconds expressed as fractional seconds.
|
||||
//
|
||||
// Durations less than one second are represented with a 0 seconds field and a
|
||||
// positive or negative nanos field. For durations of one second or more, a
|
||||
// non-zero value for the nanos field must be of the same sign as the seconds
|
||||
// field.
|
||||
//
|
||||
// Duration.seconds must be from -315,576,000,000 to +315,576,000,000 inclusive.
|
||||
// Duration.nanos must be from -999,999,999 to +999,999,999 inclusive.
|
||||
|
||||
const (
|
||||
secondsInNanos = 999999999
|
||||
maxSecondsInDuration = 315576000000
|
||||
)
|
||||
|
||||
func (e encoder) marshalDuration(m pref.Message) error {
|
||||
fds := m.Descriptor().Fields()
|
||||
fdSeconds := fds.ByNumber(genid.Duration_Seconds_field_number)
|
||||
fdNanos := fds.ByNumber(genid.Duration_Nanos_field_number)
|
||||
|
||||
secsVal := m.Get(fdSeconds)
|
||||
nanosVal := m.Get(fdNanos)
|
||||
secs := secsVal.Int()
|
||||
nanos := nanosVal.Int()
|
||||
if secs < -maxSecondsInDuration || secs > maxSecondsInDuration {
|
||||
return errors.New("%s: seconds out of range %v", genid.Duration_message_fullname, secs)
|
||||
}
|
||||
if nanos < -secondsInNanos || nanos > secondsInNanos {
|
||||
return errors.New("%s: nanos out of range %v", genid.Duration_message_fullname, nanos)
|
||||
}
|
||||
if (secs > 0 && nanos < 0) || (secs < 0 && nanos > 0) {
|
||||
return errors.New("%s: signs of seconds and nanos do not match", genid.Duration_message_fullname)
|
||||
}
|
||||
// Generated output always contains 0, 3, 6, or 9 fractional digits,
|
||||
// depending on required precision, followed by the suffix "s".
|
||||
f := "%d.%09d"
|
||||
if nanos < 0 {
|
||||
nanos = -nanos
|
||||
if secs == 0 {
|
||||
f = "-%d.%09d"
|
||||
}
|
||||
}
|
||||
x := fmt.Sprintf(f, secs, nanos)
|
||||
x = strings.TrimSuffix(x, "000")
|
||||
x = strings.TrimSuffix(x, "000")
|
||||
x = strings.TrimSuffix(x, ".000")
|
||||
e.WriteString(x + "s")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d decoder) unmarshalDuration(m pref.Message) error {
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if tok.Kind() != json.String {
|
||||
return d.unexpectedTokenError(tok)
|
||||
}
|
||||
|
||||
secs, nanos, ok := parseDuration(tok.ParsedString())
|
||||
if !ok {
|
||||
return d.newError(tok.Pos(), "invalid %v value %v", genid.Duration_message_fullname, tok.RawString())
|
||||
}
|
||||
// Validate seconds. No need to validate nanos because parseDuration would
|
||||
// have covered that already.
|
||||
if secs < -maxSecondsInDuration || secs > maxSecondsInDuration {
|
||||
return d.newError(tok.Pos(), "%v value out of range: %v", genid.Duration_message_fullname, tok.RawString())
|
||||
}
|
||||
|
||||
fds := m.Descriptor().Fields()
|
||||
fdSeconds := fds.ByNumber(genid.Duration_Seconds_field_number)
|
||||
fdNanos := fds.ByNumber(genid.Duration_Nanos_field_number)
|
||||
|
||||
m.Set(fdSeconds, pref.ValueOfInt64(secs))
|
||||
m.Set(fdNanos, pref.ValueOfInt32(nanos))
|
||||
return nil
|
||||
}
|
||||
|
||||
// parseDuration parses the given input string for seconds and nanoseconds value
|
||||
// for the Duration JSON format. The format is a decimal number with a suffix
|
||||
// 's'. It can have optional plus/minus sign. There needs to be at least an
|
||||
// integer or fractional part. Fractional part is limited to 9 digits only for
|
||||
// nanoseconds precision, regardless of whether there are trailing zero digits.
|
||||
// Example values are 1s, 0.1s, 1.s, .1s, +1s, -1s, -.1s.
|
||||
func parseDuration(input string) (int64, int32, bool) {
|
||||
b := []byte(input)
|
||||
size := len(b)
|
||||
if size < 2 {
|
||||
return 0, 0, false
|
||||
}
|
||||
if b[size-1] != 's' {
|
||||
return 0, 0, false
|
||||
}
|
||||
b = b[:size-1]
|
||||
|
||||
// Read optional plus/minus symbol.
|
||||
var neg bool
|
||||
switch b[0] {
|
||||
case '-':
|
||||
neg = true
|
||||
b = b[1:]
|
||||
case '+':
|
||||
b = b[1:]
|
||||
}
|
||||
if len(b) == 0 {
|
||||
return 0, 0, false
|
||||
}
|
||||
|
||||
// Read the integer part.
|
||||
var intp []byte
|
||||
switch {
|
||||
case b[0] == '0':
|
||||
b = b[1:]
|
||||
|
||||
case '1' <= b[0] && b[0] <= '9':
|
||||
intp = b[0:]
|
||||
b = b[1:]
|
||||
n := 1
|
||||
for len(b) > 0 && '0' <= b[0] && b[0] <= '9' {
|
||||
n++
|
||||
b = b[1:]
|
||||
}
|
||||
intp = intp[:n]
|
||||
|
||||
case b[0] == '.':
|
||||
// Continue below.
|
||||
|
||||
default:
|
||||
return 0, 0, false
|
||||
}
|
||||
|
||||
hasFrac := false
|
||||
var frac [9]byte
|
||||
if len(b) > 0 {
|
||||
if b[0] != '.' {
|
||||
return 0, 0, false
|
||||
}
|
||||
// Read the fractional part.
|
||||
b = b[1:]
|
||||
n := 0
|
||||
for len(b) > 0 && n < 9 && '0' <= b[0] && b[0] <= '9' {
|
||||
frac[n] = b[0]
|
||||
n++
|
||||
b = b[1:]
|
||||
}
|
||||
// It is not valid if there are more bytes left.
|
||||
if len(b) > 0 {
|
||||
return 0, 0, false
|
||||
}
|
||||
// Pad fractional part with 0s.
|
||||
for i := n; i < 9; i++ {
|
||||
frac[i] = '0'
|
||||
}
|
||||
hasFrac = true
|
||||
}
|
||||
|
||||
var secs int64
|
||||
if len(intp) > 0 {
|
||||
var err error
|
||||
secs, err = strconv.ParseInt(string(intp), 10, 64)
|
||||
if err != nil {
|
||||
return 0, 0, false
|
||||
}
|
||||
}
|
||||
|
||||
var nanos int64
|
||||
if hasFrac {
|
||||
nanob := bytes.TrimLeft(frac[:], "0")
|
||||
if len(nanob) > 0 {
|
||||
var err error
|
||||
nanos, err = strconv.ParseInt(string(nanob), 10, 32)
|
||||
if err != nil {
|
||||
return 0, 0, false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if neg {
|
||||
if secs > 0 {
|
||||
secs = -secs
|
||||
}
|
||||
if nanos > 0 {
|
||||
nanos = -nanos
|
||||
}
|
||||
}
|
||||
return secs, int32(nanos), true
|
||||
}
|
||||
|
||||
// The JSON representation for a Timestamp is a JSON string in the RFC 3339
|
||||
// format, i.e. "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" where
|
||||
// {year} is always expressed using four digits while {month}, {day}, {hour},
|
||||
// {min}, and {sec} are zero-padded to two digits each. The fractional seconds,
|
||||
// which can go up to 9 digits, up to 1 nanosecond resolution, is optional. The
|
||||
// "Z" suffix indicates the timezone ("UTC"); the timezone is required. Encoding
|
||||
// should always use UTC (as indicated by "Z") and a decoder should be able to
|
||||
// accept both UTC and other timezones (as indicated by an offset).
|
||||
//
|
||||
// Timestamp.seconds must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z
|
||||
// inclusive.
|
||||
// Timestamp.nanos must be from 0 to 999,999,999 inclusive.
|
||||
|
||||
const (
|
||||
maxTimestampSeconds = 253402300799
|
||||
minTimestampSeconds = -62135596800
|
||||
)
|
||||
|
||||
func (e encoder) marshalTimestamp(m pref.Message) error {
|
||||
fds := m.Descriptor().Fields()
|
||||
fdSeconds := fds.ByNumber(genid.Timestamp_Seconds_field_number)
|
||||
fdNanos := fds.ByNumber(genid.Timestamp_Nanos_field_number)
|
||||
|
||||
secsVal := m.Get(fdSeconds)
|
||||
nanosVal := m.Get(fdNanos)
|
||||
secs := secsVal.Int()
|
||||
nanos := nanosVal.Int()
|
||||
if secs < minTimestampSeconds || secs > maxTimestampSeconds {
|
||||
return errors.New("%s: seconds out of range %v", genid.Timestamp_message_fullname, secs)
|
||||
}
|
||||
if nanos < 0 || nanos > secondsInNanos {
|
||||
return errors.New("%s: nanos out of range %v", genid.Timestamp_message_fullname, nanos)
|
||||
}
|
||||
// Uses RFC 3339, where generated output will be Z-normalized and uses 0, 3,
|
||||
// 6 or 9 fractional digits.
|
||||
t := time.Unix(secs, nanos).UTC()
|
||||
x := t.Format("2006-01-02T15:04:05.000000000")
|
||||
x = strings.TrimSuffix(x, "000")
|
||||
x = strings.TrimSuffix(x, "000")
|
||||
x = strings.TrimSuffix(x, ".000")
|
||||
e.WriteString(x + "Z")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d decoder) unmarshalTimestamp(m pref.Message) error {
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if tok.Kind() != json.String {
|
||||
return d.unexpectedTokenError(tok)
|
||||
}
|
||||
|
||||
t, err := time.Parse(time.RFC3339Nano, tok.ParsedString())
|
||||
if err != nil {
|
||||
return d.newError(tok.Pos(), "invalid %v value %v", genid.Timestamp_message_fullname, tok.RawString())
|
||||
}
|
||||
// Validate seconds. No need to validate nanos because time.Parse would have
|
||||
// covered that already.
|
||||
secs := t.Unix()
|
||||
if secs < minTimestampSeconds || secs > maxTimestampSeconds {
|
||||
return d.newError(tok.Pos(), "%v value out of range: %v", genid.Timestamp_message_fullname, tok.RawString())
|
||||
}
|
||||
|
||||
fds := m.Descriptor().Fields()
|
||||
fdSeconds := fds.ByNumber(genid.Timestamp_Seconds_field_number)
|
||||
fdNanos := fds.ByNumber(genid.Timestamp_Nanos_field_number)
|
||||
|
||||
m.Set(fdSeconds, pref.ValueOfInt64(secs))
|
||||
m.Set(fdNanos, pref.ValueOfInt32(int32(t.Nanosecond())))
|
||||
return nil
|
||||
}
|
||||
|
||||
// The JSON representation for a FieldMask is a JSON string where paths are
|
||||
// separated by a comma. Fields name in each path are converted to/from
|
||||
// lower-camel naming conventions. Encoding should fail if the path name would
|
||||
// end up differently after a round-trip.
|
||||
|
||||
func (e encoder) marshalFieldMask(m pref.Message) error {
|
||||
fd := m.Descriptor().Fields().ByNumber(genid.FieldMask_Paths_field_number)
|
||||
list := m.Get(fd).List()
|
||||
paths := make([]string, 0, list.Len())
|
||||
|
||||
for i := 0; i < list.Len(); i++ {
|
||||
s := list.Get(i).String()
|
||||
if !pref.FullName(s).IsValid() {
|
||||
return errors.New("%s contains invalid path: %q", genid.FieldMask_Paths_field_fullname, s)
|
||||
}
|
||||
// Return error if conversion to camelCase is not reversible.
|
||||
cc := strs.JSONCamelCase(s)
|
||||
if s != strs.JSONSnakeCase(cc) {
|
||||
return errors.New("%s contains irreversible value %q", genid.FieldMask_Paths_field_fullname, s)
|
||||
}
|
||||
paths = append(paths, cc)
|
||||
}
|
||||
|
||||
e.WriteString(strings.Join(paths, ","))
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d decoder) unmarshalFieldMask(m pref.Message) error {
|
||||
tok, err := d.Read()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if tok.Kind() != json.String {
|
||||
return d.unexpectedTokenError(tok)
|
||||
}
|
||||
str := strings.TrimSpace(tok.ParsedString())
|
||||
if str == "" {
|
||||
return nil
|
||||
}
|
||||
paths := strings.Split(str, ",")
|
||||
|
||||
fd := m.Descriptor().Fields().ByNumber(genid.FieldMask_Paths_field_number)
|
||||
list := m.Mutable(fd).List()
|
||||
|
||||
for _, s0 := range paths {
|
||||
s := strs.JSONSnakeCase(s0)
|
||||
if strings.Contains(s0, "_") || !pref.FullName(s).IsValid() {
|
||||
return d.newError(tok.Pos(), "%v contains invalid path: %q", genid.FieldMask_Paths_field_fullname, s0)
|
||||
}
|
||||
list.Append(pref.ValueOfString(s))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
65
vendor/google.golang.org/protobuf/encoding/prototext/decode.go
generated
vendored
65
vendor/google.golang.org/protobuf/encoding/prototext/decode.go
generated
vendored
@ -12,8 +12,8 @@ import (
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/encoding/text"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/fieldnum"
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/internal/set"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
@ -108,7 +108,7 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error {
|
||||
return errors.New("no support for proto1 MessageSets")
|
||||
}
|
||||
|
||||
if messageDesc.FullName() == "google.protobuf.Any" {
|
||||
if messageDesc.FullName() == genid.Any_message_fullname {
|
||||
return d.unmarshalAny(m, checkDelims)
|
||||
}
|
||||
|
||||
@ -538,14 +538,13 @@ Loop:
|
||||
return d.unexpectedTokenError(tok)
|
||||
}
|
||||
|
||||
name := tok.IdentName()
|
||||
switch name {
|
||||
case "key":
|
||||
switch name := pref.Name(tok.IdentName()); name {
|
||||
case genid.MapEntry_Key_field_name:
|
||||
if !tok.HasSeparator() {
|
||||
return d.syntaxError(tok.Pos(), "missing field separator :")
|
||||
}
|
||||
if key.IsValid() {
|
||||
return d.newError(tok.Pos(), `map entry "key" cannot be repeated`)
|
||||
return d.newError(tok.Pos(), "map entry %q cannot be repeated", name)
|
||||
}
|
||||
val, err := d.unmarshalScalar(fd.MapKey())
|
||||
if err != nil {
|
||||
@ -553,14 +552,14 @@ Loop:
|
||||
}
|
||||
key = val.MapKey()
|
||||
|
||||
case "value":
|
||||
case genid.MapEntry_Value_field_name:
|
||||
if kind := fd.MapValue().Kind(); (kind != pref.MessageKind) && (kind != pref.GroupKind) {
|
||||
if !tok.HasSeparator() {
|
||||
return d.syntaxError(tok.Pos(), "missing field separator :")
|
||||
}
|
||||
}
|
||||
if pval.IsValid() {
|
||||
return d.newError(tok.Pos(), `map entry "value" cannot be repeated`)
|
||||
return d.newError(tok.Pos(), "map entry %q cannot be repeated", name)
|
||||
}
|
||||
pval, err = unmarshalMapValue()
|
||||
if err != nil {
|
||||
@ -597,13 +596,9 @@ Loop:
|
||||
func (d decoder) unmarshalAny(m pref.Message, checkDelims bool) error {
|
||||
var typeURL string
|
||||
var bValue []byte
|
||||
|
||||
// hasFields tracks which valid fields have been seen in the loop below in
|
||||
// order to flag an error if there are duplicates or conflicts. It may
|
||||
// contain the strings "type_url", "value" and "expanded". The literal
|
||||
// "expanded" is used to indicate that the expanded form has been
|
||||
// encountered already.
|
||||
hasFields := map[string]bool{}
|
||||
var seenTypeUrl bool
|
||||
var seenValue bool
|
||||
var isExpanded bool
|
||||
|
||||
if checkDelims {
|
||||
tok, err := d.Read()
|
||||
@ -642,12 +637,12 @@ Loop:
|
||||
return d.syntaxError(tok.Pos(), "missing field separator :")
|
||||
}
|
||||
|
||||
switch tok.IdentName() {
|
||||
case "type_url":
|
||||
if hasFields["type_url"] {
|
||||
return d.newError(tok.Pos(), "duplicate Any type_url field")
|
||||
switch name := pref.Name(tok.IdentName()); name {
|
||||
case genid.Any_TypeUrl_field_name:
|
||||
if seenTypeUrl {
|
||||
return d.newError(tok.Pos(), "duplicate %v field", genid.Any_TypeUrl_field_fullname)
|
||||
}
|
||||
if hasFields["expanded"] {
|
||||
if isExpanded {
|
||||
return d.newError(tok.Pos(), "conflict with [%s] field", typeURL)
|
||||
}
|
||||
tok, err := d.Read()
|
||||
@ -657,15 +652,15 @@ Loop:
|
||||
var ok bool
|
||||
typeURL, ok = tok.String()
|
||||
if !ok {
|
||||
return d.newError(tok.Pos(), "invalid Any type_url: %v", tok.RawString())
|
||||
return d.newError(tok.Pos(), "invalid %v field value: %v", genid.Any_TypeUrl_field_fullname, tok.RawString())
|
||||
}
|
||||
hasFields["type_url"] = true
|
||||
seenTypeUrl = true
|
||||
|
||||
case "value":
|
||||
if hasFields["value"] {
|
||||
return d.newError(tok.Pos(), "duplicate Any value field")
|
||||
case genid.Any_Value_field_name:
|
||||
if seenValue {
|
||||
return d.newError(tok.Pos(), "duplicate %v field", genid.Any_Value_field_fullname)
|
||||
}
|
||||
if hasFields["expanded"] {
|
||||
if isExpanded {
|
||||
return d.newError(tok.Pos(), "conflict with [%s] field", typeURL)
|
||||
}
|
||||
tok, err := d.Read()
|
||||
@ -674,22 +669,22 @@ Loop:
|
||||
}
|
||||
s, ok := tok.String()
|
||||
if !ok {
|
||||
return d.newError(tok.Pos(), "invalid Any value: %v", tok.RawString())
|
||||
return d.newError(tok.Pos(), "invalid %v field value: %v", genid.Any_Value_field_fullname, tok.RawString())
|
||||
}
|
||||
bValue = []byte(s)
|
||||
hasFields["value"] = true
|
||||
seenValue = true
|
||||
|
||||
default:
|
||||
if !d.opts.DiscardUnknown {
|
||||
return d.newError(tok.Pos(), "invalid field name %q in google.protobuf.Any message", tok.RawString())
|
||||
return d.newError(tok.Pos(), "invalid field name %q in %v message", tok.RawString(), genid.Any_message_fullname)
|
||||
}
|
||||
}
|
||||
|
||||
case text.TypeName:
|
||||
if hasFields["expanded"] {
|
||||
if isExpanded {
|
||||
return d.newError(tok.Pos(), "cannot have more than one type")
|
||||
}
|
||||
if hasFields["type_url"] {
|
||||
if seenTypeUrl {
|
||||
return d.newError(tok.Pos(), "conflict with type_url field")
|
||||
}
|
||||
typeURL = tok.TypeName()
|
||||
@ -698,21 +693,21 @@ Loop:
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
hasFields["expanded"] = true
|
||||
isExpanded = true
|
||||
|
||||
default:
|
||||
if !d.opts.DiscardUnknown {
|
||||
return d.newError(tok.Pos(), "invalid field name %q in google.protobuf.Any message", tok.RawString())
|
||||
return d.newError(tok.Pos(), "invalid field name %q in %v message", tok.RawString(), genid.Any_message_fullname)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fds := m.Descriptor().Fields()
|
||||
if len(typeURL) > 0 {
|
||||
m.Set(fds.ByNumber(fieldnum.Any_TypeUrl), pref.ValueOfString(typeURL))
|
||||
m.Set(fds.ByNumber(genid.Any_TypeUrl_field_number), pref.ValueOfString(typeURL))
|
||||
}
|
||||
if len(bValue) > 0 {
|
||||
m.Set(fds.ByNumber(fieldnum.Any_Value), pref.ValueOfBytes(bValue))
|
||||
m.Set(fds.ByNumber(genid.Any_Value_field_number), pref.ValueOfBytes(bValue))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
12
vendor/google.golang.org/protobuf/encoding/prototext/encode.go
generated
vendored
12
vendor/google.golang.org/protobuf/encoding/prototext/encode.go
generated
vendored
@ -14,8 +14,8 @@ import (
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/encoding/text"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/fieldnum"
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/mapsort"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
@ -162,7 +162,7 @@ func (e encoder) marshalMessage(m pref.Message, inclDelims bool) error {
|
||||
}
|
||||
|
||||
// Handle Any expansion.
|
||||
if messageDesc.FullName() == "google.protobuf.Any" {
|
||||
if messageDesc.FullName() == genid.Any_message_fullname {
|
||||
if e.marshalAny(m) {
|
||||
return nil
|
||||
}
|
||||
@ -295,13 +295,13 @@ func (e encoder) marshalMap(name string, mmap pref.Map, fd pref.FieldDescriptor)
|
||||
e.StartMessage()
|
||||
defer e.EndMessage()
|
||||
|
||||
e.WriteName("key")
|
||||
e.WriteName(string(genid.MapEntry_Key_field_name))
|
||||
err = e.marshalSingular(key.Value(), fd.MapKey())
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
e.WriteName("value")
|
||||
e.WriteName(string(genid.MapEntry_Value_field_name))
|
||||
err = e.marshalSingular(val, fd.MapValue())
|
||||
if err != nil {
|
||||
return false
|
||||
@ -399,7 +399,7 @@ func (e encoder) marshalUnknown(b []byte) {
|
||||
func (e encoder) marshalAny(any pref.Message) bool {
|
||||
// Construct the embedded message.
|
||||
fds := any.Descriptor().Fields()
|
||||
fdType := fds.ByNumber(fieldnum.Any_TypeUrl)
|
||||
fdType := fds.ByNumber(genid.Any_TypeUrl_field_number)
|
||||
typeURL := any.Get(fdType).String()
|
||||
mt, err := e.opts.Resolver.FindMessageByURL(typeURL)
|
||||
if err != nil {
|
||||
@ -408,7 +408,7 @@ func (e encoder) marshalAny(any pref.Message) bool {
|
||||
m := mt.New().Interface()
|
||||
|
||||
// Unmarshal bytes into embedded message.
|
||||
fdValue := fds.ByNumber(fieldnum.Any_Value)
|
||||
fdValue := fds.ByNumber(genid.Any_Value_field_number)
|
||||
value := any.Get(fdValue)
|
||||
err = proto.UnmarshalOptions{
|
||||
AllowPartial: true,
|
||||
|
||||
340
vendor/google.golang.org/protobuf/internal/encoding/json/decode.go
generated
vendored
Normal file
340
vendor/google.golang.org/protobuf/internal/encoding/json/decode.go
generated
vendored
Normal file
@ -0,0 +1,340 @@
|
||||
// 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 json
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"regexp"
|
||||
"unicode/utf8"
|
||||
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
)
|
||||
|
||||
// call specifies which Decoder method was invoked.
|
||||
type call uint8
|
||||
|
||||
const (
|
||||
readCall call = iota
|
||||
peekCall
|
||||
)
|
||||
|
||||
const unexpectedFmt = "unexpected token %s"
|
||||
|
||||
// ErrUnexpectedEOF means that EOF was encountered in the middle of the input.
|
||||
var ErrUnexpectedEOF = errors.New("%v", io.ErrUnexpectedEOF)
|
||||
|
||||
// Decoder is a token-based JSON decoder.
|
||||
type Decoder struct {
|
||||
// lastCall is last method called, either readCall or peekCall.
|
||||
// Initial value is readCall.
|
||||
lastCall call
|
||||
|
||||
// lastToken contains the last read token.
|
||||
lastToken Token
|
||||
|
||||
// lastErr contains the last read error.
|
||||
lastErr error
|
||||
|
||||
// openStack is a stack containing ObjectOpen and ArrayOpen values. The
|
||||
// top of stack represents the object or the array the current value is
|
||||
// directly located in.
|
||||
openStack []Kind
|
||||
|
||||
// orig is used in reporting line and column.
|
||||
orig []byte
|
||||
// in contains the unconsumed input.
|
||||
in []byte
|
||||
}
|
||||
|
||||
// NewDecoder returns a Decoder to read the given []byte.
|
||||
func NewDecoder(b []byte) *Decoder {
|
||||
return &Decoder{orig: b, in: b}
|
||||
}
|
||||
|
||||
// Peek looks ahead and returns the next token kind without advancing a read.
|
||||
func (d *Decoder) Peek() (Token, error) {
|
||||
defer func() { d.lastCall = peekCall }()
|
||||
if d.lastCall == readCall {
|
||||
d.lastToken, d.lastErr = d.Read()
|
||||
}
|
||||
return d.lastToken, d.lastErr
|
||||
}
|
||||
|
||||
// Read returns the next JSON token.
|
||||
// It will return an error if there is no valid token.
|
||||
func (d *Decoder) Read() (Token, error) {
|
||||
const scalar = Null | Bool | Number | String
|
||||
|
||||
defer func() { d.lastCall = readCall }()
|
||||
if d.lastCall == peekCall {
|
||||
return d.lastToken, d.lastErr
|
||||
}
|
||||
|
||||
tok, err := d.parseNext()
|
||||
if err != nil {
|
||||
return Token{}, err
|
||||
}
|
||||
|
||||
switch tok.kind {
|
||||
case EOF:
|
||||
if len(d.openStack) != 0 ||
|
||||
d.lastToken.kind&scalar|ObjectClose|ArrayClose == 0 {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
case Null:
|
||||
if !d.isValueNext() {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
|
||||
case Bool, Number:
|
||||
if !d.isValueNext() {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
|
||||
case String:
|
||||
if d.isValueNext() {
|
||||
break
|
||||
}
|
||||
// This string token should only be for a field name.
|
||||
if d.lastToken.kind&(ObjectOpen|comma) == 0 {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
if len(d.in) == 0 {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
if c := d.in[0]; c != ':' {
|
||||
return Token{}, d.newSyntaxError(d.currPos(), `unexpected character %s, missing ":" after field name`, string(c))
|
||||
}
|
||||
tok.kind = Name
|
||||
d.consume(1)
|
||||
|
||||
case ObjectOpen, ArrayOpen:
|
||||
if !d.isValueNext() {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
d.openStack = append(d.openStack, tok.kind)
|
||||
|
||||
case ObjectClose:
|
||||
if len(d.openStack) == 0 ||
|
||||
d.lastToken.kind == comma ||
|
||||
d.openStack[len(d.openStack)-1] != ObjectOpen {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
d.openStack = d.openStack[:len(d.openStack)-1]
|
||||
|
||||
case ArrayClose:
|
||||
if len(d.openStack) == 0 ||
|
||||
d.lastToken.kind == comma ||
|
||||
d.openStack[len(d.openStack)-1] != ArrayOpen {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
d.openStack = d.openStack[:len(d.openStack)-1]
|
||||
|
||||
case comma:
|
||||
if len(d.openStack) == 0 ||
|
||||
d.lastToken.kind&(scalar|ObjectClose|ArrayClose) == 0 {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
}
|
||||
|
||||
// Update d.lastToken only after validating token to be in the right sequence.
|
||||
d.lastToken = tok
|
||||
|
||||
if d.lastToken.kind == comma {
|
||||
return d.Read()
|
||||
}
|
||||
return tok, nil
|
||||
}
|
||||
|
||||
// Any sequence that looks like a non-delimiter (for error reporting).
|
||||
var errRegexp = regexp.MustCompile(`^([-+._a-zA-Z0-9]{1,32}|.)`)
|
||||
|
||||
// parseNext parses for the next JSON token. It returns a Token object for
|
||||
// different types, except for Name. It does not handle whether the next token
|
||||
// is in a valid sequence or not.
|
||||
func (d *Decoder) parseNext() (Token, error) {
|
||||
// Trim leading spaces.
|
||||
d.consume(0)
|
||||
|
||||
in := d.in
|
||||
if len(in) == 0 {
|
||||
return d.consumeToken(EOF, 0), nil
|
||||
}
|
||||
|
||||
switch in[0] {
|
||||
case 'n':
|
||||
if n := matchWithDelim("null", in); n != 0 {
|
||||
return d.consumeToken(Null, n), nil
|
||||
}
|
||||
|
||||
case 't':
|
||||
if n := matchWithDelim("true", in); n != 0 {
|
||||
return d.consumeBoolToken(true, n), nil
|
||||
}
|
||||
|
||||
case 'f':
|
||||
if n := matchWithDelim("false", in); n != 0 {
|
||||
return d.consumeBoolToken(false, n), nil
|
||||
}
|
||||
|
||||
case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
|
||||
if n, ok := parseNumber(in); ok {
|
||||
return d.consumeToken(Number, n), nil
|
||||
}
|
||||
|
||||
case '"':
|
||||
s, n, err := d.parseString(in)
|
||||
if err != nil {
|
||||
return Token{}, err
|
||||
}
|
||||
return d.consumeStringToken(s, n), nil
|
||||
|
||||
case '{':
|
||||
return d.consumeToken(ObjectOpen, 1), nil
|
||||
|
||||
case '}':
|
||||
return d.consumeToken(ObjectClose, 1), nil
|
||||
|
||||
case '[':
|
||||
return d.consumeToken(ArrayOpen, 1), nil
|
||||
|
||||
case ']':
|
||||
return d.consumeToken(ArrayClose, 1), nil
|
||||
|
||||
case ',':
|
||||
return d.consumeToken(comma, 1), nil
|
||||
}
|
||||
return Token{}, d.newSyntaxError(d.currPos(), "invalid value %s", errRegexp.Find(in))
|
||||
}
|
||||
|
||||
// newSyntaxError returns an error with line and column information useful for
|
||||
// syntax errors.
|
||||
func (d *Decoder) newSyntaxError(pos int, f string, x ...interface{}) error {
|
||||
e := errors.New(f, x...)
|
||||
line, column := d.Position(pos)
|
||||
return errors.New("syntax error (line %d:%d): %v", line, column, e)
|
||||
}
|
||||
|
||||
// Position returns line and column number of given index of the original input.
|
||||
// It will panic if index is out of range.
|
||||
func (d *Decoder) Position(idx int) (line int, column int) {
|
||||
b := d.orig[:idx]
|
||||
line = bytes.Count(b, []byte("\n")) + 1
|
||||
if i := bytes.LastIndexByte(b, '\n'); i >= 0 {
|
||||
b = b[i+1:]
|
||||
}
|
||||
column = utf8.RuneCount(b) + 1 // ignore multi-rune characters
|
||||
return line, column
|
||||
}
|
||||
|
||||
// currPos returns the current index position of d.in from d.orig.
|
||||
func (d *Decoder) currPos() int {
|
||||
return len(d.orig) - len(d.in)
|
||||
}
|
||||
|
||||
// matchWithDelim matches s with the input b and verifies that the match
|
||||
// terminates with a delimiter of some form (e.g., r"[^-+_.a-zA-Z0-9]").
|
||||
// As a special case, EOF is considered a delimiter. It returns the length of s
|
||||
// if there is a match, else 0.
|
||||
func matchWithDelim(s string, b []byte) int {
|
||||
if !bytes.HasPrefix(b, []byte(s)) {
|
||||
return 0
|
||||
}
|
||||
|
||||
n := len(s)
|
||||
if n < len(b) && isNotDelim(b[n]) {
|
||||
return 0
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
// isNotDelim returns true if given byte is a not delimiter character.
|
||||
func isNotDelim(c byte) bool {
|
||||
return (c == '-' || c == '+' || c == '.' || c == '_' ||
|
||||
('a' <= c && c <= 'z') ||
|
||||
('A' <= c && c <= 'Z') ||
|
||||
('0' <= c && c <= '9'))
|
||||
}
|
||||
|
||||
// consume consumes n bytes of input and any subsequent whitespace.
|
||||
func (d *Decoder) consume(n int) {
|
||||
d.in = d.in[n:]
|
||||
for len(d.in) > 0 {
|
||||
switch d.in[0] {
|
||||
case ' ', '\n', '\r', '\t':
|
||||
d.in = d.in[1:]
|
||||
default:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// isValueNext returns true if next type should be a JSON value: Null,
|
||||
// Number, String or Bool.
|
||||
func (d *Decoder) isValueNext() bool {
|
||||
if len(d.openStack) == 0 {
|
||||
return d.lastToken.kind == 0
|
||||
}
|
||||
|
||||
start := d.openStack[len(d.openStack)-1]
|
||||
switch start {
|
||||
case ObjectOpen:
|
||||
return d.lastToken.kind&Name != 0
|
||||
case ArrayOpen:
|
||||
return d.lastToken.kind&(ArrayOpen|comma) != 0
|
||||
}
|
||||
panic(fmt.Sprintf(
|
||||
"unreachable logic in Decoder.isValueNext, lastToken.kind: %v, openStack: %v",
|
||||
d.lastToken.kind, start))
|
||||
}
|
||||
|
||||
// consumeToken constructs a Token for given Kind with raw value derived from
|
||||
// current d.in and given size, and consumes the given size-lenght of it.
|
||||
func (d *Decoder) consumeToken(kind Kind, size int) Token {
|
||||
tok := Token{
|
||||
kind: kind,
|
||||
raw: d.in[:size],
|
||||
pos: len(d.orig) - len(d.in),
|
||||
}
|
||||
d.consume(size)
|
||||
return tok
|
||||
}
|
||||
|
||||
// consumeBoolToken constructs a Token for a Bool kind with raw value derived from
|
||||
// current d.in and given size.
|
||||
func (d *Decoder) consumeBoolToken(b bool, size int) Token {
|
||||
tok := Token{
|
||||
kind: Bool,
|
||||
raw: d.in[:size],
|
||||
pos: len(d.orig) - len(d.in),
|
||||
boo: b,
|
||||
}
|
||||
d.consume(size)
|
||||
return tok
|
||||
}
|
||||
|
||||
// consumeStringToken constructs a Token for a String kind with raw value derived
|
||||
// from current d.in and given size.
|
||||
func (d *Decoder) consumeStringToken(s string, size int) Token {
|
||||
tok := Token{
|
||||
kind: String,
|
||||
raw: d.in[:size],
|
||||
pos: len(d.orig) - len(d.in),
|
||||
str: s,
|
||||
}
|
||||
d.consume(size)
|
||||
return tok
|
||||
}
|
||||
|
||||
// Clone returns a copy of the Decoder for use in reading ahead the next JSON
|
||||
// object, array or other values without affecting current Decoder.
|
||||
func (d *Decoder) Clone() *Decoder {
|
||||
ret := *d
|
||||
ret.openStack = append([]Kind(nil), ret.openStack...)
|
||||
return &ret
|
||||
}
|
||||
254
vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go
generated
vendored
Normal file
254
vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go
generated
vendored
Normal file
@ -0,0 +1,254 @@
|
||||
// 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 json
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// parseNumber reads the given []byte for a valid JSON number. If it is valid,
|
||||
// it returns the number of bytes. Parsing logic follows the definition in
|
||||
// https://tools.ietf.org/html/rfc7159#section-6, and is based off
|
||||
// encoding/json.isValidNumber function.
|
||||
func parseNumber(input []byte) (int, bool) {
|
||||
var n int
|
||||
|
||||
s := input
|
||||
if len(s) == 0 {
|
||||
return 0, false
|
||||
}
|
||||
|
||||
// Optional -
|
||||
if s[0] == '-' {
|
||||
s = s[1:]
|
||||
n++
|
||||
if len(s) == 0 {
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
|
||||
// Digits
|
||||
switch {
|
||||
case s[0] == '0':
|
||||
s = s[1:]
|
||||
n++
|
||||
|
||||
case '1' <= s[0] && s[0] <= '9':
|
||||
s = s[1:]
|
||||
n++
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
|
||||
default:
|
||||
return 0, false
|
||||
}
|
||||
|
||||
// . followed by 1 or more digits.
|
||||
if len(s) >= 2 && s[0] == '.' && '0' <= s[1] && s[1] <= '9' {
|
||||
s = s[2:]
|
||||
n += 2
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
}
|
||||
|
||||
// e or E followed by an optional - or + and
|
||||
// 1 or more digits.
|
||||
if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') {
|
||||
s = s[1:]
|
||||
n++
|
||||
if s[0] == '+' || s[0] == '-' {
|
||||
s = s[1:]
|
||||
n++
|
||||
if len(s) == 0 {
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
}
|
||||
|
||||
// Check that next byte is a delimiter or it is at the end.
|
||||
if n < len(input) && isNotDelim(input[n]) {
|
||||
return 0, false
|
||||
}
|
||||
|
||||
return n, true
|
||||
}
|
||||
|
||||
// numberParts is the result of parsing out a valid JSON number. It contains
|
||||
// the parts of a number. The parts are used for integer conversion.
|
||||
type numberParts struct {
|
||||
neg bool
|
||||
intp []byte
|
||||
frac []byte
|
||||
exp []byte
|
||||
}
|
||||
|
||||
// parseNumber constructs numberParts from given []byte. The logic here is
|
||||
// similar to consumeNumber above with the difference of having to construct
|
||||
// numberParts. The slice fields in numberParts are subslices of the input.
|
||||
func parseNumberParts(input []byte) (numberParts, bool) {
|
||||
var neg bool
|
||||
var intp []byte
|
||||
var frac []byte
|
||||
var exp []byte
|
||||
|
||||
s := input
|
||||
if len(s) == 0 {
|
||||
return numberParts{}, false
|
||||
}
|
||||
|
||||
// Optional -
|
||||
if s[0] == '-' {
|
||||
neg = true
|
||||
s = s[1:]
|
||||
if len(s) == 0 {
|
||||
return numberParts{}, false
|
||||
}
|
||||
}
|
||||
|
||||
// Digits
|
||||
switch {
|
||||
case s[0] == '0':
|
||||
// Skip first 0 and no need to store.
|
||||
s = s[1:]
|
||||
|
||||
case '1' <= s[0] && s[0] <= '9':
|
||||
intp = s
|
||||
n := 1
|
||||
s = s[1:]
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
intp = intp[:n]
|
||||
|
||||
default:
|
||||
return numberParts{}, false
|
||||
}
|
||||
|
||||
// . followed by 1 or more digits.
|
||||
if len(s) >= 2 && s[0] == '.' && '0' <= s[1] && s[1] <= '9' {
|
||||
frac = s[1:]
|
||||
n := 1
|
||||
s = s[2:]
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
frac = frac[:n]
|
||||
}
|
||||
|
||||
// e or E followed by an optional - or + and
|
||||
// 1 or more digits.
|
||||
if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') {
|
||||
s = s[1:]
|
||||
exp = s
|
||||
n := 0
|
||||
if s[0] == '+' || s[0] == '-' {
|
||||
s = s[1:]
|
||||
n++
|
||||
if len(s) == 0 {
|
||||
return numberParts{}, false
|
||||
}
|
||||
}
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
exp = exp[:n]
|
||||
}
|
||||
|
||||
return numberParts{
|
||||
neg: neg,
|
||||
intp: intp,
|
||||
frac: bytes.TrimRight(frac, "0"), // Remove unnecessary 0s to the right.
|
||||
exp: exp,
|
||||
}, true
|
||||
}
|
||||
|
||||
// normalizeToIntString returns an integer string in normal form without the
|
||||
// E-notation for given numberParts. It will return false if it is not an
|
||||
// integer or if the exponent exceeds than max/min int value.
|
||||
func normalizeToIntString(n numberParts) (string, bool) {
|
||||
intpSize := len(n.intp)
|
||||
fracSize := len(n.frac)
|
||||
|
||||
if intpSize == 0 && fracSize == 0 {
|
||||
return "0", true
|
||||
}
|
||||
|
||||
var exp int
|
||||
if len(n.exp) > 0 {
|
||||
i, err := strconv.ParseInt(string(n.exp), 10, 32)
|
||||
if err != nil {
|
||||
return "", false
|
||||
}
|
||||
exp = int(i)
|
||||
}
|
||||
|
||||
var num []byte
|
||||
if exp >= 0 {
|
||||
// For positive E, shift fraction digits into integer part and also pad
|
||||
// with zeroes as needed.
|
||||
|
||||
// If there are more digits in fraction than the E value, then the
|
||||
// number is not an integer.
|
||||
if fracSize > exp {
|
||||
return "", false
|
||||
}
|
||||
|
||||
// Make sure resulting digits are within max value limit to avoid
|
||||
// unnecessarily constructing a large byte slice that may simply fail
|
||||
// later on.
|
||||
const maxDigits = 20 // Max uint64 value has 20 decimal digits.
|
||||
if intpSize+exp > maxDigits {
|
||||
return "", false
|
||||
}
|
||||
|
||||
// Set cap to make a copy of integer part when appended.
|
||||
num = n.intp[:len(n.intp):len(n.intp)]
|
||||
num = append(num, n.frac...)
|
||||
for i := 0; i < exp-fracSize; i++ {
|
||||
num = append(num, '0')
|
||||
}
|
||||
} else {
|
||||
// For negative E, shift digits in integer part out.
|
||||
|
||||
// If there are fractions, then the number is not an integer.
|
||||
if fracSize > 0 {
|
||||
return "", false
|
||||
}
|
||||
|
||||
// index is where the decimal point will be after adjusting for negative
|
||||
// exponent.
|
||||
index := intpSize + exp
|
||||
if index < 0 {
|
||||
return "", false
|
||||
}
|
||||
|
||||
num = n.intp
|
||||
// If any of the digits being shifted to the right of the decimal point
|
||||
// is non-zero, then the number is not an integer.
|
||||
for i := index; i < intpSize; i++ {
|
||||
if num[i] != '0' {
|
||||
return "", false
|
||||
}
|
||||
}
|
||||
num = num[:index]
|
||||
}
|
||||
|
||||
if n.neg {
|
||||
return "-" + string(num), true
|
||||
}
|
||||
return string(num), true
|
||||
}
|
||||
91
vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go
generated
vendored
Normal file
91
vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go
generated
vendored
Normal file
@ -0,0 +1,91 @@
|
||||
// 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 json
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"unicode"
|
||||
"unicode/utf16"
|
||||
"unicode/utf8"
|
||||
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
)
|
||||
|
||||
func (d *Decoder) parseString(in []byte) (string, int, error) {
|
||||
in0 := in
|
||||
if len(in) == 0 {
|
||||
return "", 0, ErrUnexpectedEOF
|
||||
}
|
||||
if in[0] != '"' {
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid character %q at start of string", in[0])
|
||||
}
|
||||
in = in[1:]
|
||||
i := indexNeedEscapeInBytes(in)
|
||||
in, out := in[i:], in[:i:i] // set cap to prevent mutations
|
||||
for len(in) > 0 {
|
||||
switch r, n := utf8.DecodeRune(in); {
|
||||
case r == utf8.RuneError && n == 1:
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid UTF-8 in string")
|
||||
case r < ' ':
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid character %q in string", r)
|
||||
case r == '"':
|
||||
in = in[1:]
|
||||
n := len(in0) - len(in)
|
||||
return string(out), n, nil
|
||||
case r == '\\':
|
||||
if len(in) < 2 {
|
||||
return "", 0, ErrUnexpectedEOF
|
||||
}
|
||||
switch r := in[1]; r {
|
||||
case '"', '\\', '/':
|
||||
in, out = in[2:], append(out, r)
|
||||
case 'b':
|
||||
in, out = in[2:], append(out, '\b')
|
||||
case 'f':
|
||||
in, out = in[2:], append(out, '\f')
|
||||
case 'n':
|
||||
in, out = in[2:], append(out, '\n')
|
||||
case 'r':
|
||||
in, out = in[2:], append(out, '\r')
|
||||
case 't':
|
||||
in, out = in[2:], append(out, '\t')
|
||||
case 'u':
|
||||
if len(in) < 6 {
|
||||
return "", 0, ErrUnexpectedEOF
|
||||
}
|
||||
v, err := strconv.ParseUint(string(in[2:6]), 16, 16)
|
||||
if err != nil {
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:6])
|
||||
}
|
||||
in = in[6:]
|
||||
|
||||
r := rune(v)
|
||||
if utf16.IsSurrogate(r) {
|
||||
if len(in) < 6 {
|
||||
return "", 0, ErrUnexpectedEOF
|
||||
}
|
||||
v, err := strconv.ParseUint(string(in[2:6]), 16, 16)
|
||||
r = utf16.DecodeRune(r, rune(v))
|
||||
if in[0] != '\\' || in[1] != 'u' ||
|
||||
r == unicode.ReplacementChar || err != nil {
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:6])
|
||||
}
|
||||
in = in[6:]
|
||||
}
|
||||
out = append(out, string(r)...)
|
||||
default:
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:2])
|
||||
}
|
||||
default:
|
||||
i := indexNeedEscapeInBytes(in[n:])
|
||||
in, out = in[n+i:], append(out, in[:n+i]...)
|
||||
}
|
||||
}
|
||||
return "", 0, ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
// indexNeedEscapeInBytes returns the index of the character that needs
|
||||
// escaping. If no characters need escaping, this returns the input length.
|
||||
func indexNeedEscapeInBytes(b []byte) int { return indexNeedEscapeInString(strs.UnsafeString(b)) }
|
||||
193
vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go
generated
vendored
Normal file
193
vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go
generated
vendored
Normal file
@ -0,0 +1,193 @@
|
||||
// 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 json
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// Kind represents a token kind expressible in the JSON format.
|
||||
type Kind uint16
|
||||
|
||||
const (
|
||||
Invalid Kind = (1 << iota) / 2
|
||||
EOF
|
||||
Null
|
||||
Bool
|
||||
Number
|
||||
String
|
||||
Name
|
||||
ObjectOpen
|
||||
ObjectClose
|
||||
ArrayOpen
|
||||
ArrayClose
|
||||
|
||||
// comma is only for parsing in between tokens and
|
||||
// does not need to be exported.
|
||||
comma
|
||||
)
|
||||
|
||||
func (k Kind) String() string {
|
||||
switch k {
|
||||
case EOF:
|
||||
return "eof"
|
||||
case Null:
|
||||
return "null"
|
||||
case Bool:
|
||||
return "bool"
|
||||
case Number:
|
||||
return "number"
|
||||
case String:
|
||||
return "string"
|
||||
case ObjectOpen:
|
||||
return "{"
|
||||
case ObjectClose:
|
||||
return "}"
|
||||
case Name:
|
||||
return "name"
|
||||
case ArrayOpen:
|
||||
return "["
|
||||
case ArrayClose:
|
||||
return "]"
|
||||
case comma:
|
||||
return ","
|
||||
}
|
||||
return "<invalid>"
|
||||
}
|
||||
|
||||
// Token provides a parsed token kind and value.
|
||||
//
|
||||
// Values are provided by the difference accessor methods. The accessor methods
|
||||
// Name, Bool, and ParsedString will panic if called on the wrong kind. There
|
||||
// are different accessor methods for the Number kind for converting to the
|
||||
// appropriate Go numeric type and those methods have the ok return value.
|
||||
type Token struct {
|
||||
// Token kind.
|
||||
kind Kind
|
||||
// pos provides the position of the token in the original input.
|
||||
pos int
|
||||
// raw bytes of the serialized token.
|
||||
// This is a subslice into the original input.
|
||||
raw []byte
|
||||
// boo is parsed boolean value.
|
||||
boo bool
|
||||
// str is parsed string value.
|
||||
str string
|
||||
}
|
||||
|
||||
// Kind returns the token kind.
|
||||
func (t Token) Kind() Kind {
|
||||
return t.kind
|
||||
}
|
||||
|
||||
// RawString returns the read value in string.
|
||||
func (t Token) RawString() string {
|
||||
return string(t.raw)
|
||||
}
|
||||
|
||||
// Pos returns the token position from the input.
|
||||
func (t Token) Pos() int {
|
||||
return t.pos
|
||||
}
|
||||
|
||||
// Name returns the object name if token is Name, else it will return an error.
|
||||
func (t Token) Name() string {
|
||||
if t.kind == Name {
|
||||
return t.str
|
||||
}
|
||||
panic(fmt.Sprintf("Token is not a Name: %v", t.RawString()))
|
||||
}
|
||||
|
||||
// Bool returns the bool value if token kind is Bool, else it panics.
|
||||
func (t Token) Bool() bool {
|
||||
if t.kind == Bool {
|
||||
return t.boo
|
||||
}
|
||||
panic(fmt.Sprintf("Token is not a Bool: %v", t.RawString()))
|
||||
}
|
||||
|
||||
// ParsedString returns the string value for a JSON string token or the read
|
||||
// value in string if token is not a string.
|
||||
func (t Token) ParsedString() string {
|
||||
if t.kind == String {
|
||||
return t.str
|
||||
}
|
||||
panic(fmt.Sprintf("Token is not a String: %v", t.RawString()))
|
||||
}
|
||||
|
||||
// Float returns the floating-point number if token kind is Number.
|
||||
//
|
||||
// The floating-point precision is specified by the bitSize parameter: 32 for
|
||||
// float32 or 64 for float64. If bitSize=32, the result still has type float64,
|
||||
// but it will be convertible to float32 without changing its value. It will
|
||||
// return false if the number exceeds the floating point limits for given
|
||||
// bitSize.
|
||||
func (t Token) Float(bitSize int) (float64, bool) {
|
||||
if t.kind != Number {
|
||||
return 0, false
|
||||
}
|
||||
f, err := strconv.ParseFloat(t.RawString(), bitSize)
|
||||
if err != nil {
|
||||
return 0, false
|
||||
}
|
||||
return f, true
|
||||
}
|
||||
|
||||
// Int returns the signed integer number if token is Number.
|
||||
//
|
||||
// The given bitSize specifies the integer type that the result must fit into.
|
||||
// It returns false if the number is not an integer value or if the result
|
||||
// exceeds the limits for given bitSize.
|
||||
func (t Token) Int(bitSize int) (int64, bool) {
|
||||
s, ok := t.getIntStr()
|
||||
if !ok {
|
||||
return 0, false
|
||||
}
|
||||
n, err := strconv.ParseInt(s, 10, bitSize)
|
||||
if err != nil {
|
||||
return 0, false
|
||||
}
|
||||
return n, true
|
||||
}
|
||||
|
||||
// Uint returns the signed integer number if token is Number, else it will
|
||||
// return an error.
|
||||
//
|
||||
// The given bitSize specifies the unsigned integer type that the result must
|
||||
// fit into. It returns false if the number is not an unsigned integer value
|
||||
// or if the result exceeds the limits for given bitSize.
|
||||
func (t Token) Uint(bitSize int) (uint64, bool) {
|
||||
s, ok := t.getIntStr()
|
||||
if !ok {
|
||||
return 0, false
|
||||
}
|
||||
n, err := strconv.ParseUint(s, 10, bitSize)
|
||||
if err != nil {
|
||||
return 0, false
|
||||
}
|
||||
return n, true
|
||||
}
|
||||
|
||||
func (t Token) getIntStr() (string, bool) {
|
||||
if t.kind != Number {
|
||||
return "", false
|
||||
}
|
||||
parts, ok := parseNumberParts(t.raw)
|
||||
if !ok {
|
||||
return "", false
|
||||
}
|
||||
return normalizeToIntString(parts)
|
||||
}
|
||||
|
||||
// TokenEquals returns true if given Tokens are equal, else false.
|
||||
func TokenEquals(x, y Token) bool {
|
||||
return x.kind == y.kind &&
|
||||
x.pos == y.pos &&
|
||||
bytes.Equal(x.raw, y.raw) &&
|
||||
x.boo == y.boo &&
|
||||
x.str == y.str
|
||||
}
|
||||
276
vendor/google.golang.org/protobuf/internal/encoding/json/encode.go
generated
vendored
Normal file
276
vendor/google.golang.org/protobuf/internal/encoding/json/encode.go
generated
vendored
Normal file
@ -0,0 +1,276 @@
|
||||
// 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 json
|
||||
|
||||
import (
|
||||
"math"
|
||||
"math/bits"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
|
||||
"google.golang.org/protobuf/internal/detrand"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
)
|
||||
|
||||
// kind represents an encoding type.
|
||||
type kind uint8
|
||||
|
||||
const (
|
||||
_ kind = (1 << iota) / 2
|
||||
name
|
||||
scalar
|
||||
objectOpen
|
||||
objectClose
|
||||
arrayOpen
|
||||
arrayClose
|
||||
)
|
||||
|
||||
// Encoder provides methods to write out JSON constructs and values. The user is
|
||||
// responsible for producing valid sequences of JSON constructs and values.
|
||||
type Encoder struct {
|
||||
indent string
|
||||
lastKind kind
|
||||
indents []byte
|
||||
out []byte
|
||||
}
|
||||
|
||||
// NewEncoder returns an Encoder.
|
||||
//
|
||||
// If indent is a non-empty string, it causes every entry for an Array or Object
|
||||
// to be preceded by the indent and trailed by a newline.
|
||||
func NewEncoder(indent string) (*Encoder, error) {
|
||||
e := &Encoder{}
|
||||
if len(indent) > 0 {
|
||||
if strings.Trim(indent, " \t") != "" {
|
||||
return nil, errors.New("indent may only be composed of space or tab characters")
|
||||
}
|
||||
e.indent = indent
|
||||
}
|
||||
return e, nil
|
||||
}
|
||||
|
||||
// Bytes returns the content of the written bytes.
|
||||
func (e *Encoder) Bytes() []byte {
|
||||
return e.out
|
||||
}
|
||||
|
||||
// WriteNull writes out the null value.
|
||||
func (e *Encoder) WriteNull() {
|
||||
e.prepareNext(scalar)
|
||||
e.out = append(e.out, "null"...)
|
||||
}
|
||||
|
||||
// WriteBool writes out the given boolean value.
|
||||
func (e *Encoder) WriteBool(b bool) {
|
||||
e.prepareNext(scalar)
|
||||
if b {
|
||||
e.out = append(e.out, "true"...)
|
||||
} else {
|
||||
e.out = append(e.out, "false"...)
|
||||
}
|
||||
}
|
||||
|
||||
// WriteString writes out the given string in JSON string value. Returns error
|
||||
// if input string contains invalid UTF-8.
|
||||
func (e *Encoder) WriteString(s string) error {
|
||||
e.prepareNext(scalar)
|
||||
var err error
|
||||
if e.out, err = appendString(e.out, s); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Sentinel error used for indicating invalid UTF-8.
|
||||
var errInvalidUTF8 = errors.New("invalid UTF-8")
|
||||
|
||||
func appendString(out []byte, in string) ([]byte, error) {
|
||||
out = append(out, '"')
|
||||
i := indexNeedEscapeInString(in)
|
||||
in, out = in[i:], append(out, in[:i]...)
|
||||
for len(in) > 0 {
|
||||
switch r, n := utf8.DecodeRuneInString(in); {
|
||||
case r == utf8.RuneError && n == 1:
|
||||
return out, errInvalidUTF8
|
||||
case r < ' ' || r == '"' || r == '\\':
|
||||
out = append(out, '\\')
|
||||
switch r {
|
||||
case '"', '\\':
|
||||
out = append(out, byte(r))
|
||||
case '\b':
|
||||
out = append(out, 'b')
|
||||
case '\f':
|
||||
out = append(out, 'f')
|
||||
case '\n':
|
||||
out = append(out, 'n')
|
||||
case '\r':
|
||||
out = append(out, 'r')
|
||||
case '\t':
|
||||
out = append(out, 't')
|
||||
default:
|
||||
out = append(out, 'u')
|
||||
out = append(out, "0000"[1+(bits.Len32(uint32(r))-1)/4:]...)
|
||||
out = strconv.AppendUint(out, uint64(r), 16)
|
||||
}
|
||||
in = in[n:]
|
||||
default:
|
||||
i := indexNeedEscapeInString(in[n:])
|
||||
in, out = in[n+i:], append(out, in[:n+i]...)
|
||||
}
|
||||
}
|
||||
out = append(out, '"')
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// indexNeedEscapeInString returns the index of the character that needs
|
||||
// escaping. If no characters need escaping, this returns the input length.
|
||||
func indexNeedEscapeInString(s string) int {
|
||||
for i, r := range s {
|
||||
if r < ' ' || r == '\\' || r == '"' || r == utf8.RuneError {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return len(s)
|
||||
}
|
||||
|
||||
// WriteFloat writes out the given float and bitSize in JSON number value.
|
||||
func (e *Encoder) WriteFloat(n float64, bitSize int) {
|
||||
e.prepareNext(scalar)
|
||||
e.out = appendFloat(e.out, n, bitSize)
|
||||
}
|
||||
|
||||
// appendFloat formats given float in bitSize, and appends to the given []byte.
|
||||
func appendFloat(out []byte, n float64, bitSize int) []byte {
|
||||
switch {
|
||||
case math.IsNaN(n):
|
||||
return append(out, `"NaN"`...)
|
||||
case math.IsInf(n, +1):
|
||||
return append(out, `"Infinity"`...)
|
||||
case math.IsInf(n, -1):
|
||||
return append(out, `"-Infinity"`...)
|
||||
}
|
||||
|
||||
// JSON number formatting logic based on encoding/json.
|
||||
// See floatEncoder.encode for reference.
|
||||
fmt := byte('f')
|
||||
if abs := math.Abs(n); abs != 0 {
|
||||
if bitSize == 64 && (abs < 1e-6 || abs >= 1e21) ||
|
||||
bitSize == 32 && (float32(abs) < 1e-6 || float32(abs) >= 1e21) {
|
||||
fmt = 'e'
|
||||
}
|
||||
}
|
||||
out = strconv.AppendFloat(out, n, fmt, -1, bitSize)
|
||||
if fmt == 'e' {
|
||||
n := len(out)
|
||||
if n >= 4 && out[n-4] == 'e' && out[n-3] == '-' && out[n-2] == '0' {
|
||||
out[n-2] = out[n-1]
|
||||
out = out[:n-1]
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// WriteInt writes out the given signed integer in JSON number value.
|
||||
func (e *Encoder) WriteInt(n int64) {
|
||||
e.prepareNext(scalar)
|
||||
e.out = append(e.out, strconv.FormatInt(n, 10)...)
|
||||
}
|
||||
|
||||
// WriteUint writes out the given unsigned integer in JSON number value.
|
||||
func (e *Encoder) WriteUint(n uint64) {
|
||||
e.prepareNext(scalar)
|
||||
e.out = append(e.out, strconv.FormatUint(n, 10)...)
|
||||
}
|
||||
|
||||
// StartObject writes out the '{' symbol.
|
||||
func (e *Encoder) StartObject() {
|
||||
e.prepareNext(objectOpen)
|
||||
e.out = append(e.out, '{')
|
||||
}
|
||||
|
||||
// EndObject writes out the '}' symbol.
|
||||
func (e *Encoder) EndObject() {
|
||||
e.prepareNext(objectClose)
|
||||
e.out = append(e.out, '}')
|
||||
}
|
||||
|
||||
// WriteName writes out the given string in JSON string value and the name
|
||||
// separator ':'. Returns error if input string contains invalid UTF-8, which
|
||||
// should not be likely as protobuf field names should be valid.
|
||||
func (e *Encoder) WriteName(s string) error {
|
||||
e.prepareNext(name)
|
||||
var err error
|
||||
// Append to output regardless of error.
|
||||
e.out, err = appendString(e.out, s)
|
||||
e.out = append(e.out, ':')
|
||||
return err
|
||||
}
|
||||
|
||||
// StartArray writes out the '[' symbol.
|
||||
func (e *Encoder) StartArray() {
|
||||
e.prepareNext(arrayOpen)
|
||||
e.out = append(e.out, '[')
|
||||
}
|
||||
|
||||
// EndArray writes out the ']' symbol.
|
||||
func (e *Encoder) EndArray() {
|
||||
e.prepareNext(arrayClose)
|
||||
e.out = append(e.out, ']')
|
||||
}
|
||||
|
||||
// prepareNext adds possible comma and indentation for the next value based
|
||||
// on last type and indent option. It also updates lastKind to next.
|
||||
func (e *Encoder) prepareNext(next kind) {
|
||||
defer func() {
|
||||
// Set lastKind to next.
|
||||
e.lastKind = next
|
||||
}()
|
||||
|
||||
if len(e.indent) == 0 {
|
||||
// Need to add comma on the following condition.
|
||||
if e.lastKind&(scalar|objectClose|arrayClose) != 0 &&
|
||||
next&(name|scalar|objectOpen|arrayOpen) != 0 {
|
||||
e.out = append(e.out, ',')
|
||||
// For single-line output, add a random extra space after each
|
||||
// comma to make output unstable.
|
||||
if detrand.Bool() {
|
||||
e.out = append(e.out, ' ')
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
switch {
|
||||
case e.lastKind&(objectOpen|arrayOpen) != 0:
|
||||
// If next type is NOT closing, add indent and newline.
|
||||
if next&(objectClose|arrayClose) == 0 {
|
||||
e.indents = append(e.indents, e.indent...)
|
||||
e.out = append(e.out, '\n')
|
||||
e.out = append(e.out, e.indents...)
|
||||
}
|
||||
|
||||
case e.lastKind&(scalar|objectClose|arrayClose) != 0:
|
||||
switch {
|
||||
// If next type is either a value or name, add comma and newline.
|
||||
case next&(name|scalar|objectOpen|arrayOpen) != 0:
|
||||
e.out = append(e.out, ',', '\n')
|
||||
|
||||
// If next type is a closing object or array, adjust indentation.
|
||||
case next&(objectClose|arrayClose) != 0:
|
||||
e.indents = e.indents[:len(e.indents)-len(e.indent)]
|
||||
e.out = append(e.out, '\n')
|
||||
}
|
||||
e.out = append(e.out, e.indents...)
|
||||
|
||||
case e.lastKind&name != 0:
|
||||
e.out = append(e.out, ' ')
|
||||
// For multi-line output, add a random extra space after key: to make
|
||||
// output unstable.
|
||||
if detrand.Bool() {
|
||||
e.out = append(e.out, ' ')
|
||||
}
|
||||
}
|
||||
}
|
||||
13
vendor/google.golang.org/protobuf/internal/fieldnum/any_gen.go
generated
vendored
13
vendor/google.golang.org/protobuf/internal/fieldnum/any_gen.go
generated
vendored
@ -1,13 +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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package fieldnum
|
||||
|
||||
// Field numbers for google.protobuf.Any.
|
||||
const (
|
||||
Any_TypeUrl = 1 // optional string
|
||||
Any_Value = 2 // optional bytes
|
||||
)
|
||||
35
vendor/google.golang.org/protobuf/internal/fieldnum/api_gen.go
generated
vendored
35
vendor/google.golang.org/protobuf/internal/fieldnum/api_gen.go
generated
vendored
@ -1,35 +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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package fieldnum
|
||||
|
||||
// Field numbers for google.protobuf.Api.
|
||||
const (
|
||||
Api_Name = 1 // optional string
|
||||
Api_Methods = 2 // repeated google.protobuf.Method
|
||||
Api_Options = 3 // repeated google.protobuf.Option
|
||||
Api_Version = 4 // optional string
|
||||
Api_SourceContext = 5 // optional google.protobuf.SourceContext
|
||||
Api_Mixins = 6 // repeated google.protobuf.Mixin
|
||||
Api_Syntax = 7 // optional google.protobuf.Syntax
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Method.
|
||||
const (
|
||||
Method_Name = 1 // optional string
|
||||
Method_RequestTypeUrl = 2 // optional string
|
||||
Method_RequestStreaming = 3 // optional bool
|
||||
Method_ResponseTypeUrl = 4 // optional string
|
||||
Method_ResponseStreaming = 5 // optional bool
|
||||
Method_Options = 6 // repeated google.protobuf.Option
|
||||
Method_Syntax = 7 // optional google.protobuf.Syntax
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Mixin.
|
||||
const (
|
||||
Mixin_Name = 1 // optional string
|
||||
Mixin_Root = 2 // optional string
|
||||
)
|
||||
240
vendor/google.golang.org/protobuf/internal/fieldnum/descriptor_gen.go
generated
vendored
240
vendor/google.golang.org/protobuf/internal/fieldnum/descriptor_gen.go
generated
vendored
@ -1,240 +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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package fieldnum
|
||||
|
||||
// Field numbers for google.protobuf.FileDescriptorSet.
|
||||
const (
|
||||
FileDescriptorSet_File = 1 // repeated google.protobuf.FileDescriptorProto
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FileDescriptorProto.
|
||||
const (
|
||||
FileDescriptorProto_Name = 1 // optional string
|
||||
FileDescriptorProto_Package = 2 // optional string
|
||||
FileDescriptorProto_Dependency = 3 // repeated string
|
||||
FileDescriptorProto_PublicDependency = 10 // repeated int32
|
||||
FileDescriptorProto_WeakDependency = 11 // repeated int32
|
||||
FileDescriptorProto_MessageType = 4 // repeated google.protobuf.DescriptorProto
|
||||
FileDescriptorProto_EnumType = 5 // repeated google.protobuf.EnumDescriptorProto
|
||||
FileDescriptorProto_Service = 6 // repeated google.protobuf.ServiceDescriptorProto
|
||||
FileDescriptorProto_Extension = 7 // repeated google.protobuf.FieldDescriptorProto
|
||||
FileDescriptorProto_Options = 8 // optional google.protobuf.FileOptions
|
||||
FileDescriptorProto_SourceCodeInfo = 9 // optional google.protobuf.SourceCodeInfo
|
||||
FileDescriptorProto_Syntax = 12 // optional string
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.DescriptorProto.
|
||||
const (
|
||||
DescriptorProto_Name = 1 // optional string
|
||||
DescriptorProto_Field = 2 // repeated google.protobuf.FieldDescriptorProto
|
||||
DescriptorProto_Extension = 6 // repeated google.protobuf.FieldDescriptorProto
|
||||
DescriptorProto_NestedType = 3 // repeated google.protobuf.DescriptorProto
|
||||
DescriptorProto_EnumType = 4 // repeated google.protobuf.EnumDescriptorProto
|
||||
DescriptorProto_ExtensionRange = 5 // repeated google.protobuf.DescriptorProto.ExtensionRange
|
||||
DescriptorProto_OneofDecl = 8 // repeated google.protobuf.OneofDescriptorProto
|
||||
DescriptorProto_Options = 7 // optional google.protobuf.MessageOptions
|
||||
DescriptorProto_ReservedRange = 9 // repeated google.protobuf.DescriptorProto.ReservedRange
|
||||
DescriptorProto_ReservedName = 10 // repeated string
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.DescriptorProto.ExtensionRange.
|
||||
const (
|
||||
DescriptorProto_ExtensionRange_Start = 1 // optional int32
|
||||
DescriptorProto_ExtensionRange_End = 2 // optional int32
|
||||
DescriptorProto_ExtensionRange_Options = 3 // optional google.protobuf.ExtensionRangeOptions
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.DescriptorProto.ReservedRange.
|
||||
const (
|
||||
DescriptorProto_ReservedRange_Start = 1 // optional int32
|
||||
DescriptorProto_ReservedRange_End = 2 // optional int32
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.ExtensionRangeOptions.
|
||||
const (
|
||||
ExtensionRangeOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FieldDescriptorProto.
|
||||
const (
|
||||
FieldDescriptorProto_Name = 1 // optional string
|
||||
FieldDescriptorProto_Number = 3 // optional int32
|
||||
FieldDescriptorProto_Label = 4 // optional google.protobuf.FieldDescriptorProto.Label
|
||||
FieldDescriptorProto_Type = 5 // optional google.protobuf.FieldDescriptorProto.Type
|
||||
FieldDescriptorProto_TypeName = 6 // optional string
|
||||
FieldDescriptorProto_Extendee = 2 // optional string
|
||||
FieldDescriptorProto_DefaultValue = 7 // optional string
|
||||
FieldDescriptorProto_OneofIndex = 9 // optional int32
|
||||
FieldDescriptorProto_JsonName = 10 // optional string
|
||||
FieldDescriptorProto_Options = 8 // optional google.protobuf.FieldOptions
|
||||
FieldDescriptorProto_Proto3Optional = 17 // optional bool
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.OneofDescriptorProto.
|
||||
const (
|
||||
OneofDescriptorProto_Name = 1 // optional string
|
||||
OneofDescriptorProto_Options = 2 // optional google.protobuf.OneofOptions
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumDescriptorProto.
|
||||
const (
|
||||
EnumDescriptorProto_Name = 1 // optional string
|
||||
EnumDescriptorProto_Value = 2 // repeated google.protobuf.EnumValueDescriptorProto
|
||||
EnumDescriptorProto_Options = 3 // optional google.protobuf.EnumOptions
|
||||
EnumDescriptorProto_ReservedRange = 4 // repeated google.protobuf.EnumDescriptorProto.EnumReservedRange
|
||||
EnumDescriptorProto_ReservedName = 5 // repeated string
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumDescriptorProto.EnumReservedRange.
|
||||
const (
|
||||
EnumDescriptorProto_EnumReservedRange_Start = 1 // optional int32
|
||||
EnumDescriptorProto_EnumReservedRange_End = 2 // optional int32
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumValueDescriptorProto.
|
||||
const (
|
||||
EnumValueDescriptorProto_Name = 1 // optional string
|
||||
EnumValueDescriptorProto_Number = 2 // optional int32
|
||||
EnumValueDescriptorProto_Options = 3 // optional google.protobuf.EnumValueOptions
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.ServiceDescriptorProto.
|
||||
const (
|
||||
ServiceDescriptorProto_Name = 1 // optional string
|
||||
ServiceDescriptorProto_Method = 2 // repeated google.protobuf.MethodDescriptorProto
|
||||
ServiceDescriptorProto_Options = 3 // optional google.protobuf.ServiceOptions
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.MethodDescriptorProto.
|
||||
const (
|
||||
MethodDescriptorProto_Name = 1 // optional string
|
||||
MethodDescriptorProto_InputType = 2 // optional string
|
||||
MethodDescriptorProto_OutputType = 3 // optional string
|
||||
MethodDescriptorProto_Options = 4 // optional google.protobuf.MethodOptions
|
||||
MethodDescriptorProto_ClientStreaming = 5 // optional bool
|
||||
MethodDescriptorProto_ServerStreaming = 6 // optional bool
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FileOptions.
|
||||
const (
|
||||
FileOptions_JavaPackage = 1 // optional string
|
||||
FileOptions_JavaOuterClassname = 8 // optional string
|
||||
FileOptions_JavaMultipleFiles = 10 // optional bool
|
||||
FileOptions_JavaGenerateEqualsAndHash = 20 // optional bool
|
||||
FileOptions_JavaStringCheckUtf8 = 27 // optional bool
|
||||
FileOptions_OptimizeFor = 9 // optional google.protobuf.FileOptions.OptimizeMode
|
||||
FileOptions_GoPackage = 11 // optional string
|
||||
FileOptions_CcGenericServices = 16 // optional bool
|
||||
FileOptions_JavaGenericServices = 17 // optional bool
|
||||
FileOptions_PyGenericServices = 18 // optional bool
|
||||
FileOptions_PhpGenericServices = 42 // optional bool
|
||||
FileOptions_Deprecated = 23 // optional bool
|
||||
FileOptions_CcEnableArenas = 31 // optional bool
|
||||
FileOptions_ObjcClassPrefix = 36 // optional string
|
||||
FileOptions_CsharpNamespace = 37 // optional string
|
||||
FileOptions_SwiftPrefix = 39 // optional string
|
||||
FileOptions_PhpClassPrefix = 40 // optional string
|
||||
FileOptions_PhpNamespace = 41 // optional string
|
||||
FileOptions_PhpMetadataNamespace = 44 // optional string
|
||||
FileOptions_RubyPackage = 45 // optional string
|
||||
FileOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.MessageOptions.
|
||||
const (
|
||||
MessageOptions_MessageSetWireFormat = 1 // optional bool
|
||||
MessageOptions_NoStandardDescriptorAccessor = 2 // optional bool
|
||||
MessageOptions_Deprecated = 3 // optional bool
|
||||
MessageOptions_MapEntry = 7 // optional bool
|
||||
MessageOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FieldOptions.
|
||||
const (
|
||||
FieldOptions_Ctype = 1 // optional google.protobuf.FieldOptions.CType
|
||||
FieldOptions_Packed = 2 // optional bool
|
||||
FieldOptions_Jstype = 6 // optional google.protobuf.FieldOptions.JSType
|
||||
FieldOptions_Lazy = 5 // optional bool
|
||||
FieldOptions_Deprecated = 3 // optional bool
|
||||
FieldOptions_Weak = 10 // optional bool
|
||||
FieldOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.OneofOptions.
|
||||
const (
|
||||
OneofOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumOptions.
|
||||
const (
|
||||
EnumOptions_AllowAlias = 2 // optional bool
|
||||
EnumOptions_Deprecated = 3 // optional bool
|
||||
EnumOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumValueOptions.
|
||||
const (
|
||||
EnumValueOptions_Deprecated = 1 // optional bool
|
||||
EnumValueOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.ServiceOptions.
|
||||
const (
|
||||
ServiceOptions_Deprecated = 33 // optional bool
|
||||
ServiceOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.MethodOptions.
|
||||
const (
|
||||
MethodOptions_Deprecated = 33 // optional bool
|
||||
MethodOptions_IdempotencyLevel = 34 // optional google.protobuf.MethodOptions.IdempotencyLevel
|
||||
MethodOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.UninterpretedOption.
|
||||
const (
|
||||
UninterpretedOption_Name = 2 // repeated google.protobuf.UninterpretedOption.NamePart
|
||||
UninterpretedOption_IdentifierValue = 3 // optional string
|
||||
UninterpretedOption_PositiveIntValue = 4 // optional uint64
|
||||
UninterpretedOption_NegativeIntValue = 5 // optional int64
|
||||
UninterpretedOption_DoubleValue = 6 // optional double
|
||||
UninterpretedOption_StringValue = 7 // optional bytes
|
||||
UninterpretedOption_AggregateValue = 8 // optional string
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.UninterpretedOption.NamePart.
|
||||
const (
|
||||
UninterpretedOption_NamePart_NamePart = 1 // required string
|
||||
UninterpretedOption_NamePart_IsExtension = 2 // required bool
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.SourceCodeInfo.
|
||||
const (
|
||||
SourceCodeInfo_Location = 1 // repeated google.protobuf.SourceCodeInfo.Location
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.SourceCodeInfo.Location.
|
||||
const (
|
||||
SourceCodeInfo_Location_Path = 1 // repeated int32
|
||||
SourceCodeInfo_Location_Span = 2 // repeated int32
|
||||
SourceCodeInfo_Location_LeadingComments = 3 // optional string
|
||||
SourceCodeInfo_Location_TrailingComments = 4 // optional string
|
||||
SourceCodeInfo_Location_LeadingDetachedComments = 6 // repeated string
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.GeneratedCodeInfo.
|
||||
const (
|
||||
GeneratedCodeInfo_Annotation = 1 // repeated google.protobuf.GeneratedCodeInfo.Annotation
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.GeneratedCodeInfo.Annotation.
|
||||
const (
|
||||
GeneratedCodeInfo_Annotation_Path = 1 // repeated int32
|
||||
GeneratedCodeInfo_Annotation_SourceFile = 2 // optional string
|
||||
GeneratedCodeInfo_Annotation_Begin = 3 // optional int32
|
||||
GeneratedCodeInfo_Annotation_End = 4 // optional int32
|
||||
)
|
||||
7
vendor/google.golang.org/protobuf/internal/fieldnum/doc.go
generated
vendored
7
vendor/google.golang.org/protobuf/internal/fieldnum/doc.go
generated
vendored
@ -1,7 +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 fieldnum contains constants for field numbers of fields in messages
|
||||
// declared in descriptor.proto and any of the well-known types.
|
||||
package fieldnum
|
||||
13
vendor/google.golang.org/protobuf/internal/fieldnum/duration_gen.go
generated
vendored
13
vendor/google.golang.org/protobuf/internal/fieldnum/duration_gen.go
generated
vendored
@ -1,13 +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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package fieldnum
|
||||
|
||||
// Field numbers for google.protobuf.Duration.
|
||||
const (
|
||||
Duration_Seconds = 1 // optional int64
|
||||
Duration_Nanos = 2 // optional int32
|
||||
)
|
||||
10
vendor/google.golang.org/protobuf/internal/fieldnum/empty_gen.go
generated
vendored
10
vendor/google.golang.org/protobuf/internal/fieldnum/empty_gen.go
generated
vendored
@ -1,10 +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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package fieldnum
|
||||
|
||||
// Field numbers for google.protobuf.Empty.
|
||||
const ()
|
||||
12
vendor/google.golang.org/protobuf/internal/fieldnum/field_mask_gen.go
generated
vendored
12
vendor/google.golang.org/protobuf/internal/fieldnum/field_mask_gen.go
generated
vendored
@ -1,12 +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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package fieldnum
|
||||
|
||||
// Field numbers for google.protobuf.FieldMask.
|
||||
const (
|
||||
FieldMask_Paths = 1 // repeated string
|
||||
)
|
||||
12
vendor/google.golang.org/protobuf/internal/fieldnum/source_context_gen.go
generated
vendored
12
vendor/google.golang.org/protobuf/internal/fieldnum/source_context_gen.go
generated
vendored
@ -1,12 +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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package fieldnum
|
||||
|
||||
// Field numbers for google.protobuf.SourceContext.
|
||||
const (
|
||||
SourceContext_FileName = 1 // optional string
|
||||
)
|
||||
33
vendor/google.golang.org/protobuf/internal/fieldnum/struct_gen.go
generated
vendored
33
vendor/google.golang.org/protobuf/internal/fieldnum/struct_gen.go
generated
vendored
@ -1,33 +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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package fieldnum
|
||||
|
||||
// Field numbers for google.protobuf.Struct.
|
||||
const (
|
||||
Struct_Fields = 1 // repeated google.protobuf.Struct.FieldsEntry
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Struct.FieldsEntry.
|
||||
const (
|
||||
Struct_FieldsEntry_Key = 1 // optional string
|
||||
Struct_FieldsEntry_Value = 2 // optional google.protobuf.Value
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Value.
|
||||
const (
|
||||
Value_NullValue = 1 // optional google.protobuf.NullValue
|
||||
Value_NumberValue = 2 // optional double
|
||||
Value_StringValue = 3 // optional string
|
||||
Value_BoolValue = 4 // optional bool
|
||||
Value_StructValue = 5 // optional google.protobuf.Struct
|
||||
Value_ListValue = 6 // optional google.protobuf.ListValue
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.ListValue.
|
||||
const (
|
||||
ListValue_Values = 1 // repeated google.protobuf.Value
|
||||
)
|
||||
13
vendor/google.golang.org/protobuf/internal/fieldnum/timestamp_gen.go
generated
vendored
13
vendor/google.golang.org/protobuf/internal/fieldnum/timestamp_gen.go
generated
vendored
@ -1,13 +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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package fieldnum
|
||||
|
||||
// Field numbers for google.protobuf.Timestamp.
|
||||
const (
|
||||
Timestamp_Seconds = 1 // optional int64
|
||||
Timestamp_Nanos = 2 // optional int32
|
||||
)
|
||||
53
vendor/google.golang.org/protobuf/internal/fieldnum/type_gen.go
generated
vendored
53
vendor/google.golang.org/protobuf/internal/fieldnum/type_gen.go
generated
vendored
@ -1,53 +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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package fieldnum
|
||||
|
||||
// Field numbers for google.protobuf.Type.
|
||||
const (
|
||||
Type_Name = 1 // optional string
|
||||
Type_Fields = 2 // repeated google.protobuf.Field
|
||||
Type_Oneofs = 3 // repeated string
|
||||
Type_Options = 4 // repeated google.protobuf.Option
|
||||
Type_SourceContext = 5 // optional google.protobuf.SourceContext
|
||||
Type_Syntax = 6 // optional google.protobuf.Syntax
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Field.
|
||||
const (
|
||||
Field_Kind = 1 // optional google.protobuf.Field.Kind
|
||||
Field_Cardinality = 2 // optional google.protobuf.Field.Cardinality
|
||||
Field_Number = 3 // optional int32
|
||||
Field_Name = 4 // optional string
|
||||
Field_TypeUrl = 6 // optional string
|
||||
Field_OneofIndex = 7 // optional int32
|
||||
Field_Packed = 8 // optional bool
|
||||
Field_Options = 9 // repeated google.protobuf.Option
|
||||
Field_JsonName = 10 // optional string
|
||||
Field_DefaultValue = 11 // optional string
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Enum.
|
||||
const (
|
||||
Enum_Name = 1 // optional string
|
||||
Enum_Enumvalue = 2 // repeated google.protobuf.EnumValue
|
||||
Enum_Options = 3 // repeated google.protobuf.Option
|
||||
Enum_SourceContext = 4 // optional google.protobuf.SourceContext
|
||||
Enum_Syntax = 5 // optional google.protobuf.Syntax
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumValue.
|
||||
const (
|
||||
EnumValue_Name = 1 // optional string
|
||||
EnumValue_Number = 2 // optional int32
|
||||
EnumValue_Options = 3 // repeated google.protobuf.Option
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Option.
|
||||
const (
|
||||
Option_Name = 1 // optional string
|
||||
Option_Value = 2 // optional google.protobuf.Any
|
||||
)
|
||||
52
vendor/google.golang.org/protobuf/internal/fieldnum/wrappers_gen.go
generated
vendored
52
vendor/google.golang.org/protobuf/internal/fieldnum/wrappers_gen.go
generated
vendored
@ -1,52 +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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package fieldnum
|
||||
|
||||
// Field numbers for google.protobuf.DoubleValue.
|
||||
const (
|
||||
DoubleValue_Value = 1 // optional double
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FloatValue.
|
||||
const (
|
||||
FloatValue_Value = 1 // optional float
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Int64Value.
|
||||
const (
|
||||
Int64Value_Value = 1 // optional int64
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.UInt64Value.
|
||||
const (
|
||||
UInt64Value_Value = 1 // optional uint64
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Int32Value.
|
||||
const (
|
||||
Int32Value_Value = 1 // optional int32
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.UInt32Value.
|
||||
const (
|
||||
UInt32Value_Value = 1 // optional uint32
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.BoolValue.
|
||||
const (
|
||||
BoolValue_Value = 1 // optional bool
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.StringValue.
|
||||
const (
|
||||
StringValue_Value = 1 // optional string
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.BytesValue.
|
||||
const (
|
||||
BytesValue_Value = 1 // optional bytes
|
||||
)
|
||||
16
vendor/google.golang.org/protobuf/internal/filedesc/build.go
generated
vendored
16
vendor/google.golang.org/protobuf/internal/filedesc/build.go
generated
vendored
@ -7,7 +7,7 @@ package filedesc
|
||||
|
||||
import (
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/fieldnum"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
pref "google.golang.org/protobuf/reflect/protoreflect"
|
||||
preg "google.golang.org/protobuf/reflect/protoregistry"
|
||||
@ -126,24 +126,24 @@ func (db *Builder) unmarshalCounts(b []byte, isFile bool) {
|
||||
b = b[m:]
|
||||
if isFile {
|
||||
switch num {
|
||||
case fieldnum.FileDescriptorProto_EnumType:
|
||||
case genid.FileDescriptorProto_EnumType_field_number:
|
||||
db.NumEnums++
|
||||
case fieldnum.FileDescriptorProto_MessageType:
|
||||
case genid.FileDescriptorProto_MessageType_field_number:
|
||||
db.unmarshalCounts(v, false)
|
||||
db.NumMessages++
|
||||
case fieldnum.FileDescriptorProto_Extension:
|
||||
case genid.FileDescriptorProto_Extension_field_number:
|
||||
db.NumExtensions++
|
||||
case fieldnum.FileDescriptorProto_Service:
|
||||
case genid.FileDescriptorProto_Service_field_number:
|
||||
db.NumServices++
|
||||
}
|
||||
} else {
|
||||
switch num {
|
||||
case fieldnum.DescriptorProto_EnumType:
|
||||
case genid.DescriptorProto_EnumType_field_number:
|
||||
db.NumEnums++
|
||||
case fieldnum.DescriptorProto_NestedType:
|
||||
case genid.DescriptorProto_NestedType_field_number:
|
||||
db.unmarshalCounts(v, false)
|
||||
db.NumMessages++
|
||||
case fieldnum.DescriptorProto_Extension:
|
||||
case genid.DescriptorProto_Extension_field_number:
|
||||
db.NumExtensions++
|
||||
}
|
||||
}
|
||||
|
||||
5
vendor/google.golang.org/protobuf/internal/filedesc/desc.go
generated
vendored
5
vendor/google.golang.org/protobuf/internal/filedesc/desc.go
generated
vendored
@ -13,6 +13,7 @@ import (
|
||||
"google.golang.org/protobuf/internal/descfmt"
|
||||
"google.golang.org/protobuf/internal/descopts"
|
||||
"google.golang.org/protobuf/internal/encoding/defval"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
pref "google.golang.org/protobuf/reflect/protoreflect"
|
||||
@ -302,13 +303,13 @@ func (fd *Field) MapKey() pref.FieldDescriptor {
|
||||
if !fd.IsMap() {
|
||||
return nil
|
||||
}
|
||||
return fd.Message().Fields().ByNumber(1)
|
||||
return fd.Message().Fields().ByNumber(genid.MapEntry_Key_field_number)
|
||||
}
|
||||
func (fd *Field) MapValue() pref.FieldDescriptor {
|
||||
if !fd.IsMap() {
|
||||
return nil
|
||||
}
|
||||
return fd.Message().Fields().ByNumber(2)
|
||||
return fd.Message().Fields().ByNumber(genid.MapEntry_Value_field_number)
|
||||
}
|
||||
func (fd *Field) HasDefault() bool { return fd.L1.Default.has }
|
||||
func (fd *Field) Default() pref.Value { return fd.L1.Default.get(fd) }
|
||||
|
||||
62
vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go
generated
vendored
62
vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go
generated
vendored
@ -8,7 +8,7 @@ import (
|
||||
"sync"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/fieldnum"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
pref "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
@ -107,7 +107,7 @@ func (fd *File) unmarshalSeed(b []byte) {
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.FileDescriptorProto_Syntax:
|
||||
case genid.FileDescriptorProto_Syntax_field_number:
|
||||
switch string(v) {
|
||||
case "proto2":
|
||||
fd.L1.Syntax = pref.Proto2
|
||||
@ -116,36 +116,36 @@ func (fd *File) unmarshalSeed(b []byte) {
|
||||
default:
|
||||
panic("invalid syntax")
|
||||
}
|
||||
case fieldnum.FileDescriptorProto_Name:
|
||||
case genid.FileDescriptorProto_Name_field_number:
|
||||
fd.L1.Path = sb.MakeString(v)
|
||||
case fieldnum.FileDescriptorProto_Package:
|
||||
case genid.FileDescriptorProto_Package_field_number:
|
||||
fd.L1.Package = pref.FullName(sb.MakeString(v))
|
||||
case fieldnum.FileDescriptorProto_EnumType:
|
||||
if prevField != fieldnum.FileDescriptorProto_EnumType {
|
||||
case genid.FileDescriptorProto_EnumType_field_number:
|
||||
if prevField != genid.FileDescriptorProto_EnumType_field_number {
|
||||
if numEnums > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posEnums = len(b0) - len(b) - n - m
|
||||
}
|
||||
numEnums++
|
||||
case fieldnum.FileDescriptorProto_MessageType:
|
||||
if prevField != fieldnum.FileDescriptorProto_MessageType {
|
||||
case genid.FileDescriptorProto_MessageType_field_number:
|
||||
if prevField != genid.FileDescriptorProto_MessageType_field_number {
|
||||
if numMessages > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posMessages = len(b0) - len(b) - n - m
|
||||
}
|
||||
numMessages++
|
||||
case fieldnum.FileDescriptorProto_Extension:
|
||||
if prevField != fieldnum.FileDescriptorProto_Extension {
|
||||
case genid.FileDescriptorProto_Extension_field_number:
|
||||
if prevField != genid.FileDescriptorProto_Extension_field_number {
|
||||
if numExtensions > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posExtensions = len(b0) - len(b) - n - m
|
||||
}
|
||||
numExtensions++
|
||||
case fieldnum.FileDescriptorProto_Service:
|
||||
if prevField != fieldnum.FileDescriptorProto_Service {
|
||||
case genid.FileDescriptorProto_Service_field_number:
|
||||
if prevField != genid.FileDescriptorProto_Service_field_number {
|
||||
if numServices > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
@ -233,9 +233,9 @@ func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Desc
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.EnumDescriptorProto_Name:
|
||||
case genid.EnumDescriptorProto_Name_field_number:
|
||||
ed.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case fieldnum.EnumDescriptorProto_Value:
|
||||
case genid.EnumDescriptorProto_Value_field_number:
|
||||
numValues++
|
||||
}
|
||||
default:
|
||||
@ -260,7 +260,7 @@ func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Desc
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.EnumDescriptorProto_Value:
|
||||
case genid.EnumDescriptorProto_Value_field_number:
|
||||
ed.L2.Values.List[i].unmarshalFull(v, sb, pf, ed, i)
|
||||
i++
|
||||
}
|
||||
@ -288,33 +288,33 @@ func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.D
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.DescriptorProto_Name:
|
||||
case genid.DescriptorProto_Name_field_number:
|
||||
md.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case fieldnum.DescriptorProto_EnumType:
|
||||
if prevField != fieldnum.DescriptorProto_EnumType {
|
||||
case genid.DescriptorProto_EnumType_field_number:
|
||||
if prevField != genid.DescriptorProto_EnumType_field_number {
|
||||
if numEnums > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posEnums = len(b0) - len(b) - n - m
|
||||
}
|
||||
numEnums++
|
||||
case fieldnum.DescriptorProto_NestedType:
|
||||
if prevField != fieldnum.DescriptorProto_NestedType {
|
||||
case genid.DescriptorProto_NestedType_field_number:
|
||||
if prevField != genid.DescriptorProto_NestedType_field_number {
|
||||
if numMessages > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posMessages = len(b0) - len(b) - n - m
|
||||
}
|
||||
numMessages++
|
||||
case fieldnum.DescriptorProto_Extension:
|
||||
if prevField != fieldnum.DescriptorProto_Extension {
|
||||
case genid.DescriptorProto_Extension_field_number:
|
||||
if prevField != genid.DescriptorProto_Extension_field_number {
|
||||
if numExtensions > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posExtensions = len(b0) - len(b) - n - m
|
||||
}
|
||||
numExtensions++
|
||||
case fieldnum.DescriptorProto_Options:
|
||||
case genid.DescriptorProto_Options_field_number:
|
||||
md.unmarshalSeedOptions(v)
|
||||
}
|
||||
prevField = num
|
||||
@ -375,9 +375,9 @@ func (md *Message) unmarshalSeedOptions(b []byte) {
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.MessageOptions_MapEntry:
|
||||
case genid.MessageOptions_MapEntry_field_number:
|
||||
md.L1.IsMapEntry = protowire.DecodeBool(v)
|
||||
case fieldnum.MessageOptions_MessageSetWireFormat:
|
||||
case genid.MessageOptions_MessageSetWireFormat_field_number:
|
||||
md.L1.IsMessageSet = protowire.DecodeBool(v)
|
||||
}
|
||||
default:
|
||||
@ -400,20 +400,20 @@ func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.FieldDescriptorProto_Number:
|
||||
case genid.FieldDescriptorProto_Number_field_number:
|
||||
xd.L1.Number = pref.FieldNumber(v)
|
||||
case fieldnum.FieldDescriptorProto_Label:
|
||||
case genid.FieldDescriptorProto_Label_field_number:
|
||||
xd.L1.Cardinality = pref.Cardinality(v)
|
||||
case fieldnum.FieldDescriptorProto_Type:
|
||||
case genid.FieldDescriptorProto_Type_field_number:
|
||||
xd.L1.Kind = pref.Kind(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.FieldDescriptorProto_Name:
|
||||
case genid.FieldDescriptorProto_Name_field_number:
|
||||
xd.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case fieldnum.FieldDescriptorProto_Extendee:
|
||||
case genid.FieldDescriptorProto_Extendee_field_number:
|
||||
xd.L1.Extendee = PlaceholderMessage(makeFullName(sb, v))
|
||||
}
|
||||
default:
|
||||
@ -436,7 +436,7 @@ func (sd *Service) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.D
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.ServiceDescriptorProto_Name:
|
||||
case genid.ServiceDescriptorProto_Name_field_number:
|
||||
sd.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
}
|
||||
default:
|
||||
|
||||
124
vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go
generated
vendored
124
vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go
generated
vendored
@ -10,7 +10,7 @@ import (
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/descopts"
|
||||
"google.golang.org/protobuf/internal/fieldnum"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/proto"
|
||||
pref "google.golang.org/protobuf/reflect/protoreflect"
|
||||
@ -143,35 +143,35 @@ func (fd *File) unmarshalFull(b []byte) {
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.FileDescriptorProto_PublicDependency:
|
||||
case genid.FileDescriptorProto_PublicDependency_field_number:
|
||||
fd.L2.Imports[v].IsPublic = true
|
||||
case fieldnum.FileDescriptorProto_WeakDependency:
|
||||
case genid.FileDescriptorProto_WeakDependency_field_number:
|
||||
fd.L2.Imports[v].IsWeak = true
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.FileDescriptorProto_Dependency:
|
||||
case genid.FileDescriptorProto_Dependency_field_number:
|
||||
path := sb.MakeString(v)
|
||||
imp, _ := fd.builder.FileRegistry.FindFileByPath(path)
|
||||
if imp == nil {
|
||||
imp = PlaceholderFile(path)
|
||||
}
|
||||
fd.L2.Imports = append(fd.L2.Imports, pref.FileImport{FileDescriptor: imp})
|
||||
case fieldnum.FileDescriptorProto_EnumType:
|
||||
case genid.FileDescriptorProto_EnumType_field_number:
|
||||
fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb)
|
||||
enumIdx++
|
||||
case fieldnum.FileDescriptorProto_MessageType:
|
||||
case genid.FileDescriptorProto_MessageType_field_number:
|
||||
fd.L1.Messages.List[messageIdx].unmarshalFull(v, sb)
|
||||
messageIdx++
|
||||
case fieldnum.FileDescriptorProto_Extension:
|
||||
case genid.FileDescriptorProto_Extension_field_number:
|
||||
fd.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb)
|
||||
extensionIdx++
|
||||
case fieldnum.FileDescriptorProto_Service:
|
||||
case genid.FileDescriptorProto_Service_field_number:
|
||||
fd.L1.Services.List[serviceIdx].unmarshalFull(v, sb)
|
||||
serviceIdx++
|
||||
case fieldnum.FileDescriptorProto_Options:
|
||||
case genid.FileDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
@ -196,13 +196,13 @@ func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) {
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.EnumDescriptorProto_Value:
|
||||
case genid.EnumDescriptorProto_Value_field_number:
|
||||
rawValues = append(rawValues, v)
|
||||
case fieldnum.EnumDescriptorProto_ReservedName:
|
||||
case genid.EnumDescriptorProto_ReservedName_field_number:
|
||||
ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, pref.Name(sb.MakeString(v)))
|
||||
case fieldnum.EnumDescriptorProto_ReservedRange:
|
||||
case genid.EnumDescriptorProto_ReservedRange_field_number:
|
||||
ed.L2.ReservedRanges.List = append(ed.L2.ReservedRanges.List, unmarshalEnumReservedRange(v))
|
||||
case fieldnum.EnumDescriptorProto_Options:
|
||||
case genid.EnumDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
@ -228,9 +228,9 @@ func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) {
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.EnumDescriptorProto_EnumReservedRange_Start:
|
||||
case genid.EnumDescriptorProto_EnumReservedRange_Start_field_number:
|
||||
r[0] = pref.EnumNumber(v)
|
||||
case fieldnum.EnumDescriptorProto_EnumReservedRange_End:
|
||||
case genid.EnumDescriptorProto_EnumReservedRange_End_field_number:
|
||||
r[1] = pref.EnumNumber(v)
|
||||
}
|
||||
default:
|
||||
@ -255,17 +255,17 @@ func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.EnumValueDescriptorProto_Number:
|
||||
case genid.EnumValueDescriptorProto_Number_field_number:
|
||||
vd.L1.Number = pref.EnumNumber(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.EnumValueDescriptorProto_Name:
|
||||
case genid.EnumValueDescriptorProto_Name_field_number:
|
||||
// NOTE: Enum values are in the same scope as the enum parent.
|
||||
vd.L0.FullName = appendFullName(sb, pd.Parent().FullName(), v)
|
||||
case fieldnum.EnumValueDescriptorProto_Options:
|
||||
case genid.EnumValueDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
@ -289,29 +289,29 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) {
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.DescriptorProto_Field:
|
||||
case genid.DescriptorProto_Field_field_number:
|
||||
rawFields = append(rawFields, v)
|
||||
case fieldnum.DescriptorProto_OneofDecl:
|
||||
case genid.DescriptorProto_OneofDecl_field_number:
|
||||
rawOneofs = append(rawOneofs, v)
|
||||
case fieldnum.DescriptorProto_ReservedName:
|
||||
case genid.DescriptorProto_ReservedName_field_number:
|
||||
md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, pref.Name(sb.MakeString(v)))
|
||||
case fieldnum.DescriptorProto_ReservedRange:
|
||||
case genid.DescriptorProto_ReservedRange_field_number:
|
||||
md.L2.ReservedRanges.List = append(md.L2.ReservedRanges.List, unmarshalMessageReservedRange(v))
|
||||
case fieldnum.DescriptorProto_ExtensionRange:
|
||||
case genid.DescriptorProto_ExtensionRange_field_number:
|
||||
r, rawOptions := unmarshalMessageExtensionRange(v)
|
||||
opts := md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.ExtensionRange, rawOptions)
|
||||
md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, r)
|
||||
md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, opts)
|
||||
case fieldnum.DescriptorProto_EnumType:
|
||||
case genid.DescriptorProto_EnumType_field_number:
|
||||
md.L1.Enums.List[enumIdx].unmarshalFull(v, sb)
|
||||
enumIdx++
|
||||
case fieldnum.DescriptorProto_NestedType:
|
||||
case genid.DescriptorProto_NestedType_field_number:
|
||||
md.L1.Messages.List[messageIdx].unmarshalFull(v, sb)
|
||||
messageIdx++
|
||||
case fieldnum.DescriptorProto_Extension:
|
||||
case genid.DescriptorProto_Extension_field_number:
|
||||
md.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb)
|
||||
extensionIdx++
|
||||
case fieldnum.DescriptorProto_Options:
|
||||
case genid.DescriptorProto_Options_field_number:
|
||||
md.unmarshalOptions(v)
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
@ -347,9 +347,9 @@ func (md *Message) unmarshalOptions(b []byte) {
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.MessageOptions_MapEntry:
|
||||
case genid.MessageOptions_MapEntry_field_number:
|
||||
md.L1.IsMapEntry = protowire.DecodeBool(v)
|
||||
case fieldnum.MessageOptions_MessageSetWireFormat:
|
||||
case genid.MessageOptions_MessageSetWireFormat_field_number:
|
||||
md.L1.IsMessageSet = protowire.DecodeBool(v)
|
||||
}
|
||||
default:
|
||||
@ -368,9 +368,9 @@ func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) {
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.DescriptorProto_ReservedRange_Start:
|
||||
case genid.DescriptorProto_ReservedRange_Start_field_number:
|
||||
r[0] = pref.FieldNumber(v)
|
||||
case fieldnum.DescriptorProto_ReservedRange_End:
|
||||
case genid.DescriptorProto_ReservedRange_End_field_number:
|
||||
r[1] = pref.FieldNumber(v)
|
||||
}
|
||||
default:
|
||||
@ -390,16 +390,16 @@ func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.DescriptorProto_ExtensionRange_Start:
|
||||
case genid.DescriptorProto_ExtensionRange_Start_field_number:
|
||||
r[0] = pref.FieldNumber(v)
|
||||
case fieldnum.DescriptorProto_ExtensionRange_End:
|
||||
case genid.DescriptorProto_ExtensionRange_End_field_number:
|
||||
r[1] = pref.FieldNumber(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.DescriptorProto_ExtensionRange_Options:
|
||||
case genid.DescriptorProto_ExtensionRange_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
@ -425,13 +425,13 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.FieldDescriptorProto_Number:
|
||||
case genid.FieldDescriptorProto_Number_field_number:
|
||||
fd.L1.Number = pref.FieldNumber(v)
|
||||
case fieldnum.FieldDescriptorProto_Label:
|
||||
case genid.FieldDescriptorProto_Label_field_number:
|
||||
fd.L1.Cardinality = pref.Cardinality(v)
|
||||
case fieldnum.FieldDescriptorProto_Type:
|
||||
case genid.FieldDescriptorProto_Type_field_number:
|
||||
fd.L1.Kind = pref.Kind(v)
|
||||
case fieldnum.FieldDescriptorProto_OneofIndex:
|
||||
case genid.FieldDescriptorProto_OneofIndex_field_number:
|
||||
// In Message.unmarshalFull, we allocate slices for both
|
||||
// the field and oneof descriptors before unmarshaling either
|
||||
// of them. This ensures pointers to slice elements are stable.
|
||||
@ -441,22 +441,22 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des
|
||||
panic("oneof type already set")
|
||||
}
|
||||
fd.L1.ContainingOneof = od
|
||||
case fieldnum.FieldDescriptorProto_Proto3Optional:
|
||||
case genid.FieldDescriptorProto_Proto3Optional_field_number:
|
||||
fd.L1.IsProto3Optional = protowire.DecodeBool(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.FieldDescriptorProto_Name:
|
||||
case genid.FieldDescriptorProto_Name_field_number:
|
||||
fd.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case fieldnum.FieldDescriptorProto_JsonName:
|
||||
case genid.FieldDescriptorProto_JsonName_field_number:
|
||||
fd.L1.JSONName.Init(sb.MakeString(v))
|
||||
case fieldnum.FieldDescriptorProto_DefaultValue:
|
||||
case genid.FieldDescriptorProto_DefaultValue_field_number:
|
||||
fd.L1.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages
|
||||
case fieldnum.FieldDescriptorProto_TypeName:
|
||||
case genid.FieldDescriptorProto_TypeName_field_number:
|
||||
rawTypeName = v
|
||||
case fieldnum.FieldDescriptorProto_Options:
|
||||
case genid.FieldDescriptorProto_Options_field_number:
|
||||
fd.unmarshalOptions(v)
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
@ -488,10 +488,10 @@ func (fd *Field) unmarshalOptions(b []byte) {
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.FieldOptions_Packed:
|
||||
case genid.FieldOptions_Packed_field_number:
|
||||
fd.L1.HasPacked = true
|
||||
fd.L1.IsPacked = protowire.DecodeBool(v)
|
||||
case fieldnum.FieldOptions_Weak:
|
||||
case genid.FieldOptions_Weak_field_number:
|
||||
fd.L1.IsWeak = protowire.DecodeBool(v)
|
||||
case FieldOptions_EnforceUTF8:
|
||||
fd.L1.HasEnforceUTF8 = true
|
||||
@ -518,9 +518,9 @@ func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.OneofDescriptorProto_Name:
|
||||
case genid.OneofDescriptorProto_Name_field_number:
|
||||
od.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case fieldnum.OneofDescriptorProto_Options:
|
||||
case genid.OneofDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
@ -543,20 +543,20 @@ func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) {
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.FieldDescriptorProto_Proto3Optional:
|
||||
case genid.FieldDescriptorProto_Proto3Optional_field_number:
|
||||
xd.L2.IsProto3Optional = protowire.DecodeBool(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.FieldDescriptorProto_JsonName:
|
||||
case genid.FieldDescriptorProto_JsonName_field_number:
|
||||
xd.L2.JSONName.Init(sb.MakeString(v))
|
||||
case fieldnum.FieldDescriptorProto_DefaultValue:
|
||||
case genid.FieldDescriptorProto_DefaultValue_field_number:
|
||||
xd.L2.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions
|
||||
case fieldnum.FieldDescriptorProto_TypeName:
|
||||
case genid.FieldDescriptorProto_TypeName_field_number:
|
||||
rawTypeName = v
|
||||
case fieldnum.FieldDescriptorProto_Options:
|
||||
case genid.FieldDescriptorProto_Options_field_number:
|
||||
xd.unmarshalOptions(v)
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
@ -586,7 +586,7 @@ func (xd *Extension) unmarshalOptions(b []byte) {
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.FieldOptions_Packed:
|
||||
case genid.FieldOptions_Packed_field_number:
|
||||
xd.L2.IsPacked = protowire.DecodeBool(v)
|
||||
}
|
||||
default:
|
||||
@ -608,9 +608,9 @@ func (sd *Service) unmarshalFull(b []byte, sb *strs.Builder) {
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.ServiceDescriptorProto_Method:
|
||||
case genid.ServiceDescriptorProto_Method_field_number:
|
||||
rawMethods = append(rawMethods, v)
|
||||
case fieldnum.ServiceDescriptorProto_Options:
|
||||
case genid.ServiceDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
@ -641,22 +641,22 @@ func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.De
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.MethodDescriptorProto_ClientStreaming:
|
||||
case genid.MethodDescriptorProto_ClientStreaming_field_number:
|
||||
md.L1.IsStreamingClient = protowire.DecodeBool(v)
|
||||
case fieldnum.MethodDescriptorProto_ServerStreaming:
|
||||
case genid.MethodDescriptorProto_ServerStreaming_field_number:
|
||||
md.L1.IsStreamingServer = protowire.DecodeBool(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case fieldnum.MethodDescriptorProto_Name:
|
||||
case genid.MethodDescriptorProto_Name_field_number:
|
||||
md.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case fieldnum.MethodDescriptorProto_InputType:
|
||||
case genid.MethodDescriptorProto_InputType_field_number:
|
||||
md.L1.Input = PlaceholderMessage(makeFullName(sb, v))
|
||||
case fieldnum.MethodDescriptorProto_OutputType:
|
||||
case genid.MethodDescriptorProto_OutputType_field_number:
|
||||
md.L1.Output = PlaceholderMessage(makeFullName(sb, v))
|
||||
case fieldnum.MethodDescriptorProto_Options:
|
||||
case genid.MethodDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
|
||||
6
vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go
generated
vendored
6
vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go
generated
vendored
@ -6,7 +6,6 @@ package filedesc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"sort"
|
||||
"sync"
|
||||
|
||||
@ -185,10 +184,7 @@ func (p *FieldRanges) CheckValid(isMessageSet bool) error {
|
||||
// Unlike the FieldNumber.IsValid method, it allows ranges that cover the
|
||||
// reserved number range.
|
||||
func isValidFieldNumber(n protoreflect.FieldNumber, isMessageSet bool) bool {
|
||||
if isMessageSet {
|
||||
return protowire.MinValidNumber <= n && n <= math.MaxInt32
|
||||
}
|
||||
return protowire.MinValidNumber <= n && n <= protowire.MaxValidNumber
|
||||
return protowire.MinValidNumber <= n && (n <= protowire.MaxValidNumber || isMessageSet)
|
||||
}
|
||||
|
||||
// CheckOverlap reports an error if p and q overlap.
|
||||
|
||||
34
vendor/google.golang.org/protobuf/internal/genid/any_gen.go
generated
vendored
Normal file
34
vendor/google.golang.org/protobuf/internal/genid/any_gen.go
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
// 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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_any_proto = "google/protobuf/any.proto"
|
||||
|
||||
// Names for google.protobuf.Any.
|
||||
const (
|
||||
Any_message_name protoreflect.Name = "Any"
|
||||
Any_message_fullname protoreflect.FullName = "google.protobuf.Any"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Any.
|
||||
const (
|
||||
Any_TypeUrl_field_name protoreflect.Name = "type_url"
|
||||
Any_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
Any_TypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Any.type_url"
|
||||
Any_Value_field_fullname protoreflect.FullName = "google.protobuf.Any.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Any.
|
||||
const (
|
||||
Any_TypeUrl_field_number protoreflect.FieldNumber = 1
|
||||
Any_Value_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
106
vendor/google.golang.org/protobuf/internal/genid/api_gen.go
generated
vendored
Normal file
106
vendor/google.golang.org/protobuf/internal/genid/api_gen.go
generated
vendored
Normal file
@ -0,0 +1,106 @@
|
||||
// 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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_api_proto = "google/protobuf/api.proto"
|
||||
|
||||
// Names for google.protobuf.Api.
|
||||
const (
|
||||
Api_message_name protoreflect.Name = "Api"
|
||||
Api_message_fullname protoreflect.FullName = "google.protobuf.Api"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Api.
|
||||
const (
|
||||
Api_Name_field_name protoreflect.Name = "name"
|
||||
Api_Methods_field_name protoreflect.Name = "methods"
|
||||
Api_Options_field_name protoreflect.Name = "options"
|
||||
Api_Version_field_name protoreflect.Name = "version"
|
||||
Api_SourceContext_field_name protoreflect.Name = "source_context"
|
||||
Api_Mixins_field_name protoreflect.Name = "mixins"
|
||||
Api_Syntax_field_name protoreflect.Name = "syntax"
|
||||
|
||||
Api_Name_field_fullname protoreflect.FullName = "google.protobuf.Api.name"
|
||||
Api_Methods_field_fullname protoreflect.FullName = "google.protobuf.Api.methods"
|
||||
Api_Options_field_fullname protoreflect.FullName = "google.protobuf.Api.options"
|
||||
Api_Version_field_fullname protoreflect.FullName = "google.protobuf.Api.version"
|
||||
Api_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Api.source_context"
|
||||
Api_Mixins_field_fullname protoreflect.FullName = "google.protobuf.Api.mixins"
|
||||
Api_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Api.syntax"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Api.
|
||||
const (
|
||||
Api_Name_field_number protoreflect.FieldNumber = 1
|
||||
Api_Methods_field_number protoreflect.FieldNumber = 2
|
||||
Api_Options_field_number protoreflect.FieldNumber = 3
|
||||
Api_Version_field_number protoreflect.FieldNumber = 4
|
||||
Api_SourceContext_field_number protoreflect.FieldNumber = 5
|
||||
Api_Mixins_field_number protoreflect.FieldNumber = 6
|
||||
Api_Syntax_field_number protoreflect.FieldNumber = 7
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Method.
|
||||
const (
|
||||
Method_message_name protoreflect.Name = "Method"
|
||||
Method_message_fullname protoreflect.FullName = "google.protobuf.Method"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Method.
|
||||
const (
|
||||
Method_Name_field_name protoreflect.Name = "name"
|
||||
Method_RequestTypeUrl_field_name protoreflect.Name = "request_type_url"
|
||||
Method_RequestStreaming_field_name protoreflect.Name = "request_streaming"
|
||||
Method_ResponseTypeUrl_field_name protoreflect.Name = "response_type_url"
|
||||
Method_ResponseStreaming_field_name protoreflect.Name = "response_streaming"
|
||||
Method_Options_field_name protoreflect.Name = "options"
|
||||
Method_Syntax_field_name protoreflect.Name = "syntax"
|
||||
|
||||
Method_Name_field_fullname protoreflect.FullName = "google.protobuf.Method.name"
|
||||
Method_RequestTypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Method.request_type_url"
|
||||
Method_RequestStreaming_field_fullname protoreflect.FullName = "google.protobuf.Method.request_streaming"
|
||||
Method_ResponseTypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Method.response_type_url"
|
||||
Method_ResponseStreaming_field_fullname protoreflect.FullName = "google.protobuf.Method.response_streaming"
|
||||
Method_Options_field_fullname protoreflect.FullName = "google.protobuf.Method.options"
|
||||
Method_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Method.syntax"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Method.
|
||||
const (
|
||||
Method_Name_field_number protoreflect.FieldNumber = 1
|
||||
Method_RequestTypeUrl_field_number protoreflect.FieldNumber = 2
|
||||
Method_RequestStreaming_field_number protoreflect.FieldNumber = 3
|
||||
Method_ResponseTypeUrl_field_number protoreflect.FieldNumber = 4
|
||||
Method_ResponseStreaming_field_number protoreflect.FieldNumber = 5
|
||||
Method_Options_field_number protoreflect.FieldNumber = 6
|
||||
Method_Syntax_field_number protoreflect.FieldNumber = 7
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Mixin.
|
||||
const (
|
||||
Mixin_message_name protoreflect.Name = "Mixin"
|
||||
Mixin_message_fullname protoreflect.FullName = "google.protobuf.Mixin"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Mixin.
|
||||
const (
|
||||
Mixin_Name_field_name protoreflect.Name = "name"
|
||||
Mixin_Root_field_name protoreflect.Name = "root"
|
||||
|
||||
Mixin_Name_field_fullname protoreflect.FullName = "google.protobuf.Mixin.name"
|
||||
Mixin_Root_field_fullname protoreflect.FullName = "google.protobuf.Mixin.root"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Mixin.
|
||||
const (
|
||||
Mixin_Name_field_number protoreflect.FieldNumber = 1
|
||||
Mixin_Root_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
829
vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go
generated
vendored
Normal file
829
vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go
generated
vendored
Normal file
@ -0,0 +1,829 @@
|
||||
// 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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_descriptor_proto = "google/protobuf/descriptor.proto"
|
||||
|
||||
// Names for google.protobuf.FileDescriptorSet.
|
||||
const (
|
||||
FileDescriptorSet_message_name protoreflect.Name = "FileDescriptorSet"
|
||||
FileDescriptorSet_message_fullname protoreflect.FullName = "google.protobuf.FileDescriptorSet"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.FileDescriptorSet.
|
||||
const (
|
||||
FileDescriptorSet_File_field_name protoreflect.Name = "file"
|
||||
|
||||
FileDescriptorSet_File_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorSet.file"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FileDescriptorSet.
|
||||
const (
|
||||
FileDescriptorSet_File_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.FileDescriptorProto.
|
||||
const (
|
||||
FileDescriptorProto_message_name protoreflect.Name = "FileDescriptorProto"
|
||||
FileDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.FileDescriptorProto.
|
||||
const (
|
||||
FileDescriptorProto_Name_field_name protoreflect.Name = "name"
|
||||
FileDescriptorProto_Package_field_name protoreflect.Name = "package"
|
||||
FileDescriptorProto_Dependency_field_name protoreflect.Name = "dependency"
|
||||
FileDescriptorProto_PublicDependency_field_name protoreflect.Name = "public_dependency"
|
||||
FileDescriptorProto_WeakDependency_field_name protoreflect.Name = "weak_dependency"
|
||||
FileDescriptorProto_MessageType_field_name protoreflect.Name = "message_type"
|
||||
FileDescriptorProto_EnumType_field_name protoreflect.Name = "enum_type"
|
||||
FileDescriptorProto_Service_field_name protoreflect.Name = "service"
|
||||
FileDescriptorProto_Extension_field_name protoreflect.Name = "extension"
|
||||
FileDescriptorProto_Options_field_name protoreflect.Name = "options"
|
||||
FileDescriptorProto_SourceCodeInfo_field_name protoreflect.Name = "source_code_info"
|
||||
FileDescriptorProto_Syntax_field_name protoreflect.Name = "syntax"
|
||||
|
||||
FileDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.name"
|
||||
FileDescriptorProto_Package_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.package"
|
||||
FileDescriptorProto_Dependency_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.dependency"
|
||||
FileDescriptorProto_PublicDependency_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.public_dependency"
|
||||
FileDescriptorProto_WeakDependency_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.weak_dependency"
|
||||
FileDescriptorProto_MessageType_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.message_type"
|
||||
FileDescriptorProto_EnumType_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.enum_type"
|
||||
FileDescriptorProto_Service_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.service"
|
||||
FileDescriptorProto_Extension_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.extension"
|
||||
FileDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.options"
|
||||
FileDescriptorProto_SourceCodeInfo_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.source_code_info"
|
||||
FileDescriptorProto_Syntax_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.syntax"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FileDescriptorProto.
|
||||
const (
|
||||
FileDescriptorProto_Name_field_number protoreflect.FieldNumber = 1
|
||||
FileDescriptorProto_Package_field_number protoreflect.FieldNumber = 2
|
||||
FileDescriptorProto_Dependency_field_number protoreflect.FieldNumber = 3
|
||||
FileDescriptorProto_PublicDependency_field_number protoreflect.FieldNumber = 10
|
||||
FileDescriptorProto_WeakDependency_field_number protoreflect.FieldNumber = 11
|
||||
FileDescriptorProto_MessageType_field_number protoreflect.FieldNumber = 4
|
||||
FileDescriptorProto_EnumType_field_number protoreflect.FieldNumber = 5
|
||||
FileDescriptorProto_Service_field_number protoreflect.FieldNumber = 6
|
||||
FileDescriptorProto_Extension_field_number protoreflect.FieldNumber = 7
|
||||
FileDescriptorProto_Options_field_number protoreflect.FieldNumber = 8
|
||||
FileDescriptorProto_SourceCodeInfo_field_number protoreflect.FieldNumber = 9
|
||||
FileDescriptorProto_Syntax_field_number protoreflect.FieldNumber = 12
|
||||
)
|
||||
|
||||
// Names for google.protobuf.DescriptorProto.
|
||||
const (
|
||||
DescriptorProto_message_name protoreflect.Name = "DescriptorProto"
|
||||
DescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.DescriptorProto"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.DescriptorProto.
|
||||
const (
|
||||
DescriptorProto_Name_field_name protoreflect.Name = "name"
|
||||
DescriptorProto_Field_field_name protoreflect.Name = "field"
|
||||
DescriptorProto_Extension_field_name protoreflect.Name = "extension"
|
||||
DescriptorProto_NestedType_field_name protoreflect.Name = "nested_type"
|
||||
DescriptorProto_EnumType_field_name protoreflect.Name = "enum_type"
|
||||
DescriptorProto_ExtensionRange_field_name protoreflect.Name = "extension_range"
|
||||
DescriptorProto_OneofDecl_field_name protoreflect.Name = "oneof_decl"
|
||||
DescriptorProto_Options_field_name protoreflect.Name = "options"
|
||||
DescriptorProto_ReservedRange_field_name protoreflect.Name = "reserved_range"
|
||||
DescriptorProto_ReservedName_field_name protoreflect.Name = "reserved_name"
|
||||
|
||||
DescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.name"
|
||||
DescriptorProto_Field_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.field"
|
||||
DescriptorProto_Extension_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.extension"
|
||||
DescriptorProto_NestedType_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.nested_type"
|
||||
DescriptorProto_EnumType_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.enum_type"
|
||||
DescriptorProto_ExtensionRange_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.extension_range"
|
||||
DescriptorProto_OneofDecl_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.oneof_decl"
|
||||
DescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.options"
|
||||
DescriptorProto_ReservedRange_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.reserved_range"
|
||||
DescriptorProto_ReservedName_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.reserved_name"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.DescriptorProto.
|
||||
const (
|
||||
DescriptorProto_Name_field_number protoreflect.FieldNumber = 1
|
||||
DescriptorProto_Field_field_number protoreflect.FieldNumber = 2
|
||||
DescriptorProto_Extension_field_number protoreflect.FieldNumber = 6
|
||||
DescriptorProto_NestedType_field_number protoreflect.FieldNumber = 3
|
||||
DescriptorProto_EnumType_field_number protoreflect.FieldNumber = 4
|
||||
DescriptorProto_ExtensionRange_field_number protoreflect.FieldNumber = 5
|
||||
DescriptorProto_OneofDecl_field_number protoreflect.FieldNumber = 8
|
||||
DescriptorProto_Options_field_number protoreflect.FieldNumber = 7
|
||||
DescriptorProto_ReservedRange_field_number protoreflect.FieldNumber = 9
|
||||
DescriptorProto_ReservedName_field_number protoreflect.FieldNumber = 10
|
||||
)
|
||||
|
||||
// Names for google.protobuf.DescriptorProto.ExtensionRange.
|
||||
const (
|
||||
DescriptorProto_ExtensionRange_message_name protoreflect.Name = "ExtensionRange"
|
||||
DescriptorProto_ExtensionRange_message_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.DescriptorProto.ExtensionRange.
|
||||
const (
|
||||
DescriptorProto_ExtensionRange_Start_field_name protoreflect.Name = "start"
|
||||
DescriptorProto_ExtensionRange_End_field_name protoreflect.Name = "end"
|
||||
DescriptorProto_ExtensionRange_Options_field_name protoreflect.Name = "options"
|
||||
|
||||
DescriptorProto_ExtensionRange_Start_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange.start"
|
||||
DescriptorProto_ExtensionRange_End_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange.end"
|
||||
DescriptorProto_ExtensionRange_Options_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange.options"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.DescriptorProto.ExtensionRange.
|
||||
const (
|
||||
DescriptorProto_ExtensionRange_Start_field_number protoreflect.FieldNumber = 1
|
||||
DescriptorProto_ExtensionRange_End_field_number protoreflect.FieldNumber = 2
|
||||
DescriptorProto_ExtensionRange_Options_field_number protoreflect.FieldNumber = 3
|
||||
)
|
||||
|
||||
// Names for google.protobuf.DescriptorProto.ReservedRange.
|
||||
const (
|
||||
DescriptorProto_ReservedRange_message_name protoreflect.Name = "ReservedRange"
|
||||
DescriptorProto_ReservedRange_message_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ReservedRange"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.DescriptorProto.ReservedRange.
|
||||
const (
|
||||
DescriptorProto_ReservedRange_Start_field_name protoreflect.Name = "start"
|
||||
DescriptorProto_ReservedRange_End_field_name protoreflect.Name = "end"
|
||||
|
||||
DescriptorProto_ReservedRange_Start_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ReservedRange.start"
|
||||
DescriptorProto_ReservedRange_End_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ReservedRange.end"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.DescriptorProto.ReservedRange.
|
||||
const (
|
||||
DescriptorProto_ReservedRange_Start_field_number protoreflect.FieldNumber = 1
|
||||
DescriptorProto_ReservedRange_End_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
|
||||
// Names for google.protobuf.ExtensionRangeOptions.
|
||||
const (
|
||||
ExtensionRangeOptions_message_name protoreflect.Name = "ExtensionRangeOptions"
|
||||
ExtensionRangeOptions_message_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.ExtensionRangeOptions.
|
||||
const (
|
||||
ExtensionRangeOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option"
|
||||
|
||||
ExtensionRangeOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.uninterpreted_option"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.ExtensionRangeOptions.
|
||||
const (
|
||||
ExtensionRangeOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999
|
||||
)
|
||||
|
||||
// Names for google.protobuf.FieldDescriptorProto.
|
||||
const (
|
||||
FieldDescriptorProto_message_name protoreflect.Name = "FieldDescriptorProto"
|
||||
FieldDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.FieldDescriptorProto.
|
||||
const (
|
||||
FieldDescriptorProto_Name_field_name protoreflect.Name = "name"
|
||||
FieldDescriptorProto_Number_field_name protoreflect.Name = "number"
|
||||
FieldDescriptorProto_Label_field_name protoreflect.Name = "label"
|
||||
FieldDescriptorProto_Type_field_name protoreflect.Name = "type"
|
||||
FieldDescriptorProto_TypeName_field_name protoreflect.Name = "type_name"
|
||||
FieldDescriptorProto_Extendee_field_name protoreflect.Name = "extendee"
|
||||
FieldDescriptorProto_DefaultValue_field_name protoreflect.Name = "default_value"
|
||||
FieldDescriptorProto_OneofIndex_field_name protoreflect.Name = "oneof_index"
|
||||
FieldDescriptorProto_JsonName_field_name protoreflect.Name = "json_name"
|
||||
FieldDescriptorProto_Options_field_name protoreflect.Name = "options"
|
||||
FieldDescriptorProto_Proto3Optional_field_name protoreflect.Name = "proto3_optional"
|
||||
|
||||
FieldDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.name"
|
||||
FieldDescriptorProto_Number_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.number"
|
||||
FieldDescriptorProto_Label_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.label"
|
||||
FieldDescriptorProto_Type_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.type"
|
||||
FieldDescriptorProto_TypeName_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.type_name"
|
||||
FieldDescriptorProto_Extendee_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.extendee"
|
||||
FieldDescriptorProto_DefaultValue_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.default_value"
|
||||
FieldDescriptorProto_OneofIndex_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.oneof_index"
|
||||
FieldDescriptorProto_JsonName_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.json_name"
|
||||
FieldDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.options"
|
||||
FieldDescriptorProto_Proto3Optional_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.proto3_optional"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FieldDescriptorProto.
|
||||
const (
|
||||
FieldDescriptorProto_Name_field_number protoreflect.FieldNumber = 1
|
||||
FieldDescriptorProto_Number_field_number protoreflect.FieldNumber = 3
|
||||
FieldDescriptorProto_Label_field_number protoreflect.FieldNumber = 4
|
||||
FieldDescriptorProto_Type_field_number protoreflect.FieldNumber = 5
|
||||
FieldDescriptorProto_TypeName_field_number protoreflect.FieldNumber = 6
|
||||
FieldDescriptorProto_Extendee_field_number protoreflect.FieldNumber = 2
|
||||
FieldDescriptorProto_DefaultValue_field_number protoreflect.FieldNumber = 7
|
||||
FieldDescriptorProto_OneofIndex_field_number protoreflect.FieldNumber = 9
|
||||
FieldDescriptorProto_JsonName_field_number protoreflect.FieldNumber = 10
|
||||
FieldDescriptorProto_Options_field_number protoreflect.FieldNumber = 8
|
||||
FieldDescriptorProto_Proto3Optional_field_number protoreflect.FieldNumber = 17
|
||||
)
|
||||
|
||||
// Full and short names for google.protobuf.FieldDescriptorProto.Type.
|
||||
const (
|
||||
FieldDescriptorProto_Type_enum_fullname = "google.protobuf.FieldDescriptorProto.Type"
|
||||
FieldDescriptorProto_Type_enum_name = "Type"
|
||||
)
|
||||
|
||||
// Full and short names for google.protobuf.FieldDescriptorProto.Label.
|
||||
const (
|
||||
FieldDescriptorProto_Label_enum_fullname = "google.protobuf.FieldDescriptorProto.Label"
|
||||
FieldDescriptorProto_Label_enum_name = "Label"
|
||||
)
|
||||
|
||||
// Names for google.protobuf.OneofDescriptorProto.
|
||||
const (
|
||||
OneofDescriptorProto_message_name protoreflect.Name = "OneofDescriptorProto"
|
||||
OneofDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.OneofDescriptorProto"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.OneofDescriptorProto.
|
||||
const (
|
||||
OneofDescriptorProto_Name_field_name protoreflect.Name = "name"
|
||||
OneofDescriptorProto_Options_field_name protoreflect.Name = "options"
|
||||
|
||||
OneofDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.OneofDescriptorProto.name"
|
||||
OneofDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.OneofDescriptorProto.options"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.OneofDescriptorProto.
|
||||
const (
|
||||
OneofDescriptorProto_Name_field_number protoreflect.FieldNumber = 1
|
||||
OneofDescriptorProto_Options_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
|
||||
// Names for google.protobuf.EnumDescriptorProto.
|
||||
const (
|
||||
EnumDescriptorProto_message_name protoreflect.Name = "EnumDescriptorProto"
|
||||
EnumDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.EnumDescriptorProto.
|
||||
const (
|
||||
EnumDescriptorProto_Name_field_name protoreflect.Name = "name"
|
||||
EnumDescriptorProto_Value_field_name protoreflect.Name = "value"
|
||||
EnumDescriptorProto_Options_field_name protoreflect.Name = "options"
|
||||
EnumDescriptorProto_ReservedRange_field_name protoreflect.Name = "reserved_range"
|
||||
EnumDescriptorProto_ReservedName_field_name protoreflect.Name = "reserved_name"
|
||||
|
||||
EnumDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.name"
|
||||
EnumDescriptorProto_Value_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.value"
|
||||
EnumDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.options"
|
||||
EnumDescriptorProto_ReservedRange_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.reserved_range"
|
||||
EnumDescriptorProto_ReservedName_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.reserved_name"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumDescriptorProto.
|
||||
const (
|
||||
EnumDescriptorProto_Name_field_number protoreflect.FieldNumber = 1
|
||||
EnumDescriptorProto_Value_field_number protoreflect.FieldNumber = 2
|
||||
EnumDescriptorProto_Options_field_number protoreflect.FieldNumber = 3
|
||||
EnumDescriptorProto_ReservedRange_field_number protoreflect.FieldNumber = 4
|
||||
EnumDescriptorProto_ReservedName_field_number protoreflect.FieldNumber = 5
|
||||
)
|
||||
|
||||
// Names for google.protobuf.EnumDescriptorProto.EnumReservedRange.
|
||||
const (
|
||||
EnumDescriptorProto_EnumReservedRange_message_name protoreflect.Name = "EnumReservedRange"
|
||||
EnumDescriptorProto_EnumReservedRange_message_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.EnumReservedRange"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.EnumDescriptorProto.EnumReservedRange.
|
||||
const (
|
||||
EnumDescriptorProto_EnumReservedRange_Start_field_name protoreflect.Name = "start"
|
||||
EnumDescriptorProto_EnumReservedRange_End_field_name protoreflect.Name = "end"
|
||||
|
||||
EnumDescriptorProto_EnumReservedRange_Start_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.EnumReservedRange.start"
|
||||
EnumDescriptorProto_EnumReservedRange_End_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.EnumReservedRange.end"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumDescriptorProto.EnumReservedRange.
|
||||
const (
|
||||
EnumDescriptorProto_EnumReservedRange_Start_field_number protoreflect.FieldNumber = 1
|
||||
EnumDescriptorProto_EnumReservedRange_End_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
|
||||
// Names for google.protobuf.EnumValueDescriptorProto.
|
||||
const (
|
||||
EnumValueDescriptorProto_message_name protoreflect.Name = "EnumValueDescriptorProto"
|
||||
EnumValueDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.EnumValueDescriptorProto.
|
||||
const (
|
||||
EnumValueDescriptorProto_Name_field_name protoreflect.Name = "name"
|
||||
EnumValueDescriptorProto_Number_field_name protoreflect.Name = "number"
|
||||
EnumValueDescriptorProto_Options_field_name protoreflect.Name = "options"
|
||||
|
||||
EnumValueDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto.name"
|
||||
EnumValueDescriptorProto_Number_field_fullname protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto.number"
|
||||
EnumValueDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto.options"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumValueDescriptorProto.
|
||||
const (
|
||||
EnumValueDescriptorProto_Name_field_number protoreflect.FieldNumber = 1
|
||||
EnumValueDescriptorProto_Number_field_number protoreflect.FieldNumber = 2
|
||||
EnumValueDescriptorProto_Options_field_number protoreflect.FieldNumber = 3
|
||||
)
|
||||
|
||||
// Names for google.protobuf.ServiceDescriptorProto.
|
||||
const (
|
||||
ServiceDescriptorProto_message_name protoreflect.Name = "ServiceDescriptorProto"
|
||||
ServiceDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.ServiceDescriptorProto"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.ServiceDescriptorProto.
|
||||
const (
|
||||
ServiceDescriptorProto_Name_field_name protoreflect.Name = "name"
|
||||
ServiceDescriptorProto_Method_field_name protoreflect.Name = "method"
|
||||
ServiceDescriptorProto_Options_field_name protoreflect.Name = "options"
|
||||
|
||||
ServiceDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.ServiceDescriptorProto.name"
|
||||
ServiceDescriptorProto_Method_field_fullname protoreflect.FullName = "google.protobuf.ServiceDescriptorProto.method"
|
||||
ServiceDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.ServiceDescriptorProto.options"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.ServiceDescriptorProto.
|
||||
const (
|
||||
ServiceDescriptorProto_Name_field_number protoreflect.FieldNumber = 1
|
||||
ServiceDescriptorProto_Method_field_number protoreflect.FieldNumber = 2
|
||||
ServiceDescriptorProto_Options_field_number protoreflect.FieldNumber = 3
|
||||
)
|
||||
|
||||
// Names for google.protobuf.MethodDescriptorProto.
|
||||
const (
|
||||
MethodDescriptorProto_message_name protoreflect.Name = "MethodDescriptorProto"
|
||||
MethodDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.MethodDescriptorProto.
|
||||
const (
|
||||
MethodDescriptorProto_Name_field_name protoreflect.Name = "name"
|
||||
MethodDescriptorProto_InputType_field_name protoreflect.Name = "input_type"
|
||||
MethodDescriptorProto_OutputType_field_name protoreflect.Name = "output_type"
|
||||
MethodDescriptorProto_Options_field_name protoreflect.Name = "options"
|
||||
MethodDescriptorProto_ClientStreaming_field_name protoreflect.Name = "client_streaming"
|
||||
MethodDescriptorProto_ServerStreaming_field_name protoreflect.Name = "server_streaming"
|
||||
|
||||
MethodDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.name"
|
||||
MethodDescriptorProto_InputType_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.input_type"
|
||||
MethodDescriptorProto_OutputType_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.output_type"
|
||||
MethodDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.options"
|
||||
MethodDescriptorProto_ClientStreaming_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.client_streaming"
|
||||
MethodDescriptorProto_ServerStreaming_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.server_streaming"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.MethodDescriptorProto.
|
||||
const (
|
||||
MethodDescriptorProto_Name_field_number protoreflect.FieldNumber = 1
|
||||
MethodDescriptorProto_InputType_field_number protoreflect.FieldNumber = 2
|
||||
MethodDescriptorProto_OutputType_field_number protoreflect.FieldNumber = 3
|
||||
MethodDescriptorProto_Options_field_number protoreflect.FieldNumber = 4
|
||||
MethodDescriptorProto_ClientStreaming_field_number protoreflect.FieldNumber = 5
|
||||
MethodDescriptorProto_ServerStreaming_field_number protoreflect.FieldNumber = 6
|
||||
)
|
||||
|
||||
// Names for google.protobuf.FileOptions.
|
||||
const (
|
||||
FileOptions_message_name protoreflect.Name = "FileOptions"
|
||||
FileOptions_message_fullname protoreflect.FullName = "google.protobuf.FileOptions"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.FileOptions.
|
||||
const (
|
||||
FileOptions_JavaPackage_field_name protoreflect.Name = "java_package"
|
||||
FileOptions_JavaOuterClassname_field_name protoreflect.Name = "java_outer_classname"
|
||||
FileOptions_JavaMultipleFiles_field_name protoreflect.Name = "java_multiple_files"
|
||||
FileOptions_JavaGenerateEqualsAndHash_field_name protoreflect.Name = "java_generate_equals_and_hash"
|
||||
FileOptions_JavaStringCheckUtf8_field_name protoreflect.Name = "java_string_check_utf8"
|
||||
FileOptions_OptimizeFor_field_name protoreflect.Name = "optimize_for"
|
||||
FileOptions_GoPackage_field_name protoreflect.Name = "go_package"
|
||||
FileOptions_CcGenericServices_field_name protoreflect.Name = "cc_generic_services"
|
||||
FileOptions_JavaGenericServices_field_name protoreflect.Name = "java_generic_services"
|
||||
FileOptions_PyGenericServices_field_name protoreflect.Name = "py_generic_services"
|
||||
FileOptions_PhpGenericServices_field_name protoreflect.Name = "php_generic_services"
|
||||
FileOptions_Deprecated_field_name protoreflect.Name = "deprecated"
|
||||
FileOptions_CcEnableArenas_field_name protoreflect.Name = "cc_enable_arenas"
|
||||
FileOptions_ObjcClassPrefix_field_name protoreflect.Name = "objc_class_prefix"
|
||||
FileOptions_CsharpNamespace_field_name protoreflect.Name = "csharp_namespace"
|
||||
FileOptions_SwiftPrefix_field_name protoreflect.Name = "swift_prefix"
|
||||
FileOptions_PhpClassPrefix_field_name protoreflect.Name = "php_class_prefix"
|
||||
FileOptions_PhpNamespace_field_name protoreflect.Name = "php_namespace"
|
||||
FileOptions_PhpMetadataNamespace_field_name protoreflect.Name = "php_metadata_namespace"
|
||||
FileOptions_RubyPackage_field_name protoreflect.Name = "ruby_package"
|
||||
FileOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option"
|
||||
|
||||
FileOptions_JavaPackage_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_package"
|
||||
FileOptions_JavaOuterClassname_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_outer_classname"
|
||||
FileOptions_JavaMultipleFiles_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_multiple_files"
|
||||
FileOptions_JavaGenerateEqualsAndHash_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_generate_equals_and_hash"
|
||||
FileOptions_JavaStringCheckUtf8_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_string_check_utf8"
|
||||
FileOptions_OptimizeFor_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.optimize_for"
|
||||
FileOptions_GoPackage_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.go_package"
|
||||
FileOptions_CcGenericServices_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.cc_generic_services"
|
||||
FileOptions_JavaGenericServices_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_generic_services"
|
||||
FileOptions_PyGenericServices_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.py_generic_services"
|
||||
FileOptions_PhpGenericServices_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_generic_services"
|
||||
FileOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.deprecated"
|
||||
FileOptions_CcEnableArenas_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.cc_enable_arenas"
|
||||
FileOptions_ObjcClassPrefix_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.objc_class_prefix"
|
||||
FileOptions_CsharpNamespace_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.csharp_namespace"
|
||||
FileOptions_SwiftPrefix_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.swift_prefix"
|
||||
FileOptions_PhpClassPrefix_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_class_prefix"
|
||||
FileOptions_PhpNamespace_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_namespace"
|
||||
FileOptions_PhpMetadataNamespace_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_metadata_namespace"
|
||||
FileOptions_RubyPackage_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.ruby_package"
|
||||
FileOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.uninterpreted_option"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FileOptions.
|
||||
const (
|
||||
FileOptions_JavaPackage_field_number protoreflect.FieldNumber = 1
|
||||
FileOptions_JavaOuterClassname_field_number protoreflect.FieldNumber = 8
|
||||
FileOptions_JavaMultipleFiles_field_number protoreflect.FieldNumber = 10
|
||||
FileOptions_JavaGenerateEqualsAndHash_field_number protoreflect.FieldNumber = 20
|
||||
FileOptions_JavaStringCheckUtf8_field_number protoreflect.FieldNumber = 27
|
||||
FileOptions_OptimizeFor_field_number protoreflect.FieldNumber = 9
|
||||
FileOptions_GoPackage_field_number protoreflect.FieldNumber = 11
|
||||
FileOptions_CcGenericServices_field_number protoreflect.FieldNumber = 16
|
||||
FileOptions_JavaGenericServices_field_number protoreflect.FieldNumber = 17
|
||||
FileOptions_PyGenericServices_field_number protoreflect.FieldNumber = 18
|
||||
FileOptions_PhpGenericServices_field_number protoreflect.FieldNumber = 42
|
||||
FileOptions_Deprecated_field_number protoreflect.FieldNumber = 23
|
||||
FileOptions_CcEnableArenas_field_number protoreflect.FieldNumber = 31
|
||||
FileOptions_ObjcClassPrefix_field_number protoreflect.FieldNumber = 36
|
||||
FileOptions_CsharpNamespace_field_number protoreflect.FieldNumber = 37
|
||||
FileOptions_SwiftPrefix_field_number protoreflect.FieldNumber = 39
|
||||
FileOptions_PhpClassPrefix_field_number protoreflect.FieldNumber = 40
|
||||
FileOptions_PhpNamespace_field_number protoreflect.FieldNumber = 41
|
||||
FileOptions_PhpMetadataNamespace_field_number protoreflect.FieldNumber = 44
|
||||
FileOptions_RubyPackage_field_number protoreflect.FieldNumber = 45
|
||||
FileOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999
|
||||
)
|
||||
|
||||
// Full and short names for google.protobuf.FileOptions.OptimizeMode.
|
||||
const (
|
||||
FileOptions_OptimizeMode_enum_fullname = "google.protobuf.FileOptions.OptimizeMode"
|
||||
FileOptions_OptimizeMode_enum_name = "OptimizeMode"
|
||||
)
|
||||
|
||||
// Names for google.protobuf.MessageOptions.
|
||||
const (
|
||||
MessageOptions_message_name protoreflect.Name = "MessageOptions"
|
||||
MessageOptions_message_fullname protoreflect.FullName = "google.protobuf.MessageOptions"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.MessageOptions.
|
||||
const (
|
||||
MessageOptions_MessageSetWireFormat_field_name protoreflect.Name = "message_set_wire_format"
|
||||
MessageOptions_NoStandardDescriptorAccessor_field_name protoreflect.Name = "no_standard_descriptor_accessor"
|
||||
MessageOptions_Deprecated_field_name protoreflect.Name = "deprecated"
|
||||
MessageOptions_MapEntry_field_name protoreflect.Name = "map_entry"
|
||||
MessageOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option"
|
||||
|
||||
MessageOptions_MessageSetWireFormat_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.message_set_wire_format"
|
||||
MessageOptions_NoStandardDescriptorAccessor_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.no_standard_descriptor_accessor"
|
||||
MessageOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated"
|
||||
MessageOptions_MapEntry_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.map_entry"
|
||||
MessageOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.uninterpreted_option"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.MessageOptions.
|
||||
const (
|
||||
MessageOptions_MessageSetWireFormat_field_number protoreflect.FieldNumber = 1
|
||||
MessageOptions_NoStandardDescriptorAccessor_field_number protoreflect.FieldNumber = 2
|
||||
MessageOptions_Deprecated_field_number protoreflect.FieldNumber = 3
|
||||
MessageOptions_MapEntry_field_number protoreflect.FieldNumber = 7
|
||||
MessageOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999
|
||||
)
|
||||
|
||||
// Names for google.protobuf.FieldOptions.
|
||||
const (
|
||||
FieldOptions_message_name protoreflect.Name = "FieldOptions"
|
||||
FieldOptions_message_fullname protoreflect.FullName = "google.protobuf.FieldOptions"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.FieldOptions.
|
||||
const (
|
||||
FieldOptions_Ctype_field_name protoreflect.Name = "ctype"
|
||||
FieldOptions_Packed_field_name protoreflect.Name = "packed"
|
||||
FieldOptions_Jstype_field_name protoreflect.Name = "jstype"
|
||||
FieldOptions_Lazy_field_name protoreflect.Name = "lazy"
|
||||
FieldOptions_Deprecated_field_name protoreflect.Name = "deprecated"
|
||||
FieldOptions_Weak_field_name protoreflect.Name = "weak"
|
||||
FieldOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option"
|
||||
|
||||
FieldOptions_Ctype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.ctype"
|
||||
FieldOptions_Packed_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.packed"
|
||||
FieldOptions_Jstype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.jstype"
|
||||
FieldOptions_Lazy_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.lazy"
|
||||
FieldOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.deprecated"
|
||||
FieldOptions_Weak_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.weak"
|
||||
FieldOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.uninterpreted_option"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FieldOptions.
|
||||
const (
|
||||
FieldOptions_Ctype_field_number protoreflect.FieldNumber = 1
|
||||
FieldOptions_Packed_field_number protoreflect.FieldNumber = 2
|
||||
FieldOptions_Jstype_field_number protoreflect.FieldNumber = 6
|
||||
FieldOptions_Lazy_field_number protoreflect.FieldNumber = 5
|
||||
FieldOptions_Deprecated_field_number protoreflect.FieldNumber = 3
|
||||
FieldOptions_Weak_field_number protoreflect.FieldNumber = 10
|
||||
FieldOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999
|
||||
)
|
||||
|
||||
// Full and short names for google.protobuf.FieldOptions.CType.
|
||||
const (
|
||||
FieldOptions_CType_enum_fullname = "google.protobuf.FieldOptions.CType"
|
||||
FieldOptions_CType_enum_name = "CType"
|
||||
)
|
||||
|
||||
// Full and short names for google.protobuf.FieldOptions.JSType.
|
||||
const (
|
||||
FieldOptions_JSType_enum_fullname = "google.protobuf.FieldOptions.JSType"
|
||||
FieldOptions_JSType_enum_name = "JSType"
|
||||
)
|
||||
|
||||
// Names for google.protobuf.OneofOptions.
|
||||
const (
|
||||
OneofOptions_message_name protoreflect.Name = "OneofOptions"
|
||||
OneofOptions_message_fullname protoreflect.FullName = "google.protobuf.OneofOptions"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.OneofOptions.
|
||||
const (
|
||||
OneofOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option"
|
||||
|
||||
OneofOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.OneofOptions.uninterpreted_option"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.OneofOptions.
|
||||
const (
|
||||
OneofOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999
|
||||
)
|
||||
|
||||
// Names for google.protobuf.EnumOptions.
|
||||
const (
|
||||
EnumOptions_message_name protoreflect.Name = "EnumOptions"
|
||||
EnumOptions_message_fullname protoreflect.FullName = "google.protobuf.EnumOptions"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.EnumOptions.
|
||||
const (
|
||||
EnumOptions_AllowAlias_field_name protoreflect.Name = "allow_alias"
|
||||
EnumOptions_Deprecated_field_name protoreflect.Name = "deprecated"
|
||||
EnumOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option"
|
||||
|
||||
EnumOptions_AllowAlias_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.allow_alias"
|
||||
EnumOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated"
|
||||
EnumOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.uninterpreted_option"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumOptions.
|
||||
const (
|
||||
EnumOptions_AllowAlias_field_number protoreflect.FieldNumber = 2
|
||||
EnumOptions_Deprecated_field_number protoreflect.FieldNumber = 3
|
||||
EnumOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999
|
||||
)
|
||||
|
||||
// Names for google.protobuf.EnumValueOptions.
|
||||
const (
|
||||
EnumValueOptions_message_name protoreflect.Name = "EnumValueOptions"
|
||||
EnumValueOptions_message_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.EnumValueOptions.
|
||||
const (
|
||||
EnumValueOptions_Deprecated_field_name protoreflect.Name = "deprecated"
|
||||
EnumValueOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option"
|
||||
|
||||
EnumValueOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.deprecated"
|
||||
EnumValueOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.uninterpreted_option"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumValueOptions.
|
||||
const (
|
||||
EnumValueOptions_Deprecated_field_number protoreflect.FieldNumber = 1
|
||||
EnumValueOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999
|
||||
)
|
||||
|
||||
// Names for google.protobuf.ServiceOptions.
|
||||
const (
|
||||
ServiceOptions_message_name protoreflect.Name = "ServiceOptions"
|
||||
ServiceOptions_message_fullname protoreflect.FullName = "google.protobuf.ServiceOptions"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.ServiceOptions.
|
||||
const (
|
||||
ServiceOptions_Deprecated_field_name protoreflect.Name = "deprecated"
|
||||
ServiceOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option"
|
||||
|
||||
ServiceOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.ServiceOptions.deprecated"
|
||||
ServiceOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ServiceOptions.uninterpreted_option"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.ServiceOptions.
|
||||
const (
|
||||
ServiceOptions_Deprecated_field_number protoreflect.FieldNumber = 33
|
||||
ServiceOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999
|
||||
)
|
||||
|
||||
// Names for google.protobuf.MethodOptions.
|
||||
const (
|
||||
MethodOptions_message_name protoreflect.Name = "MethodOptions"
|
||||
MethodOptions_message_fullname protoreflect.FullName = "google.protobuf.MethodOptions"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.MethodOptions.
|
||||
const (
|
||||
MethodOptions_Deprecated_field_name protoreflect.Name = "deprecated"
|
||||
MethodOptions_IdempotencyLevel_field_name protoreflect.Name = "idempotency_level"
|
||||
MethodOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option"
|
||||
|
||||
MethodOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.deprecated"
|
||||
MethodOptions_IdempotencyLevel_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.idempotency_level"
|
||||
MethodOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.uninterpreted_option"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.MethodOptions.
|
||||
const (
|
||||
MethodOptions_Deprecated_field_number protoreflect.FieldNumber = 33
|
||||
MethodOptions_IdempotencyLevel_field_number protoreflect.FieldNumber = 34
|
||||
MethodOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999
|
||||
)
|
||||
|
||||
// Full and short names for google.protobuf.MethodOptions.IdempotencyLevel.
|
||||
const (
|
||||
MethodOptions_IdempotencyLevel_enum_fullname = "google.protobuf.MethodOptions.IdempotencyLevel"
|
||||
MethodOptions_IdempotencyLevel_enum_name = "IdempotencyLevel"
|
||||
)
|
||||
|
||||
// Names for google.protobuf.UninterpretedOption.
|
||||
const (
|
||||
UninterpretedOption_message_name protoreflect.Name = "UninterpretedOption"
|
||||
UninterpretedOption_message_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.UninterpretedOption.
|
||||
const (
|
||||
UninterpretedOption_Name_field_name protoreflect.Name = "name"
|
||||
UninterpretedOption_IdentifierValue_field_name protoreflect.Name = "identifier_value"
|
||||
UninterpretedOption_PositiveIntValue_field_name protoreflect.Name = "positive_int_value"
|
||||
UninterpretedOption_NegativeIntValue_field_name protoreflect.Name = "negative_int_value"
|
||||
UninterpretedOption_DoubleValue_field_name protoreflect.Name = "double_value"
|
||||
UninterpretedOption_StringValue_field_name protoreflect.Name = "string_value"
|
||||
UninterpretedOption_AggregateValue_field_name protoreflect.Name = "aggregate_value"
|
||||
|
||||
UninterpretedOption_Name_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.name"
|
||||
UninterpretedOption_IdentifierValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.identifier_value"
|
||||
UninterpretedOption_PositiveIntValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.positive_int_value"
|
||||
UninterpretedOption_NegativeIntValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.negative_int_value"
|
||||
UninterpretedOption_DoubleValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.double_value"
|
||||
UninterpretedOption_StringValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.string_value"
|
||||
UninterpretedOption_AggregateValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.aggregate_value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.UninterpretedOption.
|
||||
const (
|
||||
UninterpretedOption_Name_field_number protoreflect.FieldNumber = 2
|
||||
UninterpretedOption_IdentifierValue_field_number protoreflect.FieldNumber = 3
|
||||
UninterpretedOption_PositiveIntValue_field_number protoreflect.FieldNumber = 4
|
||||
UninterpretedOption_NegativeIntValue_field_number protoreflect.FieldNumber = 5
|
||||
UninterpretedOption_DoubleValue_field_number protoreflect.FieldNumber = 6
|
||||
UninterpretedOption_StringValue_field_number protoreflect.FieldNumber = 7
|
||||
UninterpretedOption_AggregateValue_field_number protoreflect.FieldNumber = 8
|
||||
)
|
||||
|
||||
// Names for google.protobuf.UninterpretedOption.NamePart.
|
||||
const (
|
||||
UninterpretedOption_NamePart_message_name protoreflect.Name = "NamePart"
|
||||
UninterpretedOption_NamePart_message_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.NamePart"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.UninterpretedOption.NamePart.
|
||||
const (
|
||||
UninterpretedOption_NamePart_NamePart_field_name protoreflect.Name = "name_part"
|
||||
UninterpretedOption_NamePart_IsExtension_field_name protoreflect.Name = "is_extension"
|
||||
|
||||
UninterpretedOption_NamePart_NamePart_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.NamePart.name_part"
|
||||
UninterpretedOption_NamePart_IsExtension_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.NamePart.is_extension"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.UninterpretedOption.NamePart.
|
||||
const (
|
||||
UninterpretedOption_NamePart_NamePart_field_number protoreflect.FieldNumber = 1
|
||||
UninterpretedOption_NamePart_IsExtension_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
|
||||
// Names for google.protobuf.SourceCodeInfo.
|
||||
const (
|
||||
SourceCodeInfo_message_name protoreflect.Name = "SourceCodeInfo"
|
||||
SourceCodeInfo_message_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.SourceCodeInfo.
|
||||
const (
|
||||
SourceCodeInfo_Location_field_name protoreflect.Name = "location"
|
||||
|
||||
SourceCodeInfo_Location_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.location"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.SourceCodeInfo.
|
||||
const (
|
||||
SourceCodeInfo_Location_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.SourceCodeInfo.Location.
|
||||
const (
|
||||
SourceCodeInfo_Location_message_name protoreflect.Name = "Location"
|
||||
SourceCodeInfo_Location_message_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.SourceCodeInfo.Location.
|
||||
const (
|
||||
SourceCodeInfo_Location_Path_field_name protoreflect.Name = "path"
|
||||
SourceCodeInfo_Location_Span_field_name protoreflect.Name = "span"
|
||||
SourceCodeInfo_Location_LeadingComments_field_name protoreflect.Name = "leading_comments"
|
||||
SourceCodeInfo_Location_TrailingComments_field_name protoreflect.Name = "trailing_comments"
|
||||
SourceCodeInfo_Location_LeadingDetachedComments_field_name protoreflect.Name = "leading_detached_comments"
|
||||
|
||||
SourceCodeInfo_Location_Path_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.path"
|
||||
SourceCodeInfo_Location_Span_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.span"
|
||||
SourceCodeInfo_Location_LeadingComments_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.leading_comments"
|
||||
SourceCodeInfo_Location_TrailingComments_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.trailing_comments"
|
||||
SourceCodeInfo_Location_LeadingDetachedComments_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.leading_detached_comments"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.SourceCodeInfo.Location.
|
||||
const (
|
||||
SourceCodeInfo_Location_Path_field_number protoreflect.FieldNumber = 1
|
||||
SourceCodeInfo_Location_Span_field_number protoreflect.FieldNumber = 2
|
||||
SourceCodeInfo_Location_LeadingComments_field_number protoreflect.FieldNumber = 3
|
||||
SourceCodeInfo_Location_TrailingComments_field_number protoreflect.FieldNumber = 4
|
||||
SourceCodeInfo_Location_LeadingDetachedComments_field_number protoreflect.FieldNumber = 6
|
||||
)
|
||||
|
||||
// Names for google.protobuf.GeneratedCodeInfo.
|
||||
const (
|
||||
GeneratedCodeInfo_message_name protoreflect.Name = "GeneratedCodeInfo"
|
||||
GeneratedCodeInfo_message_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.GeneratedCodeInfo.
|
||||
const (
|
||||
GeneratedCodeInfo_Annotation_field_name protoreflect.Name = "annotation"
|
||||
|
||||
GeneratedCodeInfo_Annotation_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.annotation"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.GeneratedCodeInfo.
|
||||
const (
|
||||
GeneratedCodeInfo_Annotation_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.GeneratedCodeInfo.Annotation.
|
||||
const (
|
||||
GeneratedCodeInfo_Annotation_message_name protoreflect.Name = "Annotation"
|
||||
GeneratedCodeInfo_Annotation_message_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.GeneratedCodeInfo.Annotation.
|
||||
const (
|
||||
GeneratedCodeInfo_Annotation_Path_field_name protoreflect.Name = "path"
|
||||
GeneratedCodeInfo_Annotation_SourceFile_field_name protoreflect.Name = "source_file"
|
||||
GeneratedCodeInfo_Annotation_Begin_field_name protoreflect.Name = "begin"
|
||||
GeneratedCodeInfo_Annotation_End_field_name protoreflect.Name = "end"
|
||||
|
||||
GeneratedCodeInfo_Annotation_Path_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.path"
|
||||
GeneratedCodeInfo_Annotation_SourceFile_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.source_file"
|
||||
GeneratedCodeInfo_Annotation_Begin_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.begin"
|
||||
GeneratedCodeInfo_Annotation_End_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.end"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.GeneratedCodeInfo.Annotation.
|
||||
const (
|
||||
GeneratedCodeInfo_Annotation_Path_field_number protoreflect.FieldNumber = 1
|
||||
GeneratedCodeInfo_Annotation_SourceFile_field_number protoreflect.FieldNumber = 2
|
||||
GeneratedCodeInfo_Annotation_Begin_field_number protoreflect.FieldNumber = 3
|
||||
GeneratedCodeInfo_Annotation_End_field_number protoreflect.FieldNumber = 4
|
||||
)
|
||||
11
vendor/google.golang.org/protobuf/internal/genid/doc.go
generated
vendored
Normal file
11
vendor/google.golang.org/protobuf/internal/genid/doc.go
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
// 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 genid contains constants for declarations in descriptor.proto
|
||||
// and the well-known types.
|
||||
package genid
|
||||
|
||||
import protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
const GoogleProtobuf_package protoreflect.FullName = "google.protobuf"
|
||||
34
vendor/google.golang.org/protobuf/internal/genid/duration_gen.go
generated
vendored
Normal file
34
vendor/google.golang.org/protobuf/internal/genid/duration_gen.go
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
// 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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_duration_proto = "google/protobuf/duration.proto"
|
||||
|
||||
// Names for google.protobuf.Duration.
|
||||
const (
|
||||
Duration_message_name protoreflect.Name = "Duration"
|
||||
Duration_message_fullname protoreflect.FullName = "google.protobuf.Duration"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Duration.
|
||||
const (
|
||||
Duration_Seconds_field_name protoreflect.Name = "seconds"
|
||||
Duration_Nanos_field_name protoreflect.Name = "nanos"
|
||||
|
||||
Duration_Seconds_field_fullname protoreflect.FullName = "google.protobuf.Duration.seconds"
|
||||
Duration_Nanos_field_fullname protoreflect.FullName = "google.protobuf.Duration.nanos"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Duration.
|
||||
const (
|
||||
Duration_Seconds_field_number protoreflect.FieldNumber = 1
|
||||
Duration_Nanos_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
19
vendor/google.golang.org/protobuf/internal/genid/empty_gen.go
generated
vendored
Normal file
19
vendor/google.golang.org/protobuf/internal/genid/empty_gen.go
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
// 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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_empty_proto = "google/protobuf/empty.proto"
|
||||
|
||||
// Names for google.protobuf.Empty.
|
||||
const (
|
||||
Empty_message_name protoreflect.Name = "Empty"
|
||||
Empty_message_fullname protoreflect.FullName = "google.protobuf.Empty"
|
||||
)
|
||||
31
vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go
generated
vendored
Normal file
31
vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
// 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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_field_mask_proto = "google/protobuf/field_mask.proto"
|
||||
|
||||
// Names for google.protobuf.FieldMask.
|
||||
const (
|
||||
FieldMask_message_name protoreflect.Name = "FieldMask"
|
||||
FieldMask_message_fullname protoreflect.FullName = "google.protobuf.FieldMask"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.FieldMask.
|
||||
const (
|
||||
FieldMask_Paths_field_name protoreflect.Name = "paths"
|
||||
|
||||
FieldMask_Paths_field_fullname protoreflect.FullName = "google.protobuf.FieldMask.paths"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FieldMask.
|
||||
const (
|
||||
FieldMask_Paths_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
25
vendor/google.golang.org/protobuf/internal/genid/goname.go
generated
vendored
Normal file
25
vendor/google.golang.org/protobuf/internal/genid/goname.go
generated
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
// 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 genid
|
||||
|
||||
// Go names of implementation-specific struct fields in generated messages.
|
||||
const (
|
||||
State_goname = "state"
|
||||
|
||||
SizeCache_goname = "sizeCache"
|
||||
SizeCacheA_goname = "XXX_sizecache"
|
||||
|
||||
WeakFields_goname = "weakFields"
|
||||
WeakFieldsA_goname = "XXX_weak"
|
||||
|
||||
UnknownFields_goname = "unknownFields"
|
||||
UnknownFieldsA_goname = "XXX_unrecognized"
|
||||
|
||||
ExtensionFields_goname = "extensionFields"
|
||||
ExtensionFieldsA_goname = "XXX_InternalExtensions"
|
||||
ExtensionFieldsB_goname = "XXX_extensions"
|
||||
|
||||
WeakFieldPrefix_goname = "XXX_weak_"
|
||||
)
|
||||
16
vendor/google.golang.org/protobuf/internal/genid/map_entry.go
generated
vendored
Normal file
16
vendor/google.golang.org/protobuf/internal/genid/map_entry.go
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
// 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 genid
|
||||
|
||||
import protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
// Generic field names and numbers for synthetic map entry messages.
|
||||
const (
|
||||
MapEntry_Key_field_name protoreflect.Name = "key"
|
||||
MapEntry_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
MapEntry_Key_field_number protoreflect.FieldNumber = 1
|
||||
MapEntry_Value_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
31
vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go
generated
vendored
Normal file
31
vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
// 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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_source_context_proto = "google/protobuf/source_context.proto"
|
||||
|
||||
// Names for google.protobuf.SourceContext.
|
||||
const (
|
||||
SourceContext_message_name protoreflect.Name = "SourceContext"
|
||||
SourceContext_message_fullname protoreflect.FullName = "google.protobuf.SourceContext"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.SourceContext.
|
||||
const (
|
||||
SourceContext_FileName_field_name protoreflect.Name = "file_name"
|
||||
|
||||
SourceContext_FileName_field_fullname protoreflect.FullName = "google.protobuf.SourceContext.file_name"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.SourceContext.
|
||||
const (
|
||||
SourceContext_FileName_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
116
vendor/google.golang.org/protobuf/internal/genid/struct_gen.go
generated
vendored
Normal file
116
vendor/google.golang.org/protobuf/internal/genid/struct_gen.go
generated
vendored
Normal file
@ -0,0 +1,116 @@
|
||||
// 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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_struct_proto = "google/protobuf/struct.proto"
|
||||
|
||||
// Full and short names for google.protobuf.NullValue.
|
||||
const (
|
||||
NullValue_enum_fullname = "google.protobuf.NullValue"
|
||||
NullValue_enum_name = "NullValue"
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Struct.
|
||||
const (
|
||||
Struct_message_name protoreflect.Name = "Struct"
|
||||
Struct_message_fullname protoreflect.FullName = "google.protobuf.Struct"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Struct.
|
||||
const (
|
||||
Struct_Fields_field_name protoreflect.Name = "fields"
|
||||
|
||||
Struct_Fields_field_fullname protoreflect.FullName = "google.protobuf.Struct.fields"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Struct.
|
||||
const (
|
||||
Struct_Fields_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Struct.FieldsEntry.
|
||||
const (
|
||||
Struct_FieldsEntry_message_name protoreflect.Name = "FieldsEntry"
|
||||
Struct_FieldsEntry_message_fullname protoreflect.FullName = "google.protobuf.Struct.FieldsEntry"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Struct.FieldsEntry.
|
||||
const (
|
||||
Struct_FieldsEntry_Key_field_name protoreflect.Name = "key"
|
||||
Struct_FieldsEntry_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
Struct_FieldsEntry_Key_field_fullname protoreflect.FullName = "google.protobuf.Struct.FieldsEntry.key"
|
||||
Struct_FieldsEntry_Value_field_fullname protoreflect.FullName = "google.protobuf.Struct.FieldsEntry.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Struct.FieldsEntry.
|
||||
const (
|
||||
Struct_FieldsEntry_Key_field_number protoreflect.FieldNumber = 1
|
||||
Struct_FieldsEntry_Value_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Value.
|
||||
const (
|
||||
Value_message_name protoreflect.Name = "Value"
|
||||
Value_message_fullname protoreflect.FullName = "google.protobuf.Value"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Value.
|
||||
const (
|
||||
Value_NullValue_field_name protoreflect.Name = "null_value"
|
||||
Value_NumberValue_field_name protoreflect.Name = "number_value"
|
||||
Value_StringValue_field_name protoreflect.Name = "string_value"
|
||||
Value_BoolValue_field_name protoreflect.Name = "bool_value"
|
||||
Value_StructValue_field_name protoreflect.Name = "struct_value"
|
||||
Value_ListValue_field_name protoreflect.Name = "list_value"
|
||||
|
||||
Value_NullValue_field_fullname protoreflect.FullName = "google.protobuf.Value.null_value"
|
||||
Value_NumberValue_field_fullname protoreflect.FullName = "google.protobuf.Value.number_value"
|
||||
Value_StringValue_field_fullname protoreflect.FullName = "google.protobuf.Value.string_value"
|
||||
Value_BoolValue_field_fullname protoreflect.FullName = "google.protobuf.Value.bool_value"
|
||||
Value_StructValue_field_fullname protoreflect.FullName = "google.protobuf.Value.struct_value"
|
||||
Value_ListValue_field_fullname protoreflect.FullName = "google.protobuf.Value.list_value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Value.
|
||||
const (
|
||||
Value_NullValue_field_number protoreflect.FieldNumber = 1
|
||||
Value_NumberValue_field_number protoreflect.FieldNumber = 2
|
||||
Value_StringValue_field_number protoreflect.FieldNumber = 3
|
||||
Value_BoolValue_field_number protoreflect.FieldNumber = 4
|
||||
Value_StructValue_field_number protoreflect.FieldNumber = 5
|
||||
Value_ListValue_field_number protoreflect.FieldNumber = 6
|
||||
)
|
||||
|
||||
// Oneof names for google.protobuf.Value.
|
||||
const (
|
||||
Value_Kind_oneof_name protoreflect.Name = "kind"
|
||||
|
||||
Value_Kind_oneof_fullname protoreflect.FullName = "google.protobuf.Value.kind"
|
||||
)
|
||||
|
||||
// Names for google.protobuf.ListValue.
|
||||
const (
|
||||
ListValue_message_name protoreflect.Name = "ListValue"
|
||||
ListValue_message_fullname protoreflect.FullName = "google.protobuf.ListValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.ListValue.
|
||||
const (
|
||||
ListValue_Values_field_name protoreflect.Name = "values"
|
||||
|
||||
ListValue_Values_field_fullname protoreflect.FullName = "google.protobuf.ListValue.values"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.ListValue.
|
||||
const (
|
||||
ListValue_Values_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
34
vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go
generated
vendored
Normal file
34
vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
// 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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_timestamp_proto = "google/protobuf/timestamp.proto"
|
||||
|
||||
// Names for google.protobuf.Timestamp.
|
||||
const (
|
||||
Timestamp_message_name protoreflect.Name = "Timestamp"
|
||||
Timestamp_message_fullname protoreflect.FullName = "google.protobuf.Timestamp"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Timestamp.
|
||||
const (
|
||||
Timestamp_Seconds_field_name protoreflect.Name = "seconds"
|
||||
Timestamp_Nanos_field_name protoreflect.Name = "nanos"
|
||||
|
||||
Timestamp_Seconds_field_fullname protoreflect.FullName = "google.protobuf.Timestamp.seconds"
|
||||
Timestamp_Nanos_field_fullname protoreflect.FullName = "google.protobuf.Timestamp.nanos"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Timestamp.
|
||||
const (
|
||||
Timestamp_Seconds_field_number protoreflect.FieldNumber = 1
|
||||
Timestamp_Nanos_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
184
vendor/google.golang.org/protobuf/internal/genid/type_gen.go
generated
vendored
Normal file
184
vendor/google.golang.org/protobuf/internal/genid/type_gen.go
generated
vendored
Normal file
@ -0,0 +1,184 @@
|
||||
// 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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_type_proto = "google/protobuf/type.proto"
|
||||
|
||||
// Full and short names for google.protobuf.Syntax.
|
||||
const (
|
||||
Syntax_enum_fullname = "google.protobuf.Syntax"
|
||||
Syntax_enum_name = "Syntax"
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Type.
|
||||
const (
|
||||
Type_message_name protoreflect.Name = "Type"
|
||||
Type_message_fullname protoreflect.FullName = "google.protobuf.Type"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Type.
|
||||
const (
|
||||
Type_Name_field_name protoreflect.Name = "name"
|
||||
Type_Fields_field_name protoreflect.Name = "fields"
|
||||
Type_Oneofs_field_name protoreflect.Name = "oneofs"
|
||||
Type_Options_field_name protoreflect.Name = "options"
|
||||
Type_SourceContext_field_name protoreflect.Name = "source_context"
|
||||
Type_Syntax_field_name protoreflect.Name = "syntax"
|
||||
|
||||
Type_Name_field_fullname protoreflect.FullName = "google.protobuf.Type.name"
|
||||
Type_Fields_field_fullname protoreflect.FullName = "google.protobuf.Type.fields"
|
||||
Type_Oneofs_field_fullname protoreflect.FullName = "google.protobuf.Type.oneofs"
|
||||
Type_Options_field_fullname protoreflect.FullName = "google.protobuf.Type.options"
|
||||
Type_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Type.source_context"
|
||||
Type_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Type.syntax"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Type.
|
||||
const (
|
||||
Type_Name_field_number protoreflect.FieldNumber = 1
|
||||
Type_Fields_field_number protoreflect.FieldNumber = 2
|
||||
Type_Oneofs_field_number protoreflect.FieldNumber = 3
|
||||
Type_Options_field_number protoreflect.FieldNumber = 4
|
||||
Type_SourceContext_field_number protoreflect.FieldNumber = 5
|
||||
Type_Syntax_field_number protoreflect.FieldNumber = 6
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Field.
|
||||
const (
|
||||
Field_message_name protoreflect.Name = "Field"
|
||||
Field_message_fullname protoreflect.FullName = "google.protobuf.Field"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Field.
|
||||
const (
|
||||
Field_Kind_field_name protoreflect.Name = "kind"
|
||||
Field_Cardinality_field_name protoreflect.Name = "cardinality"
|
||||
Field_Number_field_name protoreflect.Name = "number"
|
||||
Field_Name_field_name protoreflect.Name = "name"
|
||||
Field_TypeUrl_field_name protoreflect.Name = "type_url"
|
||||
Field_OneofIndex_field_name protoreflect.Name = "oneof_index"
|
||||
Field_Packed_field_name protoreflect.Name = "packed"
|
||||
Field_Options_field_name protoreflect.Name = "options"
|
||||
Field_JsonName_field_name protoreflect.Name = "json_name"
|
||||
Field_DefaultValue_field_name protoreflect.Name = "default_value"
|
||||
|
||||
Field_Kind_field_fullname protoreflect.FullName = "google.protobuf.Field.kind"
|
||||
Field_Cardinality_field_fullname protoreflect.FullName = "google.protobuf.Field.cardinality"
|
||||
Field_Number_field_fullname protoreflect.FullName = "google.protobuf.Field.number"
|
||||
Field_Name_field_fullname protoreflect.FullName = "google.protobuf.Field.name"
|
||||
Field_TypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Field.type_url"
|
||||
Field_OneofIndex_field_fullname protoreflect.FullName = "google.protobuf.Field.oneof_index"
|
||||
Field_Packed_field_fullname protoreflect.FullName = "google.protobuf.Field.packed"
|
||||
Field_Options_field_fullname protoreflect.FullName = "google.protobuf.Field.options"
|
||||
Field_JsonName_field_fullname protoreflect.FullName = "google.protobuf.Field.json_name"
|
||||
Field_DefaultValue_field_fullname protoreflect.FullName = "google.protobuf.Field.default_value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Field.
|
||||
const (
|
||||
Field_Kind_field_number protoreflect.FieldNumber = 1
|
||||
Field_Cardinality_field_number protoreflect.FieldNumber = 2
|
||||
Field_Number_field_number protoreflect.FieldNumber = 3
|
||||
Field_Name_field_number protoreflect.FieldNumber = 4
|
||||
Field_TypeUrl_field_number protoreflect.FieldNumber = 6
|
||||
Field_OneofIndex_field_number protoreflect.FieldNumber = 7
|
||||
Field_Packed_field_number protoreflect.FieldNumber = 8
|
||||
Field_Options_field_number protoreflect.FieldNumber = 9
|
||||
Field_JsonName_field_number protoreflect.FieldNumber = 10
|
||||
Field_DefaultValue_field_number protoreflect.FieldNumber = 11
|
||||
)
|
||||
|
||||
// Full and short names for google.protobuf.Field.Kind.
|
||||
const (
|
||||
Field_Kind_enum_fullname = "google.protobuf.Field.Kind"
|
||||
Field_Kind_enum_name = "Kind"
|
||||
)
|
||||
|
||||
// Full and short names for google.protobuf.Field.Cardinality.
|
||||
const (
|
||||
Field_Cardinality_enum_fullname = "google.protobuf.Field.Cardinality"
|
||||
Field_Cardinality_enum_name = "Cardinality"
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Enum.
|
||||
const (
|
||||
Enum_message_name protoreflect.Name = "Enum"
|
||||
Enum_message_fullname protoreflect.FullName = "google.protobuf.Enum"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Enum.
|
||||
const (
|
||||
Enum_Name_field_name protoreflect.Name = "name"
|
||||
Enum_Enumvalue_field_name protoreflect.Name = "enumvalue"
|
||||
Enum_Options_field_name protoreflect.Name = "options"
|
||||
Enum_SourceContext_field_name protoreflect.Name = "source_context"
|
||||
Enum_Syntax_field_name protoreflect.Name = "syntax"
|
||||
|
||||
Enum_Name_field_fullname protoreflect.FullName = "google.protobuf.Enum.name"
|
||||
Enum_Enumvalue_field_fullname protoreflect.FullName = "google.protobuf.Enum.enumvalue"
|
||||
Enum_Options_field_fullname protoreflect.FullName = "google.protobuf.Enum.options"
|
||||
Enum_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Enum.source_context"
|
||||
Enum_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Enum.syntax"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Enum.
|
||||
const (
|
||||
Enum_Name_field_number protoreflect.FieldNumber = 1
|
||||
Enum_Enumvalue_field_number protoreflect.FieldNumber = 2
|
||||
Enum_Options_field_number protoreflect.FieldNumber = 3
|
||||
Enum_SourceContext_field_number protoreflect.FieldNumber = 4
|
||||
Enum_Syntax_field_number protoreflect.FieldNumber = 5
|
||||
)
|
||||
|
||||
// Names for google.protobuf.EnumValue.
|
||||
const (
|
||||
EnumValue_message_name protoreflect.Name = "EnumValue"
|
||||
EnumValue_message_fullname protoreflect.FullName = "google.protobuf.EnumValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.EnumValue.
|
||||
const (
|
||||
EnumValue_Name_field_name protoreflect.Name = "name"
|
||||
EnumValue_Number_field_name protoreflect.Name = "number"
|
||||
EnumValue_Options_field_name protoreflect.Name = "options"
|
||||
|
||||
EnumValue_Name_field_fullname protoreflect.FullName = "google.protobuf.EnumValue.name"
|
||||
EnumValue_Number_field_fullname protoreflect.FullName = "google.protobuf.EnumValue.number"
|
||||
EnumValue_Options_field_fullname protoreflect.FullName = "google.protobuf.EnumValue.options"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumValue.
|
||||
const (
|
||||
EnumValue_Name_field_number protoreflect.FieldNumber = 1
|
||||
EnumValue_Number_field_number protoreflect.FieldNumber = 2
|
||||
EnumValue_Options_field_number protoreflect.FieldNumber = 3
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Option.
|
||||
const (
|
||||
Option_message_name protoreflect.Name = "Option"
|
||||
Option_message_fullname protoreflect.FullName = "google.protobuf.Option"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Option.
|
||||
const (
|
||||
Option_Name_field_name protoreflect.Name = "name"
|
||||
Option_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
Option_Name_field_fullname protoreflect.FullName = "google.protobuf.Option.name"
|
||||
Option_Value_field_fullname protoreflect.FullName = "google.protobuf.Option.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Option.
|
||||
const (
|
||||
Option_Name_field_number protoreflect.FieldNumber = 1
|
||||
Option_Value_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
13
vendor/google.golang.org/protobuf/internal/genid/wrappers.go
generated
vendored
Normal file
13
vendor/google.golang.org/protobuf/internal/genid/wrappers.go
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
// 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 genid
|
||||
|
||||
import protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
// Generic field name and number for messages in wrappers.proto.
|
||||
const (
|
||||
WrapperValue_Value_field_name protoreflect.Name = "value"
|
||||
WrapperValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
175
vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go
generated
vendored
Normal file
175
vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go
generated
vendored
Normal file
@ -0,0 +1,175 @@
|
||||
// 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.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_wrappers_proto = "google/protobuf/wrappers.proto"
|
||||
|
||||
// Names for google.protobuf.DoubleValue.
|
||||
const (
|
||||
DoubleValue_message_name protoreflect.Name = "DoubleValue"
|
||||
DoubleValue_message_fullname protoreflect.FullName = "google.protobuf.DoubleValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.DoubleValue.
|
||||
const (
|
||||
DoubleValue_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
DoubleValue_Value_field_fullname protoreflect.FullName = "google.protobuf.DoubleValue.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.DoubleValue.
|
||||
const (
|
||||
DoubleValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.FloatValue.
|
||||
const (
|
||||
FloatValue_message_name protoreflect.Name = "FloatValue"
|
||||
FloatValue_message_fullname protoreflect.FullName = "google.protobuf.FloatValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.FloatValue.
|
||||
const (
|
||||
FloatValue_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
FloatValue_Value_field_fullname protoreflect.FullName = "google.protobuf.FloatValue.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FloatValue.
|
||||
const (
|
||||
FloatValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Int64Value.
|
||||
const (
|
||||
Int64Value_message_name protoreflect.Name = "Int64Value"
|
||||
Int64Value_message_fullname protoreflect.FullName = "google.protobuf.Int64Value"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Int64Value.
|
||||
const (
|
||||
Int64Value_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
Int64Value_Value_field_fullname protoreflect.FullName = "google.protobuf.Int64Value.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Int64Value.
|
||||
const (
|
||||
Int64Value_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.UInt64Value.
|
||||
const (
|
||||
UInt64Value_message_name protoreflect.Name = "UInt64Value"
|
||||
UInt64Value_message_fullname protoreflect.FullName = "google.protobuf.UInt64Value"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.UInt64Value.
|
||||
const (
|
||||
UInt64Value_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
UInt64Value_Value_field_fullname protoreflect.FullName = "google.protobuf.UInt64Value.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.UInt64Value.
|
||||
const (
|
||||
UInt64Value_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Int32Value.
|
||||
const (
|
||||
Int32Value_message_name protoreflect.Name = "Int32Value"
|
||||
Int32Value_message_fullname protoreflect.FullName = "google.protobuf.Int32Value"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Int32Value.
|
||||
const (
|
||||
Int32Value_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
Int32Value_Value_field_fullname protoreflect.FullName = "google.protobuf.Int32Value.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Int32Value.
|
||||
const (
|
||||
Int32Value_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.UInt32Value.
|
||||
const (
|
||||
UInt32Value_message_name protoreflect.Name = "UInt32Value"
|
||||
UInt32Value_message_fullname protoreflect.FullName = "google.protobuf.UInt32Value"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.UInt32Value.
|
||||
const (
|
||||
UInt32Value_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
UInt32Value_Value_field_fullname protoreflect.FullName = "google.protobuf.UInt32Value.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.UInt32Value.
|
||||
const (
|
||||
UInt32Value_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.BoolValue.
|
||||
const (
|
||||
BoolValue_message_name protoreflect.Name = "BoolValue"
|
||||
BoolValue_message_fullname protoreflect.FullName = "google.protobuf.BoolValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.BoolValue.
|
||||
const (
|
||||
BoolValue_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
BoolValue_Value_field_fullname protoreflect.FullName = "google.protobuf.BoolValue.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.BoolValue.
|
||||
const (
|
||||
BoolValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.StringValue.
|
||||
const (
|
||||
StringValue_message_name protoreflect.Name = "StringValue"
|
||||
StringValue_message_fullname protoreflect.FullName = "google.protobuf.StringValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.StringValue.
|
||||
const (
|
||||
StringValue_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
StringValue_Value_field_fullname protoreflect.FullName = "google.protobuf.StringValue.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.StringValue.
|
||||
const (
|
||||
StringValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.BytesValue.
|
||||
const (
|
||||
BytesValue_message_name protoreflect.Name = "BytesValue"
|
||||
BytesValue_message_fullname protoreflect.FullName = "google.protobuf.BytesValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.BytesValue.
|
||||
const (
|
||||
BytesValue_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
BytesValue_Value_field_fullname protoreflect.FullName = "google.protobuf.BytesValue.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.BytesValue.
|
||||
const (
|
||||
BytesValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
25
vendor/google.golang.org/protobuf/internal/genname/name.go
generated
vendored
25
vendor/google.golang.org/protobuf/internal/genname/name.go
generated
vendored
@ -1,25 +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 genname contains constants for generated names.
|
||||
package genname
|
||||
|
||||
const (
|
||||
State = "state"
|
||||
|
||||
SizeCache = "sizeCache"
|
||||
SizeCacheA = "XXX_sizecache"
|
||||
|
||||
WeakFields = "weakFields"
|
||||
WeakFieldsA = "XXX_weak"
|
||||
|
||||
UnknownFields = "unknownFields"
|
||||
UnknownFieldsA = "XXX_unrecognized"
|
||||
|
||||
ExtensionFields = "extensionFields"
|
||||
ExtensionFieldsA = "XXX_InternalExtensions"
|
||||
ExtensionFieldsB = "XXX_extensions"
|
||||
|
||||
WeakFieldPrefix = "XXX_weak_"
|
||||
)
|
||||
7
vendor/google.golang.org/protobuf/internal/impl/api_export.go
generated
vendored
7
vendor/google.golang.org/protobuf/internal/impl/api_export.go
generated
vendored
@ -10,6 +10,7 @@ import (
|
||||
"strconv"
|
||||
|
||||
"google.golang.org/protobuf/encoding/prototext"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/proto"
|
||||
pref "google.golang.org/protobuf/reflect/protoreflect"
|
||||
piface "google.golang.org/protobuf/runtime/protoiface"
|
||||
@ -19,6 +20,12 @@ import (
|
||||
// functions that we do not want to appear in godoc.
|
||||
type Export struct{}
|
||||
|
||||
// NewError formats a string according to the format specifier and arguments and
|
||||
// returns an error that has a "proto" prefix.
|
||||
func (Export) NewError(f string, x ...interface{}) error {
|
||||
return errors.New(f, x...)
|
||||
}
|
||||
|
||||
// enum is any enum type generated by protoc-gen-go
|
||||
// and must be a named int32 type.
|
||||
type enum = interface{}
|
||||
|
||||
5
vendor/google.golang.org/protobuf/internal/impl/codec_map.go
generated
vendored
5
vendor/google.golang.org/protobuf/internal/impl/codec_map.go
generated
vendored
@ -10,6 +10,7 @@ import (
|
||||
"sort"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
pref "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
@ -134,7 +135,7 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo
|
||||
b = b[n:]
|
||||
err := errUnknown
|
||||
switch num {
|
||||
case 1:
|
||||
case genid.MapEntry_Key_field_number:
|
||||
var v pref.Value
|
||||
var o unmarshalOutput
|
||||
v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts)
|
||||
@ -143,7 +144,7 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo
|
||||
}
|
||||
key = v
|
||||
n = o.n
|
||||
case 2:
|
||||
case genid.MapEntry_Value_field_number:
|
||||
var v pref.Value
|
||||
var o unmarshalOutput
|
||||
v, o, err = mapi.valFuncs.unmarshal(b, val, num, wtyp, opts)
|
||||
|
||||
10
vendor/google.golang.org/protobuf/internal/impl/message.go
generated
vendored
10
vendor/google.golang.org/protobuf/internal/impl/message.go
generated
vendored
@ -12,7 +12,7 @@ import (
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
|
||||
"google.golang.org/protobuf/internal/genname"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
pref "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
@ -148,19 +148,19 @@ func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo {
|
||||
fieldLoop:
|
||||
for i := 0; i < t.NumField(); i++ {
|
||||
switch f := t.Field(i); f.Name {
|
||||
case genname.SizeCache, genname.SizeCacheA:
|
||||
case genid.SizeCache_goname, genid.SizeCacheA_goname:
|
||||
if f.Type == sizecacheType {
|
||||
si.sizecacheOffset = offsetOf(f, mi.Exporter)
|
||||
}
|
||||
case genname.WeakFields, genname.WeakFieldsA:
|
||||
case genid.WeakFields_goname, genid.WeakFieldsA_goname:
|
||||
if f.Type == weakFieldsType {
|
||||
si.weakOffset = offsetOf(f, mi.Exporter)
|
||||
}
|
||||
case genname.UnknownFields, genname.UnknownFieldsA:
|
||||
case genid.UnknownFields_goname, genid.UnknownFieldsA_goname:
|
||||
if f.Type == unknownFieldsType {
|
||||
si.unknownOffset = offsetOf(f, mi.Exporter)
|
||||
}
|
||||
case genname.ExtensionFields, genname.ExtensionFieldsA, genname.ExtensionFieldsB:
|
||||
case genid.ExtensionFields_goname, genid.ExtensionFieldsA_goname, genid.ExtensionFieldsB_goname:
|
||||
if f.Type == extensionFieldsType {
|
||||
si.extensionOffset = offsetOf(f, mi.Exporter)
|
||||
}
|
||||
|
||||
5
vendor/google.golang.org/protobuf/internal/impl/validate.go
generated
vendored
5
vendor/google.golang.org/protobuf/internal/impl/validate.go
generated
vendored
@ -14,6 +14,7 @@ import (
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
pref "google.golang.org/protobuf/reflect/protoreflect"
|
||||
preg "google.golang.org/protobuf/reflect/protoregistry"
|
||||
@ -282,9 +283,9 @@ State:
|
||||
switch {
|
||||
case st.typ == validationTypeMap:
|
||||
switch num {
|
||||
case 1:
|
||||
case genid.MapEntry_Key_field_number:
|
||||
vi.typ = st.keyType
|
||||
case 2:
|
||||
case genid.MapEntry_Value_field_number:
|
||||
vi.typ = st.valType
|
||||
vi.mi = st.mi
|
||||
vi.requiredBit = 1
|
||||
|
||||
2
vendor/google.golang.org/protobuf/internal/version/version.go
generated
vendored
2
vendor/google.golang.org/protobuf/internal/version/version.go
generated
vendored
@ -52,7 +52,7 @@ import (
|
||||
// 10. Send out the CL for review and submit it.
|
||||
const (
|
||||
Major = 1
|
||||
Minor = 24
|
||||
Minor = 25
|
||||
Patch = 0
|
||||
PreRelease = ""
|
||||
)
|
||||
|
||||
5
vendor/google.golang.org/protobuf/proto/decode.go
generated
vendored
5
vendor/google.golang.org/protobuf/proto/decode.go
generated
vendored
@ -9,6 +9,7 @@ import (
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
@ -220,13 +221,13 @@ func (o UnmarshalOptions) unmarshalMap(b []byte, wtyp protowire.Type, mapv proto
|
||||
b = b[n:]
|
||||
err = errUnknown
|
||||
switch num {
|
||||
case 1:
|
||||
case genid.MapEntry_Key_field_number:
|
||||
key, n, err = o.unmarshalScalar(b, wtyp, keyField)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
haveKey = true
|
||||
case 2:
|
||||
case genid.MapEntry_Value_field_number:
|
||||
var v protoreflect.Value
|
||||
v, n, err = o.unmarshalScalar(b, wtyp, valField)
|
||||
if err != nil {
|
||||
|
||||
5
vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go
generated
vendored
5
vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go
generated
vendored
@ -12,6 +12,7 @@ import (
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/filedesc"
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
@ -348,9 +349,9 @@ func checkValidMap(fd protoreflect.FieldDescriptor) error {
|
||||
kf := md.Fields().Get(0)
|
||||
vf := md.Fields().Get(1)
|
||||
switch {
|
||||
case kf.Name() != "key" || kf.Number() != 1 || kf.Cardinality() != protoreflect.Optional || kf.ContainingOneof() != nil || kf.HasDefault():
|
||||
case kf.Name() != genid.MapEntry_Key_field_name || kf.Number() != genid.MapEntry_Key_field_number || kf.Cardinality() != protoreflect.Optional || kf.ContainingOneof() != nil || kf.HasDefault():
|
||||
return errors.New("invalid key field")
|
||||
case vf.Name() != "value" || vf.Number() != 2 || vf.Cardinality() != protoreflect.Optional || vf.ContainingOneof() != nil || vf.HasDefault():
|
||||
case vf.Name() != genid.MapEntry_Value_field_name || vf.Number() != genid.MapEntry_Value_field_number || vf.Cardinality() != protoreflect.Optional || vf.ContainingOneof() != nil || vf.HasDefault():
|
||||
return errors.New("invalid value field")
|
||||
}
|
||||
switch kf.Kind() {
|
||||
|
||||
50
vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go
generated
vendored
50
vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go
generated
vendored
@ -128,7 +128,6 @@ package protoreflect
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
@ -408,19 +407,14 @@ type EnumRanges interface {
|
||||
doNotImplement
|
||||
}
|
||||
|
||||
var (
|
||||
regexName = regexp.MustCompile(`^[_a-zA-Z][_a-zA-Z0-9]*$`)
|
||||
regexFullName = regexp.MustCompile(`^[_a-zA-Z][_a-zA-Z0-9]*(\.[_a-zA-Z][_a-zA-Z0-9]*)*$`)
|
||||
)
|
||||
|
||||
// Name is the short name for a proto declaration. This is not the name
|
||||
// as used in Go source code, which might not be identical to the proto name.
|
||||
type Name string // e.g., "Kind"
|
||||
|
||||
// IsValid reports whether n is a syntactically valid name.
|
||||
// IsValid reports whether s is a syntactically valid name.
|
||||
// An empty name is invalid.
|
||||
func (n Name) IsValid() bool {
|
||||
return regexName.MatchString(string(n))
|
||||
func (s Name) IsValid() bool {
|
||||
return consumeIdent(string(s)) == len(s)
|
||||
}
|
||||
|
||||
// Names represent a list of names.
|
||||
@ -443,10 +437,42 @@ type Names interface {
|
||||
// This should not have any leading or trailing dots.
|
||||
type FullName string // e.g., "google.protobuf.Field.Kind"
|
||||
|
||||
// IsValid reports whether n is a syntactically valid full name.
|
||||
// IsValid reports whether s is a syntactically valid full name.
|
||||
// An empty full name is invalid.
|
||||
func (n FullName) IsValid() bool {
|
||||
return regexFullName.MatchString(string(n))
|
||||
func (s FullName) IsValid() bool {
|
||||
i := consumeIdent(string(s))
|
||||
if i < 0 {
|
||||
return false
|
||||
}
|
||||
for len(s) > i {
|
||||
if s[i] != '.' {
|
||||
return false
|
||||
}
|
||||
i++
|
||||
n := consumeIdent(string(s[i:]))
|
||||
if n < 0 {
|
||||
return false
|
||||
}
|
||||
i += n
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func consumeIdent(s string) (i int) {
|
||||
if len(s) == 0 || !isLetter(s[i]) {
|
||||
return -1
|
||||
}
|
||||
i++
|
||||
for len(s) > i && isLetterDigit(s[i]) {
|
||||
i++
|
||||
}
|
||||
return i
|
||||
}
|
||||
func isLetter(c byte) bool {
|
||||
return c == '_' || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')
|
||||
}
|
||||
func isLetterDigit(c byte) bool {
|
||||
return isLetter(c) || ('0' <= c && c <= '9')
|
||||
}
|
||||
|
||||
// Name returns the short name, which is the last identifier segment.
|
||||
|
||||
207
vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go
generated
vendored
207
vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go
generated
vendored
@ -31,12 +31,100 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: google/protobuf/any.proto
|
||||
|
||||
// Package anypb contains generated types for google/protobuf/any.proto.
|
||||
//
|
||||
// The Any message is a dynamic representation of any other message value.
|
||||
// It is functionally a tuple of the full name of the remote message type and
|
||||
// the serialized bytes of the remote message value.
|
||||
//
|
||||
//
|
||||
// Constructing an Any
|
||||
//
|
||||
// An Any message containing another message value is constructed using New:
|
||||
//
|
||||
// any, err := anypb.New(m)
|
||||
// if err != nil {
|
||||
// ... // handle error
|
||||
// }
|
||||
// ... // make use of any
|
||||
//
|
||||
//
|
||||
// Unmarshaling an Any
|
||||
//
|
||||
// With a populated Any message, the underlying message can be serialized into
|
||||
// a remote concrete message value in a few ways.
|
||||
//
|
||||
// If the exact concrete type is known, then a new (or pre-existing) instance
|
||||
// of that message can be passed to the UnmarshalTo method:
|
||||
//
|
||||
// m := new(foopb.MyMessage)
|
||||
// if err := any.UnmarshalTo(m); err != nil {
|
||||
// ... // handle error
|
||||
// }
|
||||
// ... // make use of m
|
||||
//
|
||||
// If the exact concrete type is not known, then the UnmarshalNew method can be
|
||||
// used to unmarshal the contents into a new instance of the remote message type:
|
||||
//
|
||||
// m, err := any.UnmarshalNew()
|
||||
// if err != nil {
|
||||
// ... // handle error
|
||||
// }
|
||||
// ... // make use of m
|
||||
//
|
||||
// UnmarshalNew uses the global type registry to resolve the message type and
|
||||
// construct a new instance of that message to unmarshal into. In order for a
|
||||
// message type to appear in the global registry, the Go type representing that
|
||||
// protobuf message type must be linked into the Go binary. For messages
|
||||
// generated by protoc-gen-go, this is achieved through an import of the
|
||||
// generated Go package representing a .proto file.
|
||||
//
|
||||
// A common pattern with UnmarshalNew is to use a type switch with the resulting
|
||||
// proto.Message value:
|
||||
//
|
||||
// switch m := m.(type) {
|
||||
// case *foopb.MyMessage:
|
||||
// ... // make use of m as a *foopb.MyMessage
|
||||
// case *barpb.OtherMessage:
|
||||
// ... // make use of m as a *barpb.OtherMessage
|
||||
// case *bazpb.SomeMessage:
|
||||
// ... // make use of m as a *bazpb.SomeMessage
|
||||
// }
|
||||
//
|
||||
// This pattern ensures that the generated packages containing the message types
|
||||
// listed in the case clauses are linked into the Go binary and therefore also
|
||||
// registered in the global registry.
|
||||
//
|
||||
//
|
||||
// Type checking an Any
|
||||
//
|
||||
// In order to type check whether an Any message represents some other message,
|
||||
// then use the MessageIs method:
|
||||
//
|
||||
// if any.MessageIs((*foopb.MyMessage)(nil)) {
|
||||
// ... // make use of any, knowing that it contains a foopb.MyMessage
|
||||
// }
|
||||
//
|
||||
// The MessageIs method can also be used with an allocated instance of the target
|
||||
// message type if the intention is to unmarshal into it if the type matches:
|
||||
//
|
||||
// m := new(foopb.MyMessage)
|
||||
// if any.MessageIs(m) {
|
||||
// if err := any.UnmarshalTo(m); err != nil {
|
||||
// ... // handle error
|
||||
// }
|
||||
// ... // make use of m
|
||||
// }
|
||||
//
|
||||
package anypb
|
||||
|
||||
import (
|
||||
proto "google.golang.org/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoregistry "google.golang.org/protobuf/reflect/protoregistry"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
strings "strings"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
@ -158,6 +246,125 @@ type Any struct {
|
||||
Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// New marshals src into a new Any instance.
|
||||
func New(src proto.Message) (*Any, error) {
|
||||
dst := new(Any)
|
||||
if err := dst.MarshalFrom(src); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return dst, nil
|
||||
}
|
||||
|
||||
// MarshalFrom marshals src into dst as the underlying message
|
||||
// using the provided marshal options.
|
||||
//
|
||||
// If no options are specified, call dst.MarshalFrom instead.
|
||||
func MarshalFrom(dst *Any, src proto.Message, opts proto.MarshalOptions) error {
|
||||
const urlPrefix = "type.googleapis.com/"
|
||||
if src == nil {
|
||||
return protoimpl.X.NewError("invalid nil source message")
|
||||
}
|
||||
b, err := opts.Marshal(src)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dst.TypeUrl = urlPrefix + string(src.ProtoReflect().Descriptor().FullName())
|
||||
dst.Value = b
|
||||
return nil
|
||||
}
|
||||
|
||||
// UnmarshalTo unmarshals the underlying message from src into dst
|
||||
// using the provided unmarshal options.
|
||||
// It reports an error if dst is not of the right message type.
|
||||
//
|
||||
// If no options are specified, call src.UnmarshalTo instead.
|
||||
func UnmarshalTo(src *Any, dst proto.Message, opts proto.UnmarshalOptions) error {
|
||||
if src == nil {
|
||||
return protoimpl.X.NewError("invalid nil source message")
|
||||
}
|
||||
if !src.MessageIs(dst) {
|
||||
got := dst.ProtoReflect().Descriptor().FullName()
|
||||
want := src.MessageName()
|
||||
return protoimpl.X.NewError("mismatched message type: got %q, want %q", got, want)
|
||||
}
|
||||
return opts.Unmarshal(src.GetValue(), dst)
|
||||
}
|
||||
|
||||
// UnmarshalNew unmarshals the underlying message from src into dst,
|
||||
// which is newly created message using a type resolved from the type URL.
|
||||
// The message type is resolved according to opt.Resolver,
|
||||
// which should implement protoregistry.MessageTypeResolver.
|
||||
// It reports an error if the underlying message type could not be resolved.
|
||||
//
|
||||
// If no options are specified, call src.UnmarshalNew instead.
|
||||
func UnmarshalNew(src *Any, opts proto.UnmarshalOptions) (dst proto.Message, err error) {
|
||||
if src.GetTypeUrl() == "" {
|
||||
return nil, protoimpl.X.NewError("invalid empty type URL")
|
||||
}
|
||||
if opts.Resolver == nil {
|
||||
opts.Resolver = protoregistry.GlobalTypes
|
||||
}
|
||||
r, ok := opts.Resolver.(protoregistry.MessageTypeResolver)
|
||||
if !ok {
|
||||
return nil, protoregistry.NotFound
|
||||
}
|
||||
mt, err := r.FindMessageByURL(src.GetTypeUrl())
|
||||
if err != nil {
|
||||
if err == protoregistry.NotFound {
|
||||
return nil, err
|
||||
}
|
||||
return nil, protoimpl.X.NewError("could not resolve %q: %v", src.GetTypeUrl(), err)
|
||||
}
|
||||
dst = mt.New().Interface()
|
||||
return dst, opts.Unmarshal(src.GetValue(), dst)
|
||||
}
|
||||
|
||||
// MessageIs reports whether the underlying message is of the same type as m.
|
||||
func (x *Any) MessageIs(m proto.Message) bool {
|
||||
if m == nil {
|
||||
return false
|
||||
}
|
||||
url := x.GetTypeUrl()
|
||||
name := string(m.ProtoReflect().Descriptor().FullName())
|
||||
if !strings.HasSuffix(url, name) {
|
||||
return false
|
||||
}
|
||||
return len(url) == len(name) || url[len(url)-len(name)-1] == '/'
|
||||
}
|
||||
|
||||
// MessageName reports the full name of the underlying message,
|
||||
// returning an empty string if invalid.
|
||||
func (x *Any) MessageName() protoreflect.FullName {
|
||||
url := x.GetTypeUrl()
|
||||
name := protoreflect.FullName(url)
|
||||
if i := strings.LastIndexByte(url, '/'); i >= 0 {
|
||||
name = name[i+len("/"):]
|
||||
}
|
||||
if !name.IsValid() {
|
||||
return ""
|
||||
}
|
||||
return name
|
||||
}
|
||||
|
||||
// MarshalFrom marshals m into x as the underlying message.
|
||||
func (x *Any) MarshalFrom(m proto.Message) error {
|
||||
return MarshalFrom(x, m, proto.MarshalOptions{})
|
||||
}
|
||||
|
||||
// UnmarshalTo unmarshals the contents of the underlying message of x into m.
|
||||
// It resets m before performing the unmarshal operation.
|
||||
// It reports an error if m is not of the right message type.
|
||||
func (x *Any) UnmarshalTo(m proto.Message) error {
|
||||
return UnmarshalTo(x, m, proto.UnmarshalOptions{})
|
||||
}
|
||||
|
||||
// UnmarshalNew unmarshals the contents of the underlying message of x into
|
||||
// a newly allocated message of the specified type.
|
||||
// It reports an error if the underlying message type could not be resolved.
|
||||
func (x *Any) UnmarshalNew() (proto.Message, error) {
|
||||
return UnmarshalNew(x, proto.UnmarshalOptions{})
|
||||
}
|
||||
|
||||
func (x *Any) Reset() {
|
||||
*x = Any{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
|
||||
130
vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go
generated
vendored
130
vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go
generated
vendored
@ -31,13 +31,58 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: google/protobuf/duration.proto
|
||||
|
||||
// Package durationpb contains generated types for google/protobuf/duration.proto.
|
||||
//
|
||||
// The Duration message represents a signed span of time.
|
||||
//
|
||||
//
|
||||
// Conversion to a Go Duration
|
||||
//
|
||||
// The AsDuration method can be used to convert a Duration message to a
|
||||
// standard Go time.Duration value:
|
||||
//
|
||||
// d := dur.AsDuration()
|
||||
// ... // make use of d as a time.Duration
|
||||
//
|
||||
// Converting to a time.Duration is a common operation so that the extensive
|
||||
// set of time-based operations provided by the time package can be leveraged.
|
||||
// See https://golang.org/pkg/time for more information.
|
||||
//
|
||||
// The AsDuration method performs the conversion on a best-effort basis.
|
||||
// Durations with denormal values (e.g., nanoseconds beyond -99999999 and
|
||||
// +99999999, inclusive; or seconds and nanoseconds with opposite signs)
|
||||
// are normalized during the conversion to a time.Duration. To manually check for
|
||||
// invalid Duration per the documented limitations in duration.proto,
|
||||
// additionally call the CheckValid method:
|
||||
//
|
||||
// if err := dur.CheckValid(); err != nil {
|
||||
// ... // handle error
|
||||
// }
|
||||
//
|
||||
// Note that the documented limitations in duration.proto does not protect a
|
||||
// Duration from overflowing the representable range of a time.Duration in Go.
|
||||
// The AsDuration method uses saturation arithmetic such that an overflow clamps
|
||||
// the resulting value to the closest representable value (e.g., math.MaxInt64
|
||||
// for positive overflow and math.MinInt64 for negative overflow).
|
||||
//
|
||||
//
|
||||
// Conversion from a Go Duration
|
||||
//
|
||||
// The durationpb.New function can be used to construct a Duration message
|
||||
// from a standard Go time.Duration value:
|
||||
//
|
||||
// dur := durationpb.New(d)
|
||||
// ... // make use of d as a *durationpb.Duration
|
||||
//
|
||||
package durationpb
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
math "math"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
time "time"
|
||||
)
|
||||
|
||||
// A Duration represents a signed, fixed-length span of time represented
|
||||
@ -118,6 +163,91 @@ type Duration struct {
|
||||
Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"`
|
||||
}
|
||||
|
||||
// New constructs a new Duration from the provided time.Duration.
|
||||
func New(d time.Duration) *Duration {
|
||||
nanos := d.Nanoseconds()
|
||||
secs := nanos / 1e9
|
||||
nanos -= secs * 1e9
|
||||
return &Duration{Seconds: int64(secs), Nanos: int32(nanos)}
|
||||
}
|
||||
|
||||
// AsDuration converts x to a time.Duration,
|
||||
// returning the closest duration value in the event of overflow.
|
||||
func (x *Duration) AsDuration() time.Duration {
|
||||
secs := x.GetSeconds()
|
||||
nanos := x.GetNanos()
|
||||
d := time.Duration(secs) * time.Second
|
||||
overflow := d/time.Second != time.Duration(secs)
|
||||
d += time.Duration(nanos) * time.Nanosecond
|
||||
overflow = overflow || (secs < 0 && nanos < 0 && d > 0)
|
||||
overflow = overflow || (secs > 0 && nanos > 0 && d < 0)
|
||||
if overflow {
|
||||
switch {
|
||||
case secs < 0:
|
||||
return time.Duration(math.MinInt64)
|
||||
case secs > 0:
|
||||
return time.Duration(math.MaxInt64)
|
||||
}
|
||||
}
|
||||
return d
|
||||
}
|
||||
|
||||
// IsValid reports whether the duration is valid.
|
||||
// It is equivalent to CheckValid == nil.
|
||||
func (x *Duration) IsValid() bool {
|
||||
return x.check() == 0
|
||||
}
|
||||
|
||||
// CheckValid returns an error if the duration is invalid.
|
||||
// In particular, it checks whether the value is within the range of
|
||||
// -10000 years to +10000 years inclusive.
|
||||
// An error is reported for a nil Duration.
|
||||
func (x *Duration) CheckValid() error {
|
||||
switch x.check() {
|
||||
case invalidNil:
|
||||
return protoimpl.X.NewError("invalid nil Duration")
|
||||
case invalidUnderflow:
|
||||
return protoimpl.X.NewError("duration (%v) exceeds -10000 years", x)
|
||||
case invalidOverflow:
|
||||
return protoimpl.X.NewError("duration (%v) exceeds +10000 years", x)
|
||||
case invalidNanosRange:
|
||||
return protoimpl.X.NewError("duration (%v) has out-of-range nanos", x)
|
||||
case invalidNanosSign:
|
||||
return protoimpl.X.NewError("duration (%v) has seconds and nanos with different signs", x)
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
const (
|
||||
_ = iota
|
||||
invalidNil
|
||||
invalidUnderflow
|
||||
invalidOverflow
|
||||
invalidNanosRange
|
||||
invalidNanosSign
|
||||
)
|
||||
|
||||
func (x *Duration) check() uint {
|
||||
const absDuration = 315576000000 // 10000yr * 365.25day/yr * 24hr/day * 60min/hr * 60sec/min
|
||||
secs := x.GetSeconds()
|
||||
nanos := x.GetNanos()
|
||||
switch {
|
||||
case x == nil:
|
||||
return invalidNil
|
||||
case secs < -absDuration:
|
||||
return invalidUnderflow
|
||||
case secs > +absDuration:
|
||||
return invalidOverflow
|
||||
case nanos <= -1e9 || nanos >= +1e9:
|
||||
return invalidNanosRange
|
||||
case (secs > 0 && nanos < 0) || (secs < 0 && nanos > 0):
|
||||
return invalidNanosSign
|
||||
default:
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Duration) Reset() {
|
||||
*x = Duration{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
|
||||
217
vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go
generated
vendored
217
vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go
generated
vendored
@ -31,12 +31,59 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: google/protobuf/field_mask.proto
|
||||
|
||||
// Package fieldmaskpb contains generated types for google/protobuf/field_mask.proto.
|
||||
//
|
||||
// The FieldMask message represents a set of symbolic field paths.
|
||||
// The paths are specific to some target message type,
|
||||
// which is not stored within the FieldMask message itself.
|
||||
//
|
||||
//
|
||||
// Constructing a FieldMask
|
||||
//
|
||||
// The New function is used construct a FieldMask:
|
||||
//
|
||||
// var messageType *descriptorpb.DescriptorProto
|
||||
// fm, err := fieldmaskpb.New(messageType, "field.name", "field.number")
|
||||
// if err != nil {
|
||||
// ... // handle error
|
||||
// }
|
||||
// ... // make use of fm
|
||||
//
|
||||
// The "field.name" and "field.number" paths are valid paths according to the
|
||||
// google.protobuf.DescriptorProto message. Use of a path that does not correlate
|
||||
// to valid fields reachable from DescriptorProto would result in an error.
|
||||
//
|
||||
// Once a FieldMask message has been constructed,
|
||||
// the Append method can be used to insert additional paths to the path set:
|
||||
//
|
||||
// var messageType *descriptorpb.DescriptorProto
|
||||
// if err := fm.Append(messageType, "options"); err != nil {
|
||||
// ... // handle error
|
||||
// }
|
||||
//
|
||||
//
|
||||
// Type checking a FieldMask
|
||||
//
|
||||
// In order to verify that a FieldMask represents a set of fields that are
|
||||
// reachable from some target message type, use the IsValid method:
|
||||
//
|
||||
// var messageType *descriptorpb.DescriptorProto
|
||||
// if fm.IsValid(messageType) {
|
||||
// ... // make use of fm
|
||||
// }
|
||||
//
|
||||
// IsValid needs to be passed the target message type as an input since the
|
||||
// FieldMask message itself does not store the message type that the set of paths
|
||||
// are for.
|
||||
package fieldmaskpb
|
||||
|
||||
import (
|
||||
proto "google.golang.org/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sort "sort"
|
||||
strings "strings"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
@ -248,6 +295,176 @@ type FieldMask struct {
|
||||
Paths []string `protobuf:"bytes,1,rep,name=paths,proto3" json:"paths,omitempty"`
|
||||
}
|
||||
|
||||
// New constructs a field mask from a list of paths and verifies that
|
||||
// each one is valid according to the specified message type.
|
||||
func New(m proto.Message, paths ...string) (*FieldMask, error) {
|
||||
x := new(FieldMask)
|
||||
return x, x.Append(m, paths...)
|
||||
}
|
||||
|
||||
// Union returns the union of all the paths in the input field masks.
|
||||
func Union(mx *FieldMask, my *FieldMask, ms ...*FieldMask) *FieldMask {
|
||||
var out []string
|
||||
out = append(out, mx.GetPaths()...)
|
||||
out = append(out, my.GetPaths()...)
|
||||
for _, m := range ms {
|
||||
out = append(out, m.GetPaths()...)
|
||||
}
|
||||
return &FieldMask{Paths: normalizePaths(out)}
|
||||
}
|
||||
|
||||
// Intersect returns the intersection of all the paths in the input field masks.
|
||||
func Intersect(mx *FieldMask, my *FieldMask, ms ...*FieldMask) *FieldMask {
|
||||
var ss1, ss2 []string // reused buffers for performance
|
||||
intersect := func(out, in []string) []string {
|
||||
ss1 = normalizePaths(append(ss1[:0], in...))
|
||||
ss2 = normalizePaths(append(ss2[:0], out...))
|
||||
out = out[:0]
|
||||
for i1, i2 := 0, 0; i1 < len(ss1) && i2 < len(ss2); {
|
||||
switch s1, s2 := ss1[i1], ss2[i2]; {
|
||||
case hasPathPrefix(s1, s2):
|
||||
out = append(out, s1)
|
||||
i1++
|
||||
case hasPathPrefix(s2, s1):
|
||||
out = append(out, s2)
|
||||
i2++
|
||||
case lessPath(s1, s2):
|
||||
i1++
|
||||
case lessPath(s2, s1):
|
||||
i2++
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
out := Union(mx, my, ms...).GetPaths()
|
||||
out = intersect(out, mx.GetPaths())
|
||||
out = intersect(out, my.GetPaths())
|
||||
for _, m := range ms {
|
||||
out = intersect(out, m.GetPaths())
|
||||
}
|
||||
return &FieldMask{Paths: normalizePaths(out)}
|
||||
}
|
||||
|
||||
// IsValid reports whether all the paths are syntactically valid and
|
||||
// refer to known fields in the specified message type.
|
||||
// It reports false for a nil FieldMask.
|
||||
func (x *FieldMask) IsValid(m proto.Message) bool {
|
||||
paths := x.GetPaths()
|
||||
return x != nil && numValidPaths(m, paths) == len(paths)
|
||||
}
|
||||
|
||||
// Append appends a list of paths to the mask and verifies that each one
|
||||
// is valid according to the specified message type.
|
||||
// An invalid path is not appended and breaks insertion of subsequent paths.
|
||||
func (x *FieldMask) Append(m proto.Message, paths ...string) error {
|
||||
numValid := numValidPaths(m, paths)
|
||||
x.Paths = append(x.Paths, paths[:numValid]...)
|
||||
paths = paths[numValid:]
|
||||
if len(paths) > 0 {
|
||||
name := m.ProtoReflect().Descriptor().FullName()
|
||||
return protoimpl.X.NewError("invalid path %q for message %q", paths[0], name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func numValidPaths(m proto.Message, paths []string) int {
|
||||
md0 := m.ProtoReflect().Descriptor()
|
||||
for i, path := range paths {
|
||||
md := md0
|
||||
if !rangeFields(path, func(field string) bool {
|
||||
// Search the field within the message.
|
||||
if md == nil {
|
||||
return false // not within a message
|
||||
}
|
||||
fd := md.Fields().ByName(protoreflect.Name(field))
|
||||
// The real field name of a group is the message name.
|
||||
if fd == nil {
|
||||
gd := md.Fields().ByName(protoreflect.Name(strings.ToLower(field)))
|
||||
if gd != nil && gd.Kind() == protoreflect.GroupKind && string(gd.Message().Name()) == field {
|
||||
fd = gd
|
||||
}
|
||||
} else if fd.Kind() == protoreflect.GroupKind && string(fd.Message().Name()) != field {
|
||||
fd = nil
|
||||
}
|
||||
if fd == nil {
|
||||
return false // message has does not have this field
|
||||
}
|
||||
|
||||
// Identify the next message to search within.
|
||||
md = fd.Message() // may be nil
|
||||
if fd.IsMap() {
|
||||
md = fd.MapValue().Message() // may be nil
|
||||
}
|
||||
return true
|
||||
}) {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return len(paths)
|
||||
}
|
||||
|
||||
// Normalize converts the mask to its canonical form where all paths are sorted
|
||||
// and redundant paths are removed.
|
||||
func (x *FieldMask) Normalize() {
|
||||
x.Paths = normalizePaths(x.Paths)
|
||||
}
|
||||
|
||||
func normalizePaths(paths []string) []string {
|
||||
sort.Slice(paths, func(i, j int) bool {
|
||||
return lessPath(paths[i], paths[j])
|
||||
})
|
||||
|
||||
// Elide any path that is a prefix match on the previous.
|
||||
out := paths[:0]
|
||||
for _, path := range paths {
|
||||
if len(out) > 0 && hasPathPrefix(path, out[len(out)-1]) {
|
||||
continue
|
||||
}
|
||||
out = append(out, path)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// hasPathPrefix is like strings.HasPrefix, but further checks for either
|
||||
// an exact matche or that the prefix is delimited by a dot.
|
||||
func hasPathPrefix(path, prefix string) bool {
|
||||
return strings.HasPrefix(path, prefix) && (len(path) == len(prefix) || path[len(prefix)] == '.')
|
||||
}
|
||||
|
||||
// lessPath is a lexicographical comparison where dot is specially treated
|
||||
// as the smallest symbol.
|
||||
func lessPath(x, y string) bool {
|
||||
for i := 0; i < len(x) && i < len(y); i++ {
|
||||
if x[i] != y[i] {
|
||||
return (x[i] - '.') < (y[i] - '.')
|
||||
}
|
||||
}
|
||||
return len(x) < len(y)
|
||||
}
|
||||
|
||||
// rangeFields is like strings.Split(path, "."), but avoids allocations by
|
||||
// iterating over each field in place and calling a iterator function.
|
||||
func rangeFields(path string, f func(field string) bool) bool {
|
||||
for {
|
||||
var field string
|
||||
if i := strings.IndexByte(path, '.'); i >= 0 {
|
||||
field, path = path[:i], path[i:]
|
||||
} else {
|
||||
field, path = path, ""
|
||||
}
|
||||
|
||||
if !f(field) {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(path) == 0 {
|
||||
return true
|
||||
}
|
||||
path = strings.TrimPrefix(path, ".")
|
||||
}
|
||||
}
|
||||
|
||||
func (x *FieldMask) Reset() {
|
||||
*x = FieldMask{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
|
||||
305
vendor/google.golang.org/protobuf/types/known/structpb/struct.pb.go
generated
vendored
305
vendor/google.golang.org/protobuf/types/known/structpb/struct.pb.go
generated
vendored
@ -31,13 +31,105 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: google/protobuf/struct.proto
|
||||
|
||||
// Package structpb contains generated types for google/protobuf/struct.proto.
|
||||
//
|
||||
// The messages (i.e., Value, Struct, and ListValue) defined in struct.proto are
|
||||
// used to represent arbitrary JSON. The Value message represents a JSON value,
|
||||
// the Struct message represents a JSON object, and the ListValue message
|
||||
// represents a JSON array. See https://json.org for more information.
|
||||
//
|
||||
// The Value, Struct, and ListValue types have generated MarshalJSON and
|
||||
// UnmarshalJSON methods such that they serialize JSON equivalent to what the
|
||||
// messages themselves represent. Use of these types with the
|
||||
// "google.golang.org/protobuf/encoding/protojson" package
|
||||
// ensures that they will be serialized as their JSON equivalent.
|
||||
//
|
||||
//
|
||||
// Conversion to and from a Go interface
|
||||
//
|
||||
// The standard Go "encoding/json" package has functionality to serialize
|
||||
// arbitrary types to a large degree. The Value.AsInterface, Struct.AsMap, and
|
||||
// ListValue.AsSlice methods can convert the protobuf message representation into
|
||||
// a form represented by interface{}, map[string]interface{}, and []interface{}.
|
||||
// This form can be used with other packages that operate on such data structures
|
||||
// and also directly with the standard json package.
|
||||
//
|
||||
// In order to convert the interface{}, map[string]interface{}, and []interface{}
|
||||
// forms back as Value, Struct, and ListValue messages, use the NewStruct,
|
||||
// NewList, and NewValue constructor functions.
|
||||
//
|
||||
//
|
||||
// Example usage
|
||||
//
|
||||
// Consider the following example JSON object:
|
||||
//
|
||||
// {
|
||||
// "firstName": "John",
|
||||
// "lastName": "Smith",
|
||||
// "isAlive": true,
|
||||
// "age": 27,
|
||||
// "address": {
|
||||
// "streetAddress": "21 2nd Street",
|
||||
// "city": "New York",
|
||||
// "state": "NY",
|
||||
// "postalCode": "10021-3100"
|
||||
// },
|
||||
// "phoneNumbers": [
|
||||
// {
|
||||
// "type": "home",
|
||||
// "number": "212 555-1234"
|
||||
// },
|
||||
// {
|
||||
// "type": "office",
|
||||
// "number": "646 555-4567"
|
||||
// }
|
||||
// ],
|
||||
// "children": [],
|
||||
// "spouse": null
|
||||
// }
|
||||
//
|
||||
// To construct a Value message representing the above JSON object:
|
||||
//
|
||||
// m, err := structpb.NewValue(map[string]interface{}{
|
||||
// "firstName": "John",
|
||||
// "lastName": "Smith",
|
||||
// "isAlive": true,
|
||||
// "age": 27,
|
||||
// "address": map[string]interface{}{
|
||||
// "streetAddress": "21 2nd Street",
|
||||
// "city": "New York",
|
||||
// "state": "NY",
|
||||
// "postalCode": "10021-3100",
|
||||
// },
|
||||
// "phoneNumbers": []interface{}{
|
||||
// map[string]interface{}{
|
||||
// "type": "home",
|
||||
// "number": "212 555-1234",
|
||||
// },
|
||||
// map[string]interface{}{
|
||||
// "type": "office",
|
||||
// "number": "646 555-4567",
|
||||
// },
|
||||
// },
|
||||
// "children": []interface{}{},
|
||||
// "spouse": nil,
|
||||
// })
|
||||
// if err != nil {
|
||||
// ... // handle error
|
||||
// }
|
||||
// ... // make use of m as a *structpb.Value
|
||||
//
|
||||
package structpb
|
||||
|
||||
import (
|
||||
base64 "encoding/base64"
|
||||
protojson "google.golang.org/protobuf/encoding/protojson"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
math "math"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
utf8 "unicode/utf8"
|
||||
)
|
||||
|
||||
// `NullValue` is a singleton enumeration to represent the null value for the
|
||||
@ -105,6 +197,42 @@ type Struct struct {
|
||||
Fields map[string]*Value `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
||||
}
|
||||
|
||||
// NewStruct constructs a Struct from a general-purpose Go map.
|
||||
// The map keys must be valid UTF-8.
|
||||
// The map values are converted using NewValue.
|
||||
func NewStruct(v map[string]interface{}) (*Struct, error) {
|
||||
x := &Struct{Fields: make(map[string]*Value, len(v))}
|
||||
for k, v := range v {
|
||||
if !utf8.ValidString(k) {
|
||||
return nil, protoimpl.X.NewError("invalid UTF-8 in string: %q", k)
|
||||
}
|
||||
var err error
|
||||
x.Fields[k], err = NewValue(v)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return x, nil
|
||||
}
|
||||
|
||||
// AsMap converts x to a general-purpose Go map.
|
||||
// The map values are converted by calling Value.AsInterface.
|
||||
func (x *Struct) AsMap() map[string]interface{} {
|
||||
vs := make(map[string]interface{})
|
||||
for k, v := range x.GetFields() {
|
||||
vs[k] = v.AsInterface()
|
||||
}
|
||||
return vs
|
||||
}
|
||||
|
||||
func (x *Struct) MarshalJSON() ([]byte, error) {
|
||||
return protojson.Marshal(x)
|
||||
}
|
||||
|
||||
func (x *Struct) UnmarshalJSON(b []byte) error {
|
||||
return protojson.Unmarshal(b, x)
|
||||
}
|
||||
|
||||
func (x *Struct) Reset() {
|
||||
*x = Struct{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
@ -167,6 +295,151 @@ type Value struct {
|
||||
Kind isValue_Kind `protobuf_oneof:"kind"`
|
||||
}
|
||||
|
||||
// NewValue constructs a Value from a general-purpose Go interface.
|
||||
//
|
||||
// ╔════════════════════════╤════════════════════════════════════════════╗
|
||||
// ║ Go type │ Conversion ║
|
||||
// ╠════════════════════════╪════════════════════════════════════════════╣
|
||||
// ║ nil │ stored as NullValue ║
|
||||
// ║ bool │ stored as BoolValue ║
|
||||
// ║ int, int32, int64 │ stored as NumberValue ║
|
||||
// ║ uint, uint32, uint64 │ stored as NumberValue ║
|
||||
// ║ float32, float64 │ stored as NumberValue ║
|
||||
// ║ string │ stored as StringValue; must be valid UTF-8 ║
|
||||
// ║ []byte │ stored as StringValue; base64-encoded ║
|
||||
// ║ map[string]interface{} │ stored as StructValue ║
|
||||
// ║ []interface{} │ stored as ListValue ║
|
||||
// ╚════════════════════════╧════════════════════════════════════════════╝
|
||||
//
|
||||
// When converting an int64 or uint64 to a NumberValue, numeric precision loss
|
||||
// is possible since they are stored as a float64.
|
||||
func NewValue(v interface{}) (*Value, error) {
|
||||
switch v := v.(type) {
|
||||
case nil:
|
||||
return NewNullValue(), nil
|
||||
case bool:
|
||||
return NewBoolValue(v), nil
|
||||
case int:
|
||||
return NewNumberValue(float64(v)), nil
|
||||
case int32:
|
||||
return NewNumberValue(float64(v)), nil
|
||||
case int64:
|
||||
return NewNumberValue(float64(v)), nil
|
||||
case uint:
|
||||
return NewNumberValue(float64(v)), nil
|
||||
case uint32:
|
||||
return NewNumberValue(float64(v)), nil
|
||||
case uint64:
|
||||
return NewNumberValue(float64(v)), nil
|
||||
case float32:
|
||||
return NewNumberValue(float64(v)), nil
|
||||
case float64:
|
||||
return NewNumberValue(float64(v)), nil
|
||||
case string:
|
||||
if !utf8.ValidString(v) {
|
||||
return nil, protoimpl.X.NewError("invalid UTF-8 in string: %q", v)
|
||||
}
|
||||
return NewStringValue(v), nil
|
||||
case []byte:
|
||||
s := base64.StdEncoding.EncodeToString(v)
|
||||
return NewStringValue(s), nil
|
||||
case map[string]interface{}:
|
||||
v2, err := NewStruct(v)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewStructValue(v2), nil
|
||||
case []interface{}:
|
||||
v2, err := NewList(v)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewListValue(v2), nil
|
||||
default:
|
||||
return nil, protoimpl.X.NewError("invalid type: %T", v)
|
||||
}
|
||||
}
|
||||
|
||||
// NewNullValue constructs a new null Value.
|
||||
func NewNullValue() *Value {
|
||||
return &Value{Kind: &Value_NullValue{NullValue: NullValue_NULL_VALUE}}
|
||||
}
|
||||
|
||||
// NewBoolValue constructs a new boolean Value.
|
||||
func NewBoolValue(v bool) *Value {
|
||||
return &Value{Kind: &Value_BoolValue{BoolValue: v}}
|
||||
}
|
||||
|
||||
// NewNumberValue constructs a new number Value.
|
||||
func NewNumberValue(v float64) *Value {
|
||||
return &Value{Kind: &Value_NumberValue{NumberValue: v}}
|
||||
}
|
||||
|
||||
// NewStringValue constructs a new string Value.
|
||||
func NewStringValue(v string) *Value {
|
||||
return &Value{Kind: &Value_StringValue{StringValue: v}}
|
||||
}
|
||||
|
||||
// NewStructValue constructs a new struct Value.
|
||||
func NewStructValue(v *Struct) *Value {
|
||||
return &Value{Kind: &Value_StructValue{StructValue: v}}
|
||||
}
|
||||
|
||||
// NewListValue constructs a new list Value.
|
||||
func NewListValue(v *ListValue) *Value {
|
||||
return &Value{Kind: &Value_ListValue{ListValue: v}}
|
||||
}
|
||||
|
||||
// AsInterface converts x to a general-purpose Go interface.
|
||||
//
|
||||
// Calling Value.MarshalJSON and "encoding/json".Marshal on this output produce
|
||||
// semantically equivalent JSON (assuming no errors occur).
|
||||
//
|
||||
// Floating-point values (i.e., "NaN", "Infinity", and "-Infinity") are
|
||||
// converted as strings to remain compatible with MarshalJSON.
|
||||
func (x *Value) AsInterface() interface{} {
|
||||
switch v := x.GetKind().(type) {
|
||||
case *Value_NumberValue:
|
||||
if v != nil {
|
||||
switch {
|
||||
case math.IsNaN(v.NumberValue):
|
||||
return "NaN"
|
||||
case math.IsInf(v.NumberValue, +1):
|
||||
return "Infinity"
|
||||
case math.IsInf(v.NumberValue, -1):
|
||||
return "-Infinity"
|
||||
default:
|
||||
return v.NumberValue
|
||||
}
|
||||
}
|
||||
case *Value_StringValue:
|
||||
if v != nil {
|
||||
return v.StringValue
|
||||
}
|
||||
case *Value_BoolValue:
|
||||
if v != nil {
|
||||
return v.BoolValue
|
||||
}
|
||||
case *Value_StructValue:
|
||||
if v != nil {
|
||||
return v.StructValue.AsMap()
|
||||
}
|
||||
case *Value_ListValue:
|
||||
if v != nil {
|
||||
return v.ListValue.AsSlice()
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Value) MarshalJSON() ([]byte, error) {
|
||||
return protojson.Marshal(x)
|
||||
}
|
||||
|
||||
func (x *Value) UnmarshalJSON(b []byte) error {
|
||||
return protojson.Unmarshal(b, x)
|
||||
}
|
||||
|
||||
func (x *Value) Reset() {
|
||||
*x = Value{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
@ -306,6 +579,38 @@ type ListValue struct {
|
||||
Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"`
|
||||
}
|
||||
|
||||
// NewList constructs a ListValue from a general-purpose Go slice.
|
||||
// The slice elements are converted using NewValue.
|
||||
func NewList(v []interface{}) (*ListValue, error) {
|
||||
x := &ListValue{Values: make([]*Value, len(v))}
|
||||
for i, v := range v {
|
||||
var err error
|
||||
x.Values[i], err = NewValue(v)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return x, nil
|
||||
}
|
||||
|
||||
// AsSlice converts x to a general-purpose Go slice.
|
||||
// The slice elements are converted by calling Value.AsInterface.
|
||||
func (x *ListValue) AsSlice() []interface{} {
|
||||
vs := make([]interface{}, len(x.GetValues()))
|
||||
for i, v := range x.GetValues() {
|
||||
vs[i] = v.AsInterface()
|
||||
}
|
||||
return vs
|
||||
}
|
||||
|
||||
func (x *ListValue) MarshalJSON() ([]byte, error) {
|
||||
return protojson.Marshal(x)
|
||||
}
|
||||
|
||||
func (x *ListValue) UnmarshalJSON(b []byte) error {
|
||||
return protojson.Unmarshal(b, x)
|
||||
}
|
||||
|
||||
func (x *ListValue) Reset() {
|
||||
*x = ListValue{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
|
||||
110
vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go
generated
vendored
110
vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go
generated
vendored
@ -31,6 +31,48 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: google/protobuf/timestamp.proto
|
||||
|
||||
// Package timestamppb contains generated types for google/protobuf/timestamp.proto.
|
||||
//
|
||||
// The Timestamp message represents a timestamp,
|
||||
// an instant in time since the Unix epoch (January 1st, 1970).
|
||||
//
|
||||
//
|
||||
// Conversion to a Go Time
|
||||
//
|
||||
// The AsTime method can be used to convert a Timestamp message to a
|
||||
// standard Go time.Time value in UTC:
|
||||
//
|
||||
// t := ts.AsTime()
|
||||
// ... // make use of t as a time.Time
|
||||
//
|
||||
// Converting to a time.Time is a common operation so that the extensive
|
||||
// set of time-based operations provided by the time package can be leveraged.
|
||||
// See https://golang.org/pkg/time for more information.
|
||||
//
|
||||
// The AsTime method performs the conversion on a best-effort basis. Timestamps
|
||||
// with denormal values (e.g., nanoseconds beyond 0 and 99999999, inclusive)
|
||||
// are normalized during the conversion to a time.Time. To manually check for
|
||||
// invalid Timestamps per the documented limitations in timestamp.proto,
|
||||
// additionally call the CheckValid method:
|
||||
//
|
||||
// if err := ts.CheckValid(); err != nil {
|
||||
// ... // handle error
|
||||
// }
|
||||
//
|
||||
//
|
||||
// Conversion from a Go Time
|
||||
//
|
||||
// The timestamppb.New function can be used to construct a Timestamp message
|
||||
// from a standard Go time.Time value:
|
||||
//
|
||||
// ts := timestamppb.New(t)
|
||||
// ... // make use of ts as a *timestamppb.Timestamp
|
||||
//
|
||||
// In order to construct a Timestamp representing the current time, use Now:
|
||||
//
|
||||
// ts := timestamppb.Now()
|
||||
// ... // make use of ts as a *timestamppb.Timestamp
|
||||
//
|
||||
package timestamppb
|
||||
|
||||
import (
|
||||
@ -38,6 +80,7 @@ import (
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
time "time"
|
||||
)
|
||||
|
||||
// A Timestamp represents a point in time independent of any time zone or local
|
||||
@ -140,6 +183,73 @@ type Timestamp struct {
|
||||
Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"`
|
||||
}
|
||||
|
||||
// Now constructs a new Timestamp from the current time.
|
||||
func Now() *Timestamp {
|
||||
return New(time.Now())
|
||||
}
|
||||
|
||||
// New constructs a new Timestamp from the provided time.Time.
|
||||
func New(t time.Time) *Timestamp {
|
||||
return &Timestamp{Seconds: int64(t.Unix()), Nanos: int32(t.Nanosecond())}
|
||||
}
|
||||
|
||||
// AsTime converts x to a time.Time.
|
||||
func (x *Timestamp) AsTime() time.Time {
|
||||
return time.Unix(int64(x.GetSeconds()), int64(x.GetNanos())).UTC()
|
||||
}
|
||||
|
||||
// IsValid reports whether the timestamp is valid.
|
||||
// It is equivalent to CheckValid == nil.
|
||||
func (x *Timestamp) IsValid() bool {
|
||||
return x.check() == 0
|
||||
}
|
||||
|
||||
// CheckValid returns an error if the timestamp is invalid.
|
||||
// In particular, it checks whether the value represents a date that is
|
||||
// in the range of 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.
|
||||
// An error is reported for a nil Timestamp.
|
||||
func (x *Timestamp) CheckValid() error {
|
||||
switch x.check() {
|
||||
case invalidNil:
|
||||
return protoimpl.X.NewError("invalid nil Timestamp")
|
||||
case invalidUnderflow:
|
||||
return protoimpl.X.NewError("timestamp (%v) before 0001-01-01", x)
|
||||
case invalidOverflow:
|
||||
return protoimpl.X.NewError("timestamp (%v) after 9999-12-31", x)
|
||||
case invalidNanos:
|
||||
return protoimpl.X.NewError("timestamp (%v) has out-of-range nanos", x)
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
const (
|
||||
_ = iota
|
||||
invalidNil
|
||||
invalidUnderflow
|
||||
invalidOverflow
|
||||
invalidNanos
|
||||
)
|
||||
|
||||
func (x *Timestamp) check() uint {
|
||||
const minTimestamp = -62135596800 // Seconds between 1970-01-01T00:00:00Z and 0001-01-01T00:00:00Z, inclusive
|
||||
const maxTimestamp = +253402300799 // Seconds between 1970-01-01T00:00:00Z and 9999-12-31T23:59:59Z, inclusive
|
||||
secs := x.GetSeconds()
|
||||
nanos := x.GetNanos()
|
||||
switch {
|
||||
case x == nil:
|
||||
return invalidNil
|
||||
case secs < minTimestamp:
|
||||
return invalidUnderflow
|
||||
case secs > maxTimestamp:
|
||||
return invalidOverflow
|
||||
case nanos < 0 || nanos >= 1e9:
|
||||
return invalidNanos
|
||||
default:
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Timestamp) Reset() {
|
||||
*x = Timestamp{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
|
||||
45
vendor/google.golang.org/protobuf/types/known/wrapperspb/wrappers.pb.go
generated
vendored
45
vendor/google.golang.org/protobuf/types/known/wrapperspb/wrappers.pb.go
generated
vendored
@ -62,6 +62,11 @@ type DoubleValue struct {
|
||||
Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// Double stores v in a new DoubleValue and returns a pointer to it.
|
||||
func Double(v float64) *DoubleValue {
|
||||
return &DoubleValue{Value: v}
|
||||
}
|
||||
|
||||
func (x *DoubleValue) Reset() {
|
||||
*x = DoubleValue{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
@ -113,6 +118,11 @@ type FloatValue struct {
|
||||
Value float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// Float stores v in a new FloatValue and returns a pointer to it.
|
||||
func Float(v float32) *FloatValue {
|
||||
return &FloatValue{Value: v}
|
||||
}
|
||||
|
||||
func (x *FloatValue) Reset() {
|
||||
*x = FloatValue{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
@ -164,6 +174,11 @@ type Int64Value struct {
|
||||
Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// Int64 stores v in a new Int64Value and returns a pointer to it.
|
||||
func Int64(v int64) *Int64Value {
|
||||
return &Int64Value{Value: v}
|
||||
}
|
||||
|
||||
func (x *Int64Value) Reset() {
|
||||
*x = Int64Value{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
@ -215,6 +230,11 @@ type UInt64Value struct {
|
||||
Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// UInt64 stores v in a new UInt64Value and returns a pointer to it.
|
||||
func UInt64(v uint64) *UInt64Value {
|
||||
return &UInt64Value{Value: v}
|
||||
}
|
||||
|
||||
func (x *UInt64Value) Reset() {
|
||||
*x = UInt64Value{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
@ -266,6 +286,11 @@ type Int32Value struct {
|
||||
Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// Int32 stores v in a new Int32Value and returns a pointer to it.
|
||||
func Int32(v int32) *Int32Value {
|
||||
return &Int32Value{Value: v}
|
||||
}
|
||||
|
||||
func (x *Int32Value) Reset() {
|
||||
*x = Int32Value{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
@ -317,6 +342,11 @@ type UInt32Value struct {
|
||||
Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// UInt32 stores v in a new UInt32Value and returns a pointer to it.
|
||||
func UInt32(v uint32) *UInt32Value {
|
||||
return &UInt32Value{Value: v}
|
||||
}
|
||||
|
||||
func (x *UInt32Value) Reset() {
|
||||
*x = UInt32Value{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
@ -368,6 +398,11 @@ type BoolValue struct {
|
||||
Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// Bool stores v in a new BoolValue and returns a pointer to it.
|
||||
func Bool(v bool) *BoolValue {
|
||||
return &BoolValue{Value: v}
|
||||
}
|
||||
|
||||
func (x *BoolValue) Reset() {
|
||||
*x = BoolValue{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
@ -419,6 +454,11 @@ type StringValue struct {
|
||||
Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// String stores v in a new StringValue and returns a pointer to it.
|
||||
func String(v string) *StringValue {
|
||||
return &StringValue{Value: v}
|
||||
}
|
||||
|
||||
func (x *StringValue) Reset() {
|
||||
*x = StringValue{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
@ -470,6 +510,11 @@ type BytesValue struct {
|
||||
Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// Bytes stores v in a new BytesValue and returns a pointer to it.
|
||||
func Bytes(v []byte) *BytesValue {
|
||||
return &BytesValue{Value: v}
|
||||
}
|
||||
|
||||
func (x *BytesValue) Reset() {
|
||||
*x = BytesValue{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
|
||||
7
vendor/modules.txt
vendored
7
vendor/modules.txt
vendored
@ -1126,25 +1126,26 @@ google.golang.org/grpc/serviceconfig
|
||||
google.golang.org/grpc/stats
|
||||
google.golang.org/grpc/status
|
||||
google.golang.org/grpc/tap
|
||||
# google.golang.org/protobuf v1.24.0
|
||||
# google.golang.org/protobuf v1.25.0
|
||||
google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo
|
||||
google.golang.org/protobuf/compiler/protogen
|
||||
google.golang.org/protobuf/encoding/protojson
|
||||
google.golang.org/protobuf/encoding/prototext
|
||||
google.golang.org/protobuf/encoding/protowire
|
||||
google.golang.org/protobuf/internal/descfmt
|
||||
google.golang.org/protobuf/internal/descopts
|
||||
google.golang.org/protobuf/internal/detrand
|
||||
google.golang.org/protobuf/internal/encoding/defval
|
||||
google.golang.org/protobuf/internal/encoding/json
|
||||
google.golang.org/protobuf/internal/encoding/messageset
|
||||
google.golang.org/protobuf/internal/encoding/tag
|
||||
google.golang.org/protobuf/internal/encoding/text
|
||||
google.golang.org/protobuf/internal/errors
|
||||
google.golang.org/protobuf/internal/fieldnum
|
||||
google.golang.org/protobuf/internal/fieldsort
|
||||
google.golang.org/protobuf/internal/filedesc
|
||||
google.golang.org/protobuf/internal/filetype
|
||||
google.golang.org/protobuf/internal/flags
|
||||
google.golang.org/protobuf/internal/genname
|
||||
google.golang.org/protobuf/internal/genid
|
||||
google.golang.org/protobuf/internal/impl
|
||||
google.golang.org/protobuf/internal/mapsort
|
||||
google.golang.org/protobuf/internal/pragma
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user