blob: ff9fc34aba371b61c3d15c2115751e495dbc47c9 [file] [log] [blame]
#ifndef PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_PROTO_READER_H_
#define PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_PROTO_READER_H_
#include <filesystem> // NOLINT(build/c++17)
#include <string>
#include "absl/log/log.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
namespace proto_reader {
absl::StatusOr<std::string> ReadFileToString(
const std::filesystem::path& file_name);
absl::Status WriteFileToString(const std::filesystem::path& file_name,
absl::string_view content);
template <typename T>
inline absl::StatusOr<T> ReadProto(const std::filesystem::path& proto_path) {
if (!std::filesystem::exists(proto_path) ||
!std::filesystem::is_regular_file(proto_path)) {
LOG(ERROR) << "proto file " << proto_path << " not found";
return absl::NotFoundError("proto file error");
}
absl::StatusOr<std::string> serialized_proto = ReadFileToString(proto_path);
if (!serialized_proto.ok()) {
return serialized_proto.status();
}
if (T proto; proto.ParseFromString(*serialized_proto)) {
return proto;
} else {
LOG(ERROR) << "Failed to deserialize the proto file" << proto_path;
return absl::InvalidArgumentError("Failed to deserialize the proto file");
}
}
template <typename T>
inline absl::Status WriteProto(const std::filesystem::path& proto_path,
T in_proto) {
std::string str_proto;
if (!in_proto.SerializeToString(&str_proto)) {
LOG(ERROR) << "Failed to serialize message.";
return absl::InvalidArgumentError("Failed to serialize the proto file");
}
return WriteFileToString(proto_path, str_proto);
}
} // namespace proto_reader
#endif // PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_PROTO_READER_H_