| #include "bmc/proto_reader.h" |
| |
| #include <cerrno> |
| #include <cstring> |
| #include <filesystem> // NOLINT(build/c++17) |
| #include <fstream> |
| #include <ios> |
| #include <iterator> |
| #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) { |
| std::ifstream f(file_name.c_str(), std::ios_base::in | std::ios::binary); |
| if (!f.is_open()) { |
| char* st_err = strerror(errno); |
| LOG(ERROR) << "read: Failed to open file " << file_name << " " << st_err; |
| return absl::InvalidArgumentError("read: Failed to open file"); |
| } |
| std::string content{std::istreambuf_iterator<char>(f), |
| std::istreambuf_iterator<char>()}; |
| if (!f) { |
| char* st_err = strerror(errno); |
| LOG(ERROR) << "read: Failed to read file " << file_name << " " << st_err; |
| return absl::UnavailableError("read: Failed to read file"); |
| } |
| f.close(); |
| if (!f) { |
| char* st_err = strerror(errno); |
| LOG(ERROR) << "read: Failed to close file " << file_name << " " << st_err; |
| return absl::UnavailableError("read: Failed to close file"); |
| } |
| return content; |
| } |
| |
| absl::Status WriteFileToString(const std::filesystem::path& file_name, |
| absl::string_view content) { |
| std::ofstream f(file_name.c_str(), std::ios_base::out | std::ios::binary); |
| if (!f.is_open()) { |
| char* st_err = strerror(errno); |
| LOG(ERROR) << "write: Failed to open file " << file_name << " " << st_err; |
| return absl::InvalidArgumentError("write: Failed to open file"); |
| } |
| f.write(content.data(), content.size()); |
| if (!f) { |
| char* st_err = strerror(errno); |
| LOG(ERROR) << "write: Failed to write file " << file_name << " " << st_err; |
| return absl::UnavailableError("write: Failed to write file"); |
| } |
| f.close(); |
| if (!f) { |
| char* st_err = strerror(errno); |
| LOG(ERROR) << "write: Failed to close file " << file_name << " " << st_err; |
| return absl::UnavailableError("write: Failed to close file"); |
| } |
| return absl::OkStatus(); |
| } |
| |
| } // namespace proto_reader |