Merge "[VOL-3539] Not activating ONUs after reboot if ControlledActivation doesn't require it"
diff --git a/go.mod b/go.mod
index fa8fe8b..d34df4b 100644
--- a/go.mod
+++ b/go.mod
@@ -13,7 +13,6 @@
github.com/grpc-ecosystem/grpc-gateway v1.12.2
github.com/imdario/mergo v0.3.11
github.com/jessevdk/go-flags v1.4.0
- github.com/jhump/protoreflect v1.5.0
github.com/jpillora/backoff v1.0.0
github.com/looplab/fsm v0.1.0
github.com/olekukonko/tablewriter v0.0.4
diff --git a/go.sum b/go.sum
index 2d39ec3..b8ac6d3 100644
--- a/go.sum
+++ b/go.sum
@@ -33,7 +33,6 @@
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
@@ -57,8 +56,6 @@
github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
-github.com/jhump/protoreflect v1.5.0 h1:NgpVT+dX71c8hZnxHof2M7QDK7QtohIJ7DYycjnkyfc=
-github.com/jhump/protoreflect v1.5.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74=
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@@ -110,7 +107,6 @@
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -146,13 +142,11 @@
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c h1:hrpEMCZ2O7DR5gC1n2AJGVhrwiEjOi35+jxtIuZpTMo=
google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
diff --git a/internal/bbsimctl/commands/handler.go b/internal/bbsimctl/commands/handler.go
deleted file mode 100644
index 6b05534..0000000
--- a/internal/bbsimctl/commands/handler.go
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2019-present Ciena Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package commands
-
-import (
- "io"
-
- "github.com/golang/protobuf/proto"
- "github.com/jhump/protoreflect/desc"
- "github.com/jhump/protoreflect/dynamic"
- "google.golang.org/grpc/metadata"
- "google.golang.org/grpc/status"
-)
-
-type RpcEventHandler struct {
- Response proto.Message
- Status *status.Status
- Data []byte
- Fields map[string]map[string]interface{}
-}
-
-func (h *RpcEventHandler) OnResolveMethod(*desc.MethodDescriptor) {
-}
-
-func (h *RpcEventHandler) OnSendHeaders(metadata.MD) {
-}
-
-func (h *RpcEventHandler) OnReceiveHeaders(metadata.MD) {
-}
-
-func (h *RpcEventHandler) OnReceiveResponse(m proto.Message) {
- h.Response = m
-}
-
-func (h *RpcEventHandler) OnReceiveTrailers(s *status.Status, m metadata.MD) {
- h.Status = s
-}
-
-func (h *RpcEventHandler) GetParams(msg proto.Message) error {
- dmsg, err := dynamic.AsDynamicMessage(msg)
- if err != nil {
- return err
- }
-
- if h.Fields == nil || len(h.Fields) == 0 {
- return io.EOF
- }
-
- fields, ok := h.Fields[dmsg.XXX_MessageName()]
- if !ok {
- return nil
- }
-
- for k, v := range fields {
- err := dmsg.TrySetFieldByName(k, v)
- if err != nil {
- return err
- }
- }
- delete(h.Fields, dmsg.XXX_MessageName())
-
- return nil
-}
diff --git a/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go b/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go
deleted file mode 100644
index b4eb03e..0000000
--- a/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: google/protobuf/empty.proto
-
-package empty
-
-import (
- fmt "fmt"
- proto "github.com/golang/protobuf/proto"
- math "math"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
-
-// A generic empty message that you can re-use to avoid defining duplicated
-// empty messages in your APIs. A typical example is to use it as the request
-// or the response type of an API method. For instance:
-//
-// service Foo {
-// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
-// }
-//
-// The JSON representation for `Empty` is empty JSON object `{}`.
-type Empty struct {
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
-}
-
-func (m *Empty) Reset() { *m = Empty{} }
-func (m *Empty) String() string { return proto.CompactTextString(m) }
-func (*Empty) ProtoMessage() {}
-func (*Empty) Descriptor() ([]byte, []int) {
- return fileDescriptor_900544acb223d5b8, []int{0}
-}
-
-func (*Empty) XXX_WellKnownType() string { return "Empty" }
-
-func (m *Empty) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_Empty.Unmarshal(m, b)
-}
-func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_Empty.Marshal(b, m, deterministic)
-}
-func (m *Empty) XXX_Merge(src proto.Message) {
- xxx_messageInfo_Empty.Merge(m, src)
-}
-func (m *Empty) XXX_Size() int {
- return xxx_messageInfo_Empty.Size(m)
-}
-func (m *Empty) XXX_DiscardUnknown() {
- xxx_messageInfo_Empty.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Empty proto.InternalMessageInfo
-
-func init() {
- proto.RegisterType((*Empty)(nil), "google.protobuf.Empty")
-}
-
-func init() { proto.RegisterFile("google/protobuf/empty.proto", fileDescriptor_900544acb223d5b8) }
-
-var fileDescriptor_900544acb223d5b8 = []byte{
- // 148 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0xcf, 0xcf, 0x4f,
- 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcd, 0x2d, 0x28,
- 0xa9, 0xd4, 0x03, 0x73, 0x85, 0xf8, 0x21, 0x92, 0x7a, 0x30, 0x49, 0x25, 0x76, 0x2e, 0x56, 0x57,
- 0x90, 0xbc, 0x53, 0x19, 0x97, 0x70, 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0xbc, 0x13, 0x17, 0x58, 0x36,
- 0x00, 0xc4, 0x0d, 0x60, 0x8c, 0x52, 0x4f, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf,
- 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0x47, 0x58, 0x53, 0x50, 0x52, 0x59, 0x90, 0x5a, 0x0c,
- 0xb1, 0xed, 0x07, 0x23, 0xe3, 0x22, 0x26, 0x66, 0xf7, 0x00, 0xa7, 0x55, 0x4c, 0x72, 0xee, 0x10,
- 0x13, 0x03, 0xa0, 0xea, 0xf4, 0xc2, 0x53, 0x73, 0x72, 0xbc, 0xf3, 0xf2, 0xcb, 0xf3, 0x42, 0x40,
- 0xea, 0x93, 0xd8, 0xc0, 0x06, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x64, 0xd4, 0xb3, 0xa6,
- 0xb7, 0x00, 0x00, 0x00,
-}
diff --git a/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto b/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto
deleted file mode 100644
index 03cacd2..0000000
--- a/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto
+++ /dev/null
@@ -1,52 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package google.protobuf;
-
-option csharp_namespace = "Google.Protobuf.WellKnownTypes";
-option go_package = "github.com/golang/protobuf/ptypes/empty";
-option java_package = "com.google.protobuf";
-option java_outer_classname = "EmptyProto";
-option java_multiple_files = true;
-option objc_class_prefix = "GPB";
-option cc_enable_arenas = true;
-
-// A generic empty message that you can re-use to avoid defining duplicated
-// empty messages in your APIs. A typical example is to use it as the request
-// or the response type of an API method. For instance:
-//
-// service Foo {
-// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
-// }
-//
-// The JSON representation for `Empty` is empty JSON object `{}`.
-message Empty {}
diff --git a/vendor/github.com/jhump/protoreflect/LICENSE b/vendor/github.com/jhump/protoreflect/LICENSE
deleted file mode 100644
index d645695..0000000
--- a/vendor/github.com/jhump/protoreflect/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/vendor/github.com/jhump/protoreflect/codec/buffer.go b/vendor/github.com/jhump/protoreflect/codec/buffer.go
deleted file mode 100644
index b9de99c..0000000
--- a/vendor/github.com/jhump/protoreflect/codec/buffer.go
+++ /dev/null
@@ -1,112 +0,0 @@
-package codec
-
-import (
- "fmt"
- "io"
-)
-
-// Buffer is a reader and a writer that wraps a slice of bytes and also
-// provides API for decoding and encoding the protobuf binary format.
-//
-// Its operation is similar to that of a bytes.Buffer: writing pushes
-// data to the end of the buffer while reading pops data from the head
-// of the buffer. So the same buffer can be used to both read and write.
-type Buffer struct {
- buf []byte
- index int
-
- // tmp is used when another byte slice is needed, such as when
- // serializing messages, since we need to know the length before
- // we can write the length prefix; by caching this, including
- // after it is grown by serialization operations, we reduce the
- // number of allocations needed
- tmp []byte
-
- deterministic bool
-}
-
-// NewBuffer creates a new buffer with the given slice of bytes as the
-// buffer's initial contents.
-func NewBuffer(buf []byte) *Buffer {
- return &Buffer{buf: buf}
-}
-
-// SetDeterministic sets this buffer to encode messages deterministically. This
-// is useful for tests. But the overhead is non-zero, so it should not likely be
-// used outside of tests. When true, map fields in a message must have their
-// keys sorted before serialization to ensure deterministic output. Otherwise,
-// values in a map field will be serialized in map iteration order.
-func (cb *Buffer) SetDeterministic(deterministic bool) {
- cb.deterministic = deterministic
-}
-
-// Reset resets this buffer back to empty. Any subsequent writes/encodes
-// to the buffer will allocate a new backing slice of bytes.
-func (cb *Buffer) Reset() {
- cb.buf = []byte(nil)
- cb.index = 0
-}
-
-// Bytes returns the slice of bytes remaining in the buffer. Note that
-// this does not perform a copy: if the contents of the returned slice
-// are modified, the modifications will be visible to subsequent reads
-// via the buffer.
-func (cb *Buffer) Bytes() []byte {
- return cb.buf[cb.index:]
-}
-
-// String returns the remaining bytes in the buffer as a string.
-func (cb *Buffer) String() string {
- return string(cb.Bytes())
-}
-
-// EOF returns true if there are no more bytes remaining to read.
-func (cb *Buffer) EOF() bool {
- return cb.index >= len(cb.buf)
-}
-
-// Skip attempts to skip the given number of bytes in the input. If
-// the input has fewer bytes than the given count, false is returned
-// and the buffer is unchanged. Otherwise, the given number of bytes
-// are skipped and true is returned.
-func (cb *Buffer) Skip(count int) error {
- if count < 0 {
- return fmt.Errorf("proto: bad byte length %d", count)
- }
- newIndex := cb.index + count
- if newIndex < cb.index || newIndex > len(cb.buf) {
- return io.ErrUnexpectedEOF
- }
- cb.index = newIndex
- return nil
-}
-
-// Len returns the remaining number of bytes in the buffer.
-func (cb *Buffer) Len() int {
- return len(cb.buf) - cb.index
-}
-
-// Read implements the io.Reader interface. If there are no bytes
-// remaining in the buffer, it will return 0, io.EOF. Otherwise,
-// it reads max(len(dest), cb.Len()) bytes from input and copies
-// them into dest. It returns the number of bytes copied and a nil
-// error in this case.
-func (cb *Buffer) Read(dest []byte) (int, error) {
- if cb.index == len(cb.buf) {
- return 0, io.EOF
- }
- copied := copy(dest, cb.buf[cb.index:])
- cb.index += copied
- return copied, nil
-}
-
-var _ io.Reader = (*Buffer)(nil)
-
-// Write implements the io.Writer interface. It always returns
-// len(data), nil.
-func (cb *Buffer) Write(data []byte) (int, error) {
- cb.buf = append(cb.buf, data...)
- return len(data), nil
-}
-
-var _ io.Writer = (*Buffer)(nil)
diff --git a/vendor/github.com/jhump/protoreflect/codec/decode.go b/vendor/github.com/jhump/protoreflect/codec/decode.go
deleted file mode 100644
index 2a7e59f..0000000
--- a/vendor/github.com/jhump/protoreflect/codec/decode.go
+++ /dev/null
@@ -1,372 +0,0 @@
-package codec
-
-import (
- "errors"
- "fmt"
- "io"
- "math"
-
- "github.com/golang/protobuf/proto"
- "github.com/golang/protobuf/protoc-gen-go/descriptor"
-)
-
-// ErrOverflow is returned when an integer is too large to be represented.
-var ErrOverflow = errors.New("proto: integer overflow")
-
-// ErrBadWireType is returned when decoding a wire-type from a buffer that
-// is not valid.
-var ErrBadWireType = errors.New("proto: bad wiretype")
-
-var varintTypes = map[descriptor.FieldDescriptorProto_Type]bool{}
-var fixed32Types = map[descriptor.FieldDescriptorProto_Type]bool{}
-var fixed64Types = map[descriptor.FieldDescriptorProto_Type]bool{}
-
-func init() {
- varintTypes[descriptor.FieldDescriptorProto_TYPE_BOOL] = true
- varintTypes[descriptor.FieldDescriptorProto_TYPE_INT32] = true
- varintTypes[descriptor.FieldDescriptorProto_TYPE_INT64] = true
- varintTypes[descriptor.FieldDescriptorProto_TYPE_UINT32] = true
- varintTypes[descriptor.FieldDescriptorProto_TYPE_UINT64] = true
- varintTypes[descriptor.FieldDescriptorProto_TYPE_SINT32] = true
- varintTypes[descriptor.FieldDescriptorProto_TYPE_SINT64] = true
- varintTypes[descriptor.FieldDescriptorProto_TYPE_ENUM] = true
-
- fixed32Types[descriptor.FieldDescriptorProto_TYPE_FIXED32] = true
- fixed32Types[descriptor.FieldDescriptorProto_TYPE_SFIXED32] = true
- fixed32Types[descriptor.FieldDescriptorProto_TYPE_FLOAT] = true
-
- fixed64Types[descriptor.FieldDescriptorProto_TYPE_FIXED64] = true
- fixed64Types[descriptor.FieldDescriptorProto_TYPE_SFIXED64] = true
- fixed64Types[descriptor.FieldDescriptorProto_TYPE_DOUBLE] = true
-}
-
-func (cb *Buffer) decodeVarintSlow() (x uint64, err error) {
- i := cb.index
- l := len(cb.buf)
-
- for shift := uint(0); shift < 64; shift += 7 {
- if i >= l {
- err = io.ErrUnexpectedEOF
- return
- }
- b := cb.buf[i]
- i++
- x |= (uint64(b) & 0x7F) << shift
- if b < 0x80 {
- cb.index = i
- return
- }
- }
-
- // The number is too large to represent in a 64-bit value.
- err = ErrOverflow
- return
-}
-
-// DecodeVarint reads a varint-encoded integer from the Buffer.
-// This is the format for the
-// int32, int64, uint32, uint64, bool, and enum
-// protocol buffer types.
-func (cb *Buffer) DecodeVarint() (uint64, error) {
- i := cb.index
- buf := cb.buf
-
- if i >= len(buf) {
- return 0, io.ErrUnexpectedEOF
- } else if buf[i] < 0x80 {
- cb.index++
- return uint64(buf[i]), nil
- } else if len(buf)-i < 10 {
- return cb.decodeVarintSlow()
- }
-
- var b uint64
- // we already checked the first byte
- x := uint64(buf[i]) - 0x80
- i++
-
- b = uint64(buf[i])
- i++
- x += b << 7
- if b&0x80 == 0 {
- goto done
- }
- x -= 0x80 << 7
-
- b = uint64(buf[i])
- i++
- x += b << 14
- if b&0x80 == 0 {
- goto done
- }
- x -= 0x80 << 14
-
- b = uint64(buf[i])
- i++
- x += b << 21
- if b&0x80 == 0 {
- goto done
- }
- x -= 0x80 << 21
-
- b = uint64(buf[i])
- i++
- x += b << 28
- if b&0x80 == 0 {
- goto done
- }
- x -= 0x80 << 28
-
- b = uint64(buf[i])
- i++
- x += b << 35
- if b&0x80 == 0 {
- goto done
- }
- x -= 0x80 << 35
-
- b = uint64(buf[i])
- i++
- x += b << 42
- if b&0x80 == 0 {
- goto done
- }
- x -= 0x80 << 42
-
- b = uint64(buf[i])
- i++
- x += b << 49
- if b&0x80 == 0 {
- goto done
- }
- x -= 0x80 << 49
-
- b = uint64(buf[i])
- i++
- x += b << 56
- if b&0x80 == 0 {
- goto done
- }
- x -= 0x80 << 56
-
- b = uint64(buf[i])
- i++
- x += b << 63
- if b&0x80 == 0 {
- goto done
- }
- // x -= 0x80 << 63 // Always zero.
-
- return 0, ErrOverflow
-
-done:
- cb.index = i
- return x, nil
-}
-
-// DecodeTagAndWireType decodes a field tag and wire type from input.
-// This reads a varint and then extracts the two fields from the varint
-// value read.
-func (cb *Buffer) DecodeTagAndWireType() (tag int32, wireType int8, err error) {
- var v uint64
- v, err = cb.DecodeVarint()
- if err != nil {
- return
- }
- // low 7 bits is wire type
- wireType = int8(v & 7)
- // rest is int32 tag number
- v = v >> 3
- if v > math.MaxInt32 {
- err = fmt.Errorf("tag number out of range: %d", v)
- return
- }
- tag = int32(v)
- return
-}
-
-// DecodeFixed64 reads a 64-bit integer from the Buffer.
-// This is the format for the
-// fixed64, sfixed64, and double protocol buffer types.
-func (cb *Buffer) DecodeFixed64() (x uint64, err error) {
- // x, err already 0
- i := cb.index + 8
- if i < 0 || i > len(cb.buf) {
- err = io.ErrUnexpectedEOF
- return
- }
- cb.index = i
-
- x = uint64(cb.buf[i-8])
- x |= uint64(cb.buf[i-7]) << 8
- x |= uint64(cb.buf[i-6]) << 16
- x |= uint64(cb.buf[i-5]) << 24
- x |= uint64(cb.buf[i-4]) << 32
- x |= uint64(cb.buf[i-3]) << 40
- x |= uint64(cb.buf[i-2]) << 48
- x |= uint64(cb.buf[i-1]) << 56
- return
-}
-
-// DecodeFixed32 reads a 32-bit integer from the Buffer.
-// This is the format for the
-// fixed32, sfixed32, and float protocol buffer types.
-func (cb *Buffer) DecodeFixed32() (x uint64, err error) {
- // x, err already 0
- i := cb.index + 4
- if i < 0 || i > len(cb.buf) {
- err = io.ErrUnexpectedEOF
- return
- }
- cb.index = i
-
- x = uint64(cb.buf[i-4])
- x |= uint64(cb.buf[i-3]) << 8
- x |= uint64(cb.buf[i-2]) << 16
- x |= uint64(cb.buf[i-1]) << 24
- return
-}
-
-// DecodeZigZag32 decodes a signed 32-bit integer from the given
-// zig-zag encoded value.
-func DecodeZigZag32(v uint64) int32 {
- return int32((uint32(v) >> 1) ^ uint32((int32(v&1)<<31)>>31))
-}
-
-// DecodeZigZag64 decodes a signed 64-bit integer from the given
-// zig-zag encoded value.
-func DecodeZigZag64(v uint64) int64 {
- return int64((v >> 1) ^ uint64((int64(v&1)<<63)>>63))
-}
-
-// DecodeRawBytes reads a count-delimited byte buffer from the Buffer.
-// This is the format used for the bytes protocol buffer
-// type and for embedded messages.
-func (cb *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) {
- n, err := cb.DecodeVarint()
- if err != nil {
- return nil, err
- }
-
- nb := int(n)
- if nb < 0 {
- return nil, fmt.Errorf("proto: bad byte length %d", nb)
- }
- end := cb.index + nb
- if end < cb.index || end > len(cb.buf) {
- return nil, io.ErrUnexpectedEOF
- }
-
- if !alloc {
- buf = cb.buf[cb.index:end]
- cb.index = end
- return
- }
-
- buf = make([]byte, nb)
- copy(buf, cb.buf[cb.index:])
- cb.index = end
- return
-}
-
-// ReadGroup reads the input until a "group end" tag is found
-// and returns the data up to that point. Subsequent reads from
-// the buffer will read data after the group end tag. If alloc
-// is true, the data is copied to a new slice before being returned.
-// Otherwise, the returned slice is a view into the buffer's
-// underlying byte slice.
-//
-// This function correctly handles nested groups: if a "group start"
-// tag is found, then that group's end tag will be included in the
-// returned data.
-func (cb *Buffer) ReadGroup(alloc bool) ([]byte, error) {
- var groupEnd, dataEnd int
- groupEnd, dataEnd, err := cb.findGroupEnd()
- if err != nil {
- return nil, err
- }
- var results []byte
- if !alloc {
- results = cb.buf[cb.index:dataEnd]
- } else {
- results = make([]byte, dataEnd-cb.index)
- copy(results, cb.buf[cb.index:])
- }
- cb.index = groupEnd
- return results, nil
-}
-
-// SkipGroup is like ReadGroup, except that it discards the
-// data and just advances the buffer to point to the input
-// right *after* the "group end" tag.
-func (cb *Buffer) SkipGroup() error {
- groupEnd, _, err := cb.findGroupEnd()
- if err != nil {
- return err
- }
- cb.index = groupEnd
- return nil
-}
-
-func (cb *Buffer) findGroupEnd() (groupEnd int, dataEnd int, err error) {
- bs := cb.buf
- start := cb.index
- defer func() {
- cb.index = start
- }()
- for {
- fieldStart := cb.index
- // read a field tag
- _, wireType, err := cb.DecodeTagAndWireType()
- if err != nil {
- return 0, 0, err
- }
- // skip past the field's data
- switch wireType {
- case proto.WireFixed32:
- if err := cb.Skip(4); err != nil {
- return 0, 0, err
- }
- case proto.WireFixed64:
- if err := cb.Skip(8); err != nil {
- return 0, 0, err
- }
- case proto.WireVarint:
- // skip varint by finding last byte (has high bit unset)
- i := cb.index
- limit := i + 10 // varint cannot be >10 bytes
- for {
- if i >= limit {
- return 0, 0, ErrOverflow
- }
- if i >= len(bs) {
- return 0, 0, io.ErrUnexpectedEOF
- }
- if bs[i]&0x80 == 0 {
- break
- }
- i++
- }
- // TODO: This would only overflow if buffer length was MaxInt and we
- // read the last byte. This is not a real/feasible concern on 64-bit
- // systems. Something to worry about for 32-bit systems? Do we care?
- cb.index = i + 1
- case proto.WireBytes:
- l, err := cb.DecodeVarint()
- if err != nil {
- return 0, 0, err
- }
- if err := cb.Skip(int(l)); err != nil {
- return 0, 0, err
- }
- case proto.WireStartGroup:
- if err := cb.SkipGroup(); err != nil {
- return 0, 0, err
- }
- case proto.WireEndGroup:
- return cb.index, fieldStart, nil
- default:
- return 0, 0, ErrBadWireType
- }
- }
-}
diff --git a/vendor/github.com/jhump/protoreflect/codec/decode_fields.go b/vendor/github.com/jhump/protoreflect/codec/decode_fields.go
deleted file mode 100644
index 938b4d9..0000000
--- a/vendor/github.com/jhump/protoreflect/codec/decode_fields.go
+++ /dev/null
@@ -1,283 +0,0 @@
-package codec
-
-import (
- "errors"
- "fmt"
- "io"
- "math"
-
- "github.com/golang/protobuf/proto"
- "github.com/golang/protobuf/protoc-gen-go/descriptor"
-
- "github.com/jhump/protoreflect/desc"
-)
-
-// ErrWireTypeEndGroup is returned from DecodeFieldValue if the tag and wire-type
-// it reads indicates an end-group marker.
-var ErrWireTypeEndGroup = errors.New("unexpected wire type: end group")
-
-// MessageFactory is used to instantiate messages when DecodeFieldValue needs to
-// decode a message value.
-//
-// Also see MessageFactory in "github.com/jhump/protoreflect/dynamic", which
-// implements this interface.
-type MessageFactory interface {
- NewMessage(md *desc.MessageDescriptor) proto.Message
-}
-
-// UnknownField represents a field that was parsed from the binary wire
-// format for a message, but was not a recognized field number. Enough
-// information is preserved so that re-serializing the message won't lose
-// any of the unrecognized data.
-type UnknownField struct {
- // The tag number for the unrecognized field.
- Tag int32
-
- // Encoding indicates how the unknown field was encoded on the wire. If it
- // is proto.WireBytes or proto.WireGroupStart then Contents will be set to
- // the raw bytes. If it is proto.WireTypeFixed32 then the data is in the least
- // significant 32 bits of Value. Otherwise, the data is in all 64 bits of
- // Value.
- Encoding int8
- Contents []byte
- Value uint64
-}
-
-// DecodeFieldValue will read a field value from the buffer and return its
-// value and the corresponding field descriptor. The given function is used
-// to lookup a field descriptor by tag number. The given factory is used to
-// instantiate a message if the field value is (or contains) a message value.
-//
-// On error, the field descriptor and value are typically nil. However, if the
-// error returned is ErrWireTypeEndGroup, the returned value will indicate any
-// tag number encoded in the end-group marker.
-//
-// If the field descriptor returned is nil, that means that the given function
-// returned nil. This is expected to happen for unrecognized tag numbers. In
-// that case, no error is returned, and the value will be an UnknownField.
-func (cb *Buffer) DecodeFieldValue(fieldFinder func(int32) *desc.FieldDescriptor, fact MessageFactory) (*desc.FieldDescriptor, interface{}, error) {
- if cb.EOF() {
- return nil, nil, io.EOF
- }
- tagNumber, wireType, err := cb.DecodeTagAndWireType()
- if err != nil {
- return nil, nil, err
- }
- if wireType == proto.WireEndGroup {
- return nil, tagNumber, ErrWireTypeEndGroup
- }
- fd := fieldFinder(tagNumber)
- if fd == nil {
- val, err := cb.decodeUnknownField(tagNumber, wireType)
- return nil, val, err
- }
- val, err := cb.decodeKnownField(fd, wireType, fact)
- return fd, val, err
-}
-
-// DecodeScalarField extracts a properly-typed value from v. The returned value's
-// type depends on the given field descriptor type. It will be the same type as
-// generated structs use for the field descriptor's type. Enum types will return
-// an int32. If the given field type uses length-delimited encoding (nested
-// messages, bytes, and strings), an error is returned.
-func DecodeScalarField(fd *desc.FieldDescriptor, v uint64) (interface{}, error) {
- switch fd.GetType() {
- case descriptor.FieldDescriptorProto_TYPE_BOOL:
- return v != 0, nil
- case descriptor.FieldDescriptorProto_TYPE_UINT32,
- descriptor.FieldDescriptorProto_TYPE_FIXED32:
- if v > math.MaxUint32 {
- return nil, ErrOverflow
- }
- return uint32(v), nil
-
- case descriptor.FieldDescriptorProto_TYPE_INT32,
- descriptor.FieldDescriptorProto_TYPE_ENUM:
- s := int64(v)
- if s > math.MaxInt32 || s < math.MinInt32 {
- return nil, ErrOverflow
- }
- return int32(s), nil
-
- case descriptor.FieldDescriptorProto_TYPE_SFIXED32:
- if v > math.MaxUint32 {
- return nil, ErrOverflow
- }
- return int32(v), nil
-
- case descriptor.FieldDescriptorProto_TYPE_SINT32:
- if v > math.MaxUint32 {
- return nil, ErrOverflow
- }
- return DecodeZigZag32(v), nil
-
- case descriptor.FieldDescriptorProto_TYPE_UINT64,
- descriptor.FieldDescriptorProto_TYPE_FIXED64:
- return v, nil
-
- case descriptor.FieldDescriptorProto_TYPE_INT64,
- descriptor.FieldDescriptorProto_TYPE_SFIXED64:
- return int64(v), nil
-
- case descriptor.FieldDescriptorProto_TYPE_SINT64:
- return DecodeZigZag64(v), nil
-
- case descriptor.FieldDescriptorProto_TYPE_FLOAT:
- if v > math.MaxUint32 {
- return nil, ErrOverflow
- }
- return math.Float32frombits(uint32(v)), nil
-
- case descriptor.FieldDescriptorProto_TYPE_DOUBLE:
- return math.Float64frombits(v), nil
-
- default:
- // bytes, string, message, and group cannot be represented as a simple numeric value
- return nil, fmt.Errorf("bad input; field %s requires length-delimited wire type", fd.GetFullyQualifiedName())
- }
-}
-
-// DecodeLengthDelimitedField extracts a properly-typed value from bytes. The
-// returned value's type will usually be []byte, string, or, for nested messages,
-// the type returned from the given message factory. However, since repeated
-// scalar fields can be length-delimited, when they used packed encoding, it can
-// also return an []interface{}, where each element is a scalar value. Furthermore,
-// it could return a scalar type, not in a slice, if the given field descriptor is
-// not repeated. This is to support cases where a field is changed from optional
-// to repeated. New code may emit a packed repeated representation, but old code
-// still expects a single scalar value. In this case, if the actual data in bytes
-// contains multiple values, only the last value is returned.
-func DecodeLengthDelimitedField(fd *desc.FieldDescriptor, bytes []byte, mf MessageFactory) (interface{}, error) {
- switch {
- case fd.GetType() == descriptor.FieldDescriptorProto_TYPE_BYTES:
- return bytes, nil
-
- case fd.GetType() == descriptor.FieldDescriptorProto_TYPE_STRING:
- return string(bytes), nil
-
- case fd.GetType() == descriptor.FieldDescriptorProto_TYPE_MESSAGE ||
- fd.GetType() == descriptor.FieldDescriptorProto_TYPE_GROUP:
- msg := mf.NewMessage(fd.GetMessageType())
- err := proto.Unmarshal(bytes, msg)
- if err != nil {
- return nil, err
- } else {
- return msg, nil
- }
-
- default:
- // even if the field is not repeated or not packed, we still parse it as such for
- // backwards compatibility (e.g. message we are de-serializing could have been both
- // repeated and packed at the time of serialization)
- packedBuf := NewBuffer(bytes)
- var slice []interface{}
- var val interface{}
- for !packedBuf.EOF() {
- var v uint64
- var err error
- if varintTypes[fd.GetType()] {
- v, err = packedBuf.DecodeVarint()
- } else if fixed32Types[fd.GetType()] {
- v, err = packedBuf.DecodeFixed32()
- } else if fixed64Types[fd.GetType()] {
- v, err = packedBuf.DecodeFixed64()
- } else {
- return nil, fmt.Errorf("bad input; cannot parse length-delimited wire type for field %s", fd.GetFullyQualifiedName())
- }
- if err != nil {
- return nil, err
- }
- val, err = DecodeScalarField(fd, v)
- if err != nil {
- return nil, err
- }
- if fd.IsRepeated() {
- slice = append(slice, val)
- }
- }
- if fd.IsRepeated() {
- return slice, nil
- } else {
- // if not a repeated field, last value wins
- return val, nil
- }
- }
-}
-
-func (b *Buffer) decodeKnownField(fd *desc.FieldDescriptor, encoding int8, fact MessageFactory) (interface{}, error) {
- var val interface{}
- var err error
- switch encoding {
- case proto.WireFixed32:
- var num uint64
- num, err = b.DecodeFixed32()
- if err == nil {
- val, err = DecodeScalarField(fd, num)
- }
- case proto.WireFixed64:
- var num uint64
- num, err = b.DecodeFixed64()
- if err == nil {
- val, err = DecodeScalarField(fd, num)
- }
- case proto.WireVarint:
- var num uint64
- num, err = b.DecodeVarint()
- if err == nil {
- val, err = DecodeScalarField(fd, num)
- }
-
- case proto.WireBytes:
- alloc := fd.GetType() == descriptor.FieldDescriptorProto_TYPE_BYTES
- var raw []byte
- raw, err = b.DecodeRawBytes(alloc)
- if err == nil {
- val, err = DecodeLengthDelimitedField(fd, raw, fact)
- }
-
- case proto.WireStartGroup:
- if fd.GetMessageType() == nil {
- return nil, fmt.Errorf("cannot parse field %s from group-encoded wire type", fd.GetFullyQualifiedName())
- }
- msg := fact.NewMessage(fd.GetMessageType())
- var data []byte
- data, err = b.ReadGroup(false)
- if err == nil {
- err = proto.Unmarshal(data, msg)
- if err == nil {
- val = msg
- }
- }
-
- default:
- return nil, ErrBadWireType
- }
- if err != nil {
- return nil, err
- }
-
- return val, nil
-}
-
-func (b *Buffer) decodeUnknownField(tagNumber int32, encoding int8) (interface{}, error) {
- u := UnknownField{Tag: tagNumber, Encoding: encoding}
- var err error
- switch encoding {
- case proto.WireFixed32:
- u.Value, err = b.DecodeFixed32()
- case proto.WireFixed64:
- u.Value, err = b.DecodeFixed64()
- case proto.WireVarint:
- u.Value, err = b.DecodeVarint()
- case proto.WireBytes:
- u.Contents, err = b.DecodeRawBytes(true)
- case proto.WireStartGroup:
- u.Contents, err = b.ReadGroup(true)
- default:
- err = ErrBadWireType
- }
- if err != nil {
- return nil, err
- }
- return u, nil
-}
diff --git a/vendor/github.com/jhump/protoreflect/codec/doc.go b/vendor/github.com/jhump/protoreflect/codec/doc.go
deleted file mode 100644
index f76499f..0000000
--- a/vendor/github.com/jhump/protoreflect/codec/doc.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Package codec contains a reader/write type that assists with encoding
-// and decoding protobuf's binary representation.
-//
-// The code in this package began as a fork of proto.Buffer but provides
-// additional API to make it more useful to code that needs to dynamically
-// process or produce the protobuf binary format.
-package codec
diff --git a/vendor/github.com/jhump/protoreflect/codec/encode.go b/vendor/github.com/jhump/protoreflect/codec/encode.go
deleted file mode 100644
index c84523f..0000000
--- a/vendor/github.com/jhump/protoreflect/codec/encode.go
+++ /dev/null
@@ -1,163 +0,0 @@
-package codec
-
-import "github.com/golang/protobuf/proto"
-
-// EncodeVarint writes a varint-encoded integer to the Buffer.
-// This is the format for the
-// int32, int64, uint32, uint64, bool, and enum
-// protocol buffer types.
-func (cb *Buffer) EncodeVarint(x uint64) error {
- for x >= 1<<7 {
- cb.buf = append(cb.buf, uint8(x&0x7f|0x80))
- x >>= 7
- }
- cb.buf = append(cb.buf, uint8(x))
- return nil
-}
-
-// EncodeTagAndWireType encodes the given field tag and wire type to the
-// buffer. This combines the two values and then writes them as a varint.
-func (cb *Buffer) EncodeTagAndWireType(tag int32, wireType int8) error {
- v := uint64((int64(tag) << 3) | int64(wireType))
- return cb.EncodeVarint(v)
-}
-
-// EncodeFixed64 writes a 64-bit integer to the Buffer.
-// This is the format for the
-// fixed64, sfixed64, and double protocol buffer types.
-func (cb *Buffer) EncodeFixed64(x uint64) error {
- cb.buf = append(cb.buf,
- uint8(x),
- uint8(x>>8),
- uint8(x>>16),
- uint8(x>>24),
- uint8(x>>32),
- uint8(x>>40),
- uint8(x>>48),
- uint8(x>>56))
- return nil
-}
-
-// EncodeFixed32 writes a 32-bit integer to the Buffer.
-// This is the format for the
-// fixed32, sfixed32, and float protocol buffer types.
-func (cb *Buffer) EncodeFixed32(x uint64) error {
- cb.buf = append(cb.buf,
- uint8(x),
- uint8(x>>8),
- uint8(x>>16),
- uint8(x>>24))
- return nil
-}
-
-// EncodeZigZag64 does zig-zag encoding to convert the given
-// signed 64-bit integer into a form that can be expressed
-// efficiently as a varint, even for negative values.
-func EncodeZigZag64(v int64) uint64 {
- return (uint64(v) << 1) ^ uint64(v>>63)
-}
-
-// EncodeZigZag32 does zig-zag encoding to convert the given
-// signed 32-bit integer into a form that can be expressed
-// efficiently as a varint, even for negative values.
-func EncodeZigZag32(v int32) uint64 {
- return uint64((uint32(v) << 1) ^ uint32((v >> 31)))
-}
-
-// EncodeRawBytes writes a count-delimited byte buffer to the Buffer.
-// This is the format used for the bytes protocol buffer
-// type and for embedded messages.
-func (cb *Buffer) EncodeRawBytes(b []byte) error {
- if err := cb.EncodeVarint(uint64(len(b))); err != nil {
- return err
- }
- cb.buf = append(cb.buf, b...)
- return nil
-}
-
-// EncodeMessage writes the given message to the buffer.
-func (cb *Buffer) EncodeMessage(pm proto.Message) error {
- bytes, err := marshalMessage(cb.buf, pm, cb.deterministic)
- if err != nil {
- return err
- }
- cb.buf = bytes
- return nil
-}
-
-// EncodeDelimitedMessage writes the given message to the buffer with a
-// varint-encoded length prefix (the delimiter).
-func (cb *Buffer) EncodeDelimitedMessage(pm proto.Message) error {
- bytes, err := marshalMessage(cb.tmp, pm, cb.deterministic)
- if err != nil {
- return err
- }
- // save truncated buffer if it was grown (so we can re-use it and
- // curtail future allocations)
- if cap(bytes) > cap(cb.tmp) {
- cb.tmp = bytes[:0]
- }
- return cb.EncodeRawBytes(bytes)
-}
-
-func marshalMessage(b []byte, pm proto.Message, deterministic bool) ([]byte, error) {
- // we try to use the most efficient way to marshal to existing slice
- nm, ok := pm.(interface {
- // this interface is implemented by generated messages
- XXX_Size() int
- XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
- })
- if ok {
- sz := nm.XXX_Size()
- if cap(b) < len(b)+sz {
- // re-allocate to fit
- bytes := make([]byte, len(b), len(b)+sz)
- copy(bytes, b)
- b = bytes
- }
- return nm.XXX_Marshal(b, deterministic)
- }
-
- if deterministic {
- // see if the message has custom deterministic methods, preferring an
- // "append" method over one that must always re-allocate
- madm, ok := pm.(interface {
- MarshalAppendDeterministic(b []byte) ([]byte, error)
- })
- if ok {
- return madm.MarshalAppendDeterministic(b)
- }
-
- mdm, ok := pm.(interface {
- MarshalDeterministic() ([]byte, error)
- })
- if ok {
- bytes, err := mdm.MarshalDeterministic()
- if err != nil {
- return nil, err
- }
- if len(b) == 0 {
- return bytes, nil
- }
- return append(b, bytes...), nil
- }
- }
-
- mam, ok := pm.(interface {
- // see if we can append the message, vs. having to re-allocate
- MarshalAppend(b []byte) ([]byte, error)
- })
- if ok {
- return mam.MarshalAppend(b)
- }
-
- // lowest common denominator
- bytes, err := proto.Marshal(pm)
- if err != nil {
- return nil, err
- }
- if len(b) == 0 {
- return bytes, nil
- }
- return append(b, bytes...), nil
-}
diff --git a/vendor/github.com/jhump/protoreflect/codec/encode_fields.go b/vendor/github.com/jhump/protoreflect/codec/encode_fields.go
deleted file mode 100644
index cda7299..0000000
--- a/vendor/github.com/jhump/protoreflect/codec/encode_fields.go
+++ /dev/null
@@ -1,267 +0,0 @@
-package codec
-
-import (
- "fmt"
- "math"
- "reflect"
- "sort"
-
- "github.com/golang/protobuf/proto"
- "github.com/golang/protobuf/protoc-gen-go/descriptor"
-
- "github.com/jhump/protoreflect/desc"
-)
-
-func (cb *Buffer) EncodeFieldValue(fd *desc.FieldDescriptor, val interface{}) error {
- if fd.IsMap() {
- mp := val.(map[interface{}]interface{})
- entryType := fd.GetMessageType()
- keyType := entryType.FindFieldByNumber(1)
- valType := entryType.FindFieldByNumber(2)
- var entryBuffer Buffer
- if cb.deterministic {
- keys := make([]interface{}, 0, len(mp))
- for k := range mp {
- keys = append(keys, k)
- }
- sort.Sort(sortable(keys))
- for _, k := range keys {
- v := mp[k]
- entryBuffer.Reset()
- if err := entryBuffer.encodeFieldElement(keyType, k); err != nil {
- return err
- }
- if err := entryBuffer.encodeFieldElement(valType, v); err != nil {
- return err
- }
- if err := cb.EncodeTagAndWireType(fd.GetNumber(), proto.WireBytes); err != nil {
- return err
- }
- if err := cb.EncodeRawBytes(entryBuffer.Bytes()); err != nil {
- return err
- }
- }
- } else {
- for k, v := range mp {
- entryBuffer.Reset()
- if err := entryBuffer.encodeFieldElement(keyType, k); err != nil {
- return err
- }
- if err := entryBuffer.encodeFieldElement(valType, v); err != nil {
- return err
- }
- if err := cb.EncodeTagAndWireType(fd.GetNumber(), proto.WireBytes); err != nil {
- return err
- }
- if err := cb.EncodeRawBytes(entryBuffer.Bytes()); err != nil {
- return err
- }
- }
- }
- return nil
- } else if fd.IsRepeated() {
- sl := val.([]interface{})
- wt, err := getWireType(fd.GetType())
- if err != nil {
- return err
- }
- if isPacked(fd) && len(sl) > 1 &&
- (wt == proto.WireVarint || wt == proto.WireFixed32 || wt == proto.WireFixed64) {
- // packed repeated field
- var packedBuffer Buffer
- for _, v := range sl {
- if err := packedBuffer.encodeFieldValue(fd, v); err != nil {
- return err
- }
- }
- if err := cb.EncodeTagAndWireType(fd.GetNumber(), proto.WireBytes); err != nil {
- return err
- }
- return cb.EncodeRawBytes(packedBuffer.Bytes())
- } else {
- // non-packed repeated field
- for _, v := range sl {
- if err := cb.encodeFieldElement(fd, v); err != nil {
- return err
- }
- }
- return nil
- }
- } else {
- return cb.encodeFieldElement(fd, val)
- }
-}
-
-func isPacked(fd *desc.FieldDescriptor) bool {
- opts := fd.AsFieldDescriptorProto().GetOptions()
- // if set, use that value
- if opts != nil && opts.Packed != nil {
- return opts.GetPacked()
- }
- // if unset: proto2 defaults to false, proto3 to true
- return fd.GetFile().IsProto3()
-}
-
-// sortable is used to sort map keys. Values will be integers (int32, int64, uint32, and uint64),
-// bools, or strings.
-type sortable []interface{}
-
-func (s sortable) Len() int {
- return len(s)
-}
-
-func (s sortable) Less(i, j int) bool {
- vi := s[i]
- vj := s[j]
- switch reflect.TypeOf(vi).Kind() {
- case reflect.Int32:
- return vi.(int32) < vj.(int32)
- case reflect.Int64:
- return vi.(int64) < vj.(int64)
- case reflect.Uint32:
- return vi.(uint32) < vj.(uint32)
- case reflect.Uint64:
- return vi.(uint64) < vj.(uint64)
- case reflect.String:
- return vi.(string) < vj.(string)
- case reflect.Bool:
- return !vi.(bool) && vj.(bool)
- default:
- panic(fmt.Sprintf("cannot compare keys of type %v", reflect.TypeOf(vi)))
- }
-}
-
-func (s sortable) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
-}
-
-func (b *Buffer) encodeFieldElement(fd *desc.FieldDescriptor, val interface{}) error {
- wt, err := getWireType(fd.GetType())
- if err != nil {
- return err
- }
- if err := b.EncodeTagAndWireType(fd.GetNumber(), wt); err != nil {
- return err
- }
- if err := b.encodeFieldValue(fd, val); err != nil {
- return err
- }
- if wt == proto.WireStartGroup {
- return b.EncodeTagAndWireType(fd.GetNumber(), proto.WireEndGroup)
- }
- return nil
-}
-
-func (b *Buffer) encodeFieldValue(fd *desc.FieldDescriptor, val interface{}) error {
- switch fd.GetType() {
- case descriptor.FieldDescriptorProto_TYPE_BOOL:
- v := val.(bool)
- if v {
- return b.EncodeVarint(1)
- }
- return b.EncodeVarint(0)
-
- case descriptor.FieldDescriptorProto_TYPE_ENUM,
- descriptor.FieldDescriptorProto_TYPE_INT32:
- v := val.(int32)
- return b.EncodeVarint(uint64(v))
-
- case descriptor.FieldDescriptorProto_TYPE_SFIXED32:
- v := val.(int32)
- return b.EncodeFixed32(uint64(v))
-
- case descriptor.FieldDescriptorProto_TYPE_SINT32:
- v := val.(int32)
- return b.EncodeVarint(EncodeZigZag32(v))
-
- case descriptor.FieldDescriptorProto_TYPE_UINT32:
- v := val.(uint32)
- return b.EncodeVarint(uint64(v))
-
- case descriptor.FieldDescriptorProto_TYPE_FIXED32:
- v := val.(uint32)
- return b.EncodeFixed32(uint64(v))
-
- case descriptor.FieldDescriptorProto_TYPE_INT64:
- v := val.(int64)
- return b.EncodeVarint(uint64(v))
-
- case descriptor.FieldDescriptorProto_TYPE_SFIXED64:
- v := val.(int64)
- return b.EncodeFixed64(uint64(v))
-
- case descriptor.FieldDescriptorProto_TYPE_SINT64:
- v := val.(int64)
- return b.EncodeVarint(EncodeZigZag64(v))
-
- case descriptor.FieldDescriptorProto_TYPE_UINT64:
- v := val.(uint64)
- return b.EncodeVarint(v)
-
- case descriptor.FieldDescriptorProto_TYPE_FIXED64:
- v := val.(uint64)
- return b.EncodeFixed64(v)
-
- case descriptor.FieldDescriptorProto_TYPE_DOUBLE:
- v := val.(float64)
- return b.EncodeFixed64(math.Float64bits(v))
-
- case descriptor.FieldDescriptorProto_TYPE_FLOAT:
- v := val.(float32)
- return b.EncodeFixed32(uint64(math.Float32bits(v)))
-
- case descriptor.FieldDescriptorProto_TYPE_BYTES:
- v := val.([]byte)
- return b.EncodeRawBytes(v)
-
- case descriptor.FieldDescriptorProto_TYPE_STRING:
- v := val.(string)
- return b.EncodeRawBytes(([]byte)(v))
-
- case descriptor.FieldDescriptorProto_TYPE_MESSAGE:
- return b.EncodeDelimitedMessage(val.(proto.Message))
-
- case descriptor.FieldDescriptorProto_TYPE_GROUP:
- // just append the nested message to this buffer
- return b.EncodeMessage(val.(proto.Message))
- // whosoever writeth start-group tag (e.g. caller) is responsible for writing end-group tag
-
- default:
- return fmt.Errorf("unrecognized field type: %v", fd.GetType())
- }
-}
-
-func getWireType(t descriptor.FieldDescriptorProto_Type) (int8, error) {
- switch t {
- case descriptor.FieldDescriptorProto_TYPE_ENUM,
- descriptor.FieldDescriptorProto_TYPE_BOOL,
- descriptor.FieldDescriptorProto_TYPE_INT32,
- descriptor.FieldDescriptorProto_TYPE_SINT32,
- descriptor.FieldDescriptorProto_TYPE_UINT32,
- descriptor.FieldDescriptorProto_TYPE_INT64,
- descriptor.FieldDescriptorProto_TYPE_SINT64,
- descriptor.FieldDescriptorProto_TYPE_UINT64:
- return proto.WireVarint, nil
-
- case descriptor.FieldDescriptorProto_TYPE_FIXED32,
- descriptor.FieldDescriptorProto_TYPE_SFIXED32,
- descriptor.FieldDescriptorProto_TYPE_FLOAT:
- return proto.WireFixed32, nil
-
- case descriptor.FieldDescriptorProto_TYPE_FIXED64,
- descriptor.FieldDescriptorProto_TYPE_SFIXED64,
- descriptor.FieldDescriptorProto_TYPE_DOUBLE:
- return proto.WireFixed64, nil
-
- case descriptor.FieldDescriptorProto_TYPE_BYTES,
- descriptor.FieldDescriptorProto_TYPE_STRING,
- descriptor.FieldDescriptorProto_TYPE_MESSAGE:
- return proto.WireBytes, nil
-
- case descriptor.FieldDescriptorProto_TYPE_GROUP:
- return proto.WireStartGroup, nil
-
- default:
- return 0, ErrBadWireType
- }
-}
diff --git a/vendor/github.com/jhump/protoreflect/desc/convert.go b/vendor/github.com/jhump/protoreflect/desc/convert.go
deleted file mode 100644
index 538820c..0000000
--- a/vendor/github.com/jhump/protoreflect/desc/convert.go
+++ /dev/null
@@ -1,231 +0,0 @@
-package desc
-
-import (
- "errors"
- "fmt"
- "strings"
-
- dpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
-
- "github.com/jhump/protoreflect/desc/internal"
- intn "github.com/jhump/protoreflect/internal"
-)
-
-// CreateFileDescriptor instantiates a new file descriptor for the given descriptor proto.
-// The file's direct dependencies must be provided. If the given dependencies do not include
-// all of the file's dependencies or if the contents of the descriptors are internally
-// inconsistent (e.g. contain unresolvable symbols) then an error is returned.
-func CreateFileDescriptor(fd *dpb.FileDescriptorProto, deps ...*FileDescriptor) (*FileDescriptor, error) {
- return createFileDescriptor(fd, deps, nil)
-}
-
-func createFileDescriptor(fd *dpb.FileDescriptorProto, deps []*FileDescriptor, r *ImportResolver) (*FileDescriptor, error) {
- ret := &FileDescriptor{
- proto: fd,
- symbols: map[string]Descriptor{},
- fieldIndex: map[string]map[int32]*FieldDescriptor{},
- }
- pkg := fd.GetPackage()
-
- // populate references to file descriptor dependencies
- files := map[string]*FileDescriptor{}
- for _, f := range deps {
- files[f.proto.GetName()] = f
- }
- ret.deps = make([]*FileDescriptor, len(fd.GetDependency()))
- for i, d := range fd.GetDependency() {
- resolved := r.ResolveImport(fd.GetName(), d)
- ret.deps[i] = files[resolved]
- if ret.deps[i] == nil {
- if resolved != d {
- ret.deps[i] = files[d]
- }
- if ret.deps[i] == nil {
- return nil, intn.ErrNoSuchFile(d)
- }
- }
- }
- ret.publicDeps = make([]*FileDescriptor, len(fd.GetPublicDependency()))
- for i, pd := range fd.GetPublicDependency() {
- ret.publicDeps[i] = ret.deps[pd]
- }
- ret.weakDeps = make([]*FileDescriptor, len(fd.GetWeakDependency()))
- for i, wd := range fd.GetWeakDependency() {
- ret.weakDeps[i] = ret.deps[wd]
- }
- ret.isProto3 = fd.GetSyntax() == "proto3"
-
- // populate all tables of child descriptors
- for _, m := range fd.GetMessageType() {
- md, n := createMessageDescriptor(ret, ret, pkg, m, ret.symbols)
- ret.symbols[n] = md
- ret.messages = append(ret.messages, md)
- }
- for _, e := range fd.GetEnumType() {
- ed, n := createEnumDescriptor(ret, ret, pkg, e, ret.symbols)
- ret.symbols[n] = ed
- ret.enums = append(ret.enums, ed)
- }
- for _, ex := range fd.GetExtension() {
- exd, n := createFieldDescriptor(ret, ret, pkg, ex)
- ret.symbols[n] = exd
- ret.extensions = append(ret.extensions, exd)
- }
- for _, s := range fd.GetService() {
- sd, n := createServiceDescriptor(ret, pkg, s, ret.symbols)
- ret.symbols[n] = sd
- ret.services = append(ret.services, sd)
- }
-
- ret.sourceInfo = internal.CreateSourceInfoMap(fd)
- ret.sourceInfoRecomputeFunc = ret.recomputeSourceInfo
-
- // now we can resolve all type references and source code info
- scopes := []scope{fileScope(ret)}
- path := make([]int32, 1, 8)
- path[0] = internal.File_messagesTag
- for i, md := range ret.messages {
- if err := md.resolve(append(path, int32(i)), scopes); err != nil {
- return nil, err
- }
- }
- path[0] = internal.File_enumsTag
- for i, ed := range ret.enums {
- ed.resolve(append(path, int32(i)))
- }
- path[0] = internal.File_extensionsTag
- for i, exd := range ret.extensions {
- if err := exd.resolve(append(path, int32(i)), scopes); err != nil {
- return nil, err
- }
- }
- path[0] = internal.File_servicesTag
- for i, sd := range ret.services {
- if err := sd.resolve(append(path, int32(i)), scopes); err != nil {
- return nil, err
- }
- }
-
- return ret, nil
-}
-
-// CreateFileDescriptors constructs a set of descriptors, one for each of the
-// given descriptor protos. The given set of descriptor protos must include all
-// transitive dependencies for every file.
-func CreateFileDescriptors(fds []*dpb.FileDescriptorProto) (map[string]*FileDescriptor, error) {
- return createFileDescriptors(fds, nil)
-}
-
-func createFileDescriptors(fds []*dpb.FileDescriptorProto, r *ImportResolver) (map[string]*FileDescriptor, error) {
- if len(fds) == 0 {
- return nil, nil
- }
- files := map[string]*dpb.FileDescriptorProto{}
- resolved := map[string]*FileDescriptor{}
- var name string
- for _, fd := range fds {
- name = fd.GetName()
- files[name] = fd
- }
- for _, fd := range fds {
- _, err := createFromSet(fd.GetName(), r, nil, files, resolved)
- if err != nil {
- return nil, err
- }
- }
- return resolved, nil
-}
-
-// ToFileDescriptorSet creates a FileDescriptorSet proto that contains all of the given
-// file descriptors and their transitive dependencies. The files are topologically sorted
-// so that a file will always appear after its dependencies.
-func ToFileDescriptorSet(fds ...*FileDescriptor) *dpb.FileDescriptorSet {
- var fdps []*dpb.FileDescriptorProto
- addAllFiles(fds, &fdps, map[string]struct{}{})
- return &dpb.FileDescriptorSet{File: fdps}
-}
-
-func addAllFiles(src []*FileDescriptor, results *[]*dpb.FileDescriptorProto, seen map[string]struct{}) {
- for _, fd := range src {
- if _, ok := seen[fd.GetName()]; ok {
- continue
- }
- seen[fd.GetName()] = struct{}{}
- addAllFiles(fd.GetDependencies(), results, seen)
- *results = append(*results, fd.AsFileDescriptorProto())
- }
-}
-
-// CreateFileDescriptorFromSet creates a descriptor from the given file descriptor set. The
-// set's *last* file will be the returned descriptor. The set's remaining files must comprise
-// the full set of transitive dependencies of that last file. This is the same format and
-// order used by protoc when emitting a FileDescriptorSet file with an invocation like so:
-// protoc --descriptor_set_out=./test.protoset --include_imports -I. test.proto
-func CreateFileDescriptorFromSet(fds *dpb.FileDescriptorSet) (*FileDescriptor, error) {
- return createFileDescriptorFromSet(fds, nil)
-}
-
-func createFileDescriptorFromSet(fds *dpb.FileDescriptorSet, r *ImportResolver) (*FileDescriptor, error) {
- result, err := createFileDescriptorsFromSet(fds, r)
- if err != nil {
- return nil, err
- }
- files := fds.GetFile()
- lastFilename := files[len(files)-1].GetName()
- return result[lastFilename], nil
-}
-
-// CreateFileDescriptorsFromSet creates file descriptors from the given file descriptor set.
-// The returned map includes all files in the set, keyed b name. The set must include the
-// full set of transitive dependencies for all files therein or else a link error will occur
-// and be returned instead of the slice of descriptors. This is the same format used by
-// protoc when a FileDescriptorSet file with an invocation like so:
-// protoc --descriptor_set_out=./test.protoset --include_imports -I. test.proto
-func CreateFileDescriptorsFromSet(fds *dpb.FileDescriptorSet) (map[string]*FileDescriptor, error) {
- return createFileDescriptorsFromSet(fds, nil)
-}
-
-func createFileDescriptorsFromSet(fds *dpb.FileDescriptorSet, r *ImportResolver) (map[string]*FileDescriptor, error) {
- files := fds.GetFile()
- if len(files) == 0 {
- return nil, errors.New("file descriptor set is empty")
- }
- return createFileDescriptors(files, r)
-}
-
-// createFromSet creates a descriptor for the given filename. It recursively
-// creates descriptors for the given file's dependencies.
-func createFromSet(filename string, r *ImportResolver, seen []string, files map[string]*dpb.FileDescriptorProto, resolved map[string]*FileDescriptor) (*FileDescriptor, error) {
- for _, s := range seen {
- if filename == s {
- return nil, fmt.Errorf("cycle in imports: %s", strings.Join(append(seen, filename), " -> "))
- }
- }
- seen = append(seen, filename)
-
- if d, ok := resolved[filename]; ok {
- return d, nil
- }
- fdp := files[filename]
- if fdp == nil {
- return nil, intn.ErrNoSuchFile(filename)
- }
- deps := make([]*FileDescriptor, len(fdp.GetDependency()))
- for i, depName := range fdp.GetDependency() {
- resolvedDep := r.ResolveImport(filename, depName)
- dep, err := createFromSet(resolvedDep, r, seen, files, resolved)
- if _, ok := err.(intn.ErrNoSuchFile); ok && resolvedDep != depName {
- dep, err = createFromSet(depName, r, seen, files, resolved)
- }
- if err != nil {
- return nil, err
- }
- deps[i] = dep
- }
- d, err := createFileDescriptor(fdp, deps, r)
- if err != nil {
- return nil, err
- }
- resolved[filename] = d
- return d, nil
-}
diff --git a/vendor/github.com/jhump/protoreflect/desc/descriptor.go b/vendor/github.com/jhump/protoreflect/desc/descriptor.go
deleted file mode 100644
index ab235a3..0000000
--- a/vendor/github.com/jhump/protoreflect/desc/descriptor.go
+++ /dev/null
@@ -1,1666 +0,0 @@
-package desc
-
-import (
- "bytes"
- "fmt"
- "sort"
- "strconv"
- "strings"
- "unicode/utf8"
-
- "github.com/golang/protobuf/proto"
- dpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
-
- "github.com/jhump/protoreflect/desc/internal"
-)
-
-// Descriptor is the common interface implemented by all descriptor objects.
-type Descriptor interface {
- // GetName returns the name of the object described by the descriptor. This will
- // be a base name that does not include enclosing message names or the package name.
- // For file descriptors, this indicates the path and name to the described file.
- GetName() string
- // GetFullyQualifiedName returns the fully-qualified name of the object described by
- // the descriptor. This will include the package name and any enclosing message names.
- // For file descriptors, this returns the path and name to the described file (same as
- // GetName).
- GetFullyQualifiedName() string
- // GetParent returns the enclosing element in a proto source file. If the described
- // object is a top-level object, this returns the file descriptor. Otherwise, it returns
- // the element in which the described object was declared. File descriptors have no
- // parent and return nil.
- GetParent() Descriptor
- // GetFile returns the file descriptor in which this element was declared. File
- // descriptors return themselves.
- GetFile() *FileDescriptor
- // GetOptions returns the options proto containing options for the described element.
- GetOptions() proto.Message
- // GetSourceInfo returns any source code information that was present in the file
- // descriptor. Source code info is optional. If no source code info is available for
- // the element (including if there is none at all in the file descriptor) then this
- // returns nil
- GetSourceInfo() *dpb.SourceCodeInfo_Location
- // AsProto returns the underlying descriptor proto for this descriptor.
- AsProto() proto.Message
-}
-
-type sourceInfoRecomputeFunc = internal.SourceInfoComputeFunc
-
-// FileDescriptor describes a proto source file.
-type FileDescriptor struct {
- proto *dpb.FileDescriptorProto
- symbols map[string]Descriptor
- deps []*FileDescriptor
- publicDeps []*FileDescriptor
- weakDeps []*FileDescriptor
- messages []*MessageDescriptor
- enums []*EnumDescriptor
- extensions []*FieldDescriptor
- services []*ServiceDescriptor
- fieldIndex map[string]map[int32]*FieldDescriptor
- isProto3 bool
- sourceInfo internal.SourceInfoMap
- sourceInfoRecomputeFunc
-}
-
-func (fd *FileDescriptor) recomputeSourceInfo() {
- internal.PopulateSourceInfoMap(fd.proto, fd.sourceInfo)
-}
-
-func (fd *FileDescriptor) registerField(field *FieldDescriptor) {
- fields := fd.fieldIndex[field.owner.GetFullyQualifiedName()]
- if fields == nil {
- fields = map[int32]*FieldDescriptor{}
- fd.fieldIndex[field.owner.GetFullyQualifiedName()] = fields
- }
- fields[field.GetNumber()] = field
-}
-
-// GetName returns the name of the file, as it was given to the protoc invocation
-// to compile it, possibly including path (relative to a directory in the proto
-// import path).
-func (fd *FileDescriptor) GetName() string {
- return fd.proto.GetName()
-}
-
-// GetFullyQualifiedName returns the name of the file, same as GetName. It is
-// present to satisfy the Descriptor interface.
-func (fd *FileDescriptor) GetFullyQualifiedName() string {
- return fd.proto.GetName()
-}
-
-// GetPackage returns the name of the package declared in the file.
-func (fd *FileDescriptor) GetPackage() string {
- return fd.proto.GetPackage()
-}
-
-// GetParent always returns nil: files are the root of descriptor hierarchies.
-// Is it present to satisfy the Descriptor interface.
-func (fd *FileDescriptor) GetParent() Descriptor {
- return nil
-}
-
-// GetFile returns the receiver, which is a file descriptor. This is present
-// to satisfy the Descriptor interface.
-func (fd *FileDescriptor) GetFile() *FileDescriptor {
- return fd
-}
-
-// GetOptions returns the file's options. Most usages will be more interested
-// in GetFileOptions, which has a concrete return type. This generic version
-// is present to satisfy the Descriptor interface.
-func (fd *FileDescriptor) GetOptions() proto.Message {
- return fd.proto.GetOptions()
-}
-
-// GetFileOptions returns the file's options.
-func (fd *FileDescriptor) GetFileOptions() *dpb.FileOptions {
- return fd.proto.GetOptions()
-}
-
-// GetSourceInfo returns nil for files. It is present to satisfy the Descriptor
-// interface.
-func (fd *FileDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location {
- return nil
-}
-
-// AsProto returns the underlying descriptor proto. Most usages will be more
-// interested in AsFileDescriptorProto, which has a concrete return type. This
-// generic version is present to satisfy the Descriptor interface.
-func (fd *FileDescriptor) AsProto() proto.Message {
- return fd.proto
-}
-
-// AsFileDescriptorProto returns the underlying descriptor proto.
-func (fd *FileDescriptor) AsFileDescriptorProto() *dpb.FileDescriptorProto {
- return fd.proto
-}
-
-// String returns the underlying descriptor proto, in compact text format.
-func (fd *FileDescriptor) String() string {
- return fd.proto.String()
-}
-
-// IsProto3 returns true if the file declares a syntax of "proto3".
-func (fd *FileDescriptor) IsProto3() bool {
- return fd.isProto3
-}
-
-// GetDependencies returns all of this file's dependencies. These correspond to
-// import statements in the file.
-func (fd *FileDescriptor) GetDependencies() []*FileDescriptor {
- return fd.deps
-}
-
-// GetPublicDependencies returns all of this file's public dependencies. These
-// correspond to public import statements in the file.
-func (fd *FileDescriptor) GetPublicDependencies() []*FileDescriptor {
- return fd.publicDeps
-}
-
-// GetWeakDependencies returns all of this file's weak dependencies. These
-// correspond to weak import statements in the file.
-func (fd *FileDescriptor) GetWeakDependencies() []*FileDescriptor {
- return fd.weakDeps
-}
-
-// GetMessageTypes returns all top-level messages declared in this file.
-func (fd *FileDescriptor) GetMessageTypes() []*MessageDescriptor {
- return fd.messages
-}
-
-// GetEnumTypes returns all top-level enums declared in this file.
-func (fd *FileDescriptor) GetEnumTypes() []*EnumDescriptor {
- return fd.enums
-}
-
-// GetExtensions returns all top-level extensions declared in this file.
-func (fd *FileDescriptor) GetExtensions() []*FieldDescriptor {
- return fd.extensions
-}
-
-// GetServices returns all services declared in this file.
-func (fd *FileDescriptor) GetServices() []*ServiceDescriptor {
- return fd.services
-}
-
-// FindSymbol returns the descriptor contained within this file for the
-// element with the given fully-qualified symbol name. If no such element
-// exists then this method returns nil.
-func (fd *FileDescriptor) FindSymbol(symbol string) Descriptor {
- if symbol[0] == '.' {
- symbol = symbol[1:]
- }
- return fd.symbols[symbol]
-}
-
-// FindMessage finds the message with the given fully-qualified name. If no
-// such element exists in this file then nil is returned.
-func (fd *FileDescriptor) FindMessage(msgName string) *MessageDescriptor {
- if md, ok := fd.symbols[msgName].(*MessageDescriptor); ok {
- return md
- } else {
- return nil
- }
-}
-
-// FindEnum finds the enum with the given fully-qualified name. If no such
-// element exists in this file then nil is returned.
-func (fd *FileDescriptor) FindEnum(enumName string) *EnumDescriptor {
- if ed, ok := fd.symbols[enumName].(*EnumDescriptor); ok {
- return ed
- } else {
- return nil
- }
-}
-
-// FindService finds the service with the given fully-qualified name. If no
-// such element exists in this file then nil is returned.
-func (fd *FileDescriptor) FindService(serviceName string) *ServiceDescriptor {
- if sd, ok := fd.symbols[serviceName].(*ServiceDescriptor); ok {
- return sd
- } else {
- return nil
- }
-}
-
-// FindExtension finds the extension field for the given extended type name and
-// tag number. If no such element exists in this file then nil is returned.
-func (fd *FileDescriptor) FindExtension(extendeeName string, tagNumber int32) *FieldDescriptor {
- if exd, ok := fd.fieldIndex[extendeeName][tagNumber]; ok && exd.IsExtension() {
- return exd
- } else {
- return nil
- }
-}
-
-// FindExtensionByName finds the extension field with the given fully-qualified
-// name. If no such element exists in this file then nil is returned.
-func (fd *FileDescriptor) FindExtensionByName(extName string) *FieldDescriptor {
- if exd, ok := fd.symbols[extName].(*FieldDescriptor); ok && exd.IsExtension() {
- return exd
- } else {
- return nil
- }
-}
-
-// MessageDescriptor describes a protocol buffer message.
-type MessageDescriptor struct {
- proto *dpb.DescriptorProto
- parent Descriptor
- file *FileDescriptor
- fields []*FieldDescriptor
- nested []*MessageDescriptor
- enums []*EnumDescriptor
- extensions []*FieldDescriptor
- oneOfs []*OneOfDescriptor
- extRanges extRanges
- fqn string
- sourceInfoPath []int32
- jsonNames jsonNameMap
- isProto3 bool
- isMapEntry bool
-}
-
-func createMessageDescriptor(fd *FileDescriptor, parent Descriptor, enclosing string, md *dpb.DescriptorProto, symbols map[string]Descriptor) (*MessageDescriptor, string) {
- msgName := merge(enclosing, md.GetName())
- ret := &MessageDescriptor{proto: md, parent: parent, file: fd, fqn: msgName}
- for _, f := range md.GetField() {
- fld, n := createFieldDescriptor(fd, ret, msgName, f)
- symbols[n] = fld
- ret.fields = append(ret.fields, fld)
- }
- for _, nm := range md.NestedType {
- nmd, n := createMessageDescriptor(fd, ret, msgName, nm, symbols)
- symbols[n] = nmd
- ret.nested = append(ret.nested, nmd)
- }
- for _, e := range md.EnumType {
- ed, n := createEnumDescriptor(fd, ret, msgName, e, symbols)
- symbols[n] = ed
- ret.enums = append(ret.enums, ed)
- }
- for _, ex := range md.GetExtension() {
- exd, n := createFieldDescriptor(fd, ret, msgName, ex)
- symbols[n] = exd
- ret.extensions = append(ret.extensions, exd)
- }
- for i, o := range md.GetOneofDecl() {
- od, n := createOneOfDescriptor(fd, ret, i, msgName, o)
- symbols[n] = od
- ret.oneOfs = append(ret.oneOfs, od)
- }
- for _, r := range md.GetExtensionRange() {
- // proto.ExtensionRange is inclusive (and that's how extension ranges are defined in code).
- // but protoc converts range to exclusive end in descriptor, so we must convert back
- end := r.GetEnd() - 1
- ret.extRanges = append(ret.extRanges, proto.ExtensionRange{
- Start: r.GetStart(),
- End: end})
- }
- sort.Sort(ret.extRanges)
- ret.isProto3 = fd.isProto3
- ret.isMapEntry = md.GetOptions().GetMapEntry() &&
- len(ret.fields) == 2 &&
- ret.fields[0].GetNumber() == 1 &&
- ret.fields[1].GetNumber() == 2
-
- return ret, msgName
-}
-
-func (md *MessageDescriptor) resolve(path []int32, scopes []scope) error {
- md.sourceInfoPath = append([]int32(nil), path...) // defensive copy
- path = append(path, internal.Message_nestedMessagesTag)
- scopes = append(scopes, messageScope(md))
- for i, nmd := range md.nested {
- if err := nmd.resolve(append(path, int32(i)), scopes); err != nil {
- return err
- }
- }
- path[len(path)-1] = internal.Message_enumsTag
- for i, ed := range md.enums {
- ed.resolve(append(path, int32(i)))
- }
- path[len(path)-1] = internal.Message_fieldsTag
- for i, fld := range md.fields {
- if err := fld.resolve(append(path, int32(i)), scopes); err != nil {
- return err
- }
- }
- path[len(path)-1] = internal.Message_extensionsTag
- for i, exd := range md.extensions {
- if err := exd.resolve(append(path, int32(i)), scopes); err != nil {
- return err
- }
- }
- path[len(path)-1] = internal.Message_oneOfsTag
- for i, od := range md.oneOfs {
- od.resolve(append(path, int32(i)))
- }
- return nil
-}
-
-// GetName returns the simple (unqualified) name of the message.
-func (md *MessageDescriptor) GetName() string {
- return md.proto.GetName()
-}
-
-// GetFullyQualifiedName returns the fully qualified name of the message. This
-// includes the package name (if there is one) as well as the names of any
-// enclosing messages.
-func (md *MessageDescriptor) GetFullyQualifiedName() string {
- return md.fqn
-}
-
-// GetParent returns the message's enclosing descriptor. For top-level messages,
-// this will be a file descriptor. Otherwise it will be the descriptor for the
-// enclosing message.
-func (md *MessageDescriptor) GetParent() Descriptor {
- return md.parent
-}
-
-// GetFile returns the descriptor for the file in which this message is defined.
-func (md *MessageDescriptor) GetFile() *FileDescriptor {
- return md.file
-}
-
-// GetOptions returns the message's options. Most usages will be more interested
-// in GetMessageOptions, which has a concrete return type. This generic version
-// is present to satisfy the Descriptor interface.
-func (md *MessageDescriptor) GetOptions() proto.Message {
- return md.proto.GetOptions()
-}
-
-// GetMessageOptions returns the message's options.
-func (md *MessageDescriptor) GetMessageOptions() *dpb.MessageOptions {
- return md.proto.GetOptions()
-}
-
-// GetSourceInfo returns source info for the message, if present in the
-// descriptor. Not all descriptors will contain source info. If non-nil, the
-// returned info contains information about the location in the file where the
-// message was defined and also contains comments associated with the message
-// definition.
-func (md *MessageDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location {
- return md.file.sourceInfo.Get(md.sourceInfoPath)
-}
-
-// AsProto returns the underlying descriptor proto. Most usages will be more
-// interested in AsDescriptorProto, which has a concrete return type. This
-// generic version is present to satisfy the Descriptor interface.
-func (md *MessageDescriptor) AsProto() proto.Message {
- return md.proto
-}
-
-// AsDescriptorProto returns the underlying descriptor proto.
-func (md *MessageDescriptor) AsDescriptorProto() *dpb.DescriptorProto {
- return md.proto
-}
-
-// String returns the underlying descriptor proto, in compact text format.
-func (md *MessageDescriptor) String() string {
- return md.proto.String()
-}
-
-// IsMapEntry returns true if this is a synthetic message type that represents an entry
-// in a map field.
-func (md *MessageDescriptor) IsMapEntry() bool {
- return md.isMapEntry
-}
-
-// GetFields returns all of the fields for this message.
-func (md *MessageDescriptor) GetFields() []*FieldDescriptor {
- return md.fields
-}
-
-// GetNestedMessageTypes returns all of the message types declared inside this message.
-func (md *MessageDescriptor) GetNestedMessageTypes() []*MessageDescriptor {
- return md.nested
-}
-
-// GetNestedEnumTypes returns all of the enums declared inside this message.
-func (md *MessageDescriptor) GetNestedEnumTypes() []*EnumDescriptor {
- return md.enums
-}
-
-// GetNestedExtensions returns all of the extensions declared inside this message.
-func (md *MessageDescriptor) GetNestedExtensions() []*FieldDescriptor {
- return md.extensions
-}
-
-// GetOneOfs returns all of the one-of field sets declared inside this message.
-func (md *MessageDescriptor) GetOneOfs() []*OneOfDescriptor {
- return md.oneOfs
-}
-
-// IsProto3 returns true if the file in which this message is defined declares a syntax of "proto3".
-func (md *MessageDescriptor) IsProto3() bool {
- return md.isProto3
-}
-
-// GetExtensionRanges returns the ranges of extension field numbers for this message.
-func (md *MessageDescriptor) GetExtensionRanges() []proto.ExtensionRange {
- return md.extRanges
-}
-
-// IsExtendable returns true if this message has any extension ranges.
-func (md *MessageDescriptor) IsExtendable() bool {
- return len(md.extRanges) > 0
-}
-
-// IsExtension returns true if the given tag number is within any of this message's
-// extension ranges.
-func (md *MessageDescriptor) IsExtension(tagNumber int32) bool {
- return md.extRanges.IsExtension(tagNumber)
-}
-
-type extRanges []proto.ExtensionRange
-
-func (er extRanges) String() string {
- var buf bytes.Buffer
- first := true
- for _, r := range er {
- if first {
- first = false
- } else {
- buf.WriteString(",")
- }
- fmt.Fprintf(&buf, "%d..%d", r.Start, r.End)
- }
- return buf.String()
-}
-
-func (er extRanges) IsExtension(tagNumber int32) bool {
- i := sort.Search(len(er), func(i int) bool { return er[i].End >= tagNumber })
- return i < len(er) && tagNumber >= er[i].Start
-}
-
-func (er extRanges) Len() int {
- return len(er)
-}
-
-func (er extRanges) Less(i, j int) bool {
- return er[i].Start < er[j].Start
-}
-
-func (er extRanges) Swap(i, j int) {
- er[i], er[j] = er[j], er[i]
-}
-
-// FindFieldByName finds the field with the given name. If no such field exists
-// then nil is returned. Only regular fields are returned, not extensions.
-func (md *MessageDescriptor) FindFieldByName(fieldName string) *FieldDescriptor {
- fqn := fmt.Sprintf("%s.%s", md.fqn, fieldName)
- if fd, ok := md.file.symbols[fqn].(*FieldDescriptor); ok && !fd.IsExtension() {
- return fd
- } else {
- return nil
- }
-}
-
-// FindFieldByNumber finds the field with the given tag number. If no such field
-// exists then nil is returned. Only regular fields are returned, not extensions.
-func (md *MessageDescriptor) FindFieldByNumber(tagNumber int32) *FieldDescriptor {
- if fd, ok := md.file.fieldIndex[md.fqn][tagNumber]; ok && !fd.IsExtension() {
- return fd
- } else {
- return nil
- }
-}
-
-// FieldDescriptor describes a field of a protocol buffer message.
-type FieldDescriptor struct {
- proto *dpb.FieldDescriptorProto
- parent Descriptor
- owner *MessageDescriptor
- file *FileDescriptor
- oneOf *OneOfDescriptor
- msgType *MessageDescriptor
- enumType *EnumDescriptor
- fqn string
- sourceInfoPath []int32
- def memoizedDefault
- isMap bool
-}
-
-func createFieldDescriptor(fd *FileDescriptor, parent Descriptor, enclosing string, fld *dpb.FieldDescriptorProto) (*FieldDescriptor, string) {
- fldName := merge(enclosing, fld.GetName())
- ret := &FieldDescriptor{proto: fld, parent: parent, file: fd, fqn: fldName}
- if fld.GetExtendee() == "" {
- ret.owner = parent.(*MessageDescriptor)
- }
- // owner for extensions, field type (be it message or enum), and one-ofs get resolved later
- return ret, fldName
-}
-
-func (fd *FieldDescriptor) resolve(path []int32, scopes []scope) error {
- if fd.proto.OneofIndex != nil && fd.oneOf == nil {
- return fmt.Errorf("could not link field %s to one-of index %d", fd.fqn, *fd.proto.OneofIndex)
- }
- fd.sourceInfoPath = append([]int32(nil), path...) // defensive copy
- if fd.proto.GetType() == dpb.FieldDescriptorProto_TYPE_ENUM {
- if desc, err := resolve(fd.file, fd.proto.GetTypeName(), scopes); err != nil {
- return err
- } else {
- fd.enumType = desc.(*EnumDescriptor)
- }
- }
- if fd.proto.GetType() == dpb.FieldDescriptorProto_TYPE_MESSAGE || fd.proto.GetType() == dpb.FieldDescriptorProto_TYPE_GROUP {
- if desc, err := resolve(fd.file, fd.proto.GetTypeName(), scopes); err != nil {
- return err
- } else {
- fd.msgType = desc.(*MessageDescriptor)
- }
- }
- if fd.proto.GetExtendee() != "" {
- if desc, err := resolve(fd.file, fd.proto.GetExtendee(), scopes); err != nil {
- return err
- } else {
- fd.owner = desc.(*MessageDescriptor)
- }
- }
- fd.file.registerField(fd)
- fd.isMap = fd.proto.GetLabel() == dpb.FieldDescriptorProto_LABEL_REPEATED &&
- fd.proto.GetType() == dpb.FieldDescriptorProto_TYPE_MESSAGE &&
- fd.GetMessageType().IsMapEntry()
- return nil
-}
-
-func (fd *FieldDescriptor) determineDefault() interface{} {
- if fd.IsMap() {
- return map[interface{}]interface{}(nil)
- } else if fd.IsRepeated() {
- return []interface{}(nil)
- } else if fd.msgType != nil {
- return nil
- }
-
- proto3 := fd.file.isProto3
- if !proto3 {
- def := fd.AsFieldDescriptorProto().GetDefaultValue()
- if def != "" {
- ret := parseDefaultValue(fd, def)
- if ret != nil {
- return ret
- }
- // if we can't parse default value, fall-through to return normal default...
- }
- }
-
- switch fd.GetType() {
- case dpb.FieldDescriptorProto_TYPE_FIXED32,
- dpb.FieldDescriptorProto_TYPE_UINT32:
- return uint32(0)
- case dpb.FieldDescriptorProto_TYPE_SFIXED32,
- dpb.FieldDescriptorProto_TYPE_INT32,
- dpb.FieldDescriptorProto_TYPE_SINT32:
- return int32(0)
- case dpb.FieldDescriptorProto_TYPE_FIXED64,
- dpb.FieldDescriptorProto_TYPE_UINT64:
- return uint64(0)
- case dpb.FieldDescriptorProto_TYPE_SFIXED64,
- dpb.FieldDescriptorProto_TYPE_INT64,
- dpb.FieldDescriptorProto_TYPE_SINT64:
- return int64(0)
- case dpb.FieldDescriptorProto_TYPE_FLOAT:
- return float32(0.0)
- case dpb.FieldDescriptorProto_TYPE_DOUBLE:
- return float64(0.0)
- case dpb.FieldDescriptorProto_TYPE_BOOL:
- return false
- case dpb.FieldDescriptorProto_TYPE_BYTES:
- return []byte(nil)
- case dpb.FieldDescriptorProto_TYPE_STRING:
- return ""
- case dpb.FieldDescriptorProto_TYPE_ENUM:
- if proto3 {
- return int32(0)
- }
- enumVals := fd.GetEnumType().GetValues()
- if len(enumVals) > 0 {
- return enumVals[0].GetNumber()
- } else {
- return int32(0) // WTF?
- }
- default:
- panic(fmt.Sprintf("Unknown field type: %v", fd.GetType()))
- }
-}
-
-func parseDefaultValue(fd *FieldDescriptor, val string) interface{} {
- switch fd.GetType() {
- case dpb.FieldDescriptorProto_TYPE_ENUM:
- vd := fd.GetEnumType().FindValueByName(val)
- if vd != nil {
- return vd.GetNumber()
- }
- return nil
- case dpb.FieldDescriptorProto_TYPE_BOOL:
- if val == "true" {
- return true
- } else if val == "false" {
- return false
- }
- return nil
- case dpb.FieldDescriptorProto_TYPE_BYTES:
- return []byte(unescape(val))
- case dpb.FieldDescriptorProto_TYPE_STRING:
- return val
- case dpb.FieldDescriptorProto_TYPE_FLOAT:
- if f, err := strconv.ParseFloat(val, 32); err == nil {
- return float32(f)
- } else {
- return float32(0)
- }
- case dpb.FieldDescriptorProto_TYPE_DOUBLE:
- if f, err := strconv.ParseFloat(val, 64); err == nil {
- return f
- } else {
- return float64(0)
- }
- case dpb.FieldDescriptorProto_TYPE_INT32,
- dpb.FieldDescriptorProto_TYPE_SINT32,
- dpb.FieldDescriptorProto_TYPE_SFIXED32:
- if i, err := strconv.ParseInt(val, 10, 32); err == nil {
- return int32(i)
- } else {
- return int32(0)
- }
- case dpb.FieldDescriptorProto_TYPE_UINT32,
- dpb.FieldDescriptorProto_TYPE_FIXED32:
- if i, err := strconv.ParseUint(val, 10, 32); err == nil {
- return uint32(i)
- } else {
- return uint32(0)
- }
- case dpb.FieldDescriptorProto_TYPE_INT64,
- dpb.FieldDescriptorProto_TYPE_SINT64,
- dpb.FieldDescriptorProto_TYPE_SFIXED64:
- if i, err := strconv.ParseInt(val, 10, 64); err == nil {
- return i
- } else {
- return int64(0)
- }
- case dpb.FieldDescriptorProto_TYPE_UINT64,
- dpb.FieldDescriptorProto_TYPE_FIXED64:
- if i, err := strconv.ParseUint(val, 10, 64); err == nil {
- return i
- } else {
- return uint64(0)
- }
- default:
- return nil
- }
-}
-
-func unescape(s string) string {
- // protoc encodes default values for 'bytes' fields using C escaping,
- // so this function reverses that escaping
- out := make([]byte, 0, len(s))
- var buf [4]byte
- for len(s) > 0 {
- if s[0] != '\\' || len(s) < 2 {
- // not escape sequence, or too short to be well-formed escape
- out = append(out, s[0])
- s = s[1:]
- } else if s[1] == 'x' || s[1] == 'X' {
- n := matchPrefix(s[2:], 2, isHex)
- if n == 0 {
- // bad escape
- out = append(out, s[:2]...)
- s = s[2:]
- } else {
- c, err := strconv.ParseUint(s[2:2+n], 16, 8)
- if err != nil {
- // shouldn't really happen...
- out = append(out, s[:2+n]...)
- } else {
- out = append(out, byte(c))
- }
- s = s[2+n:]
- }
- } else if s[1] >= '0' && s[1] <= '7' {
- n := 1 + matchPrefix(s[2:], 2, isOctal)
- c, err := strconv.ParseUint(s[1:1+n], 8, 8)
- if err != nil || c > 0xff {
- out = append(out, s[:1+n]...)
- } else {
- out = append(out, byte(c))
- }
- s = s[1+n:]
- } else if s[1] == 'u' {
- if len(s) < 6 {
- // bad escape
- out = append(out, s...)
- s = s[len(s):]
- } else {
- c, err := strconv.ParseUint(s[2:6], 16, 16)
- if err != nil {
- // bad escape
- out = append(out, s[:6]...)
- } else {
- w := utf8.EncodeRune(buf[:], rune(c))
- out = append(out, buf[:w]...)
- }
- s = s[6:]
- }
- } else if s[1] == 'U' {
- if len(s) < 10 {
- // bad escape
- out = append(out, s...)
- s = s[len(s):]
- } else {
- c, err := strconv.ParseUint(s[2:10], 16, 32)
- if err != nil || c > 0x10ffff {
- // bad escape
- out = append(out, s[:10]...)
- } else {
- w := utf8.EncodeRune(buf[:], rune(c))
- out = append(out, buf[:w]...)
- }
- s = s[10:]
- }
- } else {
- switch s[1] {
- case 'a':
- out = append(out, '\a')
- 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')
- case 'v':
- out = append(out, '\v')
- case '\\':
- out = append(out, '\\')
- case '\'':
- out = append(out, '\'')
- case '"':
- out = append(out, '"')
- case '?':
- out = append(out, '?')
- default:
- // invalid escape, just copy it as-is
- out = append(out, s[:2]...)
- }
- s = s[2:]
- }
- }
- return string(out)
-}
-
-func isOctal(b byte) bool { return b >= '0' && b <= '7' }
-func isHex(b byte) bool {
- return (b >= '0' && b <= '9') || (b >= 'a' && b <= 'f') || (b >= 'A' && b <= 'F')
-}
-func matchPrefix(s string, limit int, fn func(byte) bool) int {
- l := len(s)
- if l > limit {
- l = limit
- }
- i := 0
- for ; i < l; i++ {
- if !fn(s[i]) {
- return i
- }
- }
- return i
-}
-
-// GetName returns the name of the field.
-func (fd *FieldDescriptor) GetName() string {
- return fd.proto.GetName()
-}
-
-// GetNumber returns the tag number of this field.
-func (fd *FieldDescriptor) GetNumber() int32 {
- return fd.proto.GetNumber()
-}
-
-// GetFullyQualifiedName returns the fully qualified name of the field. Unlike
-// GetName, this includes fully qualified name of the enclosing message for
-// regular fields.
-//
-// For extension fields, this includes the package (if there is one) as well as
-// any enclosing messages. The package and/or enclosing messages are for where
-// the extension is defined, not the message it extends.
-//
-// If this field is part of a one-of, the fully qualified name does *not*
-// include the name of the one-of, only of the enclosing message.
-func (fd *FieldDescriptor) GetFullyQualifiedName() string {
- return fd.fqn
-}
-
-// GetParent returns the fields's enclosing descriptor. For normal
-// (non-extension) fields, this is the enclosing message. For extensions, this
-// is the descriptor in which the extension is defined, not the message that is
-// extended. The parent for an extension may be a file descriptor or a message,
-// depending on where the extension is defined.
-func (fd *FieldDescriptor) GetParent() Descriptor {
- return fd.parent
-}
-
-// GetFile returns the descriptor for the file in which this field is defined.
-func (fd *FieldDescriptor) GetFile() *FileDescriptor {
- return fd.file
-}
-
-// GetOptions returns the field's options. Most usages will be more interested
-// in GetFieldOptions, which has a concrete return type. This generic version
-// is present to satisfy the Descriptor interface.
-func (fd *FieldDescriptor) GetOptions() proto.Message {
- return fd.proto.GetOptions()
-}
-
-// GetFieldOptions returns the field's options.
-func (fd *FieldDescriptor) GetFieldOptions() *dpb.FieldOptions {
- return fd.proto.GetOptions()
-}
-
-// GetSourceInfo returns source info for the field, if present in the
-// descriptor. Not all descriptors will contain source info. If non-nil, the
-// returned info contains information about the location in the file where the
-// field was defined and also contains comments associated with the field
-// definition.
-func (fd *FieldDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location {
- return fd.file.sourceInfo.Get(fd.sourceInfoPath)
-}
-
-// AsProto returns the underlying descriptor proto. Most usages will be more
-// interested in AsFieldDescriptorProto, which has a concrete return type. This
-// generic version is present to satisfy the Descriptor interface.
-func (fd *FieldDescriptor) AsProto() proto.Message {
- return fd.proto
-}
-
-// AsFieldDescriptorProto returns the underlying descriptor proto.
-func (fd *FieldDescriptor) AsFieldDescriptorProto() *dpb.FieldDescriptorProto {
- return fd.proto
-}
-
-// String returns the underlying descriptor proto, in compact text format.
-func (fd *FieldDescriptor) String() string {
- return fd.proto.String()
-}
-
-// GetJSONName returns the name of the field as referenced in the message's JSON
-// format.
-func (fd *FieldDescriptor) GetJSONName() string {
- if jsonName := fd.proto.GetJsonName(); jsonName != "" {
- return jsonName
- }
- return fd.proto.GetName()
-}
-
-// GetFullyQualifiedJSONName returns the JSON format name (same as GetJSONName),
-// but includes the fully qualified name of the enclosing message.
-//
-// If the field is an extension, it will return the package name (if there is
-// one) as well as the names of any enclosing messages. The package and/or
-// enclosing messages are for where the extension is defined, not the message it
-// extends.
-func (fd *FieldDescriptor) GetFullyQualifiedJSONName() string {
- parent := fd.GetParent()
- switch parent := parent.(type) {
- case *FileDescriptor:
- pkg := parent.GetPackage()
- if pkg == "" {
- return fd.GetJSONName()
- }
- return fmt.Sprintf("%s.%s", pkg, fd.GetJSONName())
- default:
- return fmt.Sprintf("%s.%s", parent.GetFullyQualifiedName(), fd.GetJSONName())
- }
-}
-
-// GetOwner returns the message type that this field belongs to. If this is a normal
-// field then this is the same as GetParent. But for extensions, this will be the
-// extendee message whereas GetParent refers to where the extension was declared.
-func (fd *FieldDescriptor) GetOwner() *MessageDescriptor {
- return fd.owner
-}
-
-// IsExtension returns true if this is an extension field.
-func (fd *FieldDescriptor) IsExtension() bool {
- return fd.proto.GetExtendee() != ""
-}
-
-// GetOneOf returns the one-of field set to which this field belongs. If this field
-// is not part of a one-of then this method returns nil.
-func (fd *FieldDescriptor) GetOneOf() *OneOfDescriptor {
- return fd.oneOf
-}
-
-// GetType returns the type of this field. If the type indicates an enum, the
-// enum type can be queried via GetEnumType. If the type indicates a message, the
-// message type can be queried via GetMessageType.
-func (fd *FieldDescriptor) GetType() dpb.FieldDescriptorProto_Type {
- return fd.proto.GetType()
-}
-
-// GetLabel returns the label for this field. The label can be required (proto2-only),
-// optional (default for proto3), or required.
-func (fd *FieldDescriptor) GetLabel() dpb.FieldDescriptorProto_Label {
- return fd.proto.GetLabel()
-}
-
-// IsRequired returns true if this field has the "required" label.
-func (fd *FieldDescriptor) IsRequired() bool {
- return fd.proto.GetLabel() == dpb.FieldDescriptorProto_LABEL_REQUIRED
-}
-
-// IsRepeated returns true if this field has the "repeated" label.
-func (fd *FieldDescriptor) IsRepeated() bool {
- return fd.proto.GetLabel() == dpb.FieldDescriptorProto_LABEL_REPEATED
-}
-
-// IsMap returns true if this is a map field. If so, it will have the "repeated"
-// label its type will be a message that represents a map entry. The map entry
-// message will have exactly two fields: tag #1 is the key and tag #2 is the value.
-func (fd *FieldDescriptor) IsMap() bool {
- return fd.isMap
-}
-
-// GetMapKeyType returns the type of the key field if this is a map field. If it is
-// not a map field, nil is returned.
-func (fd *FieldDescriptor) GetMapKeyType() *FieldDescriptor {
- if fd.isMap {
- return fd.msgType.FindFieldByNumber(int32(1))
- }
- return nil
-}
-
-// GetMapValueType returns the type of the value field if this is a map field. If it
-// is not a map field, nil is returned.
-func (fd *FieldDescriptor) GetMapValueType() *FieldDescriptor {
- if fd.isMap {
- return fd.msgType.FindFieldByNumber(int32(2))
- }
- return nil
-}
-
-// GetMessageType returns the type of this field if it is a message type. If
-// this field is not a message type, it returns nil.
-func (fd *FieldDescriptor) GetMessageType() *MessageDescriptor {
- return fd.msgType
-}
-
-// GetEnumType returns the type of this field if it is an enum type. If this
-// field is not an enum type, it returns nil.
-func (fd *FieldDescriptor) GetEnumType() *EnumDescriptor {
- return fd.enumType
-}
-
-// GetDefaultValue returns the default value for this field.
-//
-// If this field represents a message type, this method always returns nil (even though
-// for proto2 files, the default value should be a default instance of the message type).
-// If the field represents an enum type, this method returns an int32 corresponding to the
-// enum value. If this field is a map, it returns a nil map[interface{}]interface{}. If
-// this field is repeated (and not a map), it returns a nil []interface{}.
-//
-// Otherwise, it returns the declared default value for the field or a zero value, if no
-// default is declared or if the file is proto3. The type of said return value corresponds
-// to the type of the field:
-// +-------------------------+-----------+
-// | Declared Type | Go Type |
-// +-------------------------+-----------+
-// | int32, sint32, sfixed32 | int32 |
-// | int64, sint64, sfixed64 | int64 |
-// | uint32, fixed32 | uint32 |
-// | uint64, fixed64 | uint64 |
-// | float | float32 |
-// | double | double32 |
-// | bool | bool |
-// | string | string |
-// | bytes | []byte |
-// +-------------------------+-----------+
-func (fd *FieldDescriptor) GetDefaultValue() interface{} {
- return fd.getDefaultValue()
-}
-
-// EnumDescriptor describes an enum declared in a proto file.
-type EnumDescriptor struct {
- proto *dpb.EnumDescriptorProto
- parent Descriptor
- file *FileDescriptor
- values []*EnumValueDescriptor
- valuesByNum sortedValues
- fqn string
- sourceInfoPath []int32
-}
-
-func createEnumDescriptor(fd *FileDescriptor, parent Descriptor, enclosing string, ed *dpb.EnumDescriptorProto, symbols map[string]Descriptor) (*EnumDescriptor, string) {
- enumName := merge(enclosing, ed.GetName())
- ret := &EnumDescriptor{proto: ed, parent: parent, file: fd, fqn: enumName}
- for _, ev := range ed.GetValue() {
- evd, n := createEnumValueDescriptor(fd, ret, enumName, ev)
- symbols[n] = evd
- ret.values = append(ret.values, evd)
- }
- if len(ret.values) > 0 {
- ret.valuesByNum = make(sortedValues, len(ret.values))
- copy(ret.valuesByNum, ret.values)
- sort.Stable(ret.valuesByNum)
- }
- return ret, enumName
-}
-
-type sortedValues []*EnumValueDescriptor
-
-func (sv sortedValues) Len() int {
- return len(sv)
-}
-
-func (sv sortedValues) Less(i, j int) bool {
- return sv[i].GetNumber() < sv[j].GetNumber()
-}
-
-func (sv sortedValues) Swap(i, j int) {
- sv[i], sv[j] = sv[j], sv[i]
-}
-
-func (ed *EnumDescriptor) resolve(path []int32) {
- ed.sourceInfoPath = append([]int32(nil), path...) // defensive copy
- path = append(path, internal.Enum_valuesTag)
- for i, evd := range ed.values {
- evd.resolve(append(path, int32(i)))
- }
-}
-
-// GetName returns the simple (unqualified) name of the enum type.
-func (ed *EnumDescriptor) GetName() string {
- return ed.proto.GetName()
-}
-
-// GetFullyQualifiedName returns the fully qualified name of the enum type.
-// This includes the package name (if there is one) as well as the names of any
-// enclosing messages.
-func (ed *EnumDescriptor) GetFullyQualifiedName() string {
- return ed.fqn
-}
-
-// GetParent returns the enum type's enclosing descriptor. For top-level enums,
-// this will be a file descriptor. Otherwise it will be the descriptor for the
-// enclosing message.
-func (ed *EnumDescriptor) GetParent() Descriptor {
- return ed.parent
-}
-
-// GetFile returns the descriptor for the file in which this enum is defined.
-func (ed *EnumDescriptor) GetFile() *FileDescriptor {
- return ed.file
-}
-
-// GetOptions returns the enum type's options. Most usages will be more
-// interested in GetEnumOptions, which has a concrete return type. This generic
-// version is present to satisfy the Descriptor interface.
-func (ed *EnumDescriptor) GetOptions() proto.Message {
- return ed.proto.GetOptions()
-}
-
-// GetEnumOptions returns the enum type's options.
-func (ed *EnumDescriptor) GetEnumOptions() *dpb.EnumOptions {
- return ed.proto.GetOptions()
-}
-
-// GetSourceInfo returns source info for the enum type, if present in the
-// descriptor. Not all descriptors will contain source info. If non-nil, the
-// returned info contains information about the location in the file where the
-// enum type was defined and also contains comments associated with the enum
-// definition.
-func (ed *EnumDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location {
- return ed.file.sourceInfo.Get(ed.sourceInfoPath)
-}
-
-// AsProto returns the underlying descriptor proto. Most usages will be more
-// interested in AsEnumDescriptorProto, which has a concrete return type. This
-// generic version is present to satisfy the Descriptor interface.
-func (ed *EnumDescriptor) AsProto() proto.Message {
- return ed.proto
-}
-
-// AsEnumDescriptorProto returns the underlying descriptor proto.
-func (ed *EnumDescriptor) AsEnumDescriptorProto() *dpb.EnumDescriptorProto {
- return ed.proto
-}
-
-// String returns the underlying descriptor proto, in compact text format.
-func (ed *EnumDescriptor) String() string {
- return ed.proto.String()
-}
-
-// GetValues returns all of the allowed values defined for this enum.
-func (ed *EnumDescriptor) GetValues() []*EnumValueDescriptor {
- return ed.values
-}
-
-// FindValueByName finds the enum value with the given name. If no such value exists
-// then nil is returned.
-func (ed *EnumDescriptor) FindValueByName(name string) *EnumValueDescriptor {
- fqn := fmt.Sprintf("%s.%s", ed.fqn, name)
- if vd, ok := ed.file.symbols[fqn].(*EnumValueDescriptor); ok {
- return vd
- } else {
- return nil
- }
-}
-
-// FindValueByNumber finds the value with the given numeric value. If no such value
-// exists then nil is returned. If aliases are allowed and multiple values have the
-// given number, the first declared value is returned.
-func (ed *EnumDescriptor) FindValueByNumber(num int32) *EnumValueDescriptor {
- index := sort.Search(len(ed.valuesByNum), func(i int) bool { return ed.valuesByNum[i].GetNumber() >= num })
- if index < len(ed.valuesByNum) {
- vd := ed.valuesByNum[index]
- if vd.GetNumber() == num {
- return vd
- }
- }
- return nil
-}
-
-// EnumValueDescriptor describes an allowed value of an enum declared in a proto file.
-type EnumValueDescriptor struct {
- proto *dpb.EnumValueDescriptorProto
- parent *EnumDescriptor
- file *FileDescriptor
- fqn string
- sourceInfoPath []int32
-}
-
-func createEnumValueDescriptor(fd *FileDescriptor, parent *EnumDescriptor, enclosing string, evd *dpb.EnumValueDescriptorProto) (*EnumValueDescriptor, string) {
- valName := merge(enclosing, evd.GetName())
- return &EnumValueDescriptor{proto: evd, parent: parent, file: fd, fqn: valName}, valName
-}
-
-func (vd *EnumValueDescriptor) resolve(path []int32) {
- vd.sourceInfoPath = append([]int32(nil), path...) // defensive copy
-}
-
-// GetName returns the name of the enum value.
-func (vd *EnumValueDescriptor) GetName() string {
- return vd.proto.GetName()
-}
-
-// GetNumber returns the numeric value associated with this enum value.
-func (vd *EnumValueDescriptor) GetNumber() int32 {
- return vd.proto.GetNumber()
-}
-
-// GetFullyQualifiedName returns the fully qualified name of the enum value.
-// Unlike GetName, this includes fully qualified name of the enclosing enum.
-func (vd *EnumValueDescriptor) GetFullyQualifiedName() string {
- return vd.fqn
-}
-
-// GetParent returns the descriptor for the enum in which this enum value is
-// defined. Most usages will prefer to use GetEnum, which has a concrete return
-// type. This more generic method is present to satisfy the Descriptor interface.
-func (vd *EnumValueDescriptor) GetParent() Descriptor {
- return vd.parent
-}
-
-// GetEnum returns the enum in which this enum value is defined.
-func (vd *EnumValueDescriptor) GetEnum() *EnumDescriptor {
- return vd.parent
-}
-
-// GetFile returns the descriptor for the file in which this enum value is
-// defined.
-func (vd *EnumValueDescriptor) GetFile() *FileDescriptor {
- return vd.file
-}
-
-// GetOptions returns the enum value's options. Most usages will be more
-// interested in GetEnumValueOptions, which has a concrete return type. This
-// generic version is present to satisfy the Descriptor interface.
-func (vd *EnumValueDescriptor) GetOptions() proto.Message {
- return vd.proto.GetOptions()
-}
-
-// GetEnumValueOptions returns the enum value's options.
-func (vd *EnumValueDescriptor) GetEnumValueOptions() *dpb.EnumValueOptions {
- return vd.proto.GetOptions()
-}
-
-// GetSourceInfo returns source info for the enum value, if present in the
-// descriptor. Not all descriptors will contain source info. If non-nil, the
-// returned info contains information about the location in the file where the
-// enum value was defined and also contains comments associated with the enum
-// value definition.
-func (vd *EnumValueDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location {
- return vd.file.sourceInfo.Get(vd.sourceInfoPath)
-}
-
-// AsProto returns the underlying descriptor proto. Most usages will be more
-// interested in AsEnumValueDescriptorProto, which has a concrete return type.
-// This generic version is present to satisfy the Descriptor interface.
-func (vd *EnumValueDescriptor) AsProto() proto.Message {
- return vd.proto
-}
-
-// AsEnumValueDescriptorProto returns the underlying descriptor proto.
-func (vd *EnumValueDescriptor) AsEnumValueDescriptorProto() *dpb.EnumValueDescriptorProto {
- return vd.proto
-}
-
-// String returns the underlying descriptor proto, in compact text format.
-func (vd *EnumValueDescriptor) String() string {
- return vd.proto.String()
-}
-
-// ServiceDescriptor describes an RPC service declared in a proto file.
-type ServiceDescriptor struct {
- proto *dpb.ServiceDescriptorProto
- file *FileDescriptor
- methods []*MethodDescriptor
- fqn string
- sourceInfoPath []int32
-}
-
-func createServiceDescriptor(fd *FileDescriptor, enclosing string, sd *dpb.ServiceDescriptorProto, symbols map[string]Descriptor) (*ServiceDescriptor, string) {
- serviceName := merge(enclosing, sd.GetName())
- ret := &ServiceDescriptor{proto: sd, file: fd, fqn: serviceName}
- for _, m := range sd.GetMethod() {
- md, n := createMethodDescriptor(fd, ret, serviceName, m)
- symbols[n] = md
- ret.methods = append(ret.methods, md)
- }
- return ret, serviceName
-}
-
-func (sd *ServiceDescriptor) resolve(path []int32, scopes []scope) error {
- sd.sourceInfoPath = append([]int32(nil), path...) // defensive copy
- path = append(path, internal.Service_methodsTag)
- for i, md := range sd.methods {
- if err := md.resolve(append(path, int32(i)), scopes); err != nil {
- return err
- }
- }
- return nil
-}
-
-// GetName returns the simple (unqualified) name of the service.
-func (sd *ServiceDescriptor) GetName() string {
- return sd.proto.GetName()
-}
-
-// GetFullyQualifiedName returns the fully qualified name of the service. This
-// includes the package name (if there is one).
-func (sd *ServiceDescriptor) GetFullyQualifiedName() string {
- return sd.fqn
-}
-
-// GetParent returns the descriptor for the file in which this service is
-// defined. Most usages will prefer to use GetFile, which has a concrete return
-// type. This more generic method is present to satisfy the Descriptor interface.
-func (sd *ServiceDescriptor) GetParent() Descriptor {
- return sd.file
-}
-
-// GetFile returns the descriptor for the file in which this service is defined.
-func (sd *ServiceDescriptor) GetFile() *FileDescriptor {
- return sd.file
-}
-
-// GetOptions returns the service's options. Most usages will be more interested
-// in GetServiceOptions, which has a concrete return type. This generic version
-// is present to satisfy the Descriptor interface.
-func (sd *ServiceDescriptor) GetOptions() proto.Message {
- return sd.proto.GetOptions()
-}
-
-// GetServiceOptions returns the service's options.
-func (sd *ServiceDescriptor) GetServiceOptions() *dpb.ServiceOptions {
- return sd.proto.GetOptions()
-}
-
-// GetSourceInfo returns source info for the service, if present in the
-// descriptor. Not all descriptors will contain source info. If non-nil, the
-// returned info contains information about the location in the file where the
-// service was defined and also contains comments associated with the service
-// definition.
-func (sd *ServiceDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location {
- return sd.file.sourceInfo.Get(sd.sourceInfoPath)
-}
-
-// AsProto returns the underlying descriptor proto. Most usages will be more
-// interested in AsServiceDescriptorProto, which has a concrete return type.
-// This generic version is present to satisfy the Descriptor interface.
-func (sd *ServiceDescriptor) AsProto() proto.Message {
- return sd.proto
-}
-
-// AsServiceDescriptorProto returns the underlying descriptor proto.
-func (sd *ServiceDescriptor) AsServiceDescriptorProto() *dpb.ServiceDescriptorProto {
- return sd.proto
-}
-
-// String returns the underlying descriptor proto, in compact text format.
-func (sd *ServiceDescriptor) String() string {
- return sd.proto.String()
-}
-
-// GetMethods returns all of the RPC methods for this service.
-func (sd *ServiceDescriptor) GetMethods() []*MethodDescriptor {
- return sd.methods
-}
-
-// FindMethodByName finds the method with the given name. If no such method exists
-// then nil is returned.
-func (sd *ServiceDescriptor) FindMethodByName(name string) *MethodDescriptor {
- fqn := fmt.Sprintf("%s.%s", sd.fqn, name)
- if md, ok := sd.file.symbols[fqn].(*MethodDescriptor); ok {
- return md
- } else {
- return nil
- }
-}
-
-// MethodDescriptor describes an RPC method declared in a proto file.
-type MethodDescriptor struct {
- proto *dpb.MethodDescriptorProto
- parent *ServiceDescriptor
- file *FileDescriptor
- inType *MessageDescriptor
- outType *MessageDescriptor
- fqn string
- sourceInfoPath []int32
-}
-
-func createMethodDescriptor(fd *FileDescriptor, parent *ServiceDescriptor, enclosing string, md *dpb.MethodDescriptorProto) (*MethodDescriptor, string) {
- // request and response types get resolved later
- methodName := merge(enclosing, md.GetName())
- return &MethodDescriptor{proto: md, parent: parent, file: fd, fqn: methodName}, methodName
-}
-
-func (md *MethodDescriptor) resolve(path []int32, scopes []scope) error {
- md.sourceInfoPath = append([]int32(nil), path...) // defensive copy
- if desc, err := resolve(md.file, md.proto.GetInputType(), scopes); err != nil {
- return err
- } else {
- md.inType = desc.(*MessageDescriptor)
- }
- if desc, err := resolve(md.file, md.proto.GetOutputType(), scopes); err != nil {
- return err
- } else {
- md.outType = desc.(*MessageDescriptor)
- }
- return nil
-}
-
-// GetName returns the name of the method.
-func (md *MethodDescriptor) GetName() string {
- return md.proto.GetName()
-}
-
-// GetFullyQualifiedName returns the fully qualified name of the method. Unlike
-// GetName, this includes fully qualified name of the enclosing service.
-func (md *MethodDescriptor) GetFullyQualifiedName() string {
- return md.fqn
-}
-
-// GetParent returns the descriptor for the service in which this method is
-// defined. Most usages will prefer to use GetService, which has a concrete
-// return type. This more generic method is present to satisfy the Descriptor
-// interface.
-func (md *MethodDescriptor) GetParent() Descriptor {
- return md.parent
-}
-
-// GetService returns the RPC service in which this method is declared.
-func (md *MethodDescriptor) GetService() *ServiceDescriptor {
- return md.parent
-}
-
-// GetFile returns the descriptor for the file in which this method is defined.
-func (md *MethodDescriptor) GetFile() *FileDescriptor {
- return md.file
-}
-
-// GetOptions returns the method's options. Most usages will be more interested
-// in GetMethodOptions, which has a concrete return type. This generic version
-// is present to satisfy the Descriptor interface.
-func (md *MethodDescriptor) GetOptions() proto.Message {
- return md.proto.GetOptions()
-}
-
-// GetMethodOptions returns the method's options.
-func (md *MethodDescriptor) GetMethodOptions() *dpb.MethodOptions {
- return md.proto.GetOptions()
-}
-
-// GetSourceInfo returns source info for the method, if present in the
-// descriptor. Not all descriptors will contain source info. If non-nil, the
-// returned info contains information about the location in the file where the
-// method was defined and also contains comments associated with the method
-// definition.
-func (md *MethodDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location {
- return md.file.sourceInfo.Get(md.sourceInfoPath)
-}
-
-// AsProto returns the underlying descriptor proto. Most usages will be more
-// interested in AsMethodDescriptorProto, which has a concrete return type. This
-// generic version is present to satisfy the Descriptor interface.
-func (md *MethodDescriptor) AsProto() proto.Message {
- return md.proto
-}
-
-// AsMethodDescriptorProto returns the underlying descriptor proto.
-func (md *MethodDescriptor) AsMethodDescriptorProto() *dpb.MethodDescriptorProto {
- return md.proto
-}
-
-// String returns the underlying descriptor proto, in compact text format.
-func (md *MethodDescriptor) String() string {
- return md.proto.String()
-}
-
-// IsServerStreaming returns true if this is a server-streaming method.
-func (md *MethodDescriptor) IsServerStreaming() bool {
- return md.proto.GetServerStreaming()
-}
-
-// IsClientStreaming returns true if this is a client-streaming method.
-func (md *MethodDescriptor) IsClientStreaming() bool {
- return md.proto.GetClientStreaming()
-}
-
-// GetInputType returns the input type, or request type, of the RPC method.
-func (md *MethodDescriptor) GetInputType() *MessageDescriptor {
- return md.inType
-}
-
-// GetOutputType returns the output type, or response type, of the RPC method.
-func (md *MethodDescriptor) GetOutputType() *MessageDescriptor {
- return md.outType
-}
-
-// OneOfDescriptor describes a one-of field set declared in a protocol buffer message.
-type OneOfDescriptor struct {
- proto *dpb.OneofDescriptorProto
- parent *MessageDescriptor
- file *FileDescriptor
- choices []*FieldDescriptor
- fqn string
- sourceInfoPath []int32
-}
-
-func createOneOfDescriptor(fd *FileDescriptor, parent *MessageDescriptor, index int, enclosing string, od *dpb.OneofDescriptorProto) (*OneOfDescriptor, string) {
- oneOfName := merge(enclosing, od.GetName())
- ret := &OneOfDescriptor{proto: od, parent: parent, file: fd, fqn: oneOfName}
- for _, f := range parent.fields {
- oi := f.proto.OneofIndex
- if oi != nil && *oi == int32(index) {
- f.oneOf = ret
- ret.choices = append(ret.choices, f)
- }
- }
- return ret, oneOfName
-}
-
-func (od *OneOfDescriptor) resolve(path []int32) {
- od.sourceInfoPath = append([]int32(nil), path...) // defensive copy
-}
-
-// GetName returns the name of the one-of.
-func (od *OneOfDescriptor) GetName() string {
- return od.proto.GetName()
-}
-
-// GetFullyQualifiedName returns the fully qualified name of the one-of. Unlike
-// GetName, this includes fully qualified name of the enclosing message.
-func (od *OneOfDescriptor) GetFullyQualifiedName() string {
- return od.fqn
-}
-
-// GetParent returns the descriptor for the message in which this one-of is
-// defined. Most usages will prefer to use GetOwner, which has a concrete
-// return type. This more generic method is present to satisfy the Descriptor
-// interface.
-func (od *OneOfDescriptor) GetParent() Descriptor {
- return od.parent
-}
-
-// GetOwner returns the message to which this one-of field set belongs.
-func (od *OneOfDescriptor) GetOwner() *MessageDescriptor {
- return od.parent
-}
-
-// GetFile returns the descriptor for the file in which this one-fof is defined.
-func (od *OneOfDescriptor) GetFile() *FileDescriptor {
- return od.file
-}
-
-// GetOptions returns the one-of's options. Most usages will be more interested
-// in GetOneOfOptions, which has a concrete return type. This generic version
-// is present to satisfy the Descriptor interface.
-func (od *OneOfDescriptor) GetOptions() proto.Message {
- return od.proto.GetOptions()
-}
-
-// GetOneOfOptions returns the one-of's options.
-func (od *OneOfDescriptor) GetOneOfOptions() *dpb.OneofOptions {
- return od.proto.GetOptions()
-}
-
-// GetSourceInfo returns source info for the one-of, if present in the
-// descriptor. Not all descriptors will contain source info. If non-nil, the
-// returned info contains information about the location in the file where the
-// one-of was defined and also contains comments associated with the one-of
-// definition.
-func (od *OneOfDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location {
- return od.file.sourceInfo.Get(od.sourceInfoPath)
-}
-
-// AsProto returns the underlying descriptor proto. Most usages will be more
-// interested in AsOneofDescriptorProto, which has a concrete return type. This
-// generic version is present to satisfy the Descriptor interface.
-func (od *OneOfDescriptor) AsProto() proto.Message {
- return od.proto
-}
-
-// AsOneofDescriptorProto returns the underlying descriptor proto.
-func (od *OneOfDescriptor) AsOneofDescriptorProto() *dpb.OneofDescriptorProto {
- return od.proto
-}
-
-// String returns the underlying descriptor proto, in compact text format.
-func (od *OneOfDescriptor) String() string {
- return od.proto.String()
-}
-
-// GetChoices returns the fields that are part of the one-of field set. At most one of
-// these fields may be set for a given message.
-func (od *OneOfDescriptor) GetChoices() []*FieldDescriptor {
- return od.choices
-}
-
-// scope represents a lexical scope in a proto file in which messages and enums
-// can be declared.
-type scope func(string) Descriptor
-
-func fileScope(fd *FileDescriptor) scope {
- // we search symbols in this file, but also symbols in other files that have
- // the same package as this file or a "parent" package (in protobuf,
- // packages are a hierarchy like C++ namespaces)
- prefixes := internal.CreatePrefixList(fd.proto.GetPackage())
- return func(name string) Descriptor {
- for _, prefix := range prefixes {
- n := merge(prefix, name)
- d := findSymbol(fd, n, false)
- if d != nil {
- return d
- }
- }
- return nil
- }
-}
-
-func messageScope(md *MessageDescriptor) scope {
- return func(name string) Descriptor {
- n := merge(md.fqn, name)
- if d, ok := md.file.symbols[n]; ok {
- return d
- }
- return nil
- }
-}
-
-func resolve(fd *FileDescriptor, name string, scopes []scope) (Descriptor, error) {
- if strings.HasPrefix(name, ".") {
- // already fully-qualified
- d := findSymbol(fd, name[1:], false)
- if d != nil {
- return d, nil
- }
- } else {
- // unqualified, so we look in the enclosing (last) scope first and move
- // towards outermost (first) scope, trying to resolve the symbol
- for i := len(scopes) - 1; i >= 0; i-- {
- d := scopes[i](name)
- if d != nil {
- return d, nil
- }
- }
- }
- return nil, fmt.Errorf("file %q included an unresolvable reference to %q", fd.proto.GetName(), name)
-}
-
-func findSymbol(fd *FileDescriptor, name string, public bool) Descriptor {
- d := fd.symbols[name]
- if d != nil {
- return d
- }
-
- // When public = false, we are searching only directly imported symbols. But we
- // also need to search transitive public imports due to semantics of public imports.
- var deps []*FileDescriptor
- if public {
- deps = fd.publicDeps
- } else {
- deps = fd.deps
- }
- for _, dep := range deps {
- d = findSymbol(dep, name, true)
- if d != nil {
- return d
- }
- }
-
- return nil
-}
-
-func merge(a, b string) string {
- if a == "" {
- return b
- } else {
- return a + "." + b
- }
-}
diff --git a/vendor/github.com/jhump/protoreflect/desc/descriptor_no_unsafe.go b/vendor/github.com/jhump/protoreflect/desc/descriptor_no_unsafe.go
deleted file mode 100644
index cd7348e..0000000
--- a/vendor/github.com/jhump/protoreflect/desc/descriptor_no_unsafe.go
+++ /dev/null
@@ -1,31 +0,0 @@
-//+build appengine gopherjs purego
-// NB: other environments where unsafe is unappropriate should use "purego" build tag
-// https://github.com/golang/go/issues/23172
-
-package desc
-
-type jsonNameMap struct{}
-type memoizedDefault struct{}
-
-// FindFieldByJSONName finds the field with the given JSON field name. If no such
-// field exists then nil is returned. Only regular fields are returned, not
-// extensions.
-func (md *MessageDescriptor) FindFieldByJSONName(jsonName string) *FieldDescriptor {
- // NB: With allowed use of unsafe, we use it to atomically define an index
- // via atomic.LoadPointer/atomic.StorePointer. Without it, we skip the index
- // and do an linear scan of fields each time.
- for _, f := range md.fields {
- jn := f.proto.GetJsonName()
- if jn == "" {
- jn = f.proto.GetName()
- }
- if jn == jsonName {
- return f
- }
- }
- return nil
-}
-
-func (fd *FieldDescriptor) getDefaultValue() interface{} {
- return fd.determineDefault()
-}
diff --git a/vendor/github.com/jhump/protoreflect/desc/descriptor_unsafe.go b/vendor/github.com/jhump/protoreflect/desc/descriptor_unsafe.go
deleted file mode 100644
index 19b808d..0000000
--- a/vendor/github.com/jhump/protoreflect/desc/descriptor_unsafe.go
+++ /dev/null
@@ -1,60 +0,0 @@
-//+build !appengine,!gopherjs,!purego
-// NB: other environments where unsafe is unappropriate should use "purego" build tag
-// https://github.com/golang/go/issues/23172
-
-package desc
-
-import (
- "sync/atomic"
- "unsafe"
-)
-
-type jsonNameMap map[string]*FieldDescriptor // loaded/stored atomically via atomic+unsafe
-type memoizedDefault *interface{} // loaded/stored atomically via atomic+unsafe
-
-// FindFieldByJSONName finds the field with the given JSON field name. If no such
-// field exists then nil is returned. Only regular fields are returned, not
-// extensions.
-func (md *MessageDescriptor) FindFieldByJSONName(jsonName string) *FieldDescriptor {
- // NB: We don't want to eagerly index JSON names because many programs won't use it.
- // So we want to do it lazily, but also make sure the result is thread-safe. So we
- // atomically load/store the map as if it were a normal pointer. We don't use other
- // mechanisms -- like sync.Mutex, sync.RWMutex, sync.Once, or atomic.Value -- to
- // do this lazily because those types cannot be copied, and we'd rather not induce
- // 'go vet' errors in programs that use descriptors and try to copy them.
- // If multiple goroutines try to access the index at the same time, before it is
- // built, they will all end up computing the index redundantly. Future reads of
- // the index will use whatever was the "last one stored" by those racing goroutines.
- // Since building the index is deterministic, this is fine: all indices computed
- // will be the same.
- addrOfJsonNames := (*unsafe.Pointer)(unsafe.Pointer(&md.jsonNames))
- jsonNames := atomic.LoadPointer(addrOfJsonNames)
- var index map[string]*FieldDescriptor
- if jsonNames == nil {
- // slow path: compute the index
- index = map[string]*FieldDescriptor{}
- for _, f := range md.fields {
- jn := f.proto.GetJsonName()
- if jn == "" {
- jn = f.proto.GetName()
- }
- index[jn] = f
- }
- atomic.StorePointer(addrOfJsonNames, *(*unsafe.Pointer)(unsafe.Pointer(&index)))
- } else {
- *(*unsafe.Pointer)(unsafe.Pointer(&index)) = jsonNames
- }
- return index[jsonName]
-}
-
-func (fd *FieldDescriptor) getDefaultValue() interface{} {
- addrOfDef := (*unsafe.Pointer)(unsafe.Pointer(&fd.def))
- def := atomic.LoadPointer(addrOfDef)
- if def != nil {
- return *(*interface{})(def)
- }
- // slow path: compute the default, potentially involves decoding value
- d := fd.determineDefault()
- atomic.StorePointer(addrOfDef, (unsafe.Pointer(&d)))
- return d
-}
diff --git a/vendor/github.com/jhump/protoreflect/desc/doc.go b/vendor/github.com/jhump/protoreflect/desc/doc.go
deleted file mode 100644
index 1740dce..0000000
--- a/vendor/github.com/jhump/protoreflect/desc/doc.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Package desc contains "rich descriptors" for protocol buffers. The built-in
-// descriptor types are simple protobuf messages, each one representing a
-// different kind of element in the AST of a .proto source file.
-//
-// Because of this inherent "tree" quality, these build-in descriptors cannot
-// refer to their enclosing file descriptor. Nor can a field descriptor refer to
-// a message or enum descriptor that represents the field's type (for enum and
-// nested message fields). All such links must instead be stringly typed. This
-// limitation makes them much harder to use for doing interesting things with
-// reflection.
-//
-// Without this package, resolving references to types is particularly complex.
-// For example, resolving a field's type, the message type an extension extends,
-// or the request and response types of an RPC method all require searching
-// through symbols defined not only in the file in which these elements are
-// declared but also in its transitive closure of dependencies.
-//
-// "Rich descriptors" avoid the need to deal with the complexities described
-// above. A rich descriptor has all type references resolved and provides
-// methods to access other rich descriptors for all referenced elements. Each
-// rich descriptor has a usefully broad API, but does not try to mimic the full
-// interface of the underlying descriptor proto. Instead, every rich descriptor
-// provides access to that underlying proto, for extracting descriptor
-// properties that are not immediately accessible through rich descriptor's
-// methods.
-//
-// Rich descriptors can be accessed in similar ways as their "poor" cousins
-// (descriptor protos). Instead of using proto.FileDescriptor, use
-// desc.LoadFileDescriptor. Message descriptors and extension field descriptors
-// can also be easily accessed using desc.LoadMessageDescriptor and
-// desc.LoadFieldDescriptorForExtension, respectively.
-//
-// It is also possible create rich descriptors for proto messages that a given
-// Go program doesn't even know about. For example, they could be loaded from a
-// FileDescriptorSet file (which can be generated by protoc) or loaded from a
-// server. This enables interesting things like dynamic clients: where a Go
-// program can be an RPC client of a service it wasn't compiled to know about.
-//
-// Also see the grpcreflect, dynamic, and grpcdynamic packages in this same
-// repo to see just how useful rich descriptors really are.
-package desc
diff --git a/vendor/github.com/jhump/protoreflect/desc/imports.go b/vendor/github.com/jhump/protoreflect/desc/imports.go
deleted file mode 100644
index ab93032..0000000
--- a/vendor/github.com/jhump/protoreflect/desc/imports.go
+++ /dev/null
@@ -1,313 +0,0 @@
-package desc
-
-import (
- "fmt"
- "path/filepath"
- "reflect"
- "strings"
- "sync"
-
- "github.com/golang/protobuf/proto"
- dpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
-)
-
-var (
- globalImportPathConf map[string]string
- globalImportPathMu sync.RWMutex
-)
-
-// RegisterImportPath registers an alternate import path for a given registered
-// proto file path. For more details on why alternate import paths may need to
-// be configured, see ImportResolver.
-//
-// This method panics if provided invalid input. An empty importPath is invalid.
-// An un-registered registerPath is also invalid. For example, if an attempt is
-// made to register the import path "foo/bar.proto" as "bar.proto", but there is
-// no "bar.proto" registered in the Go protobuf runtime, this method will panic.
-// This method also panics if an attempt is made to register the same import
-// path more than once.
-//
-// This function works globally, applying to all descriptors loaded by this
-// package. If you instead want more granular support for handling alternate
-// import paths -- such as for a single invocation of a function in this
-// package or when the alternate path is only used from one file (so you don't
-// want the alternate path used when loading every other file), use an
-// ImportResolver instead.
-func RegisterImportPath(registerPath, importPath string) {
- if len(importPath) == 0 {
- panic("import path cannot be empty")
- }
- desc := proto.FileDescriptor(registerPath)
- if len(desc) == 0 {
- panic(fmt.Sprintf("path %q is not a registered proto file", registerPath))
- }
- globalImportPathMu.Lock()
- defer globalImportPathMu.Unlock()
- if reg := globalImportPathConf[importPath]; reg != "" {
- panic(fmt.Sprintf("import path %q already registered for %s", importPath, reg))
- }
- if globalImportPathConf == nil {
- globalImportPathConf = map[string]string{}
- }
- globalImportPathConf[importPath] = registerPath
-}
-
-// ResolveImport resolves the given import path. If it has been registered as an
-// alternate via RegisterImportPath, the registered path is returned. Otherwise,
-// the given import path is returned unchanged.
-func ResolveImport(importPath string) string {
- importPath = clean(importPath)
- globalImportPathMu.RLock()
- defer globalImportPathMu.RUnlock()
- reg := globalImportPathConf[importPath]
- if reg == "" {
- return importPath
- }
- return reg
-}
-
-// ImportResolver lets you work-around linking issues that are caused by
-// mismatches between how a particular proto source file is registered in the Go
-// protobuf runtime and how that same file is imported by other files. The file
-// is registered using the same relative path given to protoc when the file is
-// compiled (i.e. when Go code is generated). So if any file tries to import
-// that source file, but using a different relative path, then a link error will
-// occur when this package tries to load a descriptor for the importing file.
-//
-// For example, let's say we have two proto source files: "foo/bar.proto" and
-// "fubar/baz.proto". The latter imports the former using a line like so:
-// import "foo/bar.proto";
-// However, when protoc is invoked, the command-line args looks like so:
-// protoc -Ifoo/ --go_out=foo/ bar.proto
-// protoc -I./ -Ifubar/ --go_out=fubar/ baz.proto
-// Because the path given to protoc is just "bar.proto" and "baz.proto", this is
-// how they are registered in the Go protobuf runtime. So, when loading the
-// descriptor for "fubar/baz.proto", we'll see an import path of "foo/bar.proto"
-// but will find no file registered with that path:
-// fd, err := desc.LoadFileDescriptor("baz.proto")
-// // err will be non-nil, complaining that there is no such file
-// // found named "foo/bar.proto"
-//
-// This can be remedied by registering alternate import paths using an
-// ImportResolver. Continuing with the example above, the code below would fix
-// any link issue:
-// var r desc.ImportResolver
-// r.RegisterImportPath("bar.proto", "foo/bar.proto")
-// fd, err := r.LoadFileDescriptor("baz.proto")
-// // err will be nil; descriptor successfully loaded!
-//
-// If there are files that are *always* imported using a different relative
-// path then how they are registered, consider using the global
-// RegisterImportPath function, so you don't have to use an ImportResolver for
-// every file that imports it.
-type ImportResolver struct {
- children map[string]*ImportResolver
- importPaths map[string]string
-
- // By default, an ImportResolver will fallback to consulting any paths
- // registered via the top-level RegisterImportPath function. Setting this
- // field to true will cause the ImportResolver to skip that fallback and
- // only examine its own locally registered paths.
- SkipFallbackRules bool
-}
-
-// ResolveImport resolves the given import path in the context of the given
-// source file. If a matching alternate has been registered with this resolver
-// via a call to RegisterImportPath or RegisterImportPathFrom, then the
-// registered path is returned. Otherwise, the given import path is returned
-// unchanged.
-func (r *ImportResolver) ResolveImport(source, importPath string) string {
- if r != nil {
- res := r.resolveImport(clean(source), clean(importPath))
- if res != "" {
- return res
- }
- if r.SkipFallbackRules {
- return importPath
- }
- }
- return ResolveImport(importPath)
-}
-
-func (r *ImportResolver) resolveImport(source, importPath string) string {
- if source == "" {
- return r.importPaths[importPath]
- }
- var car, cdr string
- idx := strings.IndexRune(source, filepath.Separator)
- if idx < 0 {
- car, cdr = source, ""
- } else {
- car, cdr = source[:idx], source[idx+1:]
- }
- ch := r.children[car]
- if ch != nil {
- if reg := ch.resolveImport(cdr, importPath); reg != "" {
- return reg
- }
- }
- return r.importPaths[importPath]
-}
-
-// RegisterImportPath registers an alternate import path for a given registered
-// proto file path with this resolver. Any appearance of the given import path
-// when linking files will instead try to link the given registered path. If the
-// registered path cannot be located, then linking will fallback to the actual
-// imported path.
-//
-// This method will panic if given an empty path or if the same import path is
-// registered more than once.
-//
-// To constrain the contexts where the given import path is to be re-written,
-// use RegisterImportPathFrom instead.
-func (r *ImportResolver) RegisterImportPath(registerPath, importPath string) {
- r.RegisterImportPathFrom(registerPath, importPath, "")
-}
-
-// RegisterImportPathFrom registers an alternate import path for a given
-// registered proto file path with this resolver, but only for imports in the
-// specified source context.
-//
-// The source context can be the name of a folder or a proto source file. Any
-// appearance of the given import path in that context will instead try to link
-// the given registered path. To be in context, the file that is being linked
-// (i.e. the one whose import statement is being resolved) must be the same
-// relative path of the source context or be a sub-path (i.e. a descendant of
-// the source folder).
-//
-// If the registered path cannot be located, then linking will fallback to the
-// actual imported path.
-//
-// This method will panic if given an empty path. The source context, on the
-// other hand, is allowed to be blank. A blank source matches all files. This
-// method also panics if the same import path is registered in the same source
-// context more than once.
-func (r *ImportResolver) RegisterImportPathFrom(registerPath, importPath, source string) {
- importPath = clean(importPath)
- if len(importPath) == 0 {
- panic("import path cannot be empty")
- }
- registerPath = clean(registerPath)
- if len(registerPath) == 0 {
- panic("registered path cannot be empty")
- }
- r.registerImportPathFrom(registerPath, importPath, clean(source))
-}
-
-func (r *ImportResolver) registerImportPathFrom(registerPath, importPath, source string) {
- if source == "" {
- if r.importPaths == nil {
- r.importPaths = map[string]string{}
- } else if reg := r.importPaths[importPath]; reg != "" {
- panic(fmt.Sprintf("already registered import path %q as %q", importPath, registerPath))
- }
- r.importPaths[importPath] = registerPath
- return
- }
- var car, cdr string
- idx := strings.IndexRune(source, filepath.Separator)
- if idx < 0 {
- car, cdr = source, ""
- } else {
- car, cdr = source[:idx], source[idx+1:]
- }
- ch := r.children[car]
- if ch == nil {
- if r.children == nil {
- r.children = map[string]*ImportResolver{}
- }
- ch = &ImportResolver{}
- r.children[car] = ch
- }
- ch.registerImportPathFrom(registerPath, importPath, cdr)
-}
-
-// LoadFileDescriptor is the same as the package function of the same name, but
-// any alternate paths configured in this resolver are used when linking the
-// given descriptor proto.
-func (r *ImportResolver) LoadFileDescriptor(filePath string) (*FileDescriptor, error) {
- return loadFileDescriptor(filePath, r)
-}
-
-// LoadMessageDescriptor is the same as the package function of the same name,
-// but any alternate paths configured in this resolver are used when linking
-// files for the returned descriptor.
-func (r *ImportResolver) LoadMessageDescriptor(msgName string) (*MessageDescriptor, error) {
- return loadMessageDescriptor(msgName, r)
-}
-
-// LoadMessageDescriptorForMessage is the same as the package function of the
-// same name, but any alternate paths configured in this resolver are used when
-// linking files for the returned descriptor.
-func (r *ImportResolver) LoadMessageDescriptorForMessage(msg proto.Message) (*MessageDescriptor, error) {
- return loadMessageDescriptorForMessage(msg, r)
-}
-
-// LoadMessageDescriptorForType is the same as the package function of the same
-// name, but any alternate paths configured in this resolver are used when
-// linking files for the returned descriptor.
-func (r *ImportResolver) LoadMessageDescriptorForType(msgType reflect.Type) (*MessageDescriptor, error) {
- return loadMessageDescriptorForType(msgType, r)
-}
-
-// LoadEnumDescriptorForEnum is the same as the package function of the same
-// name, but any alternate paths configured in this resolver are used when
-// linking files for the returned descriptor.
-func (r *ImportResolver) LoadEnumDescriptorForEnum(enum protoEnum) (*EnumDescriptor, error) {
- return loadEnumDescriptorForEnum(enum, r)
-}
-
-// LoadEnumDescriptorForType is the same as the package function of the same
-// name, but any alternate paths configured in this resolver are used when
-// linking files for the returned descriptor.
-func (r *ImportResolver) LoadEnumDescriptorForType(enumType reflect.Type) (*EnumDescriptor, error) {
- return loadEnumDescriptorForType(enumType, r)
-}
-
-// LoadFieldDescriptorForExtension is the same as the package function of the
-// same name, but any alternate paths configured in this resolver are used when
-// linking files for the returned descriptor.
-func (r *ImportResolver) LoadFieldDescriptorForExtension(ext *proto.ExtensionDesc) (*FieldDescriptor, error) {
- return loadFieldDescriptorForExtension(ext, r)
-}
-
-// CreateFileDescriptor is the same as the package function of the same name,
-// but any alternate paths configured in this resolver are used when linking the
-// given descriptor proto.
-func (r *ImportResolver) CreateFileDescriptor(fdp *dpb.FileDescriptorProto, deps ...*FileDescriptor) (*FileDescriptor, error) {
- return createFileDescriptor(fdp, deps, r)
-}
-
-// CreateFileDescriptors is the same as the package function of the same name,
-// but any alternate paths configured in this resolver are used when linking the
-// given descriptor protos.
-func (r *ImportResolver) CreateFileDescriptors(fds []*dpb.FileDescriptorProto) (map[string]*FileDescriptor, error) {
- return createFileDescriptors(fds, r)
-}
-
-// CreateFileDescriptorFromSet is the same as the package function of the same
-// name, but any alternate paths configured in this resolver are used when
-// linking the descriptor protos in the given set.
-func (r *ImportResolver) CreateFileDescriptorFromSet(fds *dpb.FileDescriptorSet) (*FileDescriptor, error) {
- return createFileDescriptorFromSet(fds, r)
-}
-
-// CreateFileDescriptorsFromSet is the same as the package function of the same
-// name, but any alternate paths configured in this resolver are used when
-// linking the descriptor protos in the given set.
-func (r *ImportResolver) CreateFileDescriptorsFromSet(fds *dpb.FileDescriptorSet) (map[string]*FileDescriptor, error) {
- return createFileDescriptorsFromSet(fds, r)
-}
-
-const dotPrefix = "." + string(filepath.Separator)
-
-func clean(path string) string {
- if path == "" {
- return ""
- }
- path = filepath.Clean(path)
- if path == "." {
- return ""
- }
- return strings.TrimPrefix(path, dotPrefix)
-}
diff --git a/vendor/github.com/jhump/protoreflect/desc/internal/source_info.go b/vendor/github.com/jhump/protoreflect/desc/internal/source_info.go
deleted file mode 100644
index b4150b8..0000000
--- a/vendor/github.com/jhump/protoreflect/desc/internal/source_info.go
+++ /dev/null
@@ -1,107 +0,0 @@
-package internal
-
-import (
- dpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
-)
-
-// SourceInfoMap is a map of paths in a descriptor to the corresponding source
-// code info.
-type SourceInfoMap map[string][]*dpb.SourceCodeInfo_Location
-
-// Get returns the source code info for the given path. If there are
-// multiple locations for the same path, the first one is returned.
-func (m SourceInfoMap) Get(path []int32) *dpb.SourceCodeInfo_Location {
- v := m[asMapKey(path)]
- if len(v) > 0 {
- return v[0]
- }
- return nil
-}
-
-// GetAll returns all source code info for the given path.
-func (m SourceInfoMap) GetAll(path []int32) []*dpb.SourceCodeInfo_Location {
- return m[asMapKey(path)]
-}
-
-// Add stores the given source code info for the given path.
-func (m SourceInfoMap) Add(path []int32, loc *dpb.SourceCodeInfo_Location) {
- m[asMapKey(path)] = append(m[asMapKey(path)], loc)
-}
-
-// PutIfAbsent stores the given source code info for the given path only if the
-// given path does not exist in the map. This method returns true when the value
-// is stored, false if the path already exists.
-func (m SourceInfoMap) PutIfAbsent(path []int32, loc *dpb.SourceCodeInfo_Location) bool {
- k := asMapKey(path)
- if _, ok := m[k]; ok {
- return false
- }
- m[k] = []*dpb.SourceCodeInfo_Location{loc}
- return true
-}
-
-func asMapKey(slice []int32) string {
- // NB: arrays should be usable as map keys, but this does not
- // work due to a bug: https://github.com/golang/go/issues/22605
- //rv := reflect.ValueOf(slice)
- //arrayType := reflect.ArrayOf(rv.Len(), rv.Type().Elem())
- //array := reflect.New(arrayType).Elem()
- //reflect.Copy(array, rv)
- //return array.Interface()
-
- b := make([]byte, len(slice)*4)
- j := 0
- for _, s := range slice {
- b[j] = byte(s)
- b[j+1] = byte(s >> 8)
- b[j+2] = byte(s >> 16)
- b[j+3] = byte(s >> 24)
- j += 4
- }
- return string(b)
-}
-
-// CreateSourceInfoMap constructs a new SourceInfoMap and populates it with the
-// source code info in the given file descriptor proto.
-func CreateSourceInfoMap(fd *dpb.FileDescriptorProto) SourceInfoMap {
- res := SourceInfoMap{}
- PopulateSourceInfoMap(fd, res)
- return res
-}
-
-// PopulateSourceInfoMap populates the given SourceInfoMap with information from
-// the given file descriptor.
-func PopulateSourceInfoMap(fd *dpb.FileDescriptorProto, m SourceInfoMap) {
- for _, l := range fd.GetSourceCodeInfo().GetLocation() {
- m.Add(l.Path, l)
- }
-}
-
-// NB: This wonkiness allows desc.Descriptor impl to implement an interface that
-// is only usable from this package, by embedding a SourceInfoComputeFunc that
-// implements the actual logic (which must live in desc package to avoid a
-// dependency cycle).
-
-// SourceInfoComputer is a single method which will be invoked to recompute
-// source info. This is needed for the protoparse package, which needs to link
-// descriptors without source info in order to interpret options, but then needs
-// to re-compute source info after that interpretation so that final linked
-// descriptors expose the right info.
-type SourceInfoComputer interface {
- recomputeSourceInfo()
-}
-
-// SourceInfoComputeFunc is the type that a desc.Descriptor will embed. It will
-// be aliased in the desc package to an unexported name so it is not marked as
-// an exported field in reflection and not present in Go docs.
-type SourceInfoComputeFunc func()
-
-func (f SourceInfoComputeFunc) recomputeSourceInfo() {
- f()
-}
-
-// RecomputeSourceInfo is used to initiate recomputation of source info. This is
-// is used by the protoparse package, after it interprets options.
-func RecomputeSourceInfo(c SourceInfoComputer) {
- c.recomputeSourceInfo()
-}
diff --git a/vendor/github.com/jhump/protoreflect/desc/internal/util.go b/vendor/github.com/jhump/protoreflect/desc/internal/util.go
deleted file mode 100644
index 139c9cd..0000000
--- a/vendor/github.com/jhump/protoreflect/desc/internal/util.go
+++ /dev/null
@@ -1,270 +0,0 @@
-package internal
-
-import (
- "unicode"
- "unicode/utf8"
-)
-
-const (
- // MaxTag is the maximum allowed tag number for a field.
- MaxTag = 536870911 // 2^29 - 1
-
- // SpecialReservedStart is the first tag in a range that is reserved and not
- // allowed for use in message definitions.
- SpecialReservedStart = 19000
- // SpecialReservedEnd is the last tag in a range that is reserved and not
- // allowed for use in message definitions.
- SpecialReservedEnd = 19999
-
- // NB: It would be nice to use constants from generated code instead of
- // hard-coding these here. But code-gen does not emit these as constants
- // anywhere. The only places they appear in generated code are struct tags
- // on fields of the generated descriptor protos.
-
- // File_packageTag is the tag number of the package element in a file
- // descriptor proto.
- File_packageTag = 2
- // File_dependencyTag is the tag number of the dependencies element in a
- // file descriptor proto.
- File_dependencyTag = 3
- // File_messagesTag is the tag number of the messages element in a file
- // descriptor proto.
- File_messagesTag = 4
- // File_enumsTag is the tag number of the enums element in a file descriptor
- // proto.
- File_enumsTag = 5
- // File_servicesTag is the tag number of the services element in a file
- // descriptor proto.
- File_servicesTag = 6
- // File_extensionsTag is the tag number of the extensions element in a file
- // descriptor proto.
- File_extensionsTag = 7
- // File_optionsTag is the tag number of the options element in a file
- // descriptor proto.
- File_optionsTag = 8
- // File_syntaxTag is the tag number of the syntax element in a file
- // descriptor proto.
- File_syntaxTag = 12
- // Message_nameTag is the tag number of the name element in a message
- // descriptor proto.
- Message_nameTag = 1
- // Message_fieldsTag is the tag number of the fields element in a message
- // descriptor proto.
- Message_fieldsTag = 2
- // Message_nestedMessagesTag is the tag number of the nested messages
- // element in a message descriptor proto.
- Message_nestedMessagesTag = 3
- // Message_enumsTag is the tag number of the enums element in a message
- // descriptor proto.
- Message_enumsTag = 4
- // Message_extensionRangeTag is the tag number of the extension ranges
- // element in a message descriptor proto.
- Message_extensionRangeTag = 5
- // Message_extensionsTag is the tag number of the extensions element in a
- // message descriptor proto.
- Message_extensionsTag = 6
- // Message_optionsTag is the tag number of the options element in a message
- // descriptor proto.
- Message_optionsTag = 7
- // Message_oneOfsTag is the tag number of the one-ofs element in a message
- // descriptor proto.
- Message_oneOfsTag = 8
- // Message_reservedRangeTag is the tag number of the reserved ranges element
- // in a message descriptor proto.
- Message_reservedRangeTag = 9
- // Message_reservedNameTag is the tag number of the reserved names element
- // in a message descriptor proto.
- Message_reservedNameTag = 10
- // ExtensionRange_startTag is the tag number of the start index in an
- // extension range proto.
- ExtensionRange_startTag = 1
- // ExtensionRange_endTag is the tag number of the end index in an
- // extension range proto.
- ExtensionRange_endTag = 2
- // ExtensionRange_optionsTag is the tag number of the options element in an
- // extension range proto.
- ExtensionRange_optionsTag = 3
- // ReservedRange_startTag is the tag number of the start index in a reserved
- // range proto.
- ReservedRange_startTag = 1
- // ReservedRange_endTag is the tag number of the end index in a reserved
- // range proto.
- ReservedRange_endTag = 2
- // Field_nameTag is the tag number of the name element in a field descriptor
- // proto.
- Field_nameTag = 1
- // Field_extendeeTag is the tag number of the extendee element in a field
- // descriptor proto.
- Field_extendeeTag = 2
- // Field_numberTag is the tag number of the number element in a field
- // descriptor proto.
- Field_numberTag = 3
- // Field_labelTag is the tag number of the label element in a field
- // descriptor proto.
- Field_labelTag = 4
- // Field_typeTag is the tag number of the type element in a field descriptor
- // proto.
- Field_typeTag = 5
- // Field_typeNameTag is the tag number of the type name element in a field
- // descriptor proto.
- Field_typeNameTag = 6
- // Field_defaultTag is the tag number of the default value element in a
- // field descriptor proto.
- Field_defaultTag = 7
- // Field_optionsTag is the tag number of the options element in a field
- // descriptor proto.
- Field_optionsTag = 8
- // Field_jsonNameTag is the tag number of the JSON name element in a field
- // descriptor proto.
- Field_jsonNameTag = 10
- // OneOf_nameTag is the tag number of the name element in a one-of
- // descriptor proto.
- OneOf_nameTag = 1
- // OneOf_optionsTag is the tag number of the options element in a one-of
- // descriptor proto.
- OneOf_optionsTag = 2
- // Enum_nameTag is the tag number of the name element in an enum descriptor
- // proto.
- Enum_nameTag = 1
- // Enum_valuesTag is the tag number of the values element in an enum
- // descriptor proto.
- Enum_valuesTag = 2
- // Enum_optionsTag is the tag number of the options element in an enum
- // descriptor proto.
- Enum_optionsTag = 3
- // Enum_reservedRangeTag is the tag number of the reserved ranges element in
- // an enum descriptor proto.
- Enum_reservedRangeTag = 4
- // Enum_reservedNameTag is the tag number of the reserved names element in
- // an enum descriptor proto.
- Enum_reservedNameTag = 5
- // EnumVal_nameTag is the tag number of the name element in an enum value
- // descriptor proto.
- EnumVal_nameTag = 1
- // EnumVal_numberTag is the tag number of the number element in an enum
- // value descriptor proto.
- EnumVal_numberTag = 2
- // EnumVal_optionsTag is the tag number of the options element in an enum
- // value descriptor proto.
- EnumVal_optionsTag = 3
- // Service_nameTag is the tag number of the name element in a service
- // descriptor proto.
- Service_nameTag = 1
- // Service_methodsTag is the tag number of the methods element in a service
- // descriptor proto.
- Service_methodsTag = 2
- // Service_optionsTag is the tag number of the options element in a service
- // descriptor proto.
- Service_optionsTag = 3
- // Method_nameTag is the tag number of the name element in a method
- // descriptor proto.
- Method_nameTag = 1
- // Method_inputTag is the tag number of the input type element in a method
- // descriptor proto.
- Method_inputTag = 2
- // Method_outputTag is the tag number of the output type element in a method
- // descriptor proto.
- Method_outputTag = 3
- // Method_optionsTag is the tag number of the options element in a method
- // descriptor proto.
- Method_optionsTag = 4
- // Method_inputStreamTag is the tag number of the input stream flag in a
- // method descriptor proto.
- Method_inputStreamTag = 5
- // Method_outputStreamTag is the tag number of the output stream flag in a
- // method descriptor proto.
- Method_outputStreamTag = 6
-
- // UninterpretedOptionsTag is the tag number of the uninterpreted options
- // element. All *Options messages use the same tag for the field that stores
- // uninterpreted options.
- UninterpretedOptionsTag = 999
-
- // Uninterpreted_nameTag is the tag number of the name element in an
- // uninterpreted options proto.
- Uninterpreted_nameTag = 2
- // Uninterpreted_identTag is the tag number of the identifier value in an
- // uninterpreted options proto.
- Uninterpreted_identTag = 3
- // Uninterpreted_posIntTag is the tag number of the positive int value in an
- // uninterpreted options proto.
- Uninterpreted_posIntTag = 4
- // Uninterpreted_negIntTag is the tag number of the negative int value in an
- // uninterpreted options proto.
- Uninterpreted_negIntTag = 5
- // Uninterpreted_doubleTag is the tag number of the double value in an
- // uninterpreted options proto.
- Uninterpreted_doubleTag = 6
- // Uninterpreted_stringTag is the tag number of the string value in an
- // uninterpreted options proto.
- Uninterpreted_stringTag = 7
- // Uninterpreted_aggregateTag is the tag number of the aggregate value in an
- // uninterpreted options proto.
- Uninterpreted_aggregateTag = 8
- // UninterpretedName_nameTag is the tag number of the name element in an
- // uninterpreted option name proto.
- UninterpretedName_nameTag = 1
-)
-
-// JsonName returns the default JSON name for a field with the given name.
-func JsonName(name string) string {
- var js []rune
- nextUpper := false
- for i, r := range name {
- if r == '_' {
- nextUpper = true
- continue
- }
- if i == 0 {
- js = append(js, r)
- } else if nextUpper {
- nextUpper = false
- js = append(js, unicode.ToUpper(r))
- } else {
- js = append(js, r)
- }
- }
- return string(js)
-}
-
-// InitCap returns the given field name, but with the first letter capitalized.
-func InitCap(name string) string {
- r, sz := utf8.DecodeRuneInString(name)
- return string(unicode.ToUpper(r)) + name[sz:]
-}
-
-// CreatePrefixList returns a list of package prefixes to search when resolving
-// a symbol name. If the given package is blank, it returns only the empty
-// string. If the given package contains only one token, e.g. "foo", it returns
-// that token and the empty string, e.g. ["foo", ""]. Otherwise, it returns
-// successively shorter prefixes of the package and then the empty string. For
-// example, for a package named "foo.bar.baz" it will return the following list:
-// ["foo.bar.baz", "foo.bar", "foo", ""]
-func CreatePrefixList(pkg string) []string {
- if pkg == "" {
- return []string{""}
- }
-
- numDots := 0
- // one pass to pre-allocate the returned slice
- for i := 0; i < len(pkg); i++ {
- if pkg[i] == '.' {
- numDots++
- }
- }
- if numDots == 0 {
- return []string{pkg, ""}
- }
-
- prefixes := make([]string, numDots+2)
- // second pass to fill in returned slice
- for i := 0; i < len(pkg); i++ {
- if pkg[i] == '.' {
- prefixes[numDots] = pkg[:i]
- numDots--
- }
- }
- prefixes[0] = pkg
-
- return prefixes
-}
diff --git a/vendor/github.com/jhump/protoreflect/desc/load.go b/vendor/github.com/jhump/protoreflect/desc/load.go
deleted file mode 100644
index 4a05830..0000000
--- a/vendor/github.com/jhump/protoreflect/desc/load.go
+++ /dev/null
@@ -1,341 +0,0 @@
-package desc
-
-import (
- "fmt"
- "reflect"
- "sync"
-
- "github.com/golang/protobuf/proto"
- dpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
-
- "github.com/jhump/protoreflect/internal"
-)
-
-var (
- cacheMu sync.RWMutex
- filesCache = map[string]*FileDescriptor{}
- messagesCache = map[string]*MessageDescriptor{}
- enumCache = map[reflect.Type]*EnumDescriptor{}
-)
-
-// LoadFileDescriptor creates a file descriptor using the bytes returned by
-// proto.FileDescriptor. Descriptors are cached so that they do not need to be
-// re-processed if the same file is fetched again later.
-func LoadFileDescriptor(file string) (*FileDescriptor, error) {
- return loadFileDescriptor(file, nil)
-}
-
-func loadFileDescriptor(file string, r *ImportResolver) (*FileDescriptor, error) {
- f := getFileFromCache(file)
- if f != nil {
- return f, nil
- }
- cacheMu.Lock()
- defer cacheMu.Unlock()
- return loadFileDescriptorLocked(file, r)
-}
-
-func loadFileDescriptorLocked(file string, r *ImportResolver) (*FileDescriptor, error) {
- f := filesCache[file]
- if f != nil {
- return f, nil
- }
- fd, err := internal.LoadFileDescriptor(file)
- if err != nil {
- return nil, err
- }
-
- f, err = toFileDescriptorLocked(fd, r)
- if err != nil {
- return nil, err
- }
- putCacheLocked(file, f)
- return f, nil
-}
-
-func toFileDescriptorLocked(fd *dpb.FileDescriptorProto, r *ImportResolver) (*FileDescriptor, error) {
- deps := make([]*FileDescriptor, len(fd.GetDependency()))
- for i, dep := range fd.GetDependency() {
- resolvedDep := r.ResolveImport(fd.GetName(), dep)
- var err error
- deps[i], err = loadFileDescriptorLocked(resolvedDep, r)
- if _, ok := err.(internal.ErrNoSuchFile); ok && resolvedDep != dep {
- // try original path
- deps[i], err = loadFileDescriptorLocked(dep, r)
- }
- if err != nil {
- return nil, err
- }
- }
- return CreateFileDescriptor(fd, deps...)
-}
-
-func getFileFromCache(file string) *FileDescriptor {
- cacheMu.RLock()
- defer cacheMu.RUnlock()
- return filesCache[file]
-}
-
-func putCacheLocked(filename string, fd *FileDescriptor) {
- filesCache[filename] = fd
- putMessageCacheLocked(fd.messages)
-}
-
-func putMessageCacheLocked(mds []*MessageDescriptor) {
- for _, md := range mds {
- messagesCache[md.fqn] = md
- putMessageCacheLocked(md.nested)
- }
-}
-
-// interface implemented by generated messages, which all have a Descriptor() method in
-// addition to the methods of proto.Message
-type protoMessage interface {
- proto.Message
- Descriptor() ([]byte, []int)
-}
-
-// LoadMessageDescriptor loads descriptor using the encoded descriptor proto returned by
-// Message.Descriptor() for the given message type. If the given type is not recognized,
-// then a nil descriptor is returned.
-func LoadMessageDescriptor(message string) (*MessageDescriptor, error) {
- return loadMessageDescriptor(message, nil)
-}
-
-func loadMessageDescriptor(message string, r *ImportResolver) (*MessageDescriptor, error) {
- m := getMessageFromCache(message)
- if m != nil {
- return m, nil
- }
-
- pt := proto.MessageType(message)
- if pt == nil {
- return nil, nil
- }
- msg, err := messageFromType(pt)
- if err != nil {
- return nil, err
- }
-
- cacheMu.Lock()
- defer cacheMu.Unlock()
- return loadMessageDescriptorForTypeLocked(message, msg, r)
-}
-
-// LoadMessageDescriptorForType loads descriptor using the encoded descriptor proto returned
-// by message.Descriptor() for the given message type. If the given type is not recognized,
-// then a nil descriptor is returned.
-func LoadMessageDescriptorForType(messageType reflect.Type) (*MessageDescriptor, error) {
- return loadMessageDescriptorForType(messageType, nil)
-}
-
-func loadMessageDescriptorForType(messageType reflect.Type, r *ImportResolver) (*MessageDescriptor, error) {
- m, err := messageFromType(messageType)
- if err != nil {
- return nil, err
- }
- return loadMessageDescriptorForMessage(m, r)
-}
-
-// LoadMessageDescriptorForMessage loads descriptor using the encoded descriptor proto
-// returned by message.Descriptor(). If the given type is not recognized, then a nil
-// descriptor is returned.
-func LoadMessageDescriptorForMessage(message proto.Message) (*MessageDescriptor, error) {
- return loadMessageDescriptorForMessage(message, nil)
-}
-
-func loadMessageDescriptorForMessage(message proto.Message, r *ImportResolver) (*MessageDescriptor, error) {
- // efficiently handle dynamic messages
- type descriptorable interface {
- GetMessageDescriptor() *MessageDescriptor
- }
- if d, ok := message.(descriptorable); ok {
- return d.GetMessageDescriptor(), nil
- }
-
- name := proto.MessageName(message)
- if name == "" {
- return nil, nil
- }
- m := getMessageFromCache(name)
- if m != nil {
- return m, nil
- }
-
- cacheMu.Lock()
- defer cacheMu.Unlock()
- return loadMessageDescriptorForTypeLocked(name, message.(protoMessage), nil)
-}
-
-func messageFromType(mt reflect.Type) (protoMessage, error) {
- if mt.Kind() != reflect.Ptr {
- mt = reflect.PtrTo(mt)
- }
- m, ok := reflect.Zero(mt).Interface().(protoMessage)
- if !ok {
- return nil, fmt.Errorf("failed to create message from type: %v", mt)
- }
- return m, nil
-}
-
-func loadMessageDescriptorForTypeLocked(name string, message protoMessage, r *ImportResolver) (*MessageDescriptor, error) {
- m := messagesCache[name]
- if m != nil {
- return m, nil
- }
-
- fdb, _ := message.Descriptor()
- fd, err := internal.DecodeFileDescriptor(name, fdb)
- if err != nil {
- return nil, err
- }
-
- f, err := toFileDescriptorLocked(fd, r)
- if err != nil {
- return nil, err
- }
- putCacheLocked(fd.GetName(), f)
- return f.FindSymbol(name).(*MessageDescriptor), nil
-}
-
-func getMessageFromCache(message string) *MessageDescriptor {
- cacheMu.RLock()
- defer cacheMu.RUnlock()
- return messagesCache[message]
-}
-
-// interface implemented by all generated enums
-type protoEnum interface {
- EnumDescriptor() ([]byte, []int)
-}
-
-// NB: There is no LoadEnumDescriptor that takes a fully-qualified enum name because
-// it is not useful since protoc-gen-go does not expose the name anywhere in generated
-// code or register it in a way that is it accessible for reflection code. This also
-// means we have to cache enum descriptors differently -- we can only cache them as
-// they are requested, as opposed to caching all enum types whenever a file descriptor
-// is cached. This is because we need to know the generated type of the enums, and we
-// don't know that at the time of caching file descriptors.
-
-// LoadEnumDescriptorForType loads descriptor using the encoded descriptor proto returned
-// by enum.EnumDescriptor() for the given enum type.
-func LoadEnumDescriptorForType(enumType reflect.Type) (*EnumDescriptor, error) {
- return loadEnumDescriptorForType(enumType, nil)
-}
-
-func loadEnumDescriptorForType(enumType reflect.Type, r *ImportResolver) (*EnumDescriptor, error) {
- // we cache descriptors using non-pointer type
- if enumType.Kind() == reflect.Ptr {
- enumType = enumType.Elem()
- }
- e := getEnumFromCache(enumType)
- if e != nil {
- return e, nil
- }
- enum, err := enumFromType(enumType)
- if err != nil {
- return nil, err
- }
-
- cacheMu.Lock()
- defer cacheMu.Unlock()
- return loadEnumDescriptorForTypeLocked(enumType, enum, r)
-}
-
-// LoadEnumDescriptorForEnum loads descriptor using the encoded descriptor proto
-// returned by enum.EnumDescriptor().
-func LoadEnumDescriptorForEnum(enum protoEnum) (*EnumDescriptor, error) {
- return loadEnumDescriptorForEnum(enum, nil)
-}
-
-func loadEnumDescriptorForEnum(enum protoEnum, r *ImportResolver) (*EnumDescriptor, error) {
- et := reflect.TypeOf(enum)
- // we cache descriptors using non-pointer type
- if et.Kind() == reflect.Ptr {
- et = et.Elem()
- enum = reflect.Zero(et).Interface().(protoEnum)
- }
- e := getEnumFromCache(et)
- if e != nil {
- return e, nil
- }
-
- cacheMu.Lock()
- defer cacheMu.Unlock()
- return loadEnumDescriptorForTypeLocked(et, enum, r)
-}
-
-func enumFromType(et reflect.Type) (protoEnum, error) {
- if et.Kind() != reflect.Int32 {
- et = reflect.PtrTo(et)
- }
- e, ok := reflect.Zero(et).Interface().(protoEnum)
- if !ok {
- return nil, fmt.Errorf("failed to create enum from type: %v", et)
- }
- return e, nil
-}
-
-func loadEnumDescriptorForTypeLocked(et reflect.Type, enum protoEnum, r *ImportResolver) (*EnumDescriptor, error) {
- e := enumCache[et]
- if e != nil {
- return e, nil
- }
-
- fdb, path := enum.EnumDescriptor()
- name := fmt.Sprintf("%v", et)
- fd, err := internal.DecodeFileDescriptor(name, fdb)
- if err != nil {
- return nil, err
- }
- // see if we already have cached "rich" descriptor
- f, ok := filesCache[fd.GetName()]
- if !ok {
- f, err = toFileDescriptorLocked(fd, r)
- if err != nil {
- return nil, err
- }
- putCacheLocked(fd.GetName(), f)
- }
-
- ed := findEnum(f, path)
- enumCache[et] = ed
- return ed, nil
-}
-
-func getEnumFromCache(et reflect.Type) *EnumDescriptor {
- cacheMu.RLock()
- defer cacheMu.RUnlock()
- return enumCache[et]
-}
-
-func findEnum(fd *FileDescriptor, path []int) *EnumDescriptor {
- if len(path) == 1 {
- return fd.GetEnumTypes()[path[0]]
- }
- md := fd.GetMessageTypes()[path[0]]
- for _, i := range path[1 : len(path)-1] {
- md = md.GetNestedMessageTypes()[i]
- }
- return md.GetNestedEnumTypes()[path[len(path)-1]]
-}
-
-// LoadFieldDescriptorForExtension loads the field descriptor that corresponds to the given
-// extension description.
-func LoadFieldDescriptorForExtension(ext *proto.ExtensionDesc) (*FieldDescriptor, error) {
- return loadFieldDescriptorForExtension(ext, nil)
-}
-
-func loadFieldDescriptorForExtension(ext *proto.ExtensionDesc, r *ImportResolver) (*FieldDescriptor, error) {
- file, err := loadFileDescriptor(ext.Filename, r)
- if err != nil {
- return nil, err
- }
- field, ok := file.FindSymbol(ext.Name).(*FieldDescriptor)
- // make sure descriptor agrees with attributes of the ExtensionDesc
- if !ok || !field.IsExtension() || field.GetOwner().GetFullyQualifiedName() != proto.MessageName(ext.ExtendedType) ||
- field.GetNumber() != ext.Field {
- return nil, fmt.Errorf("file descriptor contained unexpected object with name %s", ext.Name)
- }
- return field, nil
-}
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/binary.go b/vendor/github.com/jhump/protoreflect/dynamic/binary.go
deleted file mode 100644
index 91fd672..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/binary.go
+++ /dev/null
@@ -1,185 +0,0 @@
-package dynamic
-
-// Binary serialization and de-serialization for dynamic messages
-
-import (
- "fmt"
- "github.com/golang/protobuf/proto"
- "github.com/jhump/protoreflect/codec"
- "io"
-)
-
-// defaultDeterminism, if true, will mean that calls to Marshal will produce
-// deterministic output. This is used to make the output of proto.Marshal(...)
-// deterministic (since there is no way to have that convey determinism intent).
-// **This is only used from tests.**
-var defaultDeterminism = false
-
-// Marshal serializes this message to bytes, returning an error if the operation
-// fails. The resulting bytes are in the standard protocol buffer binary format.
-func (m *Message) Marshal() ([]byte, error) {
- var b codec.Buffer
- b.SetDeterministic(defaultDeterminism)
- if err := m.marshal(&b); err != nil {
- return nil, err
- }
- return b.Bytes(), nil
-}
-
-// MarshalAppend behaves exactly the same as Marshal, except instead of allocating a
-// new byte slice to marshal into, it uses the provided byte slice. The backing array
-// for the returned byte slice *may* be the same as the one that was passed in, but
-// it's not guaranteed as a new backing array will automatically be allocated if
-// more bytes need to be written than the provided buffer has capacity for.
-func (m *Message) MarshalAppend(b []byte) ([]byte, error) {
- codedBuf := codec.NewBuffer(b)
- codedBuf.SetDeterministic(defaultDeterminism)
- if err := m.marshal(codedBuf); err != nil {
- return nil, err
- }
- return codedBuf.Bytes(), nil
-}
-
-// MarshalDeterministic serializes this message to bytes in a deterministic way,
-// returning an error if the operation fails. This differs from Marshal in that
-// map keys will be sorted before serializing to bytes. The protobuf spec does
-// not define ordering for map entries, so Marshal will use standard Go map
-// iteration order (which will be random). But for cases where determinism is
-// more important than performance, use this method instead.
-func (m *Message) MarshalDeterministic() ([]byte, error) {
- var b codec.Buffer
- b.SetDeterministic(true)
- if err := m.marshal(&b); err != nil {
- return nil, err
- }
- return b.Bytes(), nil
-}
-
-// MarshalAppendDeterministic behaves exactly the same as MarshalDeterministic,
-// except instead of allocating a new byte slice to marshal into, it uses the
-// provided byte slice. The backing array for the returned byte slice *may* be
-// the same as the one that was passed in, but it's not guaranteed as a new
-// backing array will automatically be allocated if more bytes need to be written
-// than the provided buffer has capacity for.
-func (m *Message) MarshalAppendDeterministic(b []byte) ([]byte, error) {
- codedBuf := codec.NewBuffer(b)
- codedBuf.SetDeterministic(true)
- if err := m.marshal(codedBuf); err != nil {
- return nil, err
- }
- return codedBuf.Bytes(), nil
-}
-
-func (m *Message) marshal(b *codec.Buffer) error {
- if err := m.marshalKnownFields(b); err != nil {
- return err
- }
- return m.marshalUnknownFields(b)
-}
-
-func (m *Message) marshalKnownFields(b *codec.Buffer) error {
- for _, tag := range m.knownFieldTags() {
- itag := int32(tag)
- val := m.values[itag]
- fd := m.FindFieldDescriptor(itag)
- if fd == nil {
- panic(fmt.Sprintf("Couldn't find field for tag %d", itag))
- }
- if err := b.EncodeFieldValue(fd, val); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (m *Message) marshalUnknownFields(b *codec.Buffer) error {
- for _, tag := range m.unknownFieldTags() {
- itag := int32(tag)
- sl := m.unknownFields[itag]
- for _, u := range sl {
- if err := b.EncodeTagAndWireType(itag, u.Encoding); err != nil {
- return err
- }
- switch u.Encoding {
- case proto.WireBytes:
- if err := b.EncodeRawBytes(u.Contents); err != nil {
- return err
- }
- case proto.WireStartGroup:
- _, _ = b.Write(u.Contents)
- if err := b.EncodeTagAndWireType(itag, proto.WireEndGroup); err != nil {
- return err
- }
- case proto.WireFixed32:
- if err := b.EncodeFixed32(u.Value); err != nil {
- return err
- }
- case proto.WireFixed64:
- if err := b.EncodeFixed64(u.Value); err != nil {
- return err
- }
- case proto.WireVarint:
- if err := b.EncodeVarint(u.Value); err != nil {
- return err
- }
- default:
- return codec.ErrBadWireType
- }
- }
- }
- return nil
-}
-
-// Unmarshal de-serializes the message that is present in the given bytes into
-// this message. It first resets the current message. It returns an error if the
-// given bytes do not contain a valid encoding of this message type.
-func (m *Message) Unmarshal(b []byte) error {
- m.Reset()
- if err := m.UnmarshalMerge(b); err != nil {
- return err
- }
- return m.Validate()
-}
-
-// UnmarshalMerge de-serializes the message that is present in the given bytes
-// into this message. Unlike Unmarshal, it does not first reset the message,
-// instead merging the data in the given bytes into the existing data in this
-// message.
-func (m *Message) UnmarshalMerge(b []byte) error {
- return m.unmarshal(codec.NewBuffer(b), false)
-}
-
-func (m *Message) unmarshal(buf *codec.Buffer, isGroup bool) error {
- for !buf.EOF() {
- fd, val, err := buf.DecodeFieldValue(m.FindFieldDescriptor, m.mf)
- if err != nil {
- if err == codec.ErrWireTypeEndGroup {
- if isGroup {
- // finished parsing group
- return nil
- }
- return codec.ErrBadWireType
- }
- return err
- }
-
- if fd == nil {
- if m.unknownFields == nil {
- m.unknownFields = map[int32][]UnknownField{}
- }
- uv := val.(codec.UnknownField)
- u := UnknownField{
- Encoding: uv.Encoding,
- Value: uv.Value,
- Contents: uv.Contents,
- }
- m.unknownFields[uv.Tag] = append(m.unknownFields[uv.Tag], u)
- } else if err := mergeField(m, fd, val); err != nil {
- return err
- }
- }
- if isGroup {
- return io.ErrUnexpectedEOF
- }
- return nil
-}
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/doc.go b/vendor/github.com/jhump/protoreflect/dynamic/doc.go
deleted file mode 100644
index c329fcd..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/doc.go
+++ /dev/null
@@ -1,163 +0,0 @@
-// Package dynamic provides an implementation for a dynamic protobuf message.
-//
-// The dynamic message is essentially a message descriptor along with a map of
-// tag numbers to values. It has a broad API for interacting with the message,
-// including inspection and modification. Generally, most operations have two
-// forms: a regular method that panics on bad input or error and a "Try" form
-// of the method that will instead return an error.
-//
-// A dynamic message can optionally be constructed with a MessageFactory. The
-// MessageFactory has various registries that may be used by the dynamic message,
-// such as during de-serialization. The message factory is "inherited" by any
-// other dynamic messages created, such as nested messages that are created
-// during de-serialization. Similarly, any dynamic message created using
-// MessageFactory.NewMessage will be associated with that factory, which in turn
-// will be used to create other messages or parse extension fields during
-// de-serialization.
-//
-//
-// Field Types
-//
-// The types of values expected by setters and returned by getters are the
-// same as protoc generates for scalar fields. For repeated fields, there are
-// methods for getting and setting values at a particular index or for adding
-// an element. Similarly, for map fields, there are methods for getting and
-// setting values for a particular key.
-//
-// If you use GetField for a repeated field, it will return a copy of all
-// elements as a slice []interface{}. Similarly, using GetField for a map field
-// will return a copy of all mappings as a map[interface{}]interface{}. You can
-// also use SetField to supply an entire slice or map for repeated or map fields.
-// The slice need not be []interface{} but can actually be typed according to
-// the field's expected type. For example, a repeated uint64 field can be set
-// using a slice of type []uint64.
-//
-// Descriptors for map fields describe them as repeated fields with a nested
-// message type. The nested message type is a special generated type that
-// represents a single mapping: key and value pair. The dynamic message has some
-// special affordances for this representation. For example, you can use
-// SetField to set a map field using a slice of these entry messages. Internally,
-// the slice of entries will be converted to an actual map. Similarly, you can
-// use AddRepeatedField with an entry message to add (or overwrite) a mapping.
-// However, you cannot use GetRepeatedField or SetRepeatedField to modify maps,
-// since those take numeric index arguments which are not relevant to maps
-// (since maps in Go have no defined ordering).
-//
-// When setting field values in dynamic messages, the type-checking is lenient
-// in that it accepts any named type with the right kind. So a string field can
-// be assigned to any type that is defined as a string. Enum fields require
-// int32 values (or any type that is defined as an int32).
-//
-// Unlike normal use of numeric values in Go, values will be automatically
-// widened when assigned. So, for example, an int64 field can be set using an
-// int32 value since it can be safely widened without truncation or loss of
-// precision. Similar goes for uint32 values being converted to uint64 and
-// float32 being converted to float64. Narrowing conversions are not done,
-// however. Also, unsigned values will never be automatically converted to
-// signed (and vice versa), and floating point values will never be
-// automatically converted to integral values (and vice versa). Since the bit
-// width of int and uint fields is allowed to be platform dependent, but will
-// always be less than or equal to 64, they can only be used as values for
-// int64 and uint64 fields, respectively. They cannot be used to set int32 or
-// uint32 fields, which includes enums fields.
-//
-// Fields whose type is a nested message can have values set to either other
-// dynamic messages or generated messages (e.g. pointers to structs generated by
-// protoc). Getting a value for such a field will return the actual type it is
-// set to (e.g. either a dynamic message or a generated message). If the value
-// is not set and the message uses proto2 syntax, the default message returned
-// will be whatever is returned by the dynamic message's MessageFactory (if the
-// dynamic message was not created with a factory, it will use the logic of the
-// zero value factory). In most typical cases, it will return a dynamic message,
-// but if the factory is configured with a KnownTypeRegistry, or if the field's
-// type is a well-known type, it will return a zero value generated message.
-//
-//
-// Unrecognized Fields
-//
-// Unrecognized fields are preserved by the dynamic message when unmarshaling
-// from the standard binary format. If the message's MessageFactory was
-// configured with an ExtensionRegistry, it will be used to identify and parse
-// extension fields for the message.
-//
-// Unrecognized fields can dynamically become recognized fields if the
-// application attempts to retrieve an unrecognized field's value using a
-// FieldDescriptor. In this case, the given FieldDescriptor is used to parse the
-// unknown field and move the parsed value into the message's set of known
-// fields. This behavior is most suited to the use of extensions, where an
-// ExtensionRegistry is not setup with all known extensions ahead of time. But
-// it can even happen for non-extension fields! Here's an example scenario where
-// a non-extension field can initially be unknown and become known:
-//
-// 1. A dynamic message is created with a descriptor, A, and then
-// de-serialized from a stream of bytes. The stream includes an
-// unrecognized tag T. The message will include tag T in its unrecognized
-// field set.
-// 2. Another call site retrieves a newer descriptor, A', which includes a
-// newly added field with tag T.
-// 3. That other call site then uses a FieldDescriptor to access the value of
-// the new field. This will cause the dynamic message to parse the bytes
-// for the unknown tag T and store them as a known field.
-// 4. Subsequent operations for tag T, including setting the field using only
-// tag number or de-serializing a stream that includes tag T, will operate
-// as if that tag were part of the original descriptor, A.
-//
-//
-// Compatibility
-//
-// In addition to implementing the proto.Message interface, the included
-// Message type also provides an XXX_MessageName() method, so it can work with
-// proto.MessageName. And it provides a Descriptor() method that behaves just
-// like the method of the same signature in messages generated by protoc.
-// Because of this, it is actually compatible with proto.Message in many (though
-// not all) contexts. In particular, it is compatible with proto.Marshal and
-// proto.Unmarshal for serializing and de-serializing messages.
-//
-// The dynamic message supports binary and text marshaling, using protobuf's
-// well-defined binary format and the same text format that protoc-generated
-// types use. It also supports JSON serialization/de-serialization by
-// implementing the json.Marshaler and json.Unmarshaler interfaces. And dynamic
-// messages can safely be used with the jsonpb package for JSON serialization
-// and de-serialization.
-//
-// In addition to implementing the proto.Message interface and numerous related
-// methods, it also provides inter-op with generated messages via conversion.
-// The ConvertTo, ConvertFrom, MergeInto, and MergeFrom methods copy message
-// contents from a dynamic message to a generated message and vice versa.
-//
-// When copying from a generated message into a dynamic message, if the
-// generated message contains fields unknown to the dynamic message (e.g. not
-// present in the descriptor used to create the dynamic message), these fields
-// become known to the dynamic message (as per behavior described above in
-// "Unrecognized Fields"). If the generated message has unrecognized fields of
-// its own, including unrecognized extensions, they are preserved in the dynamic
-// message. It is possible that the dynamic message knows about fields that the
-// generated message did not, like if it has a different version of the
-// descriptor or its MessageFactory has an ExtensionRegistry that knows about
-// different extensions than were linked into the program. In this case, these
-// unrecognized fields in the generated message will be known fields in the
-// dynamic message.
-//
-// Similarly, when copying from a dynamic message into a generated message, if
-// the dynamic message has unrecognized fields they can be preserved in the
-// generated message (currently only for syntax proto2 since proto3 generated
-// messages do not preserve unrecognized fields). If the generated message knows
-// about fields that the dynamic message does not, these unrecognized fields may
-// become known fields in the generated message.
-//
-//
-// Registries
-//
-// This package also contains a couple of registries, for managing known types
-// and descriptors.
-//
-// The KnownTypeRegistry allows de-serialization of a dynamic message to use
-// generated message types, instead of dynamic messages, for some kinds of
-// nested message fields. This is particularly useful for working with proto
-// messages that have special encodings as JSON (e.g. the well-known types),
-// since the dynamic message does not try to handle these special cases in its
-// JSON marshaling facilities.
-//
-// The ExtensionRegistry allows for recognizing and parsing extensions fields
-// (for proto2 messages).
-package dynamic
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/dynamic_message.go b/vendor/github.com/jhump/protoreflect/dynamic/dynamic_message.go
deleted file mode 100644
index 3f19d6b..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/dynamic_message.go
+++ /dev/null
@@ -1,2688 +0,0 @@
-package dynamic
-
-import (
- "bytes"
- "compress/gzip"
- "errors"
- "fmt"
- "reflect"
- "sort"
- "strings"
-
- "github.com/golang/protobuf/proto"
- "github.com/golang/protobuf/protoc-gen-go/descriptor"
-
- "github.com/jhump/protoreflect/codec"
- "github.com/jhump/protoreflect/desc"
-)
-
-// ErrUnknownTagNumber is an error that is returned when an operation refers
-// to an unknown tag number.
-var ErrUnknownTagNumber = errors.New("unknown tag number")
-
-// UnknownTagNumberError is the same as ErrUnknownTagNumber.
-// Deprecated: use ErrUnknownTagNumber
-var UnknownTagNumberError = ErrUnknownTagNumber
-
-// ErrUnknownFieldName is an error that is returned when an operation refers
-// to an unknown field name.
-var ErrUnknownFieldName = errors.New("unknown field name")
-
-// UnknownFieldNameError is the same as ErrUnknownFieldName.
-// Deprecated: use ErrUnknownFieldName
-var UnknownFieldNameError = ErrUnknownFieldName
-
-// ErrFieldIsNotMap is an error that is returned when map-related operations
-// are attempted with fields that are not maps.
-var ErrFieldIsNotMap = errors.New("field is not a map type")
-
-// FieldIsNotMapError is the same as ErrFieldIsNotMap.
-// Deprecated: use ErrFieldIsNotMap
-var FieldIsNotMapError = ErrFieldIsNotMap
-
-// ErrFieldIsNotRepeated is an error that is returned when repeated field
-// operations are attempted with fields that are not repeated.
-var ErrFieldIsNotRepeated = errors.New("field is not repeated")
-
-// FieldIsNotRepeatedError is the same as ErrFieldIsNotRepeated.
-// Deprecated: use ErrFieldIsNotRepeated
-var FieldIsNotRepeatedError = ErrFieldIsNotRepeated
-
-// ErrIndexOutOfRange is an error that is returned when an invalid index is
-// provided when access a single element of a repeated field.
-var ErrIndexOutOfRange = errors.New("index is out of range")
-
-// IndexOutOfRangeError is the same as ErrIndexOutOfRange.
-// Deprecated: use ErrIndexOutOfRange
-var IndexOutOfRangeError = ErrIndexOutOfRange
-
-// ErrNumericOverflow is an error returned by operations that encounter a
-// numeric value that is too large, for example de-serializing a value into an
-// int32 field when the value is larger that can fit into a 32-bit value.
-var ErrNumericOverflow = errors.New("numeric value is out of range")
-
-// NumericOverflowError is the same as ErrNumericOverflow.
-// Deprecated: use ErrNumericOverflow
-var NumericOverflowError = ErrNumericOverflow
-
-var typeOfProtoMessage = reflect.TypeOf((*proto.Message)(nil)).Elem()
-var typeOfDynamicMessage = reflect.TypeOf((*Message)(nil))
-var typeOfBytes = reflect.TypeOf(([]byte)(nil))
-
-// Message is a dynamic protobuf message. Instead of a generated struct,
-// like most protobuf messages, this is a map of field number to values and
-// a message descriptor, which is used to validate the field values and
-// also to de-serialize messages (from the standard binary format, as well
-// as from the text format and from JSON).
-type Message struct {
- md *desc.MessageDescriptor
- er *ExtensionRegistry
- mf *MessageFactory
- extraFields map[int32]*desc.FieldDescriptor
- values map[int32]interface{}
- unknownFields map[int32][]UnknownField
-}
-
-// UnknownField represents a field that was parsed from the binary wire
-// format for a message, but was not a recognized field number. Enough
-// information is preserved so that re-serializing the message won't lose
-// any of the unrecognized data.
-type UnknownField struct {
- // Encoding indicates how the unknown field was encoded on the wire. If it
- // is proto.WireBytes or proto.WireGroupStart then Contents will be set to
- // the raw bytes. If it is proto.WireTypeFixed32 then the data is in the least
- // significant 32 bits of Value. Otherwise, the data is in all 64 bits of
- // Value.
- Encoding int8
- Contents []byte
- Value uint64
-}
-
-// NewMessage creates a new dynamic message for the type represented by the given
-// message descriptor. During de-serialization, a default MessageFactory is used to
-// instantiate any nested message fields and no extension fields will be parsed. To
-// use a custom MessageFactory or ExtensionRegistry, use MessageFactory.NewMessage.
-func NewMessage(md *desc.MessageDescriptor) *Message {
- return NewMessageWithMessageFactory(md, nil)
-}
-
-// NewMessageWithExtensionRegistry creates a new dynamic message for the type
-// represented by the given message descriptor. During de-serialization, the given
-// ExtensionRegistry is used to parse extension fields and nested messages will be
-// instantiated using dynamic.NewMessageFactoryWithExtensionRegistry(er).
-func NewMessageWithExtensionRegistry(md *desc.MessageDescriptor, er *ExtensionRegistry) *Message {
- mf := NewMessageFactoryWithExtensionRegistry(er)
- return NewMessageWithMessageFactory(md, mf)
-}
-
-// NewMessageWithMessageFactory creates a new dynamic message for the type
-// represented by the given message descriptor. During de-serialization, the given
-// MessageFactory is used to instantiate nested messages.
-func NewMessageWithMessageFactory(md *desc.MessageDescriptor, mf *MessageFactory) *Message {
- var er *ExtensionRegistry
- if mf != nil {
- er = mf.er
- }
- return &Message{
- md: md,
- mf: mf,
- er: er,
- }
-}
-
-// AsDynamicMessage converts the given message to a dynamic message. If the
-// given message is dynamic, it is returned. Otherwise, a dynamic message is
-// created using NewMessage.
-func AsDynamicMessage(msg proto.Message) (*Message, error) {
- return AsDynamicMessageWithMessageFactory(msg, nil)
-}
-
-// AsDynamicMessageWithExtensionRegistry converts the given message to a dynamic
-// message. If the given message is dynamic, it is returned. Otherwise, a
-// dynamic message is created using NewMessageWithExtensionRegistry.
-func AsDynamicMessageWithExtensionRegistry(msg proto.Message, er *ExtensionRegistry) (*Message, error) {
- mf := NewMessageFactoryWithExtensionRegistry(er)
- return AsDynamicMessageWithMessageFactory(msg, mf)
-}
-
-// AsDynamicMessageWithMessageFactory converts the given message to a dynamic
-// message. If the given message is dynamic, it is returned. Otherwise, a
-// dynamic message is created using NewMessageWithMessageFactory.
-func AsDynamicMessageWithMessageFactory(msg proto.Message, mf *MessageFactory) (*Message, error) {
- if dm, ok := msg.(*Message); ok {
- return dm, nil
- }
- md, err := desc.LoadMessageDescriptorForMessage(msg)
- if err != nil {
- return nil, err
- }
- dm := NewMessageWithMessageFactory(md, mf)
- err = dm.mergeFrom(msg)
- if err != nil {
- return nil, err
- }
- return dm, nil
-}
-
-// GetMessageDescriptor returns a descriptor for this message's type.
-func (m *Message) GetMessageDescriptor() *desc.MessageDescriptor {
- return m.md
-}
-
-// GetKnownFields returns a slice of descriptors for all known fields. The
-// fields will not be in any defined order.
-func (m *Message) GetKnownFields() []*desc.FieldDescriptor {
- if len(m.extraFields) == 0 {
- return m.md.GetFields()
- }
- flds := make([]*desc.FieldDescriptor, len(m.md.GetFields()), len(m.md.GetFields())+len(m.extraFields))
- copy(flds, m.md.GetFields())
- for _, fld := range m.extraFields {
- if !fld.IsExtension() {
- flds = append(flds, fld)
- }
- }
- return flds
-}
-
-// GetKnownExtensions returns a slice of descriptors for all extensions known by
-// the message's extension registry. The fields will not be in any defined order.
-func (m *Message) GetKnownExtensions() []*desc.FieldDescriptor {
- if !m.md.IsExtendable() {
- return nil
- }
- exts := m.er.AllExtensionsForType(m.md.GetFullyQualifiedName())
- for _, fld := range m.extraFields {
- if fld.IsExtension() {
- exts = append(exts, fld)
- }
- }
- return exts
-}
-
-// GetUnknownFields returns a slice of tag numbers for all unknown fields that
-// this message contains. The tags will not be in any defined order.
-func (m *Message) GetUnknownFields() []int32 {
- flds := make([]int32, 0, len(m.unknownFields))
- for tag := range m.unknownFields {
- flds = append(flds, tag)
- }
- return flds
-}
-
-// Descriptor returns the serialized form of the file descriptor in which the
-// message was defined and a path to the message type therein. This mimics the
-// method of the same name on message types generated by protoc.
-func (m *Message) Descriptor() ([]byte, []int) {
- // get encoded file descriptor
- b, err := proto.Marshal(m.md.GetFile().AsProto())
- if err != nil {
- panic(fmt.Sprintf("failed to get encoded descriptor for %s: %v", m.md.GetFile().GetName(), err))
- }
- var zippedBytes bytes.Buffer
- w := gzip.NewWriter(&zippedBytes)
- if _, err := w.Write(b); err != nil {
- panic(fmt.Sprintf("failed to get encoded descriptor for %s: %v", m.md.GetFile().GetName(), err))
- }
- if err := w.Close(); err != nil {
- panic(fmt.Sprintf("failed to get an encoded descriptor for %s: %v", m.md.GetFile().GetName(), err))
- }
-
- // and path to message
- path := []int{}
- var d desc.Descriptor
- name := m.md.GetFullyQualifiedName()
- for d = m.md.GetParent(); d != nil; name, d = d.GetFullyQualifiedName(), d.GetParent() {
- found := false
- switch d := d.(type) {
- case (*desc.FileDescriptor):
- for i, md := range d.GetMessageTypes() {
- if md.GetFullyQualifiedName() == name {
- found = true
- path = append(path, i)
- }
- }
- case (*desc.MessageDescriptor):
- for i, md := range d.GetNestedMessageTypes() {
- if md.GetFullyQualifiedName() == name {
- found = true
- path = append(path, i)
- }
- }
- }
- if !found {
- panic(fmt.Sprintf("failed to compute descriptor path for %s", m.md.GetFullyQualifiedName()))
- }
- }
- // reverse the path
- i := 0
- j := len(path) - 1
- for i < j {
- path[i], path[j] = path[j], path[i]
- i++
- j--
- }
-
- return zippedBytes.Bytes(), path
-}
-
-// XXX_MessageName returns the fully qualified name of this message's type. This
-// allows dynamic messages to be used with proto.MessageName.
-func (m *Message) XXX_MessageName() string {
- return m.md.GetFullyQualifiedName()
-}
-
-// FindFieldDescriptor returns a field descriptor for the given tag number. This
-// searches known fields in the descriptor, known fields discovered during calls
-// to GetField or SetField, and extension fields known by the message's extension
-// registry. It returns nil if the tag is unknown.
-func (m *Message) FindFieldDescriptor(tagNumber int32) *desc.FieldDescriptor {
- fd := m.md.FindFieldByNumber(tagNumber)
- if fd != nil {
- return fd
- }
- fd = m.er.FindExtension(m.md.GetFullyQualifiedName(), tagNumber)
- if fd != nil {
- return fd
- }
- return m.extraFields[tagNumber]
-}
-
-// FindFieldDescriptorByName returns a field descriptor for the given field
-// name. This searches known fields in the descriptor, known fields discovered
-// during calls to GetField or SetField, and extension fields known by the
-// message's extension registry. It returns nil if the name is unknown. If the
-// given name refers to an extension, it should be fully qualified and may be
-// optionally enclosed in parentheses or brackets.
-func (m *Message) FindFieldDescriptorByName(name string) *desc.FieldDescriptor {
- if name == "" {
- return nil
- }
- fd := m.md.FindFieldByName(name)
- if fd != nil {
- return fd
- }
- mustBeExt := false
- if name[0] == '(' {
- if name[len(name)-1] != ')' {
- // malformed name
- return nil
- }
- mustBeExt = true
- name = name[1 : len(name)-1]
- } else if name[0] == '[' {
- if name[len(name)-1] != ']' {
- // malformed name
- return nil
- }
- mustBeExt = true
- name = name[1 : len(name)-1]
- }
- fd = m.er.FindExtensionByName(m.md.GetFullyQualifiedName(), name)
- if fd != nil {
- return fd
- }
- for _, fd := range m.extraFields {
- if fd.IsExtension() && name == fd.GetFullyQualifiedName() {
- return fd
- } else if !mustBeExt && !fd.IsExtension() && name == fd.GetName() {
- return fd
- }
- }
-
- return nil
-}
-
-// FindFieldDescriptorByJSONName returns a field descriptor for the given JSON
-// name. This searches known fields in the descriptor, known fields discovered
-// during calls to GetField or SetField, and extension fields known by the
-// message's extension registry. If no field matches the given JSON name, it
-// will fall back to searching field names (e.g. FindFieldDescriptorByName). If
-// this also yields no match, nil is returned.
-func (m *Message) FindFieldDescriptorByJSONName(name string) *desc.FieldDescriptor {
- if name == "" {
- return nil
- }
- fd := m.md.FindFieldByJSONName(name)
- if fd != nil {
- return fd
- }
- mustBeExt := false
- if name[0] == '(' {
- if name[len(name)-1] != ')' {
- // malformed name
- return nil
- }
- mustBeExt = true
- name = name[1 : len(name)-1]
- } else if name[0] == '[' {
- if name[len(name)-1] != ']' {
- // malformed name
- return nil
- }
- mustBeExt = true
- name = name[1 : len(name)-1]
- }
- fd = m.er.FindExtensionByJSONName(m.md.GetFullyQualifiedName(), name)
- if fd != nil {
- return fd
- }
- for _, fd := range m.extraFields {
- if fd.IsExtension() && name == fd.GetFullyQualifiedJSONName() {
- return fd
- } else if !mustBeExt && !fd.IsExtension() && name == fd.GetJSONName() {
- return fd
- }
- }
-
- // try non-JSON names
- return m.FindFieldDescriptorByName(name)
-}
-
-func (m *Message) checkField(fd *desc.FieldDescriptor) error {
- return checkField(fd, m.md)
-}
-
-func checkField(fd *desc.FieldDescriptor, md *desc.MessageDescriptor) error {
- if fd.GetOwner().GetFullyQualifiedName() != md.GetFullyQualifiedName() {
- return fmt.Errorf("given field, %s, is for wrong message type: %s; expecting %s", fd.GetName(), fd.GetOwner().GetFullyQualifiedName(), md.GetFullyQualifiedName())
- }
- if fd.IsExtension() && !md.IsExtension(fd.GetNumber()) {
- return fmt.Errorf("given field, %s, is an extension but is not in message extension range: %v", fd.GetFullyQualifiedName(), md.GetExtensionRanges())
- }
- return nil
-}
-
-// GetField returns the value for the given field descriptor. It panics if an
-// error is encountered. See TryGetField.
-func (m *Message) GetField(fd *desc.FieldDescriptor) interface{} {
- if v, err := m.TryGetField(fd); err != nil {
- panic(err.Error())
- } else {
- return v
- }
-}
-
-// TryGetField returns the value for the given field descriptor. An error is
-// returned if the given field descriptor does not belong to the right message
-// type.
-//
-// The Go type of the returned value, for scalar fields, is the same as protoc
-// would generate for the field (in a non-dynamic message). The table below
-// lists the scalar types and the corresponding Go types.
-// +-------------------------+-----------+
-// | Declared Type | Go Type |
-// +-------------------------+-----------+
-// | int32, sint32, sfixed32 | int32 |
-// | int64, sint64, sfixed64 | int64 |
-// | uint32, fixed32 | uint32 |
-// | uint64, fixed64 | uint64 |
-// | float | float32 |
-// | double | double32 |
-// | bool | bool |
-// | string | string |
-// | bytes | []byte |
-// +-------------------------+-----------+
-//
-// Values for enum fields will always be int32 values. You can use the enum
-// descriptor associated with the field to lookup value names with those values.
-// Values for message type fields may be an instance of the generated type *or*
-// may be another *dynamic.Message that represents the type.
-//
-// If the given field is a map field, the returned type will be
-// map[interface{}]interface{}. The actual concrete types of keys and values is
-// as described above. If the given field is a (non-map) repeated field, the
-// returned type is always []interface{}; the type of the actual elements is as
-// described above.
-//
-// If this message has no value for the given field, its default value is
-// returned. If the message is defined in a file with "proto3" syntax, the
-// default is always the zero value for the field. The default value for map and
-// repeated fields is a nil map or slice (respectively). For field's whose types
-// is a message, the default value is an empty message for "proto2" syntax or a
-// nil message for "proto3" syntax. Note that the in the latter case, a non-nil
-// interface with a nil pointer is returned, not a nil interface. Also note that
-// whether the returned value is an empty message or nil depends on if *this*
-// message was defined as "proto3" syntax, not the message type referred to by
-// the field's type.
-//
-// If the given field descriptor is not known (e.g. not present in the message
-// descriptor) but corresponds to an unknown field, the unknown value will be
-// parsed and become known. The parsed value will be returned, or an error will
-// be returned if the unknown value cannot be parsed according to the field
-// descriptor's type information.
-func (m *Message) TryGetField(fd *desc.FieldDescriptor) (interface{}, error) {
- if err := m.checkField(fd); err != nil {
- return nil, err
- }
- return m.getField(fd)
-}
-
-// GetFieldByName returns the value for the field with the given name. It panics
-// if an error is encountered. See TryGetFieldByName.
-func (m *Message) GetFieldByName(name string) interface{} {
- if v, err := m.TryGetFieldByName(name); err != nil {
- panic(err.Error())
- } else {
- return v
- }
-}
-
-// TryGetFieldByName returns the value for the field with the given name. An
-// error is returned if the given name is unknown. If the given name refers to
-// an extension field, it should be fully qualified and optionally enclosed in
-// parenthesis or brackets.
-//
-// If this message has no value for the given field, its default value is
-// returned. (See TryGetField for more info on types and default field values.)
-func (m *Message) TryGetFieldByName(name string) (interface{}, error) {
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return nil, UnknownFieldNameError
- }
- return m.getField(fd)
-}
-
-// GetFieldByNumber returns the value for the field with the given tag number.
-// It panics if an error is encountered. See TryGetFieldByNumber.
-func (m *Message) GetFieldByNumber(tagNumber int) interface{} {
- if v, err := m.TryGetFieldByNumber(tagNumber); err != nil {
- panic(err.Error())
- } else {
- return v
- }
-}
-
-// TryGetFieldByNumber returns the value for the field with the given tag
-// number. An error is returned if the given tag is unknown.
-//
-// If this message has no value for the given field, its default value is
-// returned. (See TryGetField for more info on types and default field values.)
-func (m *Message) TryGetFieldByNumber(tagNumber int) (interface{}, error) {
- fd := m.FindFieldDescriptor(int32(tagNumber))
- if fd == nil {
- return nil, UnknownTagNumberError
- }
- return m.getField(fd)
-}
-
-func (m *Message) getField(fd *desc.FieldDescriptor) (interface{}, error) {
- return m.doGetField(fd, false)
-}
-
-func (m *Message) doGetField(fd *desc.FieldDescriptor, nilIfAbsent bool) (interface{}, error) {
- res := m.values[fd.GetNumber()]
- if res == nil {
- var err error
- if res, err = m.parseUnknownField(fd); err != nil {
- return nil, err
- }
- if res == nil {
- if nilIfAbsent {
- return nil, nil
- } else {
- def := fd.GetDefaultValue()
- if def != nil {
- return def, nil
- }
- // GetDefaultValue only returns nil for message types
- md := fd.GetMessageType()
- if md.IsProto3() {
- // try to return a proper nil pointer
- msgType := proto.MessageType(md.GetFullyQualifiedName())
- if msgType != nil && msgType.Implements(typeOfProtoMessage) {
- return reflect.Zero(msgType).Interface().(proto.Message), nil
- }
- // fallback to nil dynamic message pointer
- return (*Message)(nil), nil
- } else {
- // for proto2, return default instance of message
- return m.mf.NewMessage(md), nil
- }
- }
- }
- }
- rt := reflect.TypeOf(res)
- if rt.Kind() == reflect.Map {
- // make defensive copies to prevent caller from storing illegal keys and values
- m := res.(map[interface{}]interface{})
- res := map[interface{}]interface{}{}
- for k, v := range m {
- res[k] = v
- }
- return res, nil
- } else if rt.Kind() == reflect.Slice && rt != typeOfBytes {
- // make defensive copies to prevent caller from storing illegal elements
- sl := res.([]interface{})
- res := make([]interface{}, len(sl))
- copy(res, sl)
- return res, nil
- }
- return res, nil
-}
-
-// HasField returns true if this message has a value for the given field. If the
-// given field is not valid (e.g. belongs to a different message type), false is
-// returned. If this message is defined in a file with "proto3" syntax, this
-// will return false even if a field was explicitly assigned its zero value (the
-// zero values for a field are intentionally indistinguishable from absent).
-func (m *Message) HasField(fd *desc.FieldDescriptor) bool {
- if err := m.checkField(fd); err != nil {
- return false
- }
- return m.HasFieldNumber(int(fd.GetNumber()))
-}
-
-// HasFieldName returns true if this message has a value for a field with the
-// given name. If the given name is unknown, this returns false.
-func (m *Message) HasFieldName(name string) bool {
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return false
- }
- return m.HasFieldNumber(int(fd.GetNumber()))
-}
-
-// HasFieldNumber returns true if this message has a value for a field with the
-// given tag number. If the given tag is unknown, this returns false.
-func (m *Message) HasFieldNumber(tagNumber int) bool {
- if _, ok := m.values[int32(tagNumber)]; ok {
- return true
- }
- _, ok := m.unknownFields[int32(tagNumber)]
- return ok
-}
-
-// SetField sets the value for the given field descriptor to the given value. It
-// panics if an error is encountered. See TrySetField.
-func (m *Message) SetField(fd *desc.FieldDescriptor, val interface{}) {
- if err := m.TrySetField(fd, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TrySetField sets the value for the given field descriptor to the given value.
-// An error is returned if the given field descriptor does not belong to the
-// right message type or if the given value is not a correct/compatible type for
-// the given field.
-//
-// The Go type expected for a field is the same as TryGetField would return for
-// the field. So message values can be supplied as either the correct generated
-// message type or as a *dynamic.Message.
-//
-// Since it is cumbersome to work with dynamic messages, some concessions are
-// made to simplify usage regarding types:
-//
-// 1. If a numeric type is provided that can be converted *without loss or
-// overflow*, it is accepted. This allows for setting int64 fields using int
-// or int32 values. Similarly for uint64 with uint and uint32 values and for
-// float64 fields with float32 values.
-// 2. The value can be a named type, as long as its underlying type is correct.
-// 3. Map and repeated fields can be set using any kind of concrete map or
-// slice type, as long as the values within are all of the correct type. So
-// a field defined as a 'map<string, int32>` can be set using a
-// map[string]int32, a map[string]interface{}, or even a
-// map[interface{}]interface{}.
-// 4. Finally, dynamic code that chooses to not treat maps as a special-case
-// find that they can set map fields using a slice where each element is a
-// message that matches the implicit map-entry field message type.
-//
-// If the given field descriptor is not known (e.g. not present in the message
-// descriptor) it will become known. Subsequent operations using tag numbers or
-// names will be able to resolve the newly-known type. If the message has a
-// value for the unknown value, it is cleared, replaced by the given known
-// value.
-func (m *Message) TrySetField(fd *desc.FieldDescriptor, val interface{}) error {
- if err := m.checkField(fd); err != nil {
- return err
- }
- return m.setField(fd, val)
-}
-
-// SetFieldByName sets the value for the field with the given name to the given
-// value. It panics if an error is encountered. See TrySetFieldByName.
-func (m *Message) SetFieldByName(name string, val interface{}) {
- if err := m.TrySetFieldByName(name, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TrySetFieldByName sets the value for the field with the given name to the
-// given value. An error is returned if the given name is unknown or if the
-// given value has an incorrect type. If the given name refers to an extension
-// field, it should be fully qualified and optionally enclosed in parenthesis or
-// brackets.
-//
-// (See TrySetField for more info on types.)
-func (m *Message) TrySetFieldByName(name string, val interface{}) error {
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return UnknownFieldNameError
- }
- return m.setField(fd, val)
-}
-
-// SetFieldByNumber sets the value for the field with the given tag number to
-// the given value. It panics if an error is encountered. See
-// TrySetFieldByNumber.
-func (m *Message) SetFieldByNumber(tagNumber int, val interface{}) {
- if err := m.TrySetFieldByNumber(tagNumber, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TrySetFieldByNumber sets the value for the field with the given tag number to
-// the given value. An error is returned if the given tag is unknown or if the
-// given value has an incorrect type.
-//
-// (See TrySetField for more info on types.)
-func (m *Message) TrySetFieldByNumber(tagNumber int, val interface{}) error {
- fd := m.FindFieldDescriptor(int32(tagNumber))
- if fd == nil {
- return UnknownTagNumberError
- }
- return m.setField(fd, val)
-}
-
-func (m *Message) setField(fd *desc.FieldDescriptor, val interface{}) error {
- var err error
- if val, err = validFieldValue(fd, val); err != nil {
- return err
- }
- m.internalSetField(fd, val)
- return nil
-}
-
-func (m *Message) internalSetField(fd *desc.FieldDescriptor, val interface{}) {
- if fd.IsRepeated() {
- // Unset fields and zero-length fields are indistinguishable, in both
- // proto2 and proto3 syntax
- if reflect.ValueOf(val).Len() == 0 {
- if m.values != nil {
- delete(m.values, fd.GetNumber())
- }
- return
- }
- } else if m.md.IsProto3() && fd.GetOneOf() == nil {
- // proto3 considers fields that are set to their zero value as unset
- // (we already handled repeated fields above)
- var equal bool
- if b, ok := val.([]byte); ok {
- // can't compare slices, so we have to special-case []byte values
- equal = ok && bytes.Equal(b, fd.GetDefaultValue().([]byte))
- } else {
- defVal := fd.GetDefaultValue()
- equal = defVal == val
- if !equal && defVal == nil {
- // above just checks if value is the nil interface,
- // but we should also test if the given value is a
- // nil pointer
- rv := reflect.ValueOf(val)
- if rv.Kind() == reflect.Ptr && rv.IsNil() {
- equal = true
- }
- }
- }
- if equal {
- if m.values != nil {
- delete(m.values, fd.GetNumber())
- }
- return
- }
- }
- if m.values == nil {
- m.values = map[int32]interface{}{}
- }
- m.values[fd.GetNumber()] = val
- // if this field is part of a one-of, make sure all other one-of choices are cleared
- od := fd.GetOneOf()
- if od != nil {
- for _, other := range od.GetChoices() {
- if other.GetNumber() != fd.GetNumber() {
- delete(m.values, other.GetNumber())
- }
- }
- }
- // also clear any unknown fields
- if m.unknownFields != nil {
- delete(m.unknownFields, fd.GetNumber())
- }
- // and add this field if it was previously unknown
- if existing := m.FindFieldDescriptor(fd.GetNumber()); existing == nil {
- m.addField(fd)
- }
-}
-
-func (m *Message) addField(fd *desc.FieldDescriptor) {
- if m.extraFields == nil {
- m.extraFields = map[int32]*desc.FieldDescriptor{}
- }
- m.extraFields[fd.GetNumber()] = fd
-}
-
-// ClearField removes any value for the given field. It panics if an error is
-// encountered. See TryClearField.
-func (m *Message) ClearField(fd *desc.FieldDescriptor) {
- if err := m.TryClearField(fd); err != nil {
- panic(err.Error())
- }
-}
-
-// TryClearField removes any value for the given field. An error is returned if
-// the given field descriptor does not belong to the right message type.
-func (m *Message) TryClearField(fd *desc.FieldDescriptor) error {
- if err := m.checkField(fd); err != nil {
- return err
- }
- m.clearField(fd)
- return nil
-}
-
-// ClearFieldByName removes any value for the field with the given name. It
-// panics if an error is encountered. See TryClearFieldByName.
-func (m *Message) ClearFieldByName(name string) {
- if err := m.TryClearFieldByName(name); err != nil {
- panic(err.Error())
- }
-}
-
-// TryClearFieldByName removes any value for the field with the given name. An
-// error is returned if the given name is unknown. If the given name refers to
-// an extension field, it should be fully qualified and optionally enclosed in
-// parenthesis or brackets.
-func (m *Message) TryClearFieldByName(name string) error {
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return UnknownFieldNameError
- }
- m.clearField(fd)
- return nil
-}
-
-// ClearFieldByNumber removes any value for the field with the given tag number.
-// It panics if an error is encountered. See TryClearFieldByNumber.
-func (m *Message) ClearFieldByNumber(tagNumber int) {
- if err := m.TryClearFieldByNumber(tagNumber); err != nil {
- panic(err.Error())
- }
-}
-
-// TryClearFieldByNumber removes any value for the field with the given tag
-// number. An error is returned if the given tag is unknown.
-func (m *Message) TryClearFieldByNumber(tagNumber int) error {
- fd := m.FindFieldDescriptor(int32(tagNumber))
- if fd == nil {
- return UnknownTagNumberError
- }
- m.clearField(fd)
- return nil
-}
-
-func (m *Message) clearField(fd *desc.FieldDescriptor) {
- // clear value
- if m.values != nil {
- delete(m.values, fd.GetNumber())
- }
- // also clear any unknown fields
- if m.unknownFields != nil {
- delete(m.unknownFields, fd.GetNumber())
- }
- // and add this field if it was previously unknown
- if existing := m.FindFieldDescriptor(fd.GetNumber()); existing == nil {
- m.addField(fd)
- }
-}
-
-// GetOneOfField returns which of the given one-of's fields is set and the
-// corresponding value. It panics if an error is encountered. See
-// TryGetOneOfField.
-func (m *Message) GetOneOfField(od *desc.OneOfDescriptor) (*desc.FieldDescriptor, interface{}) {
- if fd, val, err := m.TryGetOneOfField(od); err != nil {
- panic(err.Error())
- } else {
- return fd, val
- }
-}
-
-// TryGetOneOfField returns which of the given one-of's fields is set and the
-// corresponding value. An error is returned if the given one-of belongs to the
-// wrong message type. If the given one-of has no field set, this method will
-// return nil, nil.
-//
-// The type of the value, if one is set, is the same as would be returned by
-// TryGetField using the returned field descriptor.
-//
-// Like with TryGetField, if the given one-of contains any fields that are not
-// known (e.g. not present in this message's descriptor), they will become known
-// and any unknown value will be parsed (and become a known value on success).
-func (m *Message) TryGetOneOfField(od *desc.OneOfDescriptor) (*desc.FieldDescriptor, interface{}, error) {
- if od.GetOwner().GetFullyQualifiedName() != m.md.GetFullyQualifiedName() {
- return nil, nil, fmt.Errorf("given one-of, %s, is for wrong message type: %s; expecting %s", od.GetName(), od.GetOwner().GetFullyQualifiedName(), m.md.GetFullyQualifiedName())
- }
- for _, fd := range od.GetChoices() {
- val, err := m.doGetField(fd, true)
- if err != nil {
- return nil, nil, err
- }
- if val != nil {
- return fd, val, nil
- }
- }
- return nil, nil, nil
-}
-
-// ClearOneOfField removes any value for any of the given one-of's fields. It
-// panics if an error is encountered. See TryClearOneOfField.
-func (m *Message) ClearOneOfField(od *desc.OneOfDescriptor) {
- if err := m.TryClearOneOfField(od); err != nil {
- panic(err.Error())
- }
-}
-
-// TryClearOneOfField removes any value for any of the given one-of's fields. An
-// error is returned if the given one-of descriptor does not belong to the right
-// message type.
-func (m *Message) TryClearOneOfField(od *desc.OneOfDescriptor) error {
- if od.GetOwner().GetFullyQualifiedName() != m.md.GetFullyQualifiedName() {
- return fmt.Errorf("given one-of, %s, is for wrong message type: %s; expecting %s", od.GetName(), od.GetOwner().GetFullyQualifiedName(), m.md.GetFullyQualifiedName())
- }
- for _, fd := range od.GetChoices() {
- m.clearField(fd)
- }
- return nil
-}
-
-// GetMapField returns the value for the given map field descriptor and given
-// key. It panics if an error is encountered. See TryGetMapField.
-func (m *Message) GetMapField(fd *desc.FieldDescriptor, key interface{}) interface{} {
- if v, err := m.TryGetMapField(fd, key); err != nil {
- panic(err.Error())
- } else {
- return v
- }
-}
-
-// TryGetMapField returns the value for the given map field descriptor and given
-// key. An error is returned if the given field descriptor does not belong to
-// the right message type or if it is not a map field.
-//
-// If the map field does not contain the requested key, this method returns
-// nil, nil. The Go type of the value returned mirrors the type that protoc
-// would generate for the field. (See TryGetField for more details on types).
-//
-// If the given field descriptor is not known (e.g. not present in the message
-// descriptor) but corresponds to an unknown field, the unknown value will be
-// parsed and become known. The parsed value will be searched for the requested
-// key and any value returned. An error will be returned if the unknown value
-// cannot be parsed according to the field descriptor's type information.
-func (m *Message) TryGetMapField(fd *desc.FieldDescriptor, key interface{}) (interface{}, error) {
- if err := m.checkField(fd); err != nil {
- return nil, err
- }
- return m.getMapField(fd, key)
-}
-
-// GetMapFieldByName returns the value for the map field with the given name and
-// given key. It panics if an error is encountered. See TryGetMapFieldByName.
-func (m *Message) GetMapFieldByName(name string, key interface{}) interface{} {
- if v, err := m.TryGetMapFieldByName(name, key); err != nil {
- panic(err.Error())
- } else {
- return v
- }
-}
-
-// TryGetMapFieldByName returns the value for the map field with the given name
-// and given key. An error is returned if the given name is unknown or if it
-// names a field that is not a map field.
-//
-// If this message has no value for the given field or the value has no value
-// for the requested key, then this method returns nil, nil.
-//
-// (See TryGetField for more info on types.)
-func (m *Message) TryGetMapFieldByName(name string, key interface{}) (interface{}, error) {
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return nil, UnknownFieldNameError
- }
- return m.getMapField(fd, key)
-}
-
-// GetMapFieldByNumber returns the value for the map field with the given tag
-// number and given key. It panics if an error is encountered. See
-// TryGetMapFieldByNumber.
-func (m *Message) GetMapFieldByNumber(tagNumber int, key interface{}) interface{} {
- if v, err := m.TryGetMapFieldByNumber(tagNumber, key); err != nil {
- panic(err.Error())
- } else {
- return v
- }
-}
-
-// TryGetMapFieldByNumber returns the value for the map field with the given tag
-// number and given key. An error is returned if the given tag is unknown or if
-// it indicates a field that is not a map field.
-//
-// If this message has no value for the given field or the value has no value
-// for the requested key, then this method returns nil, nil.
-//
-// (See TryGetField for more info on types.)
-func (m *Message) TryGetMapFieldByNumber(tagNumber int, key interface{}) (interface{}, error) {
- fd := m.FindFieldDescriptor(int32(tagNumber))
- if fd == nil {
- return nil, UnknownTagNumberError
- }
- return m.getMapField(fd, key)
-}
-
-func (m *Message) getMapField(fd *desc.FieldDescriptor, key interface{}) (interface{}, error) {
- if !fd.IsMap() {
- return nil, FieldIsNotMapError
- }
- kfd := fd.GetMessageType().GetFields()[0]
- ki, err := validElementFieldValue(kfd, key)
- if err != nil {
- return nil, err
- }
- mp := m.values[fd.GetNumber()]
- if mp == nil {
- if mp, err = m.parseUnknownField(fd); err != nil {
- return nil, err
- } else if mp == nil {
- return nil, nil
- }
- }
- return mp.(map[interface{}]interface{})[ki], nil
-}
-
-// ForEachMapFieldEntry executes the given function for each entry in the map
-// value for the given field descriptor. It stops iteration if the function
-// returns false. It panics if an error is encountered. See
-// TryForEachMapFieldEntry.
-func (m *Message) ForEachMapFieldEntry(fd *desc.FieldDescriptor, fn func(key, val interface{}) bool) {
- if err := m.TryForEachMapFieldEntry(fd, fn); err != nil {
- panic(err.Error())
- }
-}
-
-// TryForEachMapFieldEntry executes the given function for each entry in the map
-// value for the given field descriptor. An error is returned if the given field
-// descriptor does not belong to the right message type or if it is not a map
-// field.
-//
-// Iteration ends either when all entries have been examined or when the given
-// function returns false. So the function is expected to return true for normal
-// iteration and false to break out. If this message has no value for the given
-// field, it returns without invoking the given function.
-//
-// The Go type of the key and value supplied to the function mirrors the type
-// that protoc would generate for the field. (See TryGetField for more details
-// on types).
-//
-// If the given field descriptor is not known (e.g. not present in the message
-// descriptor) but corresponds to an unknown field, the unknown value will be
-// parsed and become known. The parsed value will be searched for the requested
-// key and any value returned. An error will be returned if the unknown value
-// cannot be parsed according to the field descriptor's type information.
-func (m *Message) TryForEachMapFieldEntry(fd *desc.FieldDescriptor, fn func(key, val interface{}) bool) error {
- if err := m.checkField(fd); err != nil {
- return err
- }
- return m.forEachMapFieldEntry(fd, fn)
-}
-
-// ForEachMapFieldEntryByName executes the given function for each entry in the
-// map value for the field with the given name. It stops iteration if the
-// function returns false. It panics if an error is encountered. See
-// TryForEachMapFieldEntryByName.
-func (m *Message) ForEachMapFieldEntryByName(name string, fn func(key, val interface{}) bool) {
- if err := m.TryForEachMapFieldEntryByName(name, fn); err != nil {
- panic(err.Error())
- }
-}
-
-// TryForEachMapFieldEntryByName executes the given function for each entry in
-// the map value for the field with the given name. It stops iteration if the
-// function returns false. An error is returned if the given name is unknown or
-// if it names a field that is not a map field.
-//
-// If this message has no value for the given field, it returns without ever
-// invoking the given function.
-//
-// (See TryGetField for more info on types supplied to the function.)
-func (m *Message) TryForEachMapFieldEntryByName(name string, fn func(key, val interface{}) bool) error {
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return UnknownFieldNameError
- }
- return m.forEachMapFieldEntry(fd, fn)
-}
-
-// ForEachMapFieldEntryByNumber executes the given function for each entry in
-// the map value for the field with the given tag number. It stops iteration if
-// the function returns false. It panics if an error is encountered. See
-// TryForEachMapFieldEntryByNumber.
-func (m *Message) ForEachMapFieldEntryByNumber(tagNumber int, fn func(key, val interface{}) bool) {
- if err := m.TryForEachMapFieldEntryByNumber(tagNumber, fn); err != nil {
- panic(err.Error())
- }
-}
-
-// TryForEachMapFieldEntryByNumber executes the given function for each entry in
-// the map value for the field with the given tag number. It stops iteration if
-// the function returns false. An error is returned if the given tag is unknown
-// or if it indicates a field that is not a map field.
-//
-// If this message has no value for the given field, it returns without ever
-// invoking the given function.
-//
-// (See TryGetField for more info on types supplied to the function.)
-func (m *Message) TryForEachMapFieldEntryByNumber(tagNumber int, fn func(key, val interface{}) bool) error {
- fd := m.FindFieldDescriptor(int32(tagNumber))
- if fd == nil {
- return UnknownTagNumberError
- }
- return m.forEachMapFieldEntry(fd, fn)
-}
-
-func (m *Message) forEachMapFieldEntry(fd *desc.FieldDescriptor, fn func(key, val interface{}) bool) error {
- if !fd.IsMap() {
- return FieldIsNotMapError
- }
- mp := m.values[fd.GetNumber()]
- if mp == nil {
- if mp, err := m.parseUnknownField(fd); err != nil {
- return err
- } else if mp == nil {
- return nil
- }
- }
- for k, v := range mp.(map[interface{}]interface{}) {
- if !fn(k, v) {
- break
- }
- }
- return nil
-}
-
-// PutMapField sets the value for the given map field descriptor and given key
-// to the given value. It panics if an error is encountered. See TryPutMapField.
-func (m *Message) PutMapField(fd *desc.FieldDescriptor, key interface{}, val interface{}) {
- if err := m.TryPutMapField(fd, key, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TryPutMapField sets the value for the given map field descriptor and given
-// key to the given value. An error is returned if the given field descriptor
-// does not belong to the right message type, if the given field is not a map
-// field, or if the given value is not a correct/compatible type for the given
-// field.
-//
-// The Go type expected for a field is the same as required by TrySetField for
-// a field with the same type as the map's value type.
-//
-// If the given field descriptor is not known (e.g. not present in the message
-// descriptor) it will become known. Subsequent operations using tag numbers or
-// names will be able to resolve the newly-known type. If the message has a
-// value for the unknown value, it is cleared, replaced by the given known
-// value.
-func (m *Message) TryPutMapField(fd *desc.FieldDescriptor, key interface{}, val interface{}) error {
- if err := m.checkField(fd); err != nil {
- return err
- }
- return m.putMapField(fd, key, val)
-}
-
-// PutMapFieldByName sets the value for the map field with the given name and
-// given key to the given value. It panics if an error is encountered. See
-// TryPutMapFieldByName.
-func (m *Message) PutMapFieldByName(name string, key interface{}, val interface{}) {
- if err := m.TryPutMapFieldByName(name, key, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TryPutMapFieldByName sets the value for the map field with the given name and
-// the given key to the given value. An error is returned if the given name is
-// unknown, if it names a field that is not a map, or if the given value has an
-// incorrect type.
-//
-// (See TrySetField for more info on types.)
-func (m *Message) TryPutMapFieldByName(name string, key interface{}, val interface{}) error {
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return UnknownFieldNameError
- }
- return m.putMapField(fd, key, val)
-}
-
-// PutMapFieldByNumber sets the value for the map field with the given tag
-// number and given key to the given value. It panics if an error is
-// encountered. See TryPutMapFieldByNumber.
-func (m *Message) PutMapFieldByNumber(tagNumber int, key interface{}, val interface{}) {
- if err := m.TryPutMapFieldByNumber(tagNumber, key, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TryPutMapFieldByNumber sets the value for the map field with the given tag
-// number and the given key to the given value. An error is returned if the
-// given tag is unknown, if it indicates a field that is not a map, or if the
-// given value has an incorrect type.
-//
-// (See TrySetField for more info on types.)
-func (m *Message) TryPutMapFieldByNumber(tagNumber int, key interface{}, val interface{}) error {
- fd := m.FindFieldDescriptor(int32(tagNumber))
- if fd == nil {
- return UnknownTagNumberError
- }
- return m.putMapField(fd, key, val)
-}
-
-func (m *Message) putMapField(fd *desc.FieldDescriptor, key interface{}, val interface{}) error {
- if !fd.IsMap() {
- return FieldIsNotMapError
- }
- kfd := fd.GetMessageType().GetFields()[0]
- ki, err := validElementFieldValue(kfd, key)
- if err != nil {
- return err
- }
- vfd := fd.GetMessageType().GetFields()[1]
- vi, err := validElementFieldValue(vfd, val)
- if err != nil {
- return err
- }
- mp := m.values[fd.GetNumber()]
- if mp == nil {
- if mp, err = m.parseUnknownField(fd); err != nil {
- return err
- } else if mp == nil {
- m.internalSetField(fd, map[interface{}]interface{}{ki: vi})
- return nil
- }
- }
- mp.(map[interface{}]interface{})[ki] = vi
- return nil
-}
-
-// RemoveMapField changes the value for the given field descriptor by removing
-// any value associated with the given key. It panics if an error is
-// encountered. See TryRemoveMapField.
-func (m *Message) RemoveMapField(fd *desc.FieldDescriptor, key interface{}) {
- if err := m.TryRemoveMapField(fd, key); err != nil {
- panic(err.Error())
- }
-}
-
-// TryRemoveMapField changes the value for the given field descriptor by
-// removing any value associated with the given key. An error is returned if the
-// given field descriptor does not belong to the right message type or if the
-// given field is not a map field.
-//
-// If the given field descriptor is not known (e.g. not present in the message
-// descriptor) it will become known. Subsequent operations using tag numbers or
-// names will be able to resolve the newly-known type. If the message has a
-// value for the unknown value, it is parsed and any value for the given key
-// removed.
-func (m *Message) TryRemoveMapField(fd *desc.FieldDescriptor, key interface{}) error {
- if err := m.checkField(fd); err != nil {
- return err
- }
- return m.removeMapField(fd, key)
-}
-
-// RemoveMapFieldByName changes the value for the field with the given name by
-// removing any value associated with the given key. It panics if an error is
-// encountered. See TryRemoveMapFieldByName.
-func (m *Message) RemoveMapFieldByName(name string, key interface{}) {
- if err := m.TryRemoveMapFieldByName(name, key); err != nil {
- panic(err.Error())
- }
-}
-
-// TryRemoveMapFieldByName changes the value for the field with the given name
-// by removing any value associated with the given key. An error is returned if
-// the given name is unknown or if it names a field that is not a map.
-func (m *Message) TryRemoveMapFieldByName(name string, key interface{}) error {
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return UnknownFieldNameError
- }
- return m.removeMapField(fd, key)
-}
-
-// RemoveMapFieldByNumber changes the value for the field with the given tag
-// number by removing any value associated with the given key. It panics if an
-// error is encountered. See TryRemoveMapFieldByNumber.
-func (m *Message) RemoveMapFieldByNumber(tagNumber int, key interface{}) {
- if err := m.TryRemoveMapFieldByNumber(tagNumber, key); err != nil {
- panic(err.Error())
- }
-}
-
-// TryRemoveMapFieldByNumber changes the value for the field with the given tag
-// number by removing any value associated with the given key. An error is
-// returned if the given tag is unknown or if it indicates a field that is not
-// a map.
-func (m *Message) TryRemoveMapFieldByNumber(tagNumber int, key interface{}) error {
- fd := m.FindFieldDescriptor(int32(tagNumber))
- if fd == nil {
- return UnknownTagNumberError
- }
- return m.removeMapField(fd, key)
-}
-
-func (m *Message) removeMapField(fd *desc.FieldDescriptor, key interface{}) error {
- if !fd.IsMap() {
- return FieldIsNotMapError
- }
- kfd := fd.GetMessageType().GetFields()[0]
- ki, err := validElementFieldValue(kfd, key)
- if err != nil {
- return err
- }
- mp := m.values[fd.GetNumber()]
- if mp == nil {
- if mp, err = m.parseUnknownField(fd); err != nil {
- return err
- } else if mp == nil {
- return nil
- }
- }
- res := mp.(map[interface{}]interface{})
- delete(res, ki)
- if len(res) == 0 {
- delete(m.values, fd.GetNumber())
- }
- return nil
-}
-
-// FieldLength returns the number of elements in this message for the given
-// field descriptor. It panics if an error is encountered. See TryFieldLength.
-func (m *Message) FieldLength(fd *desc.FieldDescriptor) int {
- l, err := m.TryFieldLength(fd)
- if err != nil {
- panic(err.Error())
- }
- return l
-}
-
-// TryFieldLength returns the number of elements in this message for the given
-// field descriptor. An error is returned if the given field descriptor does not
-// belong to the right message type or if it is neither a map field nor a
-// repeated field.
-func (m *Message) TryFieldLength(fd *desc.FieldDescriptor) (int, error) {
- if err := m.checkField(fd); err != nil {
- return 0, err
- }
- return m.fieldLength(fd)
-}
-
-// FieldLengthByName returns the number of elements in this message for the
-// field with the given name. It panics if an error is encountered. See
-// TryFieldLengthByName.
-func (m *Message) FieldLengthByName(name string) int {
- l, err := m.TryFieldLengthByName(name)
- if err != nil {
- panic(err.Error())
- }
- return l
-}
-
-// TryFieldLengthByName returns the number of elements in this message for the
-// field with the given name. An error is returned if the given name is unknown
-// or if the named field is neither a map field nor a repeated field.
-func (m *Message) TryFieldLengthByName(name string) (int, error) {
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return 0, UnknownFieldNameError
- }
- return m.fieldLength(fd)
-}
-
-// FieldLengthByNumber returns the number of elements in this message for the
-// field with the given tag number. It panics if an error is encountered. See
-// TryFieldLengthByNumber.
-func (m *Message) FieldLengthByNumber(tagNumber int32) int {
- l, err := m.TryFieldLengthByNumber(tagNumber)
- if err != nil {
- panic(err.Error())
- }
- return l
-}
-
-// TryFieldLengthByNumber returns the number of elements in this message for the
-// field with the given tag number. An error is returned if the given tag is
-// unknown or if the named field is neither a map field nor a repeated field.
-func (m *Message) TryFieldLengthByNumber(tagNumber int32) (int, error) {
- fd := m.FindFieldDescriptor(int32(tagNumber))
- if fd == nil {
- return 0, UnknownTagNumberError
- }
- return m.fieldLength(fd)
-}
-
-func (m *Message) fieldLength(fd *desc.FieldDescriptor) (int, error) {
- if !fd.IsRepeated() {
- return 0, FieldIsNotRepeatedError
- }
- val := m.values[fd.GetNumber()]
- if val == nil {
- var err error
- if val, err = m.parseUnknownField(fd); err != nil {
- return 0, err
- } else if val == nil {
- return 0, nil
- }
- }
- if sl, ok := val.([]interface{}); ok {
- return len(sl), nil
- } else if mp, ok := val.(map[interface{}]interface{}); ok {
- return len(mp), nil
- }
- return 0, nil
-}
-
-// GetRepeatedField returns the value for the given repeated field descriptor at
-// the given index. It panics if an error is encountered. See
-// TryGetRepeatedField.
-func (m *Message) GetRepeatedField(fd *desc.FieldDescriptor, index int) interface{} {
- if v, err := m.TryGetRepeatedField(fd, index); err != nil {
- panic(err.Error())
- } else {
- return v
- }
-}
-
-// TryGetRepeatedField returns the value for the given repeated field descriptor
-// at the given index. An error is returned if the given field descriptor does
-// not belong to the right message type, if it is not a repeated field, or if
-// the given index is out of range (less than zero or greater than or equal to
-// the length of the repeated field). Also, even though map fields technically
-// are repeated fields, if the given field is a map field an error will result:
-// map representation does not lend itself to random access by index.
-//
-// The Go type of the value returned mirrors the type that protoc would generate
-// for the field's element type. (See TryGetField for more details on types).
-//
-// If the given field descriptor is not known (e.g. not present in the message
-// descriptor) but corresponds to an unknown field, the unknown value will be
-// parsed and become known. The value at the given index in the parsed value
-// will be returned. An error will be returned if the unknown value cannot be
-// parsed according to the field descriptor's type information.
-func (m *Message) TryGetRepeatedField(fd *desc.FieldDescriptor, index int) (interface{}, error) {
- if index < 0 {
- return nil, IndexOutOfRangeError
- }
- if err := m.checkField(fd); err != nil {
- return nil, err
- }
- return m.getRepeatedField(fd, index)
-}
-
-// GetRepeatedFieldByName returns the value for the repeated field with the
-// given name at the given index. It panics if an error is encountered. See
-// TryGetRepeatedFieldByName.
-func (m *Message) GetRepeatedFieldByName(name string, index int) interface{} {
- if v, err := m.TryGetRepeatedFieldByName(name, index); err != nil {
- panic(err.Error())
- } else {
- return v
- }
-}
-
-// TryGetRepeatedFieldByName returns the value for the repeated field with the
-// given name at the given index. An error is returned if the given name is
-// unknown, if it names a field that is not a repeated field (or is a map
-// field), or if the given index is out of range (less than zero or greater
-// than or equal to the length of the repeated field).
-//
-// (See TryGetField for more info on types.)
-func (m *Message) TryGetRepeatedFieldByName(name string, index int) (interface{}, error) {
- if index < 0 {
- return nil, IndexOutOfRangeError
- }
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return nil, UnknownFieldNameError
- }
- return m.getRepeatedField(fd, index)
-}
-
-// GetRepeatedFieldByNumber returns the value for the repeated field with the
-// given tag number at the given index. It panics if an error is encountered.
-// See TryGetRepeatedFieldByNumber.
-func (m *Message) GetRepeatedFieldByNumber(tagNumber int, index int) interface{} {
- if v, err := m.TryGetRepeatedFieldByNumber(tagNumber, index); err != nil {
- panic(err.Error())
- } else {
- return v
- }
-}
-
-// TryGetRepeatedFieldByNumber returns the value for the repeated field with the
-// given tag number at the given index. An error is returned if the given tag is
-// unknown, if it indicates a field that is not a repeated field (or is a map
-// field), or if the given index is out of range (less than zero or greater than
-// or equal to the length of the repeated field).
-//
-// (See TryGetField for more info on types.)
-func (m *Message) TryGetRepeatedFieldByNumber(tagNumber int, index int) (interface{}, error) {
- if index < 0 {
- return nil, IndexOutOfRangeError
- }
- fd := m.FindFieldDescriptor(int32(tagNumber))
- if fd == nil {
- return nil, UnknownTagNumberError
- }
- return m.getRepeatedField(fd, index)
-}
-
-func (m *Message) getRepeatedField(fd *desc.FieldDescriptor, index int) (interface{}, error) {
- if fd.IsMap() || !fd.IsRepeated() {
- return nil, FieldIsNotRepeatedError
- }
- sl := m.values[fd.GetNumber()]
- if sl == nil {
- var err error
- if sl, err = m.parseUnknownField(fd); err != nil {
- return nil, err
- } else if sl == nil {
- return nil, IndexOutOfRangeError
- }
- }
- res := sl.([]interface{})
- if index >= len(res) {
- return nil, IndexOutOfRangeError
- }
- return res[index], nil
-}
-
-// AddRepeatedField appends the given value to the given repeated field. It
-// panics if an error is encountered. See TryAddRepeatedField.
-func (m *Message) AddRepeatedField(fd *desc.FieldDescriptor, val interface{}) {
- if err := m.TryAddRepeatedField(fd, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TryAddRepeatedField appends the given value to the given repeated field. An
-// error is returned if the given field descriptor does not belong to the right
-// message type, if the given field is not repeated, or if the given value is
-// not a correct/compatible type for the given field. If the given field is a
-// map field, the call will succeed if the given value is an instance of the
-// map's entry message type.
-//
-// The Go type expected for a field is the same as required by TrySetField for
-// a non-repeated field of the same type.
-//
-// If the given field descriptor is not known (e.g. not present in the message
-// descriptor) it will become known. Subsequent operations using tag numbers or
-// names will be able to resolve the newly-known type. If the message has a
-// value for the unknown value, it is parsed and the given value is appended to
-// it.
-func (m *Message) TryAddRepeatedField(fd *desc.FieldDescriptor, val interface{}) error {
- if err := m.checkField(fd); err != nil {
- return err
- }
- return m.addRepeatedField(fd, val)
-}
-
-// AddRepeatedFieldByName appends the given value to the repeated field with the
-// given name. It panics if an error is encountered. See
-// TryAddRepeatedFieldByName.
-func (m *Message) AddRepeatedFieldByName(name string, val interface{}) {
- if err := m.TryAddRepeatedFieldByName(name, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TryAddRepeatedFieldByName appends the given value to the repeated field with
-// the given name. An error is returned if the given name is unknown, if it
-// names a field that is not repeated, or if the given value has an incorrect
-// type.
-//
-// (See TrySetField for more info on types.)
-func (m *Message) TryAddRepeatedFieldByName(name string, val interface{}) error {
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return UnknownFieldNameError
- }
- return m.addRepeatedField(fd, val)
-}
-
-// AddRepeatedFieldByNumber appends the given value to the repeated field with
-// the given tag number. It panics if an error is encountered. See
-// TryAddRepeatedFieldByNumber.
-func (m *Message) AddRepeatedFieldByNumber(tagNumber int, val interface{}) {
- if err := m.TryAddRepeatedFieldByNumber(tagNumber, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TryAddRepeatedFieldByNumber appends the given value to the repeated field
-// with the given tag number. An error is returned if the given tag is unknown,
-// if it indicates a field that is not repeated, or if the given value has an
-// incorrect type.
-//
-// (See TrySetField for more info on types.)
-func (m *Message) TryAddRepeatedFieldByNumber(tagNumber int, val interface{}) error {
- fd := m.FindFieldDescriptor(int32(tagNumber))
- if fd == nil {
- return UnknownTagNumberError
- }
- return m.addRepeatedField(fd, val)
-}
-
-func (m *Message) addRepeatedField(fd *desc.FieldDescriptor, val interface{}) error {
- if !fd.IsRepeated() {
- return FieldIsNotRepeatedError
- }
- val, err := validElementFieldValue(fd, val)
- if err != nil {
- return err
- }
-
- if fd.IsMap() {
- // We're lenient. Just as we allow setting a map field to a slice of entry messages, we also allow
- // adding entries one at a time (as if the field were a normal repeated field).
- msg := val.(proto.Message)
- dm, err := asDynamicMessage(msg, fd.GetMessageType(), m.mf)
- if err != nil {
- return err
- }
- k, err := dm.TryGetFieldByNumber(1)
- if err != nil {
- return err
- }
- v, err := dm.TryGetFieldByNumber(2)
- if err != nil {
- return err
- }
- return m.putMapField(fd, k, v)
- }
-
- sl := m.values[fd.GetNumber()]
- if sl == nil {
- if sl, err = m.parseUnknownField(fd); err != nil {
- return err
- } else if sl == nil {
- sl = []interface{}{}
- }
- }
- res := sl.([]interface{})
- res = append(res, val)
- m.internalSetField(fd, res)
- return nil
-}
-
-// SetRepeatedField sets the value for the given repeated field descriptor and
-// given index to the given value. It panics if an error is encountered. See
-// SetRepeatedField.
-func (m *Message) SetRepeatedField(fd *desc.FieldDescriptor, index int, val interface{}) {
- if err := m.TrySetRepeatedField(fd, index, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TrySetRepeatedField sets the value for the given repeated field descriptor
-// and given index to the given value. An error is returned if the given field
-// descriptor does not belong to the right message type, if the given field is
-// not repeated, or if the given value is not a correct/compatible type for the
-// given field. Also, even though map fields technically are repeated fields, if
-// the given field is a map field an error will result: map representation does
-// not lend itself to random access by index.
-//
-// The Go type expected for a field is the same as required by TrySetField for
-// a non-repeated field of the same type.
-//
-// If the given field descriptor is not known (e.g. not present in the message
-// descriptor) it will become known. Subsequent operations using tag numbers or
-// names will be able to resolve the newly-known type. If the message has a
-// value for the unknown value, it is parsed and the element at the given index
-// is replaced with the given value.
-func (m *Message) TrySetRepeatedField(fd *desc.FieldDescriptor, index int, val interface{}) error {
- if index < 0 {
- return IndexOutOfRangeError
- }
- if err := m.checkField(fd); err != nil {
- return err
- }
- return m.setRepeatedField(fd, index, val)
-}
-
-// SetRepeatedFieldByName sets the value for the repeated field with the given
-// name and given index to the given value. It panics if an error is
-// encountered. See TrySetRepeatedFieldByName.
-func (m *Message) SetRepeatedFieldByName(name string, index int, val interface{}) {
- if err := m.TrySetRepeatedFieldByName(name, index, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TrySetRepeatedFieldByName sets the value for the repeated field with the
-// given name and the given index to the given value. An error is returned if
-// the given name is unknown, if it names a field that is not repeated (or is a
-// map field), or if the given value has an incorrect type.
-//
-// (See TrySetField for more info on types.)
-func (m *Message) TrySetRepeatedFieldByName(name string, index int, val interface{}) error {
- if index < 0 {
- return IndexOutOfRangeError
- }
- fd := m.FindFieldDescriptorByName(name)
- if fd == nil {
- return UnknownFieldNameError
- }
- return m.setRepeatedField(fd, index, val)
-}
-
-// SetRepeatedFieldByNumber sets the value for the repeated field with the given
-// tag number and given index to the given value. It panics if an error is
-// encountered. See TrySetRepeatedFieldByNumber.
-func (m *Message) SetRepeatedFieldByNumber(tagNumber int, index int, val interface{}) {
- if err := m.TrySetRepeatedFieldByNumber(tagNumber, index, val); err != nil {
- panic(err.Error())
- }
-}
-
-// TrySetRepeatedFieldByNumber sets the value for the repeated field with the
-// given tag number and the given index to the given value. An error is returned
-// if the given tag is unknown, if it indicates a field that is not repeated (or
-// is a map field), or if the given value has an incorrect type.
-//
-// (See TrySetField for more info on types.)
-func (m *Message) TrySetRepeatedFieldByNumber(tagNumber int, index int, val interface{}) error {
- if index < 0 {
- return IndexOutOfRangeError
- }
- fd := m.FindFieldDescriptor(int32(tagNumber))
- if fd == nil {
- return UnknownTagNumberError
- }
- return m.setRepeatedField(fd, index, val)
-}
-
-func (m *Message) setRepeatedField(fd *desc.FieldDescriptor, index int, val interface{}) error {
- if fd.IsMap() || !fd.IsRepeated() {
- return FieldIsNotRepeatedError
- }
- val, err := validElementFieldValue(fd, val)
- if err != nil {
- return err
- }
- sl := m.values[fd.GetNumber()]
- if sl == nil {
- if sl, err = m.parseUnknownField(fd); err != nil {
- return err
- } else if sl == nil {
- return IndexOutOfRangeError
- }
- }
- res := sl.([]interface{})
- if index >= len(res) {
- return IndexOutOfRangeError
- }
- res[index] = val
- return nil
-}
-
-// GetUnknownField gets the value(s) for the given unknown tag number. If this
-// message has no unknown fields with the given tag, nil is returned.
-func (m *Message) GetUnknownField(tagNumber int32) []UnknownField {
- if u, ok := m.unknownFields[tagNumber]; ok {
- return u
- } else {
- return nil
- }
-}
-
-func (m *Message) parseUnknownField(fd *desc.FieldDescriptor) (interface{}, error) {
- unks, ok := m.unknownFields[fd.GetNumber()]
- if !ok {
- return nil, nil
- }
- var v interface{}
- var sl []interface{}
- var mp map[interface{}]interface{}
- if fd.IsMap() {
- mp = map[interface{}]interface{}{}
- }
- var err error
- for _, unk := range unks {
- var val interface{}
- if unk.Encoding == proto.WireBytes || unk.Encoding == proto.WireStartGroup {
- val, err = codec.DecodeLengthDelimitedField(fd, unk.Contents, m.mf)
- } else {
- val, err = codec.DecodeScalarField(fd, unk.Value)
- }
- if err != nil {
- return nil, err
- }
- if fd.IsMap() {
- newEntry := val.(*Message)
- kk, err := newEntry.TryGetFieldByNumber(1)
- if err != nil {
- return nil, err
- }
- vv, err := newEntry.TryGetFieldByNumber(2)
- if err != nil {
- return nil, err
- }
- mp[kk] = vv
- v = mp
- } else if fd.IsRepeated() {
- t := reflect.TypeOf(val)
- if t.Kind() == reflect.Slice && t != typeOfBytes {
- // append slices if we unmarshalled a packed repeated field
- newVals := val.([]interface{})
- sl = append(sl, newVals...)
- } else {
- sl = append(sl, val)
- }
- v = sl
- } else {
- v = val
- }
- }
- m.internalSetField(fd, v)
- return v, nil
-}
-
-func validFieldValue(fd *desc.FieldDescriptor, val interface{}) (interface{}, error) {
- return validFieldValueForRv(fd, reflect.ValueOf(val))
-}
-
-func validFieldValueForRv(fd *desc.FieldDescriptor, val reflect.Value) (interface{}, error) {
- if fd.IsMap() && val.Kind() == reflect.Map {
- return validFieldValueForMapField(fd, val)
- }
-
- if fd.IsRepeated() { // this will also catch map fields where given value was not a map
- if val.Kind() != reflect.Array && val.Kind() != reflect.Slice {
- if fd.IsMap() {
- return nil, fmt.Errorf("value for map field must be a map; instead was %v", val.Type())
- } else {
- return nil, fmt.Errorf("value for repeated field must be a slice; instead was %v", val.Type())
- }
- }
-
- if fd.IsMap() {
- // value should be a slice of entry messages that we need convert into a map[interface{}]interface{}
- m := map[interface{}]interface{}{}
- for i := 0; i < val.Len(); i++ {
- e, err := validElementFieldValue(fd, val.Index(i).Interface())
- if err != nil {
- return nil, err
- }
- msg := e.(proto.Message)
- dm, err := asDynamicMessage(msg, fd.GetMessageType(), nil)
- if err != nil {
- return nil, err
- }
- k, err := dm.TryGetFieldByNumber(1)
- if err != nil {
- return nil, err
- }
- v, err := dm.TryGetFieldByNumber(2)
- if err != nil {
- return nil, err
- }
- m[k] = v
- }
- return m, nil
- }
-
- // make a defensive copy while checking contents (also converts to []interface{})
- s := make([]interface{}, val.Len())
- for i := 0; i < val.Len(); i++ {
- ev := val.Index(i)
- if ev.Kind() == reflect.Interface {
- // unwrap it
- ev = reflect.ValueOf(ev.Interface())
- }
- e, err := validElementFieldValueForRv(fd, ev)
- if err != nil {
- return nil, err
- }
- s[i] = e
- }
-
- return s, nil
- }
-
- return validElementFieldValueForRv(fd, val)
-}
-
-func asDynamicMessage(m proto.Message, md *desc.MessageDescriptor, mf *MessageFactory) (*Message, error) {
- if dm, ok := m.(*Message); ok {
- return dm, nil
- }
- dm := NewMessageWithMessageFactory(md, mf)
- if err := dm.mergeFrom(m); err != nil {
- return nil, err
- }
- return dm, nil
-}
-
-func validElementFieldValue(fd *desc.FieldDescriptor, val interface{}) (interface{}, error) {
- return validElementFieldValueForRv(fd, reflect.ValueOf(val))
-}
-
-func validElementFieldValueForRv(fd *desc.FieldDescriptor, val reflect.Value) (interface{}, error) {
- t := fd.GetType()
- if !val.IsValid() {
- return nil, typeError(fd, nil)
- }
-
- switch t {
- case descriptor.FieldDescriptorProto_TYPE_SFIXED32,
- descriptor.FieldDescriptorProto_TYPE_INT32,
- descriptor.FieldDescriptorProto_TYPE_SINT32,
- descriptor.FieldDescriptorProto_TYPE_ENUM:
- return toInt32(reflect.Indirect(val), fd)
-
- case descriptor.FieldDescriptorProto_TYPE_SFIXED64,
- descriptor.FieldDescriptorProto_TYPE_INT64,
- descriptor.FieldDescriptorProto_TYPE_SINT64:
- return toInt64(reflect.Indirect(val), fd)
-
- case descriptor.FieldDescriptorProto_TYPE_FIXED32,
- descriptor.FieldDescriptorProto_TYPE_UINT32:
- return toUint32(reflect.Indirect(val), fd)
-
- case descriptor.FieldDescriptorProto_TYPE_FIXED64,
- descriptor.FieldDescriptorProto_TYPE_UINT64:
- return toUint64(reflect.Indirect(val), fd)
-
- case descriptor.FieldDescriptorProto_TYPE_FLOAT:
- return toFloat32(reflect.Indirect(val), fd)
-
- case descriptor.FieldDescriptorProto_TYPE_DOUBLE:
- return toFloat64(reflect.Indirect(val), fd)
-
- case descriptor.FieldDescriptorProto_TYPE_BOOL:
- return toBool(reflect.Indirect(val), fd)
-
- case descriptor.FieldDescriptorProto_TYPE_BYTES:
- return toBytes(reflect.Indirect(val), fd)
-
- case descriptor.FieldDescriptorProto_TYPE_STRING:
- return toString(reflect.Indirect(val), fd)
-
- case descriptor.FieldDescriptorProto_TYPE_MESSAGE,
- descriptor.FieldDescriptorProto_TYPE_GROUP:
- m, err := asMessage(val, fd.GetFullyQualifiedName())
- // check that message is correct type
- if err != nil {
- return nil, err
- }
- var msgType string
- if dm, ok := m.(*Message); ok {
- msgType = dm.GetMessageDescriptor().GetFullyQualifiedName()
- } else {
- msgType = proto.MessageName(m)
- }
- if msgType != fd.GetMessageType().GetFullyQualifiedName() {
- return nil, fmt.Errorf("message field %s requires value of type %s; received %s", fd.GetFullyQualifiedName(), fd.GetMessageType().GetFullyQualifiedName(), msgType)
- }
- return m, nil
-
- default:
- return nil, fmt.Errorf("unable to handle unrecognized field type: %v", fd.GetType())
- }
-}
-
-func toInt32(v reflect.Value, fd *desc.FieldDescriptor) (int32, error) {
- if v.Kind() == reflect.Int32 {
- return int32(v.Int()), nil
- }
- return 0, typeError(fd, v.Type())
-}
-
-func toUint32(v reflect.Value, fd *desc.FieldDescriptor) (uint32, error) {
- if v.Kind() == reflect.Uint32 {
- return uint32(v.Uint()), nil
- }
- return 0, typeError(fd, v.Type())
-}
-
-func toFloat32(v reflect.Value, fd *desc.FieldDescriptor) (float32, error) {
- if v.Kind() == reflect.Float32 {
- return float32(v.Float()), nil
- }
- return 0, typeError(fd, v.Type())
-}
-
-func toInt64(v reflect.Value, fd *desc.FieldDescriptor) (int64, error) {
- if v.Kind() == reflect.Int64 || v.Kind() == reflect.Int || v.Kind() == reflect.Int32 {
- return v.Int(), nil
- }
- return 0, typeError(fd, v.Type())
-}
-
-func toUint64(v reflect.Value, fd *desc.FieldDescriptor) (uint64, error) {
- if v.Kind() == reflect.Uint64 || v.Kind() == reflect.Uint || v.Kind() == reflect.Uint32 {
- return v.Uint(), nil
- }
- return 0, typeError(fd, v.Type())
-}
-
-func toFloat64(v reflect.Value, fd *desc.FieldDescriptor) (float64, error) {
- if v.Kind() == reflect.Float64 || v.Kind() == reflect.Float32 {
- return v.Float(), nil
- }
- return 0, typeError(fd, v.Type())
-}
-
-func toBool(v reflect.Value, fd *desc.FieldDescriptor) (bool, error) {
- if v.Kind() == reflect.Bool {
- return v.Bool(), nil
- }
- return false, typeError(fd, v.Type())
-}
-
-func toBytes(v reflect.Value, fd *desc.FieldDescriptor) ([]byte, error) {
- if v.Kind() == reflect.Slice && v.Type().Elem().Kind() == reflect.Uint8 {
- return v.Bytes(), nil
- }
- return nil, typeError(fd, v.Type())
-}
-
-func toString(v reflect.Value, fd *desc.FieldDescriptor) (string, error) {
- if v.Kind() == reflect.String {
- return v.String(), nil
- }
- return "", typeError(fd, v.Type())
-}
-
-func typeError(fd *desc.FieldDescriptor, t reflect.Type) error {
- return fmt.Errorf(
- "%s field %s is not compatible with value of type %v",
- getTypeString(fd), fd.GetFullyQualifiedName(), t)
-}
-
-func getTypeString(fd *desc.FieldDescriptor) string {
- return strings.ToLower(fd.GetType().String())
-}
-
-func asMessage(v reflect.Value, fieldName string) (proto.Message, error) {
- t := v.Type()
- // we need a pointer to a struct that implements proto.Message
- if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct || !t.Implements(typeOfProtoMessage) {
- return nil, fmt.Errorf("message field %s requires is not compatible with value of type %v", fieldName, v.Type())
- }
- return v.Interface().(proto.Message), nil
-}
-
-// Reset resets this message to an empty message. It removes all values set in
-// the message.
-func (m *Message) Reset() {
- for k := range m.values {
- delete(m.values, k)
- }
- for k := range m.unknownFields {
- delete(m.unknownFields, k)
- }
-}
-
-// String returns this message rendered in compact text format.
-func (m *Message) String() string {
- b, err := m.MarshalText()
- if err != nil {
- panic(fmt.Sprintf("Failed to create string representation of message: %s", err.Error()))
- }
- return string(b)
-}
-
-// ProtoMessage is present to satisfy the proto.Message interface.
-func (m *Message) ProtoMessage() {
-}
-
-// ConvertTo converts this dynamic message into the given message. This is
-// shorthand for resetting then merging:
-// target.Reset()
-// m.MergeInto(target)
-func (m *Message) ConvertTo(target proto.Message) error {
- if err := m.checkType(target); err != nil {
- return err
- }
-
- target.Reset()
- return m.mergeInto(target)
-}
-
-// ConvertFrom converts the given message into this dynamic message. This is
-// shorthand for resetting then merging:
-// m.Reset()
-// m.MergeFrom(target)
-func (m *Message) ConvertFrom(target proto.Message) error {
- if err := m.checkType(target); err != nil {
- return err
- }
-
- m.Reset()
- return m.mergeFrom(target)
-}
-
-// MergeInto merges this dynamic message into the given message. All field
-// values in this message will be set on the given message. For map fields,
-// entries are added to the given message (if the given message has existing
-// values for like keys, they are overwritten). For slice fields, elements are
-// added.
-//
-// If the given message has a different set of known fields, it is possible for
-// some known fields in this message to be represented as unknown fields in the
-// given message after merging, and vice versa.
-func (m *Message) MergeInto(target proto.Message) error {
- if err := m.checkType(target); err != nil {
- return err
- }
- return m.mergeInto(target)
-}
-
-// MergeFrom merges the given message into this dynamic message. All field
-// values in the given message will be set on this message. For map fields,
-// entries are added to this message (if this message has existing values for
-// like keys, they are overwritten). For slice fields, elements are added.
-//
-// If the given message has a different set of known fields, it is possible for
-// some known fields in that message to be represented as unknown fields in this
-// message after merging, and vice versa.
-func (m *Message) MergeFrom(source proto.Message) error {
- if err := m.checkType(source); err != nil {
- return err
- }
- return m.mergeFrom(source)
-}
-
-// Merge implements the proto.Merger interface so that dynamic messages are
-// compatible with the proto.Merge function. It delegates to MergeFrom but will
-// panic on error as the proto.Merger interface doesn't allow for returning an
-// error.
-//
-// Unlike nearly all other methods, this method can work if this message's type
-// is not defined (such as instantiating the message without using NewMessage).
-// This is strictly so that dynamic message's are compatible with the
-// proto.Clone function, which instantiates a new message via reflection (thus
-// its message descriptor will not be set) and than calls Merge.
-func (m *Message) Merge(source proto.Message) {
- if m.md == nil {
- // To support proto.Clone, initialize the descriptor from the source.
- if dm, ok := source.(*Message); ok {
- m.md = dm.md
- // also make sure the clone uses the same message factory and
- // extensions and also knows about the same extra fields (if any)
- m.mf = dm.mf
- m.er = dm.er
- m.extraFields = dm.extraFields
- } else if md, err := desc.LoadMessageDescriptorForMessage(source); err != nil {
- panic(err.Error())
- } else {
- m.md = md
- }
- }
-
- if err := m.MergeFrom(source); err != nil {
- panic(err.Error())
- }
-}
-
-func (m *Message) checkType(target proto.Message) error {
- if dm, ok := target.(*Message); ok {
- if dm.md.GetFullyQualifiedName() != m.md.GetFullyQualifiedName() {
- return fmt.Errorf("given message has wrong type: %q; expecting %q", dm.md.GetFullyQualifiedName(), m.md.GetFullyQualifiedName())
- }
- return nil
- }
-
- msgName := proto.MessageName(target)
- if msgName != m.md.GetFullyQualifiedName() {
- return fmt.Errorf("given message has wrong type: %q; expecting %q", msgName, m.md.GetFullyQualifiedName())
- }
- return nil
-}
-
-func (m *Message) mergeInto(pm proto.Message) error {
- if dm, ok := pm.(*Message); ok {
- return dm.mergeFrom(m)
- }
-
- target := reflect.ValueOf(pm)
- if target.Kind() == reflect.Ptr {
- target = target.Elem()
- }
-
- // track tags for which the dynamic message has data but the given
- // message doesn't know about it
- u := target.FieldByName("XXX_unrecognized")
- var unknownTags map[int32]struct{}
- if u.IsValid() && u.Type() == typeOfBytes {
- unknownTags = map[int32]struct{}{}
- for tag := range m.values {
- unknownTags[tag] = struct{}{}
- }
- }
-
- // check that we can successfully do the merge
- structProps := proto.GetProperties(reflect.TypeOf(pm).Elem())
- for _, prop := range structProps.Prop {
- if prop.Tag == 0 {
- continue // one-of or special field (such as XXX_unrecognized, etc.)
- }
- tag := int32(prop.Tag)
- v, ok := m.values[tag]
- if !ok {
- continue
- }
- if unknownTags != nil {
- delete(unknownTags, tag)
- }
- f := target.FieldByName(prop.Name)
- ft := f.Type()
- val := reflect.ValueOf(v)
- if !canConvert(val, ft) {
- return fmt.Errorf("cannot convert %v to %v", val.Type(), ft)
- }
- }
- // check one-of fields
- for _, oop := range structProps.OneofTypes {
- prop := oop.Prop
- tag := int32(prop.Tag)
- v, ok := m.values[tag]
- if !ok {
- continue
- }
- if unknownTags != nil {
- delete(unknownTags, tag)
- }
- stf, ok := oop.Type.Elem().FieldByName(prop.Name)
- if !ok {
- return fmt.Errorf("one-of field indicates struct field name %s, but type %v has no such field", prop.Name, oop.Type.Elem())
- }
- ft := stf.Type
- val := reflect.ValueOf(v)
- if !canConvert(val, ft) {
- return fmt.Errorf("cannot convert %v to %v", val.Type(), ft)
- }
- }
- // and check extensions, too
- for tag, ext := range proto.RegisteredExtensions(pm) {
- v, ok := m.values[tag]
- if !ok {
- continue
- }
- if unknownTags != nil {
- delete(unknownTags, tag)
- }
- ft := reflect.TypeOf(ext.ExtensionType)
- val := reflect.ValueOf(v)
- if !canConvert(val, ft) {
- return fmt.Errorf("cannot convert %v to %v", val.Type(), ft)
- }
- }
-
- // now actually perform the merge
- for _, prop := range structProps.Prop {
- v, ok := m.values[int32(prop.Tag)]
- if !ok {
- continue
- }
- f := target.FieldByName(prop.Name)
- if err := mergeVal(reflect.ValueOf(v), f); err != nil {
- return err
- }
- }
- // merge one-ofs
- for _, oop := range structProps.OneofTypes {
- prop := oop.Prop
- tag := int32(prop.Tag)
- v, ok := m.values[tag]
- if !ok {
- continue
- }
- oov := reflect.New(oop.Type.Elem())
- f := oov.Elem().FieldByName(prop.Name)
- if err := mergeVal(reflect.ValueOf(v), f); err != nil {
- return err
- }
- target.Field(oop.Field).Set(oov)
- }
- // merge extensions, too
- for tag, ext := range proto.RegisteredExtensions(pm) {
- v, ok := m.values[tag]
- if !ok {
- continue
- }
- e := reflect.New(reflect.TypeOf(ext.ExtensionType)).Elem()
- if err := mergeVal(reflect.ValueOf(v), e); err != nil {
- return err
- }
- if err := proto.SetExtension(pm, ext, e.Interface()); err != nil {
- // shouldn't happen since we already checked that the extension type was compatible above
- return err
- }
- }
-
- // if we have fields that the given message doesn't know about, add to its unknown fields
- if len(unknownTags) > 0 {
- ub := u.Interface().([]byte)
- var b codec.Buffer
- b.SetDeterministic(defaultDeterminism)
- for tag := range unknownTags {
- fd := m.FindFieldDescriptor(tag)
- if err := b.EncodeFieldValue(fd, m.values[tag]); err != nil {
- return err
- }
- }
- ub = append(ub, b.Bytes()...)
- u.Set(reflect.ValueOf(ub))
- }
-
- // finally, convey unknown fields into the given message by letting it unmarshal them
- // (this will append to its unknown fields if not known; if somehow the given message recognizes
- // a field even though the dynamic message did not, it will get correctly unmarshalled)
- if unknownTags != nil && len(m.unknownFields) > 0 {
- var b codec.Buffer
- _ = m.marshalUnknownFields(&b)
- _ = proto.UnmarshalMerge(b.Bytes(), pm)
- }
-
- return nil
-}
-
-func canConvert(src reflect.Value, target reflect.Type) bool {
- if src.Kind() == reflect.Interface {
- src = reflect.ValueOf(src.Interface())
- }
- srcType := src.Type()
- // we allow convertible types instead of requiring exact types so that calling
- // code can, for example, assign an enum constant to an enum field. In that case,
- // one type is the enum type (a sub-type of int32) and the other may be the int32
- // type. So we automatically do the conversion in that case.
- if srcType.ConvertibleTo(target) {
- return true
- } else if target.Kind() == reflect.Ptr && srcType.ConvertibleTo(target.Elem()) {
- return true
- } else if target.Kind() == reflect.Slice {
- if srcType.Kind() != reflect.Slice {
- return false
- }
- et := target.Elem()
- for i := 0; i < src.Len(); i++ {
- if !canConvert(src.Index(i), et) {
- return false
- }
- }
- return true
- } else if target.Kind() == reflect.Map {
- if srcType.Kind() != reflect.Map {
- return false
- }
- return canConvertMap(src, target)
- } else if srcType == typeOfDynamicMessage && target.Implements(typeOfProtoMessage) {
- z := reflect.Zero(target).Interface()
- msgType := proto.MessageName(z.(proto.Message))
- return msgType == src.Interface().(*Message).GetMessageDescriptor().GetFullyQualifiedName()
- } else {
- return false
- }
-}
-
-func mergeVal(src, target reflect.Value) error {
- if src.Kind() == reflect.Interface && !src.IsNil() {
- src = src.Elem()
- }
- srcType := src.Type()
- targetType := target.Type()
- if srcType.ConvertibleTo(targetType) {
- if targetType.Implements(typeOfProtoMessage) && !target.IsNil() {
- Merge(target.Interface().(proto.Message), src.Convert(targetType).Interface().(proto.Message))
- } else {
- target.Set(src.Convert(targetType))
- }
- } else if targetType.Kind() == reflect.Ptr && srcType.ConvertibleTo(targetType.Elem()) {
- if !src.CanAddr() {
- target.Set(reflect.New(targetType.Elem()))
- target.Elem().Set(src.Convert(targetType.Elem()))
- } else {
- target.Set(src.Addr().Convert(targetType))
- }
- } else if targetType.Kind() == reflect.Slice {
- l := target.Len()
- newL := l + src.Len()
- if target.Cap() < newL {
- // expand capacity of the slice and copy
- newSl := reflect.MakeSlice(targetType, newL, newL)
- for i := 0; i < target.Len(); i++ {
- newSl.Index(i).Set(target.Index(i))
- }
- target.Set(newSl)
- } else {
- target.SetLen(newL)
- }
- for i := 0; i < src.Len(); i++ {
- dest := target.Index(l + i)
- if dest.Kind() == reflect.Ptr {
- dest.Set(reflect.New(dest.Type().Elem()))
- }
- if err := mergeVal(src.Index(i), dest); err != nil {
- return err
- }
- }
- } else if targetType.Kind() == reflect.Map {
- return mergeMapVal(src, target, targetType)
- } else if srcType == typeOfDynamicMessage && targetType.Implements(typeOfProtoMessage) {
- dm := src.Interface().(*Message)
- if target.IsNil() {
- target.Set(reflect.New(targetType.Elem()))
- }
- m := target.Interface().(proto.Message)
- if err := dm.mergeInto(m); err != nil {
- return err
- }
- } else {
- return fmt.Errorf("cannot convert %v to %v", srcType, targetType)
- }
- return nil
-}
-
-func (m *Message) mergeFrom(pm proto.Message) error {
- if dm, ok := pm.(*Message); ok {
- // if given message is also a dynamic message, we merge differently
- for tag, v := range dm.values {
- fd := m.FindFieldDescriptor(tag)
- if fd == nil {
- fd = dm.FindFieldDescriptor(tag)
- }
- if err := mergeField(m, fd, v); err != nil {
- return err
- }
- }
- return nil
- }
-
- pmrv := reflect.ValueOf(pm)
- if pmrv.IsNil() {
- // nil is an empty message, so nothing to do
- return nil
- }
-
- // check that we can successfully do the merge
- src := pmrv.Elem()
- values := map[*desc.FieldDescriptor]interface{}{}
- props := proto.GetProperties(reflect.TypeOf(pm).Elem())
- if props == nil {
- return fmt.Errorf("could not determine message properties to merge for %v", reflect.TypeOf(pm).Elem())
- }
-
- // regular fields
- for _, prop := range props.Prop {
- if prop.Tag == 0 {
- continue // one-of or special field (such as XXX_unrecognized, etc.)
- }
- fd := m.FindFieldDescriptor(int32(prop.Tag))
- if fd == nil {
- // Our descriptor has different fields than this message object. So
- // try to reflect on the message object's fields.
- md, err := desc.LoadMessageDescriptorForMessage(pm)
- if err != nil {
- return err
- }
- fd = md.FindFieldByNumber(int32(prop.Tag))
- if fd == nil {
- return fmt.Errorf("message descriptor %q did not contain field for tag %d (%q)", md.GetFullyQualifiedName(), prop.Tag, prop.Name)
- }
- }
- rv := src.FieldByName(prop.Name)
- if (rv.Kind() == reflect.Ptr || rv.Kind() == reflect.Slice) && rv.IsNil() {
- continue
- }
- if v, err := validFieldValueForRv(fd, rv); err != nil {
- return err
- } else {
- values[fd] = v
- }
- }
-
- // one-of fields
- for _, oop := range props.OneofTypes {
- oov := src.Field(oop.Field).Elem()
- if !oov.IsValid() || oov.Type() != oop.Type {
- // this field is unset (in other words, one-of message field is not currently set to this option)
- continue
- }
- prop := oop.Prop
- rv := oov.Elem().FieldByName(prop.Name)
- fd := m.FindFieldDescriptor(int32(prop.Tag))
- if fd == nil {
- // Our descriptor has different fields than this message object. So
- // try to reflect on the message object's fields.
- md, err := desc.LoadMessageDescriptorForMessage(pm)
- if err != nil {
- return err
- }
- fd = md.FindFieldByNumber(int32(prop.Tag))
- if fd == nil {
- return fmt.Errorf("message descriptor %q did not contain field for tag %d (%q in one-of %q)", md.GetFullyQualifiedName(), prop.Tag, prop.Name, src.Type().Field(oop.Field).Name)
- }
- }
- if v, err := validFieldValueForRv(fd, rv); err != nil {
- return err
- } else {
- values[fd] = v
- }
- }
-
- // extension fields
- rexts, _ := proto.ExtensionDescs(pm)
- var unknownExtensions []byte
- for _, ed := range rexts {
- v, _ := proto.GetExtension(pm, ed)
- if v == nil {
- continue
- }
- if ed.ExtensionType == nil {
- extBytes, _ := v.([]byte)
- if len(extBytes) > 0 {
- unknownExtensions = append(unknownExtensions, extBytes...)
- }
- continue
- }
- fd := m.er.FindExtension(m.md.GetFullyQualifiedName(), ed.Field)
- if fd == nil {
- var err error
- if fd, err = desc.LoadFieldDescriptorForExtension(ed); err != nil {
- return err
- }
- }
- if v, err := validFieldValue(fd, v); err != nil {
- return err
- } else {
- values[fd] = v
- }
- }
-
- // now actually perform the merge
- for fd, v := range values {
- mergeField(m, fd, v)
- }
-
- u := src.FieldByName("XXX_unrecognized")
- if u.IsValid() && u.Type() == typeOfBytes {
- // ignore any error returned: pulling in unknown fields is best-effort
- _ = m.UnmarshalMerge(u.Interface().([]byte))
- }
-
- // lastly, also extract any unknown extensions the message may have (unknown extensions
- // are stored with other extensions, not in the XXX_unrecognized field, so we have to do
- // more than just the step above...)
- if len(unknownExtensions) > 0 {
- // pulling in unknown fields is best-effort, so we just ignore errors
- _ = m.UnmarshalMerge(unknownExtensions)
- }
- return nil
-}
-
-// Validate checks that all required fields are present. It returns an error if any are absent.
-func (m *Message) Validate() error {
- missingFields := m.findMissingFields()
- if len(missingFields) == 0 {
- return nil
- }
- return fmt.Errorf("some required fields missing: %v", strings.Join(missingFields, ", "))
-}
-
-func (m *Message) findMissingFields() []string {
- if m.md.IsProto3() {
- // proto3 does not allow required fields
- return nil
- }
- var missingFields []string
- for _, fd := range m.md.GetFields() {
- if fd.IsRequired() {
- if _, ok := m.values[fd.GetNumber()]; !ok {
- missingFields = append(missingFields, fd.GetName())
- }
- }
- }
- return missingFields
-}
-
-// ValidateRecursive checks that all required fields are present and also
-// recursively validates all fields who are also messages. It returns an error
-// if any required fields, in this message or nested within, are absent.
-func (m *Message) ValidateRecursive() error {
- return m.validateRecursive("")
-}
-
-func (m *Message) validateRecursive(prefix string) error {
- if missingFields := m.findMissingFields(); len(missingFields) > 0 {
- for i := range missingFields {
- missingFields[i] = fmt.Sprintf("%s%s", prefix, missingFields[i])
- }
- return fmt.Errorf("some required fields missing: %v", strings.Join(missingFields, ", "))
- }
-
- for tag, fld := range m.values {
- fd := m.FindFieldDescriptor(tag)
- var chprefix string
- var md *desc.MessageDescriptor
- checkMsg := func(pm proto.Message) error {
- var dm *Message
- if d, ok := pm.(*Message); ok {
- dm = d
- } else {
- dm = m.mf.NewDynamicMessage(md)
- if err := dm.ConvertFrom(pm); err != nil {
- return nil
- }
- }
- if err := dm.validateRecursive(chprefix); err != nil {
- return err
- }
- return nil
- }
- isMap := fd.IsMap()
- if isMap && fd.GetMapValueType().GetMessageType() != nil {
- md = fd.GetMapValueType().GetMessageType()
- mp := fld.(map[interface{}]interface{})
- for k, v := range mp {
- chprefix = fmt.Sprintf("%s%s[%v].", prefix, getName(fd), k)
- if err := checkMsg(v.(proto.Message)); err != nil {
- return err
- }
- }
- } else if !isMap && fd.GetMessageType() != nil {
- md = fd.GetMessageType()
- if fd.IsRepeated() {
- sl := fld.([]interface{})
- for i, v := range sl {
- chprefix = fmt.Sprintf("%s%s[%d].", prefix, getName(fd), i)
- if err := checkMsg(v.(proto.Message)); err != nil {
- return err
- }
- }
- } else {
- chprefix = fmt.Sprintf("%s%s.", prefix, getName(fd))
- if err := checkMsg(fld.(proto.Message)); err != nil {
- return err
- }
- }
- }
- }
-
- return nil
-}
-
-func getName(fd *desc.FieldDescriptor) string {
- if fd.IsExtension() {
- return fmt.Sprintf("(%s)", fd.GetFullyQualifiedName())
- } else {
- return fd.GetName()
- }
-}
-
-// knownFieldTags return tags of present and recognized fields, in sorted order.
-func (m *Message) knownFieldTags() []int {
- if len(m.values) == 0 {
- return []int(nil)
- }
-
- keys := make([]int, len(m.values))
- i := 0
- for k := range m.values {
- keys[i] = int(k)
- i++
- }
-
- sort.Ints(keys)
- return keys
-}
-
-// allKnownFieldTags return tags of present and recognized fields, including
-// those that are unset, in sorted order. This only includes extensions that are
-// present. Known but not-present extensions are not included in the returned
-// set of tags.
-func (m *Message) allKnownFieldTags() []int {
- fds := m.md.GetFields()
- keys := make([]int, 0, len(fds)+len(m.extraFields))
-
- for k := range m.values {
- keys = append(keys, int(k))
- }
-
- // also include known fields that are not present
- for _, fd := range fds {
- if _, ok := m.values[fd.GetNumber()]; !ok {
- keys = append(keys, int(fd.GetNumber()))
- }
- }
- for _, fd := range m.extraFields {
- if !fd.IsExtension() { // skip extensions that are not present
- if _, ok := m.values[fd.GetNumber()]; !ok {
- keys = append(keys, int(fd.GetNumber()))
- }
- }
- }
-
- sort.Ints(keys)
- return keys
-}
-
-// unknownFieldTags return tags of present but unrecognized fields, in sorted order.
-func (m *Message) unknownFieldTags() []int {
- if len(m.unknownFields) == 0 {
- return []int(nil)
- }
- keys := make([]int, len(m.unknownFields))
- i := 0
- for k := range m.unknownFields {
- keys[i] = int(k)
- i++
- }
- sort.Ints(keys)
- return keys
-}
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/equal.go b/vendor/github.com/jhump/protoreflect/dynamic/equal.go
deleted file mode 100644
index 5fbcc24..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/equal.go
+++ /dev/null
@@ -1,152 +0,0 @@
-package dynamic
-
-import (
- "bytes"
- "reflect"
-
- "github.com/golang/protobuf/proto"
-
- "github.com/jhump/protoreflect/desc"
-)
-
-// Equal returns true if the given two dynamic messages are equal. Two messages are equal when they
-// have the same message type and same fields set to equal values. For proto3 messages, fields set
-// to their zero value are considered unset.
-func Equal(a, b *Message) bool {
- if a.md.GetFullyQualifiedName() != b.md.GetFullyQualifiedName() {
- return false
- }
- if len(a.values) != len(b.values) {
- return false
- }
- if len(a.unknownFields) != len(b.unknownFields) {
- return false
- }
- for tag, aval := range a.values {
- bval, ok := b.values[tag]
- if !ok {
- return false
- }
- if !fieldsEqual(aval, bval) {
- return false
- }
- }
- for tag, au := range a.unknownFields {
- bu, ok := b.unknownFields[tag]
- if !ok {
- return false
- }
- if len(au) != len(bu) {
- return false
- }
- for i, aval := range au {
- bval := bu[i]
- if aval.Encoding != bval.Encoding {
- return false
- }
- if aval.Encoding == proto.WireBytes || aval.Encoding == proto.WireStartGroup {
- if !bytes.Equal(aval.Contents, bval.Contents) {
- return false
- }
- } else if aval.Value != bval.Value {
- return false
- }
- }
- }
- // all checks pass!
- return true
-}
-
-func fieldsEqual(aval, bval interface{}) bool {
- arv := reflect.ValueOf(aval)
- brv := reflect.ValueOf(bval)
- if arv.Type() != brv.Type() {
- // it is possible that one is a dynamic message and one is not
- apm, ok := aval.(proto.Message)
- if !ok {
- return false
- }
- bpm, ok := bval.(proto.Message)
- if !ok {
- return false
- }
- return MessagesEqual(apm, bpm)
-
- } else {
- switch arv.Kind() {
- case reflect.Ptr:
- apm, ok := aval.(proto.Message)
- if !ok {
- // Don't know how to compare pointer values that aren't messages!
- // Maybe this should panic?
- return false
- }
- bpm := bval.(proto.Message) // we know it will succeed because we know a and b have same type
- return MessagesEqual(apm, bpm)
-
- case reflect.Map:
- return mapsEqual(arv, brv)
-
- case reflect.Slice:
- if arv.Type() == typeOfBytes {
- return bytes.Equal(aval.([]byte), bval.([]byte))
- } else {
- return slicesEqual(arv, brv)
- }
-
- default:
- return aval == bval
- }
- }
-}
-
-func slicesEqual(a, b reflect.Value) bool {
- if a.Len() != b.Len() {
- return false
- }
- for i := 0; i < a.Len(); i++ {
- ai := a.Index(i)
- bi := b.Index(i)
- if !fieldsEqual(ai.Interface(), bi.Interface()) {
- return false
- }
- }
- return true
-}
-
-// MessagesEqual returns true if the given two messages are equal. Use this instead of proto.Equal
-// when one or both of the messages might be a dynamic message.
-func MessagesEqual(a, b proto.Message) bool {
- da, aok := a.(*Message)
- db, bok := b.(*Message)
- // Both dynamic messages
- if aok && bok {
- return Equal(da, db)
- }
- // Neither dynamic messages
- if !aok && !bok {
- return proto.Equal(a, b)
- }
- // Mixed
- if aok {
- md, err := desc.LoadMessageDescriptorForMessage(b)
- if err != nil {
- return false
- }
- db = NewMessageWithMessageFactory(md, da.mf)
- if db.ConvertFrom(b) != nil {
- return false
- }
- return Equal(da, db)
- } else {
- md, err := desc.LoadMessageDescriptorForMessage(a)
- if err != nil {
- return false
- }
- da = NewMessageWithMessageFactory(md, db.mf)
- if da.ConvertFrom(a) != nil {
- return false
- }
- return Equal(da, db)
- }
-}
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/extension.go b/vendor/github.com/jhump/protoreflect/dynamic/extension.go
deleted file mode 100644
index 1d38161..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/extension.go
+++ /dev/null
@@ -1,46 +0,0 @@
-package dynamic
-
-import (
- "fmt"
-
- "github.com/golang/protobuf/proto"
-
- "github.com/jhump/protoreflect/codec"
- "github.com/jhump/protoreflect/desc"
-)
-
-// SetExtension sets the given extension value. If the given message is not a
-// dynamic message, the given extension may not be recognized (or may differ
-// from the compiled and linked in version of the extension. So in that case,
-// this function will serialize the given value to bytes and then use
-// proto.SetRawExtension to set the value.
-func SetExtension(msg proto.Message, extd *desc.FieldDescriptor, val interface{}) error {
- if !extd.IsExtension() {
- return fmt.Errorf("given field %s is not an extension", extd.GetFullyQualifiedName())
- }
-
- if dm, ok := msg.(*Message); ok {
- return dm.TrySetField(extd, val)
- }
-
- md, err := desc.LoadMessageDescriptorForMessage(msg)
- if err != nil {
- return err
- }
- if err := checkField(extd, md); err != nil {
- return err
- }
-
- val, err = validFieldValue(extd, val)
- if err != nil {
- return err
- }
-
- var b codec.Buffer
- b.SetDeterministic(defaultDeterminism)
- if err := b.EncodeFieldValue(extd, val); err != nil {
- return err
- }
- proto.SetRawExtension(msg, extd.GetNumber(), b.Bytes())
- return nil
-}
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/extension_registry.go b/vendor/github.com/jhump/protoreflect/dynamic/extension_registry.go
deleted file mode 100644
index 6876827..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/extension_registry.go
+++ /dev/null
@@ -1,241 +0,0 @@
-package dynamic
-
-import (
- "fmt"
- "reflect"
- "sync"
-
- "github.com/golang/protobuf/proto"
-
- "github.com/jhump/protoreflect/desc"
-)
-
-// ExtensionRegistry is a registry of known extension fields. This is used to parse
-// extension fields encountered when de-serializing a dynamic message.
-type ExtensionRegistry struct {
- includeDefault bool
- mu sync.RWMutex
- exts map[string]map[int32]*desc.FieldDescriptor
-}
-
-// NewExtensionRegistryWithDefaults is a registry that includes all "default" extensions,
-// which are those that are statically linked into the current program (e.g. registered by
-// protoc-generated code via proto.RegisterExtension). Extensions explicitly added to the
-// registry will override any default extensions that are for the same extendee and have the
-// same tag number and/or name.
-func NewExtensionRegistryWithDefaults() *ExtensionRegistry {
- return &ExtensionRegistry{includeDefault: true}
-}
-
-// AddExtensionDesc adds the given extensions to the registry.
-func (r *ExtensionRegistry) AddExtensionDesc(exts ...*proto.ExtensionDesc) error {
- flds := make([]*desc.FieldDescriptor, len(exts))
- for i, ext := range exts {
- fd, err := desc.LoadFieldDescriptorForExtension(ext)
- if err != nil {
- return err
- }
- flds[i] = fd
- }
- r.mu.Lock()
- defer r.mu.Unlock()
- if r.exts == nil {
- r.exts = map[string]map[int32]*desc.FieldDescriptor{}
- }
- for _, fd := range flds {
- r.putExtensionLocked(fd)
- }
- return nil
-}
-
-// AddExtension adds the given extensions to the registry. The given extensions
-// will overwrite any previously added extensions that are for the same extendee
-// message and same extension tag number.
-func (r *ExtensionRegistry) AddExtension(exts ...*desc.FieldDescriptor) error {
- for _, ext := range exts {
- if !ext.IsExtension() {
- return fmt.Errorf("given field is not an extension: %s", ext.GetFullyQualifiedName())
- }
- }
- r.mu.Lock()
- defer r.mu.Unlock()
- if r.exts == nil {
- r.exts = map[string]map[int32]*desc.FieldDescriptor{}
- }
- for _, ext := range exts {
- r.putExtensionLocked(ext)
- }
- return nil
-}
-
-// AddExtensionsFromFile adds to the registry all extension fields defined in the given file descriptor.
-func (r *ExtensionRegistry) AddExtensionsFromFile(fd *desc.FileDescriptor) {
- r.mu.Lock()
- defer r.mu.Unlock()
- r.addExtensionsFromFileLocked(fd, false, nil)
-}
-
-// AddExtensionsFromFileRecursively adds to the registry all extension fields defined in the give file
-// descriptor and also recursively adds all extensions defined in that file's dependencies. This adds
-// extensions from the entire transitive closure for the given file.
-func (r *ExtensionRegistry) AddExtensionsFromFileRecursively(fd *desc.FileDescriptor) {
- r.mu.Lock()
- defer r.mu.Unlock()
- already := map[*desc.FileDescriptor]struct{}{}
- r.addExtensionsFromFileLocked(fd, true, already)
-}
-
-func (r *ExtensionRegistry) addExtensionsFromFileLocked(fd *desc.FileDescriptor, recursive bool, alreadySeen map[*desc.FileDescriptor]struct{}) {
- if _, ok := alreadySeen[fd]; ok {
- return
- }
-
- if r.exts == nil {
- r.exts = map[string]map[int32]*desc.FieldDescriptor{}
- }
- for _, ext := range fd.GetExtensions() {
- r.putExtensionLocked(ext)
- }
- for _, msg := range fd.GetMessageTypes() {
- r.addExtensionsFromMessageLocked(msg)
- }
-
- if recursive {
- alreadySeen[fd] = struct{}{}
- for _, dep := range fd.GetDependencies() {
- r.addExtensionsFromFileLocked(dep, recursive, alreadySeen)
- }
- }
-}
-
-func (r *ExtensionRegistry) addExtensionsFromMessageLocked(md *desc.MessageDescriptor) {
- for _, ext := range md.GetNestedExtensions() {
- r.putExtensionLocked(ext)
- }
- for _, msg := range md.GetNestedMessageTypes() {
- r.addExtensionsFromMessageLocked(msg)
- }
-}
-
-func (r *ExtensionRegistry) putExtensionLocked(fd *desc.FieldDescriptor) {
- msgName := fd.GetOwner().GetFullyQualifiedName()
- m := r.exts[msgName]
- if m == nil {
- m = map[int32]*desc.FieldDescriptor{}
- r.exts[msgName] = m
- }
- m[fd.GetNumber()] = fd
-}
-
-// FindExtension queries for the extension field with the given extendee name (must be a fully-qualified
-// message name) and tag number. If no extension is known, nil is returned.
-func (r *ExtensionRegistry) FindExtension(messageName string, tagNumber int32) *desc.FieldDescriptor {
- if r == nil {
- return nil
- }
- r.mu.RLock()
- defer r.mu.RUnlock()
- fd := r.exts[messageName][tagNumber]
- if fd == nil && r.includeDefault {
- ext := getDefaultExtensions(messageName)[tagNumber]
- if ext != nil {
- fd, _ = desc.LoadFieldDescriptorForExtension(ext)
- }
- }
- return fd
-}
-
-// FindExtensionByName queries for the extension field with the given extendee name (must be a fully-qualified
-// message name) and field name (must also be a fully-qualified extension name). If no extension is known, nil
-// is returned.
-func (r *ExtensionRegistry) FindExtensionByName(messageName string, fieldName string) *desc.FieldDescriptor {
- if r == nil {
- return nil
- }
- r.mu.RLock()
- defer r.mu.RUnlock()
- for _, fd := range r.exts[messageName] {
- if fd.GetFullyQualifiedName() == fieldName {
- return fd
- }
- }
- if r.includeDefault {
- for _, ext := range getDefaultExtensions(messageName) {
- fd, _ := desc.LoadFieldDescriptorForExtension(ext)
- if fd.GetFullyQualifiedName() == fieldName {
- return fd
- }
- }
- }
- return nil
-}
-
-// FindExtensionByJSONName queries for the extension field with the given extendee name (must be a fully-qualified
-// message name) and JSON field name (must also be a fully-qualified name). If no extension is known, nil is returned.
-// The fully-qualified JSON name is the same as the extension's normal fully-qualified name except that the last
-// component uses the field's JSON name (if present).
-func (r *ExtensionRegistry) FindExtensionByJSONName(messageName string, fieldName string) *desc.FieldDescriptor {
- if r == nil {
- return nil
- }
- r.mu.RLock()
- defer r.mu.RUnlock()
- for _, fd := range r.exts[messageName] {
- if fd.GetFullyQualifiedJSONName() == fieldName {
- return fd
- }
- }
- if r.includeDefault {
- for _, ext := range getDefaultExtensions(messageName) {
- fd, _ := desc.LoadFieldDescriptorForExtension(ext)
- if fd.GetFullyQualifiedJSONName() == fieldName {
- return fd
- }
- }
- }
- return nil
-}
-
-func getDefaultExtensions(messageName string) map[int32]*proto.ExtensionDesc {
- t := proto.MessageType(messageName)
- if t != nil {
- msg := reflect.Zero(t).Interface().(proto.Message)
- return proto.RegisteredExtensions(msg)
- }
- return nil
-}
-
-// AllExtensionsForType returns all known extension fields for the given extendee name (must be a
-// fully-qualified message name).
-func (r *ExtensionRegistry) AllExtensionsForType(messageName string) []*desc.FieldDescriptor {
- if r == nil {
- return []*desc.FieldDescriptor(nil)
- }
- r.mu.RLock()
- defer r.mu.RUnlock()
- flds := r.exts[messageName]
- var ret []*desc.FieldDescriptor
- if r.includeDefault {
- exts := getDefaultExtensions(messageName)
- if len(exts) > 0 || len(flds) > 0 {
- ret = make([]*desc.FieldDescriptor, 0, len(exts)+len(flds))
- }
- for tag, ext := range exts {
- if _, ok := flds[tag]; ok {
- // skip default extension and use the one explicitly registered instead
- continue
- }
- fd, _ := desc.LoadFieldDescriptorForExtension(ext)
- if fd != nil {
- ret = append(ret, fd)
- }
- }
- } else if len(flds) > 0 {
- ret = make([]*desc.FieldDescriptor, 0, len(flds))
- }
-
- for _, ext := range flds {
- ret = append(ret, ext)
- }
- return ret
-}
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/indent.go b/vendor/github.com/jhump/protoreflect/dynamic/indent.go
deleted file mode 100644
index bd7fcaa..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/indent.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package dynamic
-
-import "bytes"
-
-type indentBuffer struct {
- bytes.Buffer
- indent string
- indentCount int
- comma bool
-}
-
-func (b *indentBuffer) start() error {
- if b.indentCount >= 0 {
- b.indentCount++
- return b.newLine(false)
- }
- return nil
-}
-
-func (b *indentBuffer) sep() error {
- if b.indentCount >= 0 {
- _, err := b.WriteString(": ")
- return err
- } else {
- return b.WriteByte(':')
- }
-}
-
-func (b *indentBuffer) end() error {
- if b.indentCount >= 0 {
- b.indentCount--
- return b.newLine(false)
- }
- return nil
-}
-
-func (b *indentBuffer) maybeNext(first *bool) error {
- if *first {
- *first = false
- return nil
- } else {
- return b.next()
- }
-}
-
-func (b *indentBuffer) next() error {
- if b.indentCount >= 0 {
- return b.newLine(b.comma)
- } else if b.comma {
- return b.WriteByte(',')
- } else {
- return b.WriteByte(' ')
- }
-}
-
-func (b *indentBuffer) newLine(comma bool) error {
- if comma {
- err := b.WriteByte(',')
- if err != nil {
- return err
- }
- }
-
- err := b.WriteByte('\n')
- if err != nil {
- return err
- }
-
- for i := 0; i < b.indentCount; i++ {
- _, err := b.WriteString(b.indent)
- if err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/json.go b/vendor/github.com/jhump/protoreflect/dynamic/json.go
deleted file mode 100644
index 7dfae09..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/json.go
+++ /dev/null
@@ -1,1238 +0,0 @@
-package dynamic
-
-// JSON marshalling and unmarshalling for dynamic messages
-
-import (
- "bytes"
- "encoding/base64"
- "encoding/json"
- "fmt"
- "io"
- "io/ioutil"
- "math"
- "reflect"
- "sort"
- "strconv"
- "strings"
-
- "github.com/golang/protobuf/jsonpb"
- "github.com/golang/protobuf/proto"
- "github.com/golang/protobuf/protoc-gen-go/descriptor"
- // link in the well-known-types that have a special JSON format
- _ "github.com/golang/protobuf/ptypes/any"
- _ "github.com/golang/protobuf/ptypes/duration"
- _ "github.com/golang/protobuf/ptypes/empty"
- _ "github.com/golang/protobuf/ptypes/struct"
- _ "github.com/golang/protobuf/ptypes/timestamp"
- _ "github.com/golang/protobuf/ptypes/wrappers"
-
- "github.com/jhump/protoreflect/desc"
-)
-
-var wellKnownTypeNames = map[string]struct{}{
- "google.protobuf.Any": {},
- "google.protobuf.Empty": {},
- "google.protobuf.Duration": {},
- "google.protobuf.Timestamp": {},
- // struct.proto
- "google.protobuf.Struct": {},
- "google.protobuf.Value": {},
- "google.protobuf.ListValue": {},
- // wrappers.proto
- "google.protobuf.DoubleValue": {},
- "google.protobuf.FloatValue": {},
- "google.protobuf.Int64Value": {},
- "google.protobuf.UInt64Value": {},
- "google.protobuf.Int32Value": {},
- "google.protobuf.UInt32Value": {},
- "google.protobuf.BoolValue": {},
- "google.protobuf.StringValue": {},
- "google.protobuf.BytesValue": {},
-}
-
-// MarshalJSON serializes this message to bytes in JSON format, returning an
-// error if the operation fails. The resulting bytes will be a valid UTF8
-// string.
-//
-// This method uses a compact form: no newlines, and spaces between fields and
-// between field identifiers and values are elided.
-//
-// This method is convenient shorthand for invoking MarshalJSONPB with a default
-// (zero value) marshaler:
-//
-// m.MarshalJSONPB(&jsonpb.Marshaler{})
-//
-// So enums are serialized using enum value name strings, and values that are
-// not present (including those with default/zero value for messages defined in
-// "proto3" syntax) are omitted.
-func (m *Message) MarshalJSON() ([]byte, error) {
- return m.MarshalJSONPB(&jsonpb.Marshaler{})
-}
-
-// MarshalJSONIndent serializes this message to bytes in JSON format, returning
-// an error if the operation fails. The resulting bytes will be a valid UTF8
-// string.
-//
-// This method uses a "pretty-printed" form, with each field on its own line and
-// spaces between field identifiers and values. Indentation of two spaces is
-// used.
-//
-// This method is convenient shorthand for invoking MarshalJSONPB with a default
-// (zero value) marshaler:
-//
-// m.MarshalJSONPB(&jsonpb.Marshaler{Indent: " "})
-//
-// So enums are serialized using enum value name strings, and values that are
-// not present (including those with default/zero value for messages defined in
-// "proto3" syntax) are omitted.
-func (m *Message) MarshalJSONIndent() ([]byte, error) {
- return m.MarshalJSONPB(&jsonpb.Marshaler{Indent: " "})
-}
-
-// MarshalJSONPB serializes this message to bytes in JSON format, returning an
-// error if the operation fails. The resulting bytes will be a valid UTF8
-// string. The given marshaler is used to convey options used during marshaling.
-//
-// If this message contains nested messages that are generated message types (as
-// opposed to dynamic messages), the given marshaler is used to marshal it.
-//
-// When marshaling any nested messages, any jsonpb.AnyResolver configured in the
-// given marshaler is augmented with knowledge of message types known to this
-// message's descriptor (and its enclosing file and set of transitive
-// dependencies).
-func (m *Message) MarshalJSONPB(opts *jsonpb.Marshaler) ([]byte, error) {
- var b indentBuffer
- b.indent = opts.Indent
- if len(opts.Indent) == 0 {
- b.indentCount = -1
- }
- b.comma = true
- if err := m.marshalJSON(&b, opts); err != nil {
- return nil, err
- }
- return b.Bytes(), nil
-}
-
-func (m *Message) marshalJSON(b *indentBuffer, opts *jsonpb.Marshaler) error {
- if r, changed := wrapResolver(opts.AnyResolver, m.mf, m.md.GetFile()); changed {
- newOpts := *opts
- newOpts.AnyResolver = r
- opts = &newOpts
- }
-
- if ok, err := marshalWellKnownType(m, b, opts); ok {
- return err
- }
-
- err := b.WriteByte('{')
- if err != nil {
- return err
- }
- err = b.start()
- if err != nil {
- return err
- }
-
- var tags []int
- if opts.EmitDefaults {
- tags = m.allKnownFieldTags()
- } else {
- tags = m.knownFieldTags()
- }
-
- first := true
-
- for _, tag := range tags {
- itag := int32(tag)
- fd := m.FindFieldDescriptor(itag)
-
- v, ok := m.values[itag]
- if !ok {
- if fd.GetOneOf() != nil {
- // don't print defaults for fields in a oneof
- continue
- }
- v = fd.GetDefaultValue()
- }
-
- err := b.maybeNext(&first)
- if err != nil {
- return err
- }
- err = marshalKnownFieldJSON(b, fd, v, opts)
- if err != nil {
- return err
- }
- }
-
- err = b.end()
- if err != nil {
- return err
- }
- err = b.WriteByte('}')
- if err != nil {
- return err
- }
-
- return nil
-}
-
-func marshalWellKnownType(m *Message, b *indentBuffer, opts *jsonpb.Marshaler) (bool, error) {
- fqn := m.md.GetFullyQualifiedName()
- if _, ok := wellKnownTypeNames[fqn]; !ok {
- return false, nil
- }
-
- msgType := proto.MessageType(fqn)
- if msgType == nil {
- // wtf?
- panic(fmt.Sprintf("could not find registered message type for %q", fqn))
- }
-
- // convert dynamic message to well-known type and let jsonpb marshal it
- msg := reflect.New(msgType.Elem()).Interface().(proto.Message)
- if err := m.MergeInto(msg); err != nil {
- return true, err
- }
- return true, opts.Marshal(b, msg)
-}
-
-func marshalKnownFieldJSON(b *indentBuffer, fd *desc.FieldDescriptor, v interface{}, opts *jsonpb.Marshaler) error {
- var jsonName string
- if opts.OrigName {
- jsonName = fd.GetName()
- } else {
- jsonName = fd.AsFieldDescriptorProto().GetJsonName()
- if jsonName == "" {
- jsonName = fd.GetName()
- }
- }
- if fd.IsExtension() {
- var scope string
- switch parent := fd.GetParent().(type) {
- case *desc.FileDescriptor:
- scope = parent.GetPackage()
- default:
- scope = parent.GetFullyQualifiedName()
- }
- if scope == "" {
- jsonName = fmt.Sprintf("[%s]", jsonName)
- } else {
- jsonName = fmt.Sprintf("[%s.%s]", scope, jsonName)
- }
- }
- err := writeJsonString(b, jsonName)
- if err != nil {
- return err
- }
- err = b.sep()
- if err != nil {
- return err
- }
-
- if isNil(v) {
- _, err := b.WriteString("null")
- return err
- }
-
- if fd.IsMap() {
- err = b.WriteByte('{')
- if err != nil {
- return err
- }
- err = b.start()
- if err != nil {
- return err
- }
-
- md := fd.GetMessageType()
- vfd := md.FindFieldByNumber(2)
-
- mp := v.(map[interface{}]interface{})
- keys := make([]interface{}, 0, len(mp))
- for k := range mp {
- keys = append(keys, k)
- }
- sort.Sort(sortable(keys))
- first := true
- for _, mk := range keys {
- mv := mp[mk]
- err := b.maybeNext(&first)
- if err != nil {
- return err
- }
-
- err = marshalKnownFieldMapEntryJSON(b, mk, vfd, mv, opts)
- if err != nil {
- return err
- }
- }
-
- err = b.end()
- if err != nil {
- return err
- }
- return b.WriteByte('}')
-
- } else if fd.IsRepeated() {
- err = b.WriteByte('[')
- if err != nil {
- return err
- }
- err = b.start()
- if err != nil {
- return err
- }
-
- sl := v.([]interface{})
- first := true
- for _, slv := range sl {
- err := b.maybeNext(&first)
- if err != nil {
- return err
- }
- err = marshalKnownFieldValueJSON(b, fd, slv, opts)
- if err != nil {
- return err
- }
- }
-
- err = b.end()
- if err != nil {
- return err
- }
- return b.WriteByte(']')
-
- } else {
- return marshalKnownFieldValueJSON(b, fd, v, opts)
- }
-}
-
-// sortable is used to sort map keys. Values will be integers (int32, int64, uint32, and uint64),
-// bools, or strings.
-type sortable []interface{}
-
-func (s sortable) Len() int {
- return len(s)
-}
-
-func (s sortable) Less(i, j int) bool {
- vi := s[i]
- vj := s[j]
- switch reflect.TypeOf(vi).Kind() {
- case reflect.Int32:
- return vi.(int32) < vj.(int32)
- case reflect.Int64:
- return vi.(int64) < vj.(int64)
- case reflect.Uint32:
- return vi.(uint32) < vj.(uint32)
- case reflect.Uint64:
- return vi.(uint64) < vj.(uint64)
- case reflect.String:
- return vi.(string) < vj.(string)
- case reflect.Bool:
- return !vi.(bool) && vj.(bool)
- default:
- panic(fmt.Sprintf("cannot compare keys of type %v", reflect.TypeOf(vi)))
- }
-}
-
-func (s sortable) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
-}
-
-func isNil(v interface{}) bool {
- if v == nil {
- return true
- }
- rv := reflect.ValueOf(v)
- return rv.Kind() == reflect.Ptr && rv.IsNil()
-}
-
-func marshalKnownFieldMapEntryJSON(b *indentBuffer, mk interface{}, vfd *desc.FieldDescriptor, mv interface{}, opts *jsonpb.Marshaler) error {
- rk := reflect.ValueOf(mk)
- var strkey string
- switch rk.Kind() {
- case reflect.Bool:
- strkey = strconv.FormatBool(rk.Bool())
- case reflect.Int32, reflect.Int64:
- strkey = strconv.FormatInt(rk.Int(), 10)
- case reflect.Uint32, reflect.Uint64:
- strkey = strconv.FormatUint(rk.Uint(), 10)
- case reflect.String:
- strkey = rk.String()
- default:
- return fmt.Errorf("invalid map key value: %v (%v)", mk, rk.Type())
- }
- err := writeString(b, strkey)
- if err != nil {
- return err
- }
- err = b.sep()
- if err != nil {
- return err
- }
- return marshalKnownFieldValueJSON(b, vfd, mv, opts)
-}
-
-func marshalKnownFieldValueJSON(b *indentBuffer, fd *desc.FieldDescriptor, v interface{}, opts *jsonpb.Marshaler) error {
- rv := reflect.ValueOf(v)
- switch rv.Kind() {
- case reflect.Int64:
- return writeJsonString(b, strconv.FormatInt(rv.Int(), 10))
- case reflect.Int32:
- ed := fd.GetEnumType()
- if !opts.EnumsAsInts && ed != nil {
- n := int32(rv.Int())
- vd := ed.FindValueByNumber(n)
- if vd == nil {
- _, err := b.WriteString(strconv.FormatInt(rv.Int(), 10))
- return err
- } else {
- return writeJsonString(b, vd.GetName())
- }
- } else {
- _, err := b.WriteString(strconv.FormatInt(rv.Int(), 10))
- return err
- }
- case reflect.Uint64:
- return writeJsonString(b, strconv.FormatUint(rv.Uint(), 10))
- case reflect.Uint32:
- _, err := b.WriteString(strconv.FormatUint(rv.Uint(), 10))
- return err
- case reflect.Float32, reflect.Float64:
- f := rv.Float()
- var str string
- if math.IsNaN(f) {
- str = `"NaN"`
- } else if math.IsInf(f, 1) {
- str = `"Infinity"`
- } else if math.IsInf(f, -1) {
- str = `"-Infinity"`
- } else {
- var bits int
- if rv.Kind() == reflect.Float32 {
- bits = 32
- } else {
- bits = 64
- }
- str = strconv.FormatFloat(rv.Float(), 'g', -1, bits)
- }
- _, err := b.WriteString(str)
- return err
- case reflect.Bool:
- _, err := b.WriteString(strconv.FormatBool(rv.Bool()))
- return err
- case reflect.Slice:
- bstr := base64.StdEncoding.EncodeToString(rv.Bytes())
- return writeJsonString(b, bstr)
- case reflect.String:
- return writeJsonString(b, rv.String())
- default:
- // must be a message
- if dm, ok := v.(*Message); ok {
- return dm.marshalJSON(b, opts)
- } else {
- var err error
- if b.indentCount <= 0 || len(b.indent) == 0 {
- err = opts.Marshal(b, v.(proto.Message))
- } else {
- str, err := opts.MarshalToString(v.(proto.Message))
- if err != nil {
- return err
- }
- indent := strings.Repeat(b.indent, b.indentCount)
- pos := 0
- // add indention prefix to each line
- for pos < len(str) {
- start := pos
- nextPos := strings.Index(str[pos:], "\n")
- if nextPos == -1 {
- nextPos = len(str)
- } else {
- nextPos = pos + nextPos + 1 // include newline
- }
- line := str[start:nextPos]
- if pos > 0 {
- _, err = b.WriteString(indent)
- if err != nil {
- return err
- }
- }
- _, err = b.WriteString(line)
- if err != nil {
- return err
- }
- pos = nextPos
- }
- }
- return err
- }
- }
-}
-
-func writeJsonString(b *indentBuffer, s string) error {
- if sbytes, err := json.Marshal(s); err != nil {
- return err
- } else {
- _, err := b.Write(sbytes)
- return err
- }
-}
-
-// UnmarshalJSON de-serializes the message that is present, in JSON format, in
-// the given bytes into this message. It first resets the current message. It
-// returns an error if the given bytes do not contain a valid encoding of this
-// message type in JSON format.
-//
-// This method is shorthand for invoking UnmarshalJSONPB with a default (zero
-// value) unmarshaler:
-//
-// m.UnmarshalMergeJSONPB(&jsonpb.Unmarshaler{}, js)
-//
-// So unknown fields will result in an error, and no provided jsonpb.AnyResolver
-// will be used when parsing google.protobuf.Any messages.
-func (m *Message) UnmarshalJSON(js []byte) error {
- return m.UnmarshalJSONPB(&jsonpb.Unmarshaler{}, js)
-}
-
-// UnmarshalMergeJSON de-serializes the message that is present, in JSON format,
-// in the given bytes into this message. Unlike UnmarshalJSON, it does not first
-// reset the message, instead merging the data in the given bytes into the
-// existing data in this message.
-func (m *Message) UnmarshalMergeJSON(js []byte) error {
- return m.UnmarshalMergeJSONPB(&jsonpb.Unmarshaler{}, js)
-}
-
-// UnmarshalJSONPB de-serializes the message that is present, in JSON format, in
-// the given bytes into this message. The given unmarshaler conveys options used
-// when parsing the JSON. This function first resets the current message. It
-// returns an error if the given bytes do not contain a valid encoding of this
-// message type in JSON format.
-//
-// The decoding is lenient:
-// 1. The JSON can refer to fields either by their JSON name or by their
-// declared name.
-// 2. The JSON can use either numeric values or string names for enum values.
-//
-// When instantiating nested messages, if this message's associated factory
-// returns a generated message type (as opposed to a dynamic message), the given
-// unmarshaler is used to unmarshal it.
-//
-// When unmarshaling any nested messages, any jsonpb.AnyResolver configured in
-// the given unmarshaler is augmented with knowledge of message types known to
-// this message's descriptor (and its enclosing file and set of transitive
-// dependencies).
-func (m *Message) UnmarshalJSONPB(opts *jsonpb.Unmarshaler, js []byte) error {
- m.Reset()
- if err := m.UnmarshalMergeJSONPB(opts, js); err != nil {
- return err
- }
- return m.Validate()
-}
-
-// UnmarshalMergeJSONPB de-serializes the message that is present, in JSON
-// format, in the given bytes into this message. The given unmarshaler conveys
-// options used when parsing the JSON. Unlike UnmarshalJSONPB, it does not first
-// reset the message, instead merging the data in the given bytes into the
-// existing data in this message.
-func (m *Message) UnmarshalMergeJSONPB(opts *jsonpb.Unmarshaler, js []byte) error {
- r := newJsReader(js)
- err := m.unmarshalJson(r, opts)
- if err != nil {
- return err
- }
- if t, err := r.poll(); err != io.EOF {
- b, _ := ioutil.ReadAll(r.unread())
- s := fmt.Sprintf("%v%s", t, string(b))
- return fmt.Errorf("superfluous data found after JSON object: %q", s)
- }
- return nil
-}
-
-func unmarshalWellKnownType(m *Message, r *jsReader, opts *jsonpb.Unmarshaler) (bool, error) {
- fqn := m.md.GetFullyQualifiedName()
- if _, ok := wellKnownTypeNames[fqn]; !ok {
- return false, nil
- }
-
- msgType := proto.MessageType(fqn)
- if msgType == nil {
- // wtf?
- panic(fmt.Sprintf("could not find registered message type for %q", fqn))
- }
-
- // extract json value from r
- var js json.RawMessage
- if err := json.NewDecoder(r.unread()).Decode(&js); err != nil {
- return true, err
- }
- if err := r.skip(); err != nil {
- return true, err
- }
-
- // unmarshal into well-known type and then convert to dynamic message
- msg := reflect.New(msgType.Elem()).Interface().(proto.Message)
- if err := opts.Unmarshal(bytes.NewReader(js), msg); err != nil {
- return true, err
- }
- return true, m.MergeFrom(msg)
-}
-
-func (m *Message) unmarshalJson(r *jsReader, opts *jsonpb.Unmarshaler) error {
- if r, changed := wrapResolver(opts.AnyResolver, m.mf, m.md.GetFile()); changed {
- newOpts := *opts
- newOpts.AnyResolver = r
- opts = &newOpts
- }
-
- if ok, err := unmarshalWellKnownType(m, r, opts); ok {
- return err
- }
-
- t, err := r.peek()
- if err != nil {
- return err
- }
- if t == nil {
- // if json is simply "null" we do nothing
- r.poll()
- return nil
- }
-
- if err := r.beginObject(); err != nil {
- return err
- }
-
- for r.hasNext() {
- f, err := r.nextObjectKey()
- if err != nil {
- return err
- }
- fd := m.FindFieldDescriptorByJSONName(f)
- if fd == nil {
- if opts.AllowUnknownFields {
- r.skip()
- continue
- }
- return fmt.Errorf("message type %s has no known field named %s", m.md.GetFullyQualifiedName(), f)
- }
- v, err := unmarshalJsField(fd, r, m.mf, opts)
- if err != nil {
- return err
- }
- if v != nil {
- if err := mergeField(m, fd, v); err != nil {
- return err
- }
- } else if fd.GetOneOf() != nil {
- // preserve explicit null for oneof fields (this is a little odd but
- // mimics the behavior of jsonpb with oneofs in generated message types)
- if fd.GetMessageType() != nil {
- typ := m.mf.GetKnownTypeRegistry().GetKnownType(fd.GetMessageType().GetFullyQualifiedName())
- if typ != nil {
- // typed nil
- if typ.Kind() != reflect.Ptr {
- typ = reflect.PtrTo(typ)
- }
- v = reflect.Zero(typ).Interface()
- } else {
- // can't use nil dynamic message, so we just use empty one instead
- v = m.mf.NewDynamicMessage(fd.GetMessageType())
- }
- if err := m.setField(fd, v); err != nil {
- return err
- }
- } else {
- // not a message... explicit null makes no sense
- return fmt.Errorf("message type %s cannot set field %s to null: it is not a message type", m.md.GetFullyQualifiedName(), f)
- }
- } else {
- m.clearField(fd)
- }
- }
-
- if err := r.endObject(); err != nil {
- return err
- }
-
- return nil
-}
-
-func isWellKnownValue(fd *desc.FieldDescriptor) bool {
- return !fd.IsRepeated() && fd.GetType() == descriptor.FieldDescriptorProto_TYPE_MESSAGE &&
- fd.GetMessageType().GetFullyQualifiedName() == "google.protobuf.Value"
-}
-
-func isWellKnownListValue(fd *desc.FieldDescriptor) bool {
- return !fd.IsRepeated() && fd.GetType() == descriptor.FieldDescriptorProto_TYPE_MESSAGE &&
- fd.GetMessageType().GetFullyQualifiedName() == "google.protobuf.ListValue"
-}
-
-func unmarshalJsField(fd *desc.FieldDescriptor, r *jsReader, mf *MessageFactory, opts *jsonpb.Unmarshaler) (interface{}, error) {
- t, err := r.peek()
- if err != nil {
- return nil, err
- }
- if t == nil && !isWellKnownValue(fd) {
- // if value is null, just return nil
- // (unless field is google.protobuf.Value, in which case
- // we fall through to parse it as an instance where its
- // underlying value is set to a NullValue)
- r.poll()
- return nil, nil
- }
-
- if t == json.Delim('{') && fd.IsMap() {
- entryType := fd.GetMessageType()
- keyType := entryType.FindFieldByNumber(1)
- valueType := entryType.FindFieldByNumber(2)
- mp := map[interface{}]interface{}{}
-
- // TODO: if there are just two map keys "key" and "value" and they have the right type of values,
- // treat this JSON object as a single map entry message. (In keeping with support of map fields as
- // if they were normal repeated field of entry messages as well as supporting a transition from
- // optional to repeated...)
-
- if err := r.beginObject(); err != nil {
- return nil, err
- }
- for r.hasNext() {
- kk, err := unmarshalJsFieldElement(keyType, r, mf, opts)
- if err != nil {
- return nil, err
- }
- vv, err := unmarshalJsFieldElement(valueType, r, mf, opts)
- if err != nil {
- return nil, err
- }
- mp[kk] = vv
- }
- if err := r.endObject(); err != nil {
- return nil, err
- }
-
- return mp, nil
- } else if t == json.Delim('[') && !isWellKnownListValue(fd) {
- // We support parsing an array, even if field is not repeated, to mimic support in proto
- // binary wire format that supports changing an optional field to repeated and vice versa.
- // If the field is not repeated, we only keep the last value in the array.
-
- if err := r.beginArray(); err != nil {
- return nil, err
- }
- var sl []interface{}
- var v interface{}
- for r.hasNext() {
- var err error
- v, err = unmarshalJsFieldElement(fd, r, mf, opts)
- if err != nil {
- return nil, err
- }
- if fd.IsRepeated() && v != nil {
- sl = append(sl, v)
- }
- }
- if err := r.endArray(); err != nil {
- return nil, err
- }
- if fd.IsMap() {
- mp := map[interface{}]interface{}{}
- for _, m := range sl {
- msg := m.(*Message)
- kk, err := msg.TryGetFieldByNumber(1)
- if err != nil {
- return nil, err
- }
- vv, err := msg.TryGetFieldByNumber(2)
- if err != nil {
- return nil, err
- }
- mp[kk] = vv
- }
- return mp, nil
- } else if fd.IsRepeated() {
- return sl, nil
- } else {
- return v, nil
- }
- } else {
- // We support parsing a singular value, even if field is repeated, to mimic support in proto
- // binary wire format that supports changing an optional field to repeated and vice versa.
- // If the field is repeated, we store value as singleton slice of that one value.
-
- v, err := unmarshalJsFieldElement(fd, r, mf, opts)
- if err != nil {
- return nil, err
- }
- if v == nil {
- return nil, nil
- }
- if fd.IsRepeated() {
- return []interface{}{v}, nil
- } else {
- return v, nil
- }
- }
-}
-
-func unmarshalJsFieldElement(fd *desc.FieldDescriptor, r *jsReader, mf *MessageFactory, opts *jsonpb.Unmarshaler) (interface{}, error) {
- t, err := r.peek()
- if err != nil {
- return nil, err
- }
-
- switch fd.GetType() {
- case descriptor.FieldDescriptorProto_TYPE_MESSAGE,
- descriptor.FieldDescriptorProto_TYPE_GROUP:
- m := mf.NewMessage(fd.GetMessageType())
- if dm, ok := m.(*Message); ok {
- if err := dm.unmarshalJson(r, opts); err != nil {
- return nil, err
- }
- } else {
- var msg json.RawMessage
- if err := json.NewDecoder(r.unread()).Decode(&msg); err != nil {
- return nil, err
- }
- if err := r.skip(); err != nil {
- return nil, err
- }
- if err := opts.Unmarshal(bytes.NewReader([]byte(msg)), m); err != nil {
- return nil, err
- }
- }
- return m, nil
-
- case descriptor.FieldDescriptorProto_TYPE_ENUM:
- if e, err := r.nextNumber(); err != nil {
- return nil, err
- } else {
- // value could be string or number
- if i, err := e.Int64(); err != nil {
- // number cannot be parsed, so see if it's an enum value name
- vd := fd.GetEnumType().FindValueByName(string(e))
- if vd != nil {
- return vd.GetNumber(), nil
- } else {
- return nil, fmt.Errorf("enum %q does not have value named %q", fd.GetEnumType().GetFullyQualifiedName(), e)
- }
- } else if i > math.MaxInt32 || i < math.MinInt32 {
- return nil, NumericOverflowError
- } else {
- return int32(i), err
- }
- }
-
- case descriptor.FieldDescriptorProto_TYPE_INT32,
- descriptor.FieldDescriptorProto_TYPE_SINT32,
- descriptor.FieldDescriptorProto_TYPE_SFIXED32:
- if i, err := r.nextInt(); err != nil {
- return nil, err
- } else if i > math.MaxInt32 || i < math.MinInt32 {
- return nil, NumericOverflowError
- } else {
- return int32(i), err
- }
-
- case descriptor.FieldDescriptorProto_TYPE_INT64,
- descriptor.FieldDescriptorProto_TYPE_SINT64,
- descriptor.FieldDescriptorProto_TYPE_SFIXED64:
- return r.nextInt()
-
- case descriptor.FieldDescriptorProto_TYPE_UINT32,
- descriptor.FieldDescriptorProto_TYPE_FIXED32:
- if i, err := r.nextUint(); err != nil {
- return nil, err
- } else if i > math.MaxUint32 {
- return nil, NumericOverflowError
- } else {
- return uint32(i), err
- }
-
- case descriptor.FieldDescriptorProto_TYPE_UINT64,
- descriptor.FieldDescriptorProto_TYPE_FIXED64:
- return r.nextUint()
-
- case descriptor.FieldDescriptorProto_TYPE_BOOL:
- if str, ok := t.(string); ok {
- if str == "true" {
- r.poll() // consume token
- return true, err
- } else if str == "false" {
- r.poll() // consume token
- return false, err
- }
- }
- return r.nextBool()
-
- case descriptor.FieldDescriptorProto_TYPE_FLOAT:
- if f, err := r.nextFloat(); err != nil {
- return nil, err
- } else {
- return float32(f), nil
- }
-
- case descriptor.FieldDescriptorProto_TYPE_DOUBLE:
- return r.nextFloat()
-
- case descriptor.FieldDescriptorProto_TYPE_BYTES:
- return r.nextBytes()
-
- case descriptor.FieldDescriptorProto_TYPE_STRING:
- return r.nextString()
-
- default:
- return nil, fmt.Errorf("unknown field type: %v", fd.GetType())
- }
-}
-
-type jsReader struct {
- reader *bytes.Reader
- dec *json.Decoder
- current json.Token
- peeked bool
-}
-
-func newJsReader(b []byte) *jsReader {
- reader := bytes.NewReader(b)
- dec := json.NewDecoder(reader)
- dec.UseNumber()
- return &jsReader{reader: reader, dec: dec}
-}
-
-func (r *jsReader) unread() io.Reader {
- bufs := make([]io.Reader, 3)
- var peeked []byte
- if r.peeked {
- if _, ok := r.current.(json.Delim); ok {
- peeked = []byte(fmt.Sprintf("%v", r.current))
- } else {
- peeked, _ = json.Marshal(r.current)
- }
- }
- readerCopy := *r.reader
- decCopy := *r.dec
-
- bufs[0] = bytes.NewReader(peeked)
- bufs[1] = decCopy.Buffered()
- bufs[2] = &readerCopy
- return &concatReader{bufs: bufs}
-}
-
-func (r *jsReader) hasNext() bool {
- return r.dec.More()
-}
-
-func (r *jsReader) peek() (json.Token, error) {
- if r.peeked {
- return r.current, nil
- }
- t, err := r.dec.Token()
- if err != nil {
- return nil, err
- }
- r.peeked = true
- r.current = t
- return t, nil
-}
-
-func (r *jsReader) poll() (json.Token, error) {
- if r.peeked {
- ret := r.current
- r.current = nil
- r.peeked = false
- return ret, nil
- }
- return r.dec.Token()
-}
-
-func (r *jsReader) beginObject() error {
- _, err := r.expect(func(t json.Token) bool { return t == json.Delim('{') }, nil, "start of JSON object: '{'")
- return err
-}
-
-func (r *jsReader) endObject() error {
- _, err := r.expect(func(t json.Token) bool { return t == json.Delim('}') }, nil, "end of JSON object: '}'")
- return err
-}
-
-func (r *jsReader) beginArray() error {
- _, err := r.expect(func(t json.Token) bool { return t == json.Delim('[') }, nil, "start of array: '['")
- return err
-}
-
-func (r *jsReader) endArray() error {
- _, err := r.expect(func(t json.Token) bool { return t == json.Delim(']') }, nil, "end of array: ']'")
- return err
-}
-
-func (r *jsReader) nextObjectKey() (string, error) {
- return r.nextString()
-}
-
-func (r *jsReader) nextString() (string, error) {
- t, err := r.expect(func(t json.Token) bool { _, ok := t.(string); return ok }, "", "string")
- if err != nil {
- return "", err
- }
- return t.(string), nil
-}
-
-func (r *jsReader) nextBytes() ([]byte, error) {
- str, err := r.nextString()
- if err != nil {
- return nil, err
- }
- return base64.StdEncoding.DecodeString(str)
-}
-
-func (r *jsReader) nextBool() (bool, error) {
- t, err := r.expect(func(t json.Token) bool { _, ok := t.(bool); return ok }, false, "boolean")
- if err != nil {
- return false, err
- }
- return t.(bool), nil
-}
-
-func (r *jsReader) nextInt() (int64, error) {
- n, err := r.nextNumber()
- if err != nil {
- return 0, err
- }
- return n.Int64()
-}
-
-func (r *jsReader) nextUint() (uint64, error) {
- n, err := r.nextNumber()
- if err != nil {
- return 0, err
- }
- return strconv.ParseUint(string(n), 10, 64)
-}
-
-func (r *jsReader) nextFloat() (float64, error) {
- n, err := r.nextNumber()
- if err != nil {
- return 0, err
- }
- return n.Float64()
-}
-
-func (r *jsReader) nextNumber() (json.Number, error) {
- t, err := r.expect(func(t json.Token) bool { return reflect.TypeOf(t).Kind() == reflect.String }, "0", "number")
- if err != nil {
- return "", err
- }
- switch t := t.(type) {
- case json.Number:
- return t, nil
- case string:
- return json.Number(t), nil
- }
- return "", fmt.Errorf("expecting a number but got %v", t)
-}
-
-func (r *jsReader) skip() error {
- t, err := r.poll()
- if err != nil {
- return err
- }
- if t == json.Delim('[') {
- if err := r.skipArray(); err != nil {
- return err
- }
- } else if t == json.Delim('{') {
- if err := r.skipObject(); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (r *jsReader) skipArray() error {
- for r.hasNext() {
- if err := r.skip(); err != nil {
- return err
- }
- }
- if err := r.endArray(); err != nil {
- return err
- }
- return nil
-}
-
-func (r *jsReader) skipObject() error {
- for r.hasNext() {
- // skip object key
- if err := r.skip(); err != nil {
- return err
- }
- // and value
- if err := r.skip(); err != nil {
- return err
- }
- }
- if err := r.endObject(); err != nil {
- return err
- }
- return nil
-}
-
-func (r *jsReader) expect(predicate func(json.Token) bool, ifNil interface{}, expected string) (interface{}, error) {
- t, err := r.poll()
- if err != nil {
- return nil, err
- }
- if t == nil && ifNil != nil {
- return ifNil, nil
- }
- if !predicate(t) {
- return t, fmt.Errorf("bad input: expecting %s ; instead got %v", expected, t)
- }
- return t, nil
-}
-
-type concatReader struct {
- bufs []io.Reader
- curr int
-}
-
-func (r *concatReader) Read(p []byte) (n int, err error) {
- for {
- if r.curr >= len(r.bufs) {
- err = io.EOF
- return
- }
- var c int
- c, err = r.bufs[r.curr].Read(p)
- n += c
- if err != io.EOF {
- return
- }
- r.curr++
- p = p[c:]
- }
-}
-
-// AnyResolver returns a jsonpb.AnyResolver that uses the given file descriptors
-// to resolve message names. It uses the given factory, which may be nil, to
-// instantiate messages. The messages that it returns when resolving a type name
-// may often be dynamic messages.
-func AnyResolver(mf *MessageFactory, files ...*desc.FileDescriptor) jsonpb.AnyResolver {
- return &anyResolver{mf: mf, files: files}
-}
-
-type anyResolver struct {
- mf *MessageFactory
- files []*desc.FileDescriptor
- ignored map[*desc.FileDescriptor]struct{}
- other jsonpb.AnyResolver
-}
-
-func wrapResolver(r jsonpb.AnyResolver, mf *MessageFactory, f *desc.FileDescriptor) (jsonpb.AnyResolver, bool) {
- if r, ok := r.(*anyResolver); ok {
- if _, ok := r.ignored[f]; ok {
- // if the current resolver is ignoring this file, it's because another
- // (upstream) resolver is already handling it, so nothing to do
- return r, false
- }
- for _, file := range r.files {
- if file == f {
- // no need to wrap!
- return r, false
- }
- }
- // ignore files that will be checked by the resolver we're wrapping
- // (we'll just delegate and let it search those files)
- ignored := map[*desc.FileDescriptor]struct{}{}
- for i := range r.ignored {
- ignored[i] = struct{}{}
- }
- ignore(r.files, ignored)
- return &anyResolver{mf: mf, files: []*desc.FileDescriptor{f}, ignored: ignored, other: r}, true
- }
- return &anyResolver{mf: mf, files: []*desc.FileDescriptor{f}, other: r}, true
-}
-
-func ignore(files []*desc.FileDescriptor, ignored map[*desc.FileDescriptor]struct{}) {
- for _, f := range files {
- if _, ok := ignored[f]; ok {
- continue
- }
- ignored[f] = struct{}{}
- ignore(f.GetDependencies(), ignored)
- }
-}
-
-func (r *anyResolver) Resolve(typeUrl string) (proto.Message, error) {
- mname := typeUrl
- if slash := strings.LastIndex(mname, "/"); slash >= 0 {
- mname = mname[slash+1:]
- }
-
- // see if the user-specified resolver is able to do the job
- if r.other != nil {
- msg, err := r.other.Resolve(typeUrl)
- if err == nil {
- return msg, nil
- }
- }
-
- // try to find the message in our known set of files
- checked := map[*desc.FileDescriptor]struct{}{}
- for _, f := range r.files {
- md := r.findMessage(f, mname, checked)
- if md != nil {
- return r.mf.NewMessage(md), nil
- }
- }
- // failing that, see if the message factory knows about this type
- var ktr *KnownTypeRegistry
- if r.mf != nil {
- ktr = r.mf.ktr
- } else {
- ktr = (*KnownTypeRegistry)(nil)
- }
- m := ktr.CreateIfKnown(mname)
- if m != nil {
- return m, nil
- }
-
- // no other resolver to fallback to? mimic default behavior
- mt := proto.MessageType(mname)
- if mt == nil {
- return nil, fmt.Errorf("unknown message type %q", mname)
- }
- return reflect.New(mt.Elem()).Interface().(proto.Message), nil
-}
-
-func (r *anyResolver) findMessage(fd *desc.FileDescriptor, msgName string, checked map[*desc.FileDescriptor]struct{}) *desc.MessageDescriptor {
- // if this is an ignored descriptor, skip
- if _, ok := r.ignored[fd]; ok {
- return nil
- }
-
- // bail if we've already checked this file
- if _, ok := checked[fd]; ok {
- return nil
- }
- checked[fd] = struct{}{}
-
- // see if this file has the message
- md := fd.FindMessage(msgName)
- if md != nil {
- return md
- }
-
- // if not, recursively search the file's imports
- for _, dep := range fd.GetDependencies() {
- md = r.findMessage(dep, msgName, checked)
- if md != nil {
- return md
- }
- }
- return nil
-}
-
-var _ jsonpb.AnyResolver = (*anyResolver)(nil)
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/maps_1.11.go b/vendor/github.com/jhump/protoreflect/dynamic/maps_1.11.go
deleted file mode 100644
index bb68d7b..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/maps_1.11.go
+++ /dev/null
@@ -1,129 +0,0 @@
-//+build !go1.12
-
-package dynamic
-
-import (
- "github.com/jhump/protoreflect/desc"
- "reflect"
-)
-
-// Pre-Go-1.12, we must use reflect.Value.MapKeys to reflectively
-// iterate a map. (We can be more efficient in Go 1.12 and up...)
-
-func mapsEqual(a, b reflect.Value) bool {
- if a.Len() != b.Len() {
- return false
- }
- if a.Len() == 0 && b.Len() == 0 {
- // Optimize the case where maps are frequently empty because MapKeys()
- // function allocates heavily.
- return true
- }
-
- for _, k := range a.MapKeys() {
- av := a.MapIndex(k)
- bv := b.MapIndex(k)
- if !bv.IsValid() {
- return false
- }
- if !fieldsEqual(av.Interface(), bv.Interface()) {
- return false
- }
- }
- return true
-}
-
-func validFieldValueForMapField(fd *desc.FieldDescriptor, val reflect.Value) (interface{}, error) {
- // make a defensive copy while we check the contents
- // (also converts to map[interface{}]interface{} if it's some other type)
- keyField := fd.GetMessageType().GetFields()[0]
- valField := fd.GetMessageType().GetFields()[1]
- m := map[interface{}]interface{}{}
- for _, k := range val.MapKeys() {
- if k.Kind() == reflect.Interface {
- // unwrap it
- k = reflect.ValueOf(k.Interface())
- }
- kk, err := validFieldValueForRv(keyField, k)
- if err != nil {
- return nil, err
- }
- v := val.MapIndex(k)
- if v.Kind() == reflect.Interface {
- // unwrap it
- v = reflect.ValueOf(v.Interface())
- }
- vv, err := validFieldValueForRv(valField, v)
- if err != nil {
- return nil, err
- }
- m[kk] = vv
- }
- return m, nil
-}
-
-func canConvertMap(src reflect.Value, target reflect.Type) bool {
- kt := target.Key()
- vt := target.Elem()
- for _, k := range src.MapKeys() {
- if !canConvert(k, kt) {
- return false
- }
- if !canConvert(src.MapIndex(k), vt) {
- return false
- }
- }
- return true
-}
-
-func mergeMapVal(src, target reflect.Value, targetType reflect.Type) error {
- tkt := targetType.Key()
- tvt := targetType.Elem()
- for _, k := range src.MapKeys() {
- v := src.MapIndex(k)
- skt := k.Type()
- svt := v.Type()
- var nk, nv reflect.Value
- if tkt == skt {
- nk = k
- } else if tkt.Kind() == reflect.Ptr && tkt.Elem() == skt {
- nk = k.Addr()
- } else {
- nk = reflect.New(tkt).Elem()
- if err := mergeVal(k, nk); err != nil {
- return err
- }
- }
- if tvt == svt {
- nv = v
- } else if tvt.Kind() == reflect.Ptr && tvt.Elem() == svt {
- nv = v.Addr()
- } else {
- nv = reflect.New(tvt).Elem()
- if err := mergeVal(v, nv); err != nil {
- return err
- }
- }
- if target.IsNil() {
- target.Set(reflect.MakeMap(targetType))
- }
- target.SetMapIndex(nk, nv)
- }
- return nil
-}
-
-func mergeMapField(m *Message, fd *desc.FieldDescriptor, rv reflect.Value) error {
- for _, k := range rv.MapKeys() {
- if k.Kind() == reflect.Interface && !k.IsNil() {
- k = k.Elem()
- }
- v := rv.MapIndex(k)
- if v.Kind() == reflect.Interface && !v.IsNil() {
- v = v.Elem()
- }
- if err := m.putMapField(fd, k.Interface(), v.Interface()); err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/maps_1.12.go b/vendor/github.com/jhump/protoreflect/dynamic/maps_1.12.go
deleted file mode 100644
index f5ffd67..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/maps_1.12.go
+++ /dev/null
@@ -1,137 +0,0 @@
-//+build go1.12
-
-package dynamic
-
-import (
- "github.com/jhump/protoreflect/desc"
- "reflect"
-)
-
-// With Go 1.12 and above, we can use reflect.Value.MapRange to iterate
-// over maps more efficiently than using reflect.Value.MapKeys.
-
-func mapsEqual(a, b reflect.Value) bool {
- if a.Len() != b.Len() {
- return false
- }
- if a.Len() == 0 && b.Len() == 0 {
- // Optimize the case where maps are frequently empty
- return true
- }
-
- iter := a.MapRange()
- for iter.Next() {
- k := iter.Key()
- av := iter.Value()
- bv := b.MapIndex(k)
- if !bv.IsValid() {
- return false
- }
- if !fieldsEqual(av.Interface(), bv.Interface()) {
- return false
- }
- }
- return true
-}
-
-func validFieldValueForMapField(fd *desc.FieldDescriptor, val reflect.Value) (interface{}, error) {
- // make a defensive copy while we check the contents
- // (also converts to map[interface{}]interface{} if it's some other type)
- keyField := fd.GetMessageType().GetFields()[0]
- valField := fd.GetMessageType().GetFields()[1]
- m := map[interface{}]interface{}{}
- iter := val.MapRange()
- for iter.Next() {
- k := iter.Key()
- if k.Kind() == reflect.Interface {
- // unwrap it
- k = reflect.ValueOf(k.Interface())
- }
- kk, err := validFieldValueForRv(keyField, k)
- if err != nil {
- return nil, err
- }
- v := iter.Value()
- if v.Kind() == reflect.Interface {
- // unwrap it
- v = reflect.ValueOf(v.Interface())
- }
- vv, err := validFieldValueForRv(valField, v)
- if err != nil {
- return nil, err
- }
- m[kk] = vv
- }
- return m, nil
-}
-
-func canConvertMap(src reflect.Value, target reflect.Type) bool {
- kt := target.Key()
- vt := target.Elem()
- iter := src.MapRange()
- for iter.Next() {
- if !canConvert(iter.Key(), kt) {
- return false
- }
- if !canConvert(iter.Value(), vt) {
- return false
- }
- }
- return true
-}
-
-func mergeMapVal(src, target reflect.Value, targetType reflect.Type) error {
- tkt := targetType.Key()
- tvt := targetType.Elem()
- iter := src.MapRange()
- for iter.Next() {
- k := iter.Key()
- v := iter.Value()
- skt := k.Type()
- svt := v.Type()
- var nk, nv reflect.Value
- if tkt == skt {
- nk = k
- } else if tkt.Kind() == reflect.Ptr && tkt.Elem() == skt {
- nk = k.Addr()
- } else {
- nk = reflect.New(tkt).Elem()
- if err := mergeVal(k, nk); err != nil {
- return err
- }
- }
- if tvt == svt {
- nv = v
- } else if tvt.Kind() == reflect.Ptr && tvt.Elem() == svt {
- nv = v.Addr()
- } else {
- nv = reflect.New(tvt).Elem()
- if err := mergeVal(v, nv); err != nil {
- return err
- }
- }
- if target.IsNil() {
- target.Set(reflect.MakeMap(targetType))
- }
- target.SetMapIndex(nk, nv)
- }
- return nil
-}
-
-func mergeMapField(m *Message, fd *desc.FieldDescriptor, rv reflect.Value) error {
- iter := rv.MapRange()
- for iter.Next() {
- k := iter.Key()
- v := iter.Value()
- if k.Kind() == reflect.Interface && !k.IsNil() {
- k = k.Elem()
- }
- if v.Kind() == reflect.Interface && !v.IsNil() {
- v = v.Elem()
- }
- if err := m.putMapField(fd, k.Interface(), v.Interface()); err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/merge.go b/vendor/github.com/jhump/protoreflect/dynamic/merge.go
deleted file mode 100644
index ce727fd..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/merge.go
+++ /dev/null
@@ -1,100 +0,0 @@
-package dynamic
-
-import (
- "errors"
- "reflect"
-
- "github.com/golang/protobuf/proto"
-
- "github.com/jhump/protoreflect/desc"
-)
-
-// Merge merges the given source message into the given destination message. Use
-// use this instead of proto.Merge when one or both of the messages might be a
-// a dynamic message. If there is a problem merging the messages, such as the
-// two messages having different types, then this method will panic (just as
-// proto.Merges does).
-func Merge(dst, src proto.Message) {
- if dm, ok := dst.(*Message); ok {
- if err := dm.MergeFrom(src); err != nil {
- panic(err.Error())
- }
- } else if dm, ok := src.(*Message); ok {
- if err := dm.MergeInto(dst); err != nil {
- panic(err.Error())
- }
- } else {
- proto.Merge(dst, src)
- }
-}
-
-// TryMerge merges the given source message into the given destination message.
-// You can use this instead of proto.Merge when one or both of the messages
-// might be a dynamic message. Unlike proto.Merge, this method will return an
-// error on failure instead of panic'ing.
-func TryMerge(dst, src proto.Message) error {
- if dm, ok := dst.(*Message); ok {
- if err := dm.MergeFrom(src); err != nil {
- return err
- }
- } else if dm, ok := src.(*Message); ok {
- if err := dm.MergeInto(dst); err != nil {
- return err
- }
- } else {
- // proto.Merge panics on bad input, so we first verify
- // inputs and return error instead of panic
- out := reflect.ValueOf(dst)
- if out.IsNil() {
- return errors.New("proto: nil destination")
- }
- in := reflect.ValueOf(src)
- if in.Type() != out.Type() {
- return errors.New("proto: type mismatch")
- }
- proto.Merge(dst, src)
- }
- return nil
-}
-
-func mergeField(m *Message, fd *desc.FieldDescriptor, val interface{}) error {
- rv := reflect.ValueOf(val)
-
- if fd.IsMap() && rv.Kind() == reflect.Map {
- return mergeMapField(m, fd, rv)
- }
-
- if fd.IsRepeated() && rv.Kind() == reflect.Slice && rv.Type() != typeOfBytes {
- for i := 0; i < rv.Len(); i++ {
- e := rv.Index(i)
- if e.Kind() == reflect.Interface && !e.IsNil() {
- e = e.Elem()
- }
- if err := m.addRepeatedField(fd, e.Interface()); err != nil {
- return err
- }
- }
- return nil
- }
-
- if fd.IsRepeated() {
- return m.addRepeatedField(fd, val)
- } else if fd.GetMessageType() == nil {
- return m.setField(fd, val)
- }
-
- // it's a message type, so we want to merge contents
- var err error
- if val, err = validFieldValue(fd, val); err != nil {
- return err
- }
-
- existing, _ := m.doGetField(fd, true)
- if existing != nil && !reflect.ValueOf(existing).IsNil() {
- return TryMerge(existing.(proto.Message), val.(proto.Message))
- }
-
- // no existing message, so just set field
- m.internalSetField(fd, val)
- return nil
-}
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/message_factory.go b/vendor/github.com/jhump/protoreflect/dynamic/message_factory.go
deleted file mode 100644
index 6c54de8..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/message_factory.go
+++ /dev/null
@@ -1,189 +0,0 @@
-package dynamic
-
-import (
- "reflect"
- "sync"
-
- "github.com/golang/protobuf/proto"
-
- "github.com/jhump/protoreflect/desc"
-)
-
-// MessageFactory can be used to create new empty message objects. A default instance
-// (without extension registry or known-type registry specified) will always return
-// dynamic messages (e.g. type will be *dynamic.Message) except for "well-known" types.
-// The well-known types include primitive wrapper types and a handful of other special
-// types defined in standard protobuf definitions, like Any, Duration, and Timestamp.
-type MessageFactory struct {
- er *ExtensionRegistry
- ktr *KnownTypeRegistry
-}
-
-// NewMessageFactoryWithExtensionRegistry creates a new message factory where any
-// dynamic messages produced will use the given extension registry to recognize and
-// parse extension fields.
-func NewMessageFactoryWithExtensionRegistry(er *ExtensionRegistry) *MessageFactory {
- return NewMessageFactoryWithRegistries(er, nil)
-}
-
-// NewMessageFactoryWithKnownTypeRegistry creates a new message factory where the
-// known types, per the given registry, will be returned as normal protobuf messages
-// (e.g. generated structs, instead of dynamic messages).
-func NewMessageFactoryWithKnownTypeRegistry(ktr *KnownTypeRegistry) *MessageFactory {
- return NewMessageFactoryWithRegistries(nil, ktr)
-}
-
-// NewMessageFactoryWithDefaults creates a new message factory where all "default" types
-// (those for which protoc-generated code is statically linked into the Go program) are
-// known types. If any dynamic messages are produced, they will recognize and parse all
-// "default" extension fields. This is the equivalent of:
-// NewMessageFactoryWithRegistries(
-// NewExtensionRegistryWithDefaults(),
-// NewKnownTypeRegistryWithDefaults())
-func NewMessageFactoryWithDefaults() *MessageFactory {
- return NewMessageFactoryWithRegistries(NewExtensionRegistryWithDefaults(), NewKnownTypeRegistryWithDefaults())
-}
-
-// NewMessageFactoryWithRegistries creates a new message factory with the given extension
-// and known type registries.
-func NewMessageFactoryWithRegistries(er *ExtensionRegistry, ktr *KnownTypeRegistry) *MessageFactory {
- return &MessageFactory{
- er: er,
- ktr: ktr,
- }
-}
-
-// NewMessage creates a new empty message that corresponds to the given descriptor.
-// If the given descriptor describes a "known type" then that type is instantiated.
-// Otherwise, an empty dynamic message is returned.
-func (f *MessageFactory) NewMessage(md *desc.MessageDescriptor) proto.Message {
- var ktr *KnownTypeRegistry
- if f != nil {
- ktr = f.ktr
- }
- if m := ktr.CreateIfKnown(md.GetFullyQualifiedName()); m != nil {
- return m
- }
- return NewMessageWithMessageFactory(md, f)
-}
-
-// NewDynamicMessage creates a new empty dynamic message that corresponds to the given
-// descriptor. This is like f.NewMessage(md) except the known type registry is not
-// consulted so the return value is always a dynamic message.
-//
-// This is also like dynamic.NewMessage(md) except that the returned message will use
-// this factory when creating other messages, like during de-serialization of fields
-// that are themselves message types.
-func (f *MessageFactory) NewDynamicMessage(md *desc.MessageDescriptor) *Message {
- return NewMessageWithMessageFactory(md, f)
-}
-
-// GetKnownTypeRegistry returns the known type registry that this factory uses to
-// instantiate known (e.g. generated) message types.
-func (f *MessageFactory) GetKnownTypeRegistry() *KnownTypeRegistry {
- if f == nil {
- return nil
- }
- return f.ktr
-}
-
-// GetExtensionRegistry returns the extension registry that this factory uses to
-// create dynamic messages. The registry is used by dynamic messages to recognize
-// and parse extension fields during de-serialization.
-func (f *MessageFactory) GetExtensionRegistry() *ExtensionRegistry {
- if f == nil {
- return nil
- }
- return f.er
-}
-
-type wkt interface {
- XXX_WellKnownType() string
-}
-
-var typeOfWkt = reflect.TypeOf((*wkt)(nil)).Elem()
-
-// KnownTypeRegistry is a registry of known message types, as identified by their
-// fully-qualified name. A known message type is one for which a protoc-generated
-// struct exists, so a dynamic message is not necessary to represent it. A
-// MessageFactory uses a KnownTypeRegistry to decide whether to create a generated
-// struct or a dynamic message. The zero-value registry (including the behavior of
-// a nil pointer) only knows about the "well-known types" in protobuf. These
-// include only the wrapper types and a handful of other special types like Any,
-// Duration, and Timestamp.
-type KnownTypeRegistry struct {
- excludeWkt bool
- includeDefault bool
- mu sync.RWMutex
- types map[string]reflect.Type
-}
-
-// NewKnownTypeRegistryWithDefaults creates a new registry that knows about all
-// "default" types (those for which protoc-generated code is statically linked
-// into the Go program).
-func NewKnownTypeRegistryWithDefaults() *KnownTypeRegistry {
- return &KnownTypeRegistry{includeDefault: true}
-}
-
-// NewKnownTypeRegistryWithoutWellKnownTypes creates a new registry that does *not*
-// include the "well-known types" in protobuf. So even well-known types would be
-// represented by a dynamic message.
-func NewKnownTypeRegistryWithoutWellKnownTypes() *KnownTypeRegistry {
- return &KnownTypeRegistry{excludeWkt: true}
-}
-
-// AddKnownType adds the types of the given messages as known types.
-func (r *KnownTypeRegistry) AddKnownType(kts ...proto.Message) {
- r.mu.Lock()
- defer r.mu.Unlock()
- if r.types == nil {
- r.types = map[string]reflect.Type{}
- }
- for _, kt := range kts {
- r.types[proto.MessageName(kt)] = reflect.TypeOf(kt)
- }
-}
-
-// CreateIfKnown will construct an instance of the given message if it is a known type.
-// If the given name is unknown, nil is returned.
-func (r *KnownTypeRegistry) CreateIfKnown(messageName string) proto.Message {
- msgType := r.GetKnownType(messageName)
- if msgType == nil {
- return nil
- }
-
- if msgType.Kind() == reflect.Ptr {
- return reflect.New(msgType.Elem()).Interface().(proto.Message)
- } else {
- return reflect.New(msgType).Elem().Interface().(proto.Message)
- }
-}
-
-// GetKnownType will return the reflect.Type for the given message name if it is
-// known. If it is not known, nil is returned.
-func (r *KnownTypeRegistry) GetKnownType(messageName string) reflect.Type {
- var msgType reflect.Type
- if r == nil {
- // a nil registry behaves the same as zero value instance: only know of well-known types
- t := proto.MessageType(messageName)
- if t != nil && t.Implements(typeOfWkt) {
- msgType = t
- }
- } else {
- if r.includeDefault {
- msgType = proto.MessageType(messageName)
- } else if !r.excludeWkt {
- t := proto.MessageType(messageName)
- if t != nil && t.Implements(typeOfWkt) {
- msgType = t
- }
- }
- if msgType == nil {
- r.mu.RLock()
- msgType = r.types[messageName]
- r.mu.RUnlock()
- }
- }
-
- return msgType
-}
diff --git a/vendor/github.com/jhump/protoreflect/dynamic/text.go b/vendor/github.com/jhump/protoreflect/dynamic/text.go
deleted file mode 100644
index 72636f2..0000000
--- a/vendor/github.com/jhump/protoreflect/dynamic/text.go
+++ /dev/null
@@ -1,1175 +0,0 @@
-package dynamic
-
-// Marshalling and unmarshalling of dynamic messages to/from proto's standard text format
-
-import (
- "bytes"
- "fmt"
- "io"
- "math"
- "reflect"
- "sort"
- "strconv"
- "strings"
- "text/scanner"
- "unicode"
-
- "github.com/golang/protobuf/proto"
- "github.com/golang/protobuf/protoc-gen-go/descriptor"
-
- "github.com/jhump/protoreflect/codec"
- "github.com/jhump/protoreflect/desc"
-)
-
-// MarshalText serializes this message to bytes in the standard text format,
-// returning an error if the operation fails. The resulting bytes will be a
-// valid UTF8 string.
-//
-// This method uses a compact form: no newlines, and spaces between field
-// identifiers and values are elided.
-func (m *Message) MarshalText() ([]byte, error) {
- var b indentBuffer
- b.indentCount = -1 // no indentation
- if err := m.marshalText(&b); err != nil {
- return nil, err
- }
- return b.Bytes(), nil
-}
-
-// MarshalTextIndent serializes this message to bytes in the standard text
-// format, returning an error if the operation fails. The resulting bytes will
-// be a valid UTF8 string.
-//
-// This method uses a "pretty-printed" form, with each field on its own line and
-// spaces between field identifiers and values.
-func (m *Message) MarshalTextIndent() ([]byte, error) {
- var b indentBuffer
- b.indent = " " // TODO: option for indent?
- if err := m.marshalText(&b); err != nil {
- return nil, err
- }
- return b.Bytes(), nil
-}
-
-func (m *Message) marshalText(b *indentBuffer) error {
- // TODO: option for emitting extended Any format?
- first := true
- // first the known fields
- for _, tag := range m.knownFieldTags() {
- itag := int32(tag)
- v := m.values[itag]
- fd := m.FindFieldDescriptor(itag)
- if fd.IsMap() {
- md := fd.GetMessageType()
- kfd := md.FindFieldByNumber(1)
- vfd := md.FindFieldByNumber(2)
- mp := v.(map[interface{}]interface{})
- keys := make([]interface{}, 0, len(mp))
- for k := range mp {
- keys = append(keys, k)
- }
- sort.Sort(sortable(keys))
- for _, mk := range keys {
- mv := mp[mk]
- err := b.maybeNext(&first)
- if err != nil {
- return err
- }
- err = marshalKnownFieldMapEntryText(b, fd, kfd, mk, vfd, mv)
- if err != nil {
- return err
- }
- }
- } else if fd.IsRepeated() {
- sl := v.([]interface{})
- for _, slv := range sl {
- err := b.maybeNext(&first)
- if err != nil {
- return err
- }
- err = marshalKnownFieldText(b, fd, slv)
- if err != nil {
- return err
- }
- }
- } else {
- err := b.maybeNext(&first)
- if err != nil {
- return err
- }
- err = marshalKnownFieldText(b, fd, v)
- if err != nil {
- return err
- }
- }
- }
- // then the unknown fields
- for _, tag := range m.unknownFieldTags() {
- itag := int32(tag)
- ufs := m.unknownFields[itag]
- for _, uf := range ufs {
- err := b.maybeNext(&first)
- if err != nil {
- return err
- }
- _, err = fmt.Fprintf(b, "%d", tag)
- if err != nil {
- return err
- }
- if uf.Encoding == proto.WireStartGroup {
- err = b.WriteByte('{')
- if err != nil {
- return err
- }
- err = b.start()
- if err != nil {
- return err
- }
- in := codec.NewBuffer(uf.Contents)
- err = marshalUnknownGroupText(b, in, true)
- if err != nil {
- return err
- }
- err = b.end()
- if err != nil {
- return err
- }
- err = b.WriteByte('}')
- if err != nil {
- return err
- }
- } else {
- err = b.sep()
- if err != nil {
- return err
- }
- if uf.Encoding == proto.WireBytes {
- err = writeString(b, string(uf.Contents))
- if err != nil {
- return err
- }
- } else {
- _, err = b.WriteString(strconv.FormatUint(uf.Value, 10))
- if err != nil {
- return err
- }
- }
- }
- }
- }
- return nil
-}
-
-func marshalKnownFieldMapEntryText(b *indentBuffer, fd *desc.FieldDescriptor, kfd *desc.FieldDescriptor, mk interface{}, vfd *desc.FieldDescriptor, mv interface{}) error {
- var name string
- if fd.IsExtension() {
- name = fmt.Sprintf("[%s]", fd.GetFullyQualifiedName())
- } else {
- name = fd.GetName()
- }
- _, err := b.WriteString(name)
- if err != nil {
- return err
- }
- err = b.sep()
- if err != nil {
- return err
- }
-
- err = b.WriteByte('<')
- if err != nil {
- return err
- }
- err = b.start()
- if err != nil {
- return err
- }
-
- err = marshalKnownFieldText(b, kfd, mk)
- if err != nil {
- return err
- }
- err = b.next()
- if err != nil {
- return err
- }
- err = marshalKnownFieldText(b, vfd, mv)
- if err != nil {
- return err
- }
-
- err = b.end()
- if err != nil {
- return err
- }
- return b.WriteByte('>')
-}
-
-func marshalKnownFieldText(b *indentBuffer, fd *desc.FieldDescriptor, v interface{}) error {
- group := fd.GetType() == descriptor.FieldDescriptorProto_TYPE_GROUP
- if group {
- var name string
- if fd.IsExtension() {
- name = fmt.Sprintf("[%s]", fd.GetMessageType().GetFullyQualifiedName())
- } else {
- name = fd.GetMessageType().GetName()
- }
- _, err := b.WriteString(name)
- if err != nil {
- return err
- }
- } else {
- var name string
- if fd.IsExtension() {
- name = fmt.Sprintf("[%s]", fd.GetFullyQualifiedName())
- } else {
- name = fd.GetName()
- }
- _, err := b.WriteString(name)
- if err != nil {
- return err
- }
- err = b.sep()
- if err != nil {
- return err
- }
- }
- rv := reflect.ValueOf(v)
- switch rv.Kind() {
- case reflect.Int32, reflect.Int64:
- ed := fd.GetEnumType()
- if ed != nil {
- n := int32(rv.Int())
- vd := ed.FindValueByNumber(n)
- if vd == nil {
- _, err := b.WriteString(strconv.FormatInt(rv.Int(), 10))
- return err
- } else {
- _, err := b.WriteString(vd.GetName())
- return err
- }
- } else {
- _, err := b.WriteString(strconv.FormatInt(rv.Int(), 10))
- return err
- }
- case reflect.Uint32, reflect.Uint64:
- _, err := b.WriteString(strconv.FormatUint(rv.Uint(), 10))
- return err
- case reflect.Float32, reflect.Float64:
- f := rv.Float()
- var str string
- if math.IsNaN(f) {
- str = "nan"
- } else if math.IsInf(f, 1) {
- str = "inf"
- } else if math.IsInf(f, -1) {
- str = "-inf"
- } else {
- var bits int
- if rv.Kind() == reflect.Float32 {
- bits = 32
- } else {
- bits = 64
- }
- str = strconv.FormatFloat(rv.Float(), 'g', -1, bits)
- }
- _, err := b.WriteString(str)
- return err
- case reflect.Bool:
- _, err := b.WriteString(strconv.FormatBool(rv.Bool()))
- return err
- case reflect.Slice:
- return writeString(b, string(rv.Bytes()))
- case reflect.String:
- return writeString(b, rv.String())
- default:
- var err error
- if group {
- err = b.WriteByte('{')
- } else {
- err = b.WriteByte('<')
- }
- if err != nil {
- return err
- }
- err = b.start()
- if err != nil {
- return err
- }
- // must be a message
- if dm, ok := v.(*Message); ok {
- err = dm.marshalText(b)
- if err != nil {
- return err
- }
- } else {
- err = proto.CompactText(b, v.(proto.Message))
- if err != nil {
- return err
- }
- }
- err = b.end()
- if err != nil {
- return err
- }
- if group {
- return b.WriteByte('}')
- } else {
- return b.WriteByte('>')
- }
- }
-}
-
-// writeString writes a string in the protocol buffer text format.
-// It is similar to strconv.Quote except we don't use Go escape sequences,
-// we treat the string as a byte sequence, and we use octal escapes.
-// These differences are to maintain interoperability with the other
-// languages' implementations of the text format.
-func writeString(b *indentBuffer, s string) error {
- // use WriteByte here to get any needed indent
- if err := b.WriteByte('"'); err != nil {
- return err
- }
- // Loop over the bytes, not the runes.
- for i := 0; i < len(s); i++ {
- var err error
- // Divergence from C++: we don't escape apostrophes.
- // There's no need to escape them, and the C++ parser
- // copes with a naked apostrophe.
- switch c := s[i]; c {
- case '\n':
- _, err = b.WriteString("\\n")
- case '\r':
- _, err = b.WriteString("\\r")
- case '\t':
- _, err = b.WriteString("\\t")
- case '"':
- _, err = b.WriteString("\\")
- case '\\':
- _, err = b.WriteString("\\\\")
- default:
- if c >= 0x20 && c < 0x7f {
- err = b.WriteByte(c)
- } else {
- _, err = fmt.Fprintf(b, "\\%03o", c)
- }
- }
- if err != nil {
- return err
- }
- }
- return b.WriteByte('"')
-}
-
-func marshalUnknownGroupText(b *indentBuffer, in *codec.Buffer, topLevel bool) error {
- first := true
- for {
- if in.EOF() {
- if topLevel {
- return nil
- }
- // this is a nested message: we are expecting an end-group tag, not EOF!
- return io.ErrUnexpectedEOF
- }
- tag, wireType, err := in.DecodeTagAndWireType()
- if err != nil {
- return err
- }
- if wireType == proto.WireEndGroup {
- return nil
- }
- err = b.maybeNext(&first)
- if err != nil {
- return err
- }
- _, err = fmt.Fprintf(b, "%d", tag)
- if err != nil {
- return err
- }
- if wireType == proto.WireStartGroup {
- err = b.WriteByte('{')
- if err != nil {
- return err
- }
- err = b.start()
- if err != nil {
- return err
- }
- err = marshalUnknownGroupText(b, in, false)
- if err != nil {
- return err
- }
- err = b.end()
- if err != nil {
- return err
- }
- err = b.WriteByte('}')
- if err != nil {
- return err
- }
- continue
- } else {
- err = b.sep()
- if err != nil {
- return err
- }
- if wireType == proto.WireBytes {
- contents, err := in.DecodeRawBytes(false)
- if err != nil {
- return err
- }
- err = writeString(b, string(contents))
- if err != nil {
- return err
- }
- } else {
- var v uint64
- switch wireType {
- case proto.WireVarint:
- v, err = in.DecodeVarint()
- case proto.WireFixed32:
- v, err = in.DecodeFixed32()
- case proto.WireFixed64:
- v, err = in.DecodeFixed64()
- default:
- return proto.ErrInternalBadWireType
- }
- if err != nil {
- return err
- }
- _, err = b.WriteString(strconv.FormatUint(v, 10))
- if err != nil {
- return err
- }
- }
- }
- }
-}
-
-// UnmarshalText de-serializes the message that is present, in text format, in
-// the given bytes into this message. It first resets the current message. It
-// returns an error if the given bytes do not contain a valid encoding of this
-// message type in the standard text format
-func (m *Message) UnmarshalText(text []byte) error {
- m.Reset()
- if err := m.UnmarshalMergeText(text); err != nil {
- return err
- }
- return m.Validate()
-}
-
-// UnmarshalMergeText de-serializes the message that is present, in text format,
-// in the given bytes into this message. Unlike UnmarshalText, it does not first
-// reset the message, instead merging the data in the given bytes into the
-// existing data in this message.
-func (m *Message) UnmarshalMergeText(text []byte) error {
- return m.unmarshalText(newReader(text), tokenEOF)
-}
-
-func (m *Message) unmarshalText(tr *txtReader, end tokenType) error {
- for {
- tok := tr.next()
- if tok.tokTyp == end {
- return nil
- }
- if tok.tokTyp == tokenEOF {
- return io.ErrUnexpectedEOF
- }
- var fd *desc.FieldDescriptor
- var extendedAnyType *desc.MessageDescriptor
- if tok.tokTyp == tokenInt {
- // tag number (indicates unknown field)
- tag, err := strconv.ParseInt(tok.val.(string), 10, 32)
- if err != nil {
- return err
- }
- itag := int32(tag)
- fd = m.FindFieldDescriptor(itag)
- if fd == nil {
- // can't parse the value w/out field descriptor, so skip it
- tok = tr.next()
- if tok.tokTyp == tokenEOF {
- return io.ErrUnexpectedEOF
- } else if tok.tokTyp == tokenOpenBrace {
- if err := skipMessageText(tr, true); err != nil {
- return err
- }
- } else if tok.tokTyp == tokenColon {
- if err := skipFieldValueText(tr); err != nil {
- return err
- }
- } else {
- return textError(tok, "Expecting a colon ':' or brace '{'; instead got %q", tok.txt)
- }
- tok = tr.peek()
- if tok.tokTyp.IsSep() {
- tr.next() // consume separator
- }
- continue
- }
- } else {
- fieldName, err := unmarshalFieldNameText(tr, tok)
- if err != nil {
- return err
- }
- fd = m.FindFieldDescriptorByName(fieldName)
- if fd == nil {
- // See if it's a group name
- for _, field := range m.md.GetFields() {
- if field.GetType() == descriptor.FieldDescriptorProto_TYPE_GROUP && field.GetMessageType().GetName() == fieldName {
- fd = field
- break
- }
- }
- if fd == nil {
- // maybe this is an extended Any
- if m.md.GetFullyQualifiedName() == "google.protobuf.Any" && fieldName[0] == '[' && strings.Contains(fieldName, "/") {
- // strip surrounding "[" and "]" and extract type name from URL
- typeUrl := fieldName[1 : len(fieldName)-1]
- mname := typeUrl
- if slash := strings.LastIndex(mname, "/"); slash >= 0 {
- mname = mname[slash+1:]
- }
- // TODO: add a way to weave an AnyResolver to this point
- extendedAnyType = findMessageDescriptor(mname, m.md.GetFile())
- if extendedAnyType == nil {
- return textError(tok, "could not parse Any with unknown type URL %q", fieldName)
- }
- // field 1 is "type_url"
- typeUrlField := m.md.FindFieldByNumber(1)
- if err := m.TrySetField(typeUrlField, typeUrl); err != nil {
- return err
- }
- } else {
- // TODO: add a flag to just ignore unrecognized field names
- return textError(tok, "%q is not a recognized field name of %q", fieldName, m.md.GetFullyQualifiedName())
- }
- }
- }
- }
- tok = tr.next()
- if tok.tokTyp == tokenEOF {
- return io.ErrUnexpectedEOF
- }
- if extendedAnyType != nil {
- // consume optional colon; make sure this is a "start message" token
- if tok.tokTyp == tokenColon {
- tok = tr.next()
- if tok.tokTyp == tokenEOF {
- return io.ErrUnexpectedEOF
- }
- }
- if tok.tokTyp.EndToken() == tokenError {
- return textError(tok, "Expecting a '<' or '{'; instead got %q", tok.txt)
- }
-
- // TODO: use mf.NewMessage and, if not a dynamic message, use proto.UnmarshalText to unmarshal it
- g := m.mf.NewDynamicMessage(extendedAnyType)
- if err := g.unmarshalText(tr, tok.tokTyp.EndToken()); err != nil {
- return err
- }
- // now we marshal the message to bytes and store in the Any
- b, err := g.Marshal()
- if err != nil {
- return err
- }
- // field 2 is "value"
- anyValueField := m.md.FindFieldByNumber(2)
- if err := m.TrySetField(anyValueField, b); err != nil {
- return err
- }
-
- } else if (fd.GetType() == descriptor.FieldDescriptorProto_TYPE_GROUP ||
- fd.GetType() == descriptor.FieldDescriptorProto_TYPE_MESSAGE) &&
- tok.tokTyp.EndToken() != tokenError {
-
- // TODO: use mf.NewMessage and, if not a dynamic message, use proto.UnmarshalText to unmarshal it
- g := m.mf.NewDynamicMessage(fd.GetMessageType())
- if err := g.unmarshalText(tr, tok.tokTyp.EndToken()); err != nil {
- return err
- }
- if fd.IsRepeated() {
- if err := m.TryAddRepeatedField(fd, g); err != nil {
- return err
- }
- } else {
- if err := m.TrySetField(fd, g); err != nil {
- return err
- }
- }
- } else {
- if tok.tokTyp != tokenColon {
- return textError(tok, "Expecting a colon ':'; instead got %q", tok.txt)
- }
- if err := m.unmarshalFieldValueText(fd, tr); err != nil {
- return err
- }
- }
- tok = tr.peek()
- if tok.tokTyp.IsSep() {
- tr.next() // consume separator
- }
- }
-}
-func findMessageDescriptor(name string, fd *desc.FileDescriptor) *desc.MessageDescriptor {
- md := findMessageInTransitiveDeps(name, fd, map[*desc.FileDescriptor]struct{}{})
- if md == nil {
- // couldn't find it; see if we have this message linked in
- md, _ = desc.LoadMessageDescriptor(name)
- }
- return md
-}
-
-func findMessageInTransitiveDeps(name string, fd *desc.FileDescriptor, seen map[*desc.FileDescriptor]struct{}) *desc.MessageDescriptor {
- if _, ok := seen[fd]; ok {
- // already checked this file
- return nil
- }
- seen[fd] = struct{}{}
- md := fd.FindMessage(name)
- if md != nil {
- return md
- }
- // not in this file so recursively search its deps
- for _, dep := range fd.GetDependencies() {
- md = findMessageInTransitiveDeps(name, dep, seen)
- if md != nil {
- return md
- }
- }
- // couldn't find it
- return nil
-}
-
-func textError(tok *token, format string, args ...interface{}) error {
- var msg string
- if tok.tokTyp == tokenError {
- msg = tok.val.(error).Error()
- } else {
- msg = fmt.Sprintf(format, args...)
- }
- return fmt.Errorf("line %d, col %d: %s", tok.pos.Line, tok.pos.Column, msg)
-}
-
-type setFunction func(*Message, *desc.FieldDescriptor, interface{}) error
-
-func (m *Message) unmarshalFieldValueText(fd *desc.FieldDescriptor, tr *txtReader) error {
- var set setFunction
- if fd.IsRepeated() {
- set = (*Message).addRepeatedField
- } else {
- set = mergeField
- }
- tok := tr.peek()
- if tok.tokTyp == tokenOpenBracket {
- tr.next() // consume tok
- for {
- if err := m.unmarshalFieldElementText(fd, tr, set); err != nil {
- return err
- }
- tok = tr.peek()
- if tok.tokTyp == tokenCloseBracket {
- tr.next() // consume tok
- return nil
- } else if tok.tokTyp.IsSep() {
- tr.next() // consume separator
- }
- }
- }
- return m.unmarshalFieldElementText(fd, tr, set)
-}
-
-func (m *Message) unmarshalFieldElementText(fd *desc.FieldDescriptor, tr *txtReader, set setFunction) error {
- tok := tr.next()
- if tok.tokTyp == tokenEOF {
- return io.ErrUnexpectedEOF
- }
-
- var expected string
- switch fd.GetType() {
- case descriptor.FieldDescriptorProto_TYPE_BOOL:
- if tok.tokTyp == tokenIdent {
- if tok.val.(string) == "true" {
- return set(m, fd, true)
- } else if tok.val.(string) == "false" {
- return set(m, fd, false)
- }
- }
- expected = "boolean value"
- case descriptor.FieldDescriptorProto_TYPE_BYTES:
- if tok.tokTyp == tokenString {
- return set(m, fd, []byte(tok.val.(string)))
- }
- expected = "bytes string value"
- case descriptor.FieldDescriptorProto_TYPE_STRING:
- if tok.tokTyp == tokenString {
- return set(m, fd, tok.val)
- }
- expected = "string value"
- case descriptor.FieldDescriptorProto_TYPE_FLOAT:
- switch tok.tokTyp {
- case tokenFloat:
- return set(m, fd, float32(tok.val.(float64)))
- case tokenInt:
- if f, err := strconv.ParseFloat(tok.val.(string), 32); err != nil {
- return err
- } else {
- return set(m, fd, float32(f))
- }
- case tokenIdent:
- ident := strings.ToLower(tok.val.(string))
- if ident == "inf" {
- return set(m, fd, float32(math.Inf(1)))
- } else if ident == "nan" {
- return set(m, fd, float32(math.NaN()))
- }
- case tokenMinus:
- peeked := tr.peek()
- if peeked.tokTyp == tokenIdent {
- ident := strings.ToLower(peeked.val.(string))
- if ident == "inf" {
- tr.next() // consume peeked token
- return set(m, fd, float32(math.Inf(-1)))
- }
- }
- }
- expected = "float value"
- case descriptor.FieldDescriptorProto_TYPE_DOUBLE:
- switch tok.tokTyp {
- case tokenFloat:
- return set(m, fd, tok.val)
- case tokenInt:
- if f, err := strconv.ParseFloat(tok.val.(string), 64); err != nil {
- return err
- } else {
- return set(m, fd, f)
- }
- case tokenIdent:
- ident := strings.ToLower(tok.val.(string))
- if ident == "inf" {
- return set(m, fd, math.Inf(1))
- } else if ident == "nan" {
- return set(m, fd, math.NaN())
- }
- case tokenMinus:
- peeked := tr.peek()
- if peeked.tokTyp == tokenIdent {
- ident := strings.ToLower(peeked.val.(string))
- if ident == "inf" {
- tr.next() // consume peeked token
- return set(m, fd, math.Inf(-1))
- }
- }
- }
- expected = "float value"
- case descriptor.FieldDescriptorProto_TYPE_INT32,
- descriptor.FieldDescriptorProto_TYPE_SINT32,
- descriptor.FieldDescriptorProto_TYPE_SFIXED32:
- if tok.tokTyp == tokenInt {
- if i, err := strconv.ParseInt(tok.val.(string), 10, 32); err != nil {
- return err
- } else {
- return set(m, fd, int32(i))
- }
- }
- expected = "int value"
- case descriptor.FieldDescriptorProto_TYPE_INT64,
- descriptor.FieldDescriptorProto_TYPE_SINT64,
- descriptor.FieldDescriptorProto_TYPE_SFIXED64:
- if tok.tokTyp == tokenInt {
- if i, err := strconv.ParseInt(tok.val.(string), 10, 64); err != nil {
- return err
- } else {
- return set(m, fd, i)
- }
- }
- expected = "int value"
- case descriptor.FieldDescriptorProto_TYPE_UINT32,
- descriptor.FieldDescriptorProto_TYPE_FIXED32:
- if tok.tokTyp == tokenInt {
- if i, err := strconv.ParseUint(tok.val.(string), 10, 32); err != nil {
- return err
- } else {
- return set(m, fd, uint32(i))
- }
- }
- expected = "unsigned int value"
- case descriptor.FieldDescriptorProto_TYPE_UINT64,
- descriptor.FieldDescriptorProto_TYPE_FIXED64:
- if tok.tokTyp == tokenInt {
- if i, err := strconv.ParseUint(tok.val.(string), 10, 64); err != nil {
- return err
- } else {
- return set(m, fd, i)
- }
- }
- expected = "unsigned int value"
- case descriptor.FieldDescriptorProto_TYPE_ENUM:
- if tok.tokTyp == tokenIdent {
- // TODO: add a flag to just ignore unrecognized enum value names?
- vd := fd.GetEnumType().FindValueByName(tok.val.(string))
- if vd != nil {
- return set(m, fd, vd.GetNumber())
- }
- } else if tok.tokTyp == tokenInt {
- if i, err := strconv.ParseInt(tok.val.(string), 10, 32); err != nil {
- return err
- } else {
- return set(m, fd, int32(i))
- }
- }
- expected = fmt.Sprintf("enum %s value", fd.GetEnumType().GetFullyQualifiedName())
- case descriptor.FieldDescriptorProto_TYPE_MESSAGE,
- descriptor.FieldDescriptorProto_TYPE_GROUP:
-
- endTok := tok.tokTyp.EndToken()
- if endTok != tokenError {
- dm := m.mf.NewDynamicMessage(fd.GetMessageType())
- if err := dm.unmarshalText(tr, endTok); err != nil {
- return err
- }
- // TODO: ideally we would use mf.NewMessage and, if not a dynamic message, use
- // proto package to unmarshal it. But the text parser isn't particularly amenable
- // to that, so we instead convert a dynamic message to a generated one if the
- // known-type registry knows about the generated type...
- var ktr *KnownTypeRegistry
- if m.mf != nil {
- ktr = m.mf.ktr
- }
- pm := ktr.CreateIfKnown(fd.GetMessageType().GetFullyQualifiedName())
- if pm != nil {
- if err := dm.ConvertTo(pm); err != nil {
- return set(m, fd, pm)
- }
- }
- return set(m, fd, dm)
- }
- expected = fmt.Sprintf("message %s value", fd.GetMessageType().GetFullyQualifiedName())
- default:
- return fmt.Errorf("field %q of message %q has unrecognized type: %v", fd.GetFullyQualifiedName(), m.md.GetFullyQualifiedName(), fd.GetType())
- }
-
- // if we get here, token was wrong type; create error message
- var article string
- if strings.Contains("aieou", expected[0:1]) {
- article = "an"
- } else {
- article = "a"
- }
- return textError(tok, "Expecting %s %s; got %q", article, expected, tok.txt)
-}
-
-func unmarshalFieldNameText(tr *txtReader, tok *token) (string, error) {
- if tok.tokTyp == tokenOpenBracket || tok.tokTyp == tokenOpenParen {
- // extension name
- var closeType tokenType
- var closeChar string
- if tok.tokTyp == tokenOpenBracket {
- closeType = tokenCloseBracket
- closeChar = "close bracket ']'"
- } else {
- closeType = tokenCloseParen
- closeChar = "close paren ')'"
- }
- // must be followed by an identifier
- idents := make([]string, 0, 1)
- for {
- tok = tr.next()
- if tok.tokTyp == tokenEOF {
- return "", io.ErrUnexpectedEOF
- } else if tok.tokTyp != tokenIdent {
- return "", textError(tok, "Expecting an identifier; instead got %q", tok.txt)
- }
- idents = append(idents, tok.val.(string))
- // and then close bracket/paren, or "/" to keep adding URL elements to name
- tok = tr.next()
- if tok.tokTyp == tokenEOF {
- return "", io.ErrUnexpectedEOF
- } else if tok.tokTyp == closeType {
- break
- } else if tok.tokTyp != tokenSlash {
- return "", textError(tok, "Expecting a %s; instead got %q", closeChar, tok.txt)
- }
- }
- return "[" + strings.Join(idents, "/") + "]", nil
- } else if tok.tokTyp == tokenIdent {
- // normal field name
- return tok.val.(string), nil
- } else {
- return "", textError(tok, "Expecting an identifier or tag number; instead got %q", tok.txt)
- }
-}
-
-func skipFieldNameText(tr *txtReader) error {
- tok := tr.next()
- if tok.tokTyp == tokenEOF {
- return io.ErrUnexpectedEOF
- } else if tok.tokTyp == tokenInt || tok.tokTyp == tokenIdent {
- return nil
- } else {
- _, err := unmarshalFieldNameText(tr, tok)
- return err
- }
-}
-
-func skipFieldValueText(tr *txtReader) error {
- tok := tr.peek()
- if tok.tokTyp == tokenOpenBracket {
- tr.next() // consume tok
- for {
- if err := skipFieldElementText(tr); err != nil {
- return err
- }
- tok = tr.peek()
- if tok.tokTyp == tokenCloseBracket {
- tr.next() // consume tok
- return nil
- } else if tok.tokTyp.IsSep() {
- tr.next() // consume separator
- }
-
- }
- }
- return skipFieldElementText(tr)
-}
-
-func skipFieldElementText(tr *txtReader) error {
- tok := tr.next()
- switch tok.tokTyp {
- case tokenEOF:
- return io.ErrUnexpectedEOF
- case tokenInt, tokenFloat, tokenString, tokenIdent:
- return nil
- case tokenOpenAngle:
- return skipMessageText(tr, false)
- default:
- return textError(tok, "Expecting an angle bracket '<' or a value; instead got %q", tok.txt)
- }
-}
-
-func skipMessageText(tr *txtReader, isGroup bool) error {
- for {
- tok := tr.peek()
- if tok.tokTyp == tokenEOF {
- return io.ErrUnexpectedEOF
- } else if isGroup && tok.tokTyp == tokenCloseBrace {
- return nil
- } else if !isGroup && tok.tokTyp == tokenCloseAngle {
- return nil
- }
-
- // field name or tag
- if err := skipFieldNameText(tr); err != nil {
- return err
- }
-
- // field value
- tok = tr.next()
- if tok.tokTyp == tokenEOF {
- return io.ErrUnexpectedEOF
- } else if tok.tokTyp == tokenOpenBrace {
- if err := skipMessageText(tr, true); err != nil {
- return err
- }
- } else if tok.tokTyp == tokenColon {
- if err := skipFieldValueText(tr); err != nil {
- return err
- }
- } else {
- return textError(tok, "Expecting a colon ':' or brace '{'; instead got %q", tok.txt)
- }
-
- tok = tr.peek()
- if tok.tokTyp.IsSep() {
- tr.next() // consume separator
- }
- }
-}
-
-type tokenType int
-
-const (
- tokenError tokenType = iota
- tokenEOF
- tokenIdent
- tokenString
- tokenInt
- tokenFloat
- tokenColon
- tokenComma
- tokenSemiColon
- tokenOpenBrace
- tokenCloseBrace
- tokenOpenBracket
- tokenCloseBracket
- tokenOpenAngle
- tokenCloseAngle
- tokenOpenParen
- tokenCloseParen
- tokenSlash
- tokenMinus
-)
-
-func (t tokenType) IsSep() bool {
- return t == tokenComma || t == tokenSemiColon
-}
-
-func (t tokenType) EndToken() tokenType {
- switch t {
- case tokenOpenAngle:
- return tokenCloseAngle
- case tokenOpenBrace:
- return tokenCloseBrace
- default:
- return tokenError
- }
-}
-
-type token struct {
- tokTyp tokenType
- val interface{}
- txt string
- pos scanner.Position
-}
-
-type txtReader struct {
- scanner scanner.Scanner
- peeked token
- havePeeked bool
-}
-
-func newReader(text []byte) *txtReader {
- sc := scanner.Scanner{}
- sc.Init(bytes.NewReader(text))
- sc.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanFloats | scanner.ScanChars |
- scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments
- // identifiers are same restrictions as Go identifiers, except we also allow dots since
- // we accept fully-qualified names
- sc.IsIdentRune = func(ch rune, i int) bool {
- return ch == '_' || unicode.IsLetter(ch) ||
- (i > 0 && unicode.IsDigit(ch)) ||
- (i > 0 && ch == '.')
- }
- // ignore errors; we handle them if/when we see malformed tokens
- sc.Error = func(s *scanner.Scanner, msg string) {}
- return &txtReader{scanner: sc}
-}
-
-func (p *txtReader) peek() *token {
- if p.havePeeked {
- return &p.peeked
- }
- t := p.scanner.Scan()
- if t == scanner.EOF {
- p.peeked.tokTyp = tokenEOF
- p.peeked.val = nil
- p.peeked.txt = ""
- p.peeked.pos = p.scanner.Position
- } else if err := p.processToken(t, p.scanner.TokenText(), p.scanner.Position); err != nil {
- p.peeked.tokTyp = tokenError
- p.peeked.val = err
- }
- p.havePeeked = true
- return &p.peeked
-}
-
-func (p *txtReader) processToken(t rune, text string, pos scanner.Position) error {
- p.peeked.pos = pos
- p.peeked.txt = text
- switch t {
- case scanner.Ident:
- p.peeked.tokTyp = tokenIdent
- p.peeked.val = text
- case scanner.Int:
- p.peeked.tokTyp = tokenInt
- p.peeked.val = text // can't parse the number because we don't know if it's signed or unsigned
- case scanner.Float:
- p.peeked.tokTyp = tokenFloat
- var err error
- if p.peeked.val, err = strconv.ParseFloat(text, 64); err != nil {
- return err
- }
- case scanner.Char, scanner.String:
- p.peeked.tokTyp = tokenString
- var err error
- if p.peeked.val, err = strconv.Unquote(text); err != nil {
- return err
- }
- case '-': // unary minus, for negative ints and floats
- ch := p.scanner.Peek()
- if ch < '0' || ch > '9' {
- p.peeked.tokTyp = tokenMinus
- p.peeked.val = '-'
- } else {
- t := p.scanner.Scan()
- if t == scanner.EOF {
- return io.ErrUnexpectedEOF
- } else if t == scanner.Float {
- p.peeked.tokTyp = tokenFloat
- text += p.scanner.TokenText()
- p.peeked.txt = text
- var err error
- if p.peeked.val, err = strconv.ParseFloat(text, 64); err != nil {
- p.peeked.pos = p.scanner.Position
- return err
- }
- } else if t == scanner.Int {
- p.peeked.tokTyp = tokenInt
- text += p.scanner.TokenText()
- p.peeked.txt = text
- p.peeked.val = text // can't parse the number because we don't know if it's signed or unsigned
- } else {
- p.peeked.pos = p.scanner.Position
- return fmt.Errorf("expecting an int or float but got %q", p.scanner.TokenText())
- }
- }
- case ':':
- p.peeked.tokTyp = tokenColon
- p.peeked.val = ':'
- case ',':
- p.peeked.tokTyp = tokenComma
- p.peeked.val = ','
- case ';':
- p.peeked.tokTyp = tokenSemiColon
- p.peeked.val = ';'
- case '{':
- p.peeked.tokTyp = tokenOpenBrace
- p.peeked.val = '{'
- case '}':
- p.peeked.tokTyp = tokenCloseBrace
- p.peeked.val = '}'
- case '<':
- p.peeked.tokTyp = tokenOpenAngle
- p.peeked.val = '<'
- case '>':
- p.peeked.tokTyp = tokenCloseAngle
- p.peeked.val = '>'
- case '[':
- p.peeked.tokTyp = tokenOpenBracket
- p.peeked.val = '['
- case ']':
- p.peeked.tokTyp = tokenCloseBracket
- p.peeked.val = ']'
- case '(':
- p.peeked.tokTyp = tokenOpenParen
- p.peeked.val = '('
- case ')':
- p.peeked.tokTyp = tokenCloseParen
- p.peeked.val = ')'
- case '/':
- // only allowed to separate URL components in expanded Any format
- p.peeked.tokTyp = tokenSlash
- p.peeked.val = '/'
- default:
- return fmt.Errorf("invalid character: %c", t)
- }
- return nil
-}
-
-func (p *txtReader) next() *token {
- t := p.peek()
- if t.tokTyp != tokenEOF && t.tokTyp != tokenError {
- p.havePeeked = false
- }
- return t
-}
diff --git a/vendor/github.com/jhump/protoreflect/internal/standard_files.go b/vendor/github.com/jhump/protoreflect/internal/standard_files.go
deleted file mode 100644
index 4a8b47a..0000000
--- a/vendor/github.com/jhump/protoreflect/internal/standard_files.go
+++ /dev/null
@@ -1,127 +0,0 @@
-// Package internal contains some code that should not be exported but needs to
-// be shared across more than one of the protoreflect sub-packages.
-package internal
-
-import (
- "bytes"
- "compress/gzip"
- "fmt"
- "io/ioutil"
-
- "github.com/golang/protobuf/proto"
- dpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
-)
-
-// TODO: replace this alias configuration with desc.RegisterImportPath?
-
-// StdFileAliases are the standard protos included with protoc, but older versions of
-// their respective packages registered them using incorrect paths.
-var StdFileAliases = map[string]string{
- // Files for the github.com/golang/protobuf/ptypes package at one point were
- // registered using the path where the proto files are mirrored in GOPATH,
- // inside the golang/protobuf repo.
- // (Fixed as of https://github.com/golang/protobuf/pull/412)
- "google/protobuf/any.proto": "github.com/golang/protobuf/ptypes/any/any.proto",
- "google/protobuf/duration.proto": "github.com/golang/protobuf/ptypes/duration/duration.proto",
- "google/protobuf/empty.proto": "github.com/golang/protobuf/ptypes/empty/empty.proto",
- "google/protobuf/struct.proto": "github.com/golang/protobuf/ptypes/struct/struct.proto",
- "google/protobuf/timestamp.proto": "github.com/golang/protobuf/ptypes/timestamp/timestamp.proto",
- "google/protobuf/wrappers.proto": "github.com/golang/protobuf/ptypes/wrappers/wrappers.proto",
- // Files for the google.golang.org/genproto/protobuf package at one point
- // were registered with an anomalous "src/" prefix.
- // (Fixed as of https://github.com/google/go-genproto/pull/31)
- "google/protobuf/api.proto": "src/google/protobuf/api.proto",
- "google/protobuf/field_mask.proto": "src/google/protobuf/field_mask.proto",
- "google/protobuf/source_context.proto": "src/google/protobuf/source_context.proto",
- "google/protobuf/type.proto": "src/google/protobuf/type.proto",
-
- // Other standard files (descriptor.proto and compiler/plugin.proto) are
- // registered correctly, so we don't need rules for them here.
-}
-
-func init() {
- // We provide aliasing in both directions, to support files with the
- // proper import path linked against older versions of the generated
- // files AND files that used the aliased import path but linked against
- // newer versions of the generated files (which register with the
- // correct path).
-
- // Get all files defined above
- keys := make([]string, 0, len(StdFileAliases))
- for k := range StdFileAliases {
- keys = append(keys, k)
- }
- // And add inverse mappings
- for _, k := range keys {
- alias := StdFileAliases[k]
- StdFileAliases[alias] = k
- }
-}
-
-type ErrNoSuchFile string
-
-func (e ErrNoSuchFile) Error() string {
- return fmt.Sprintf("no such file: %q", string(e))
-}
-
-// LoadFileDescriptor loads a registered descriptor and decodes it. If the given
-// name cannot be loaded but is a known standard name, an alias will be tried,
-// so the standard files can be loaded even if linked against older "known bad"
-// versions of packages.
-func LoadFileDescriptor(file string) (*dpb.FileDescriptorProto, error) {
- fdb := proto.FileDescriptor(file)
- aliased := false
- if fdb == nil {
- var ok bool
- alias, ok := StdFileAliases[file]
- if ok {
- aliased = true
- if fdb = proto.FileDescriptor(alias); fdb == nil {
- return nil, ErrNoSuchFile(file)
- }
- } else {
- return nil, ErrNoSuchFile(file)
- }
- }
-
- fd, err := DecodeFileDescriptor(file, fdb)
- if err != nil {
- return nil, err
- }
-
- if aliased {
- // the file descriptor will have the alias used to load it, but
- // we need it to have the specified name in order to link it
- fd.Name = proto.String(file)
- }
-
- return fd, nil
-}
-
-// DecodeFileDescriptor decodes the bytes of a registered file descriptor.
-// Registered file descriptors are first "proto encoded" (e.g. binary format
-// for the descriptor protos) and then gzipped. So this function gunzips and
-// then unmarshals into a descriptor proto.
-func DecodeFileDescriptor(element string, fdb []byte) (*dpb.FileDescriptorProto, error) {
- raw, err := decompress(fdb)
- if err != nil {
- return nil, fmt.Errorf("failed to decompress %q descriptor: %v", element, err)
- }
- fd := dpb.FileDescriptorProto{}
- if err := proto.Unmarshal(raw, &fd); err != nil {
- return nil, fmt.Errorf("bad descriptor for %q: %v", element, err)
- }
- return &fd, nil
-}
-
-func decompress(b []byte) ([]byte, error) {
- r, err := gzip.NewReader(bytes.NewReader(b))
- if err != nil {
- return nil, fmt.Errorf("bad gzipped descriptor: %v", err)
- }
- out, err := ioutil.ReadAll(r)
- if err != nil {
- return nil, fmt.Errorf("bad gzipped descriptor: %v", err)
- }
- return out, nil
-}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 54d7b54..1697510 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -24,7 +24,6 @@
github.com/golang/protobuf/ptypes
github.com/golang/protobuf/ptypes/any
github.com/golang/protobuf/ptypes/duration
-github.com/golang/protobuf/ptypes/empty
github.com/golang/protobuf/ptypes/struct
github.com/golang/protobuf/ptypes/timestamp
github.com/golang/protobuf/ptypes/wrappers
@@ -56,12 +55,6 @@
github.com/jcmturner/gofork/x/crypto/pbkdf2
# github.com/jessevdk/go-flags v1.4.0
github.com/jessevdk/go-flags
-# github.com/jhump/protoreflect v1.5.0
-github.com/jhump/protoreflect/codec
-github.com/jhump/protoreflect/desc
-github.com/jhump/protoreflect/desc/internal
-github.com/jhump/protoreflect/dynamic
-github.com/jhump/protoreflect/internal
# github.com/jpillora/backoff v1.0.0
github.com/jpillora/backoff
# github.com/klauspost/compress v1.9.8