| // 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() | |
| } |