|  | #ifndef PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_PARSE_TEXT_PROTO_H_ | 
|  | #define PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_PARSE_TEXT_PROTO_H_ | 
|  |  | 
|  | #include <string> | 
|  | #include <utility> | 
|  |  | 
|  | #include "absl/log/log.h" | 
|  | #include "absl/status/status.h" | 
|  | #include "absl/status/statusor.h" | 
|  | #include "absl/strings/string_view.h" | 
|  | #include "google/protobuf/io/tokenizer.h" | 
|  | #include "google/protobuf/text_format.h" | 
|  |  | 
|  | namespace safepower_agent { | 
|  | namespace internal { | 
|  | class ErrorCollector : public google::protobuf::io::ErrorCollector { | 
|  | public: | 
|  | explicit ErrorCollector(absl::string_view text_proto) | 
|  | : text_proto_(text_proto) {} | 
|  | ErrorCollector(const ErrorCollector&) = delete; | 
|  | ErrorCollector& operator=(const ErrorCollector&) = delete; | 
|  |  | 
|  | void RecordError(int line, google::protobuf::io::ColumnNumber column, | 
|  | absl::string_view message) override; | 
|  | void RecordWarning(int line, google::protobuf::io::ColumnNumber column, | 
|  | absl::string_view message) override; | 
|  | std::string message() && { return std::move(message_); } | 
|  |  | 
|  | private: | 
|  | absl::string_view text_proto_; | 
|  | std::string message_; | 
|  | }; | 
|  | }  // namespace internal | 
|  |  | 
|  | template <typename Proto> | 
|  | absl::StatusOr<Proto> ParseTextProto(absl::string_view text_proto) { | 
|  | google::protobuf::TextFormat::Parser parser; | 
|  | internal::ErrorCollector error_collector(text_proto); | 
|  | parser.RecordErrorsTo(&error_collector); | 
|  | Proto proto; | 
|  | if (!parser.ParseFromString(text_proto, &proto)) { | 
|  | return absl::InvalidArgumentError(std::move(error_collector).message()); | 
|  | } | 
|  | return proto; | 
|  | } | 
|  | }  // namespace safepower_agent | 
|  |  | 
|  | #endif  // PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_PARSE_TEXT_PROTO_H_ |