Index: third_party/protobuf/src/google/protobuf/util/json_util.cc |
diff --git a/third_party/protobuf/src/google/protobuf/util/json_util.cc b/third_party/protobuf/src/google/protobuf/util/json_util.cc |
index c3b8d502e3ae86350067df2d6fcf985c20c78a31..2659320a159b26933030cdad5fa1da600d49f75b 100644 |
--- a/third_party/protobuf/src/google/protobuf/util/json_util.cc |
+++ b/third_party/protobuf/src/google/protobuf/util/json_util.cc |
@@ -102,6 +102,42 @@ util::Status BinaryToJsonString(TypeResolver* resolver, |
options); |
} |
+namespace { |
+class StatusErrorListener : public converter::ErrorListener { |
+ public: |
+ StatusErrorListener() : status_(util::Status::OK) {} |
+ virtual ~StatusErrorListener() {} |
+ |
+ util::Status GetStatus() { return status_; } |
+ |
+ virtual void InvalidName(const converter::LocationTrackerInterface& loc, |
+ StringPiece unknown_name, StringPiece message) { |
+ status_ = util::Status(util::error::INVALID_ARGUMENT, |
+ loc.ToString() + ": " + message.ToString()); |
+ } |
+ |
+ virtual void InvalidValue(const converter::LocationTrackerInterface& loc, |
+ StringPiece type_name, StringPiece value) { |
+ status_ = |
+ util::Status(util::error::INVALID_ARGUMENT, |
+ loc.ToString() + ": invalid value " + value.ToString() + |
+ " for type " + type_name.ToString()); |
+ } |
+ |
+ virtual void MissingField(const converter::LocationTrackerInterface& loc, |
+ StringPiece missing_name) { |
+ status_ = util::Status( |
+ util::error::INVALID_ARGUMENT, |
+ loc.ToString() + ": missing field " + missing_name.ToString()); |
+ } |
+ |
+ private: |
+ util::Status status_; |
+ |
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StatusErrorListener); |
+}; |
+} // namespace |
+ |
util::Status JsonToBinaryStream(TypeResolver* resolver, |
const string& type_url, |
io::ZeroCopyInputStream* json_input, |
@@ -109,7 +145,7 @@ util::Status JsonToBinaryStream(TypeResolver* resolver, |
google::protobuf::Type type; |
RETURN_IF_ERROR(resolver->ResolveMessageType(type_url, &type)); |
internal::ZeroCopyStreamByteSink sink(binary_output); |
- converter::NoopErrorListener listener; |
+ StatusErrorListener listener; |
converter::ProtoStreamObjectWriter proto_writer(resolver, type, &sink, |
&listener); |
@@ -123,7 +159,7 @@ util::Status JsonToBinaryStream(TypeResolver* resolver, |
} |
RETURN_IF_ERROR(parser.FinishParse()); |
- return util::Status::OK; |
+ return listener.GetStatus(); |
} |
util::Status JsonToBinaryString(TypeResolver* resolver, |