| #ifndef PRODUCTION_SUSHID_SAFEPOWER_AGENT_PARSE_TEXT_PROTO_H_ |
| #define PRODUCTION_SUSHID_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_SUSHID_SAFEPOWER_AGENT_PARSE_TEXT_PROTO_H_ |