| // Copyright 2015 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Package jsonpb provides functionality to marshal and unmarshal between a |
| // protocol buffer message and JSON. It follows the specification at |
| // https://developers.google.com/protocol-buffers/docs/proto3#json. |
| // |
| // Do not rely on the default behavior of the standard encoding/json package |
| // when called on generated message types as it does not operate correctly. |
| // |
| // Deprecated: Use the "google.golang.org/protobuf/encoding/protojson" |
| // package instead. |
| package jsonpb |
| |
| import ( |
| "github.com/golang/protobuf/proto" |
| "google.golang.org/protobuf/reflect/protoreflect" |
| "google.golang.org/protobuf/reflect/protoregistry" |
| "google.golang.org/protobuf/runtime/protoimpl" |
| ) |
| |
| // AnyResolver takes a type URL, present in an Any message, |
| // and resolves it into an instance of the associated message. |
| type AnyResolver interface { |
| Resolve(typeURL string) (proto.Message, error) |
| } |
| |
| type anyResolver struct{ AnyResolver } |
| |
| func (r anyResolver) FindMessageByName(message protoreflect.FullName) (protoreflect.MessageType, error) { |
| return r.FindMessageByURL(string(message)) |
| } |
| |
| func (r anyResolver) FindMessageByURL(url string) (protoreflect.MessageType, error) { |
| m, err := r.Resolve(url) |
| if err != nil { |
| return nil, err |
| } |
| return protoimpl.X.MessageTypeOf(m), nil |
| } |
| |
| func (r anyResolver) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) { |
| return protoregistry.GlobalTypes.FindExtensionByName(field) |
| } |
| |
| func (r anyResolver) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) { |
| return protoregistry.GlobalTypes.FindExtensionByNumber(message, field) |
| } |
| |
| func wellKnownType(s protoreflect.FullName) string { |
| if s.Parent() == "google.protobuf" { |
| switch s.Name() { |
| case "Empty", "Any", |
| "BoolValue", "BytesValue", "StringValue", |
| "Int32Value", "UInt32Value", "FloatValue", |
| "Int64Value", "UInt64Value", "DoubleValue", |
| "Duration", "Timestamp", |
| "NullValue", "Struct", "Value", "ListValue": |
| return string(s.Name()) |
| } |
| } |
| return "" |
| } |
| |
| func isMessageSet(md protoreflect.MessageDescriptor) bool { |
| ms, ok := md.(interface{ IsMessageSet() bool }) |
| return ok && ms.IsMessageSet() |
| } |