blob: 6593b3ffb23f57f77000ac87dbf834ba2e011bc9 [file] [log] [blame]
#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