blob: 2654bc20a98bfc93d351b35a13ea3f38763cdcd7 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file
#include "src/lib/util/status_builder.h"
#include "src/logging.h"
#include "src/public/lib/status.h"
#include "src/public/lib/status_codes.h"
namespace cobalt::util {
const size_t kMaxErrorMessage = 256;
StatusBuilder::StatusBuilder(const Status& original_status, util::SourceLocation location)
: location_(location) {
SetCode(original_status.error_code());
error_message_ << original_status.error_message();
error_details_ << original_status.error_details();
}
StatusBuilder::StatusBuilder(StatusCode status_code, util::SourceLocation location)
: location_(location) {
SetCode(status_code);
}
StatusBuilder::StatusBuilder(StatusCode status_code, const std::string& initial_message,
util::SourceLocation location)
: location_(location) {
SetCode(status_code);
error_message_ << initial_message;
}
#ifdef HAVE_GLOG
#define LOG_AT_LOC(location, severity) \
::google::LogMessage((location).file_name(), (location).line(), google::GLOG_##severity).stream()
#elif defined(__Fuchsia__)
#define LOG_AT_LOC(location, severity) \
FX_LAZY_STREAM( \
::fuchsia_logging::LogMessage(::fuchsia_logging::LOG_##severity, (location).file_name(), \
(location).line(), nullptr, "core") \
.stream(), \
FX_LOG_IS_ON(severity))
#else
#define LOG_AT_LOC(location, severity) LOG(severity).AtLocation(location)
#endif
Status StatusBuilder::Build() {
if (code_ == StatusCode::OK) {
return Status::OkStatus();
}
std::string message = error_message_.str();
if (message.size() > kMaxErrorMessage) {
message.resize(kMaxErrorMessage);
}
Status result = Status(code_, message, error_details_.str());
switch (log_level_) {
case LogLevel::ERROR:
LOG_AT_LOC(location_, ERROR) << result;
break;
case LogLevel::WARNING:
LOG_AT_LOC(location_, WARNING) << result;
break;
case LogLevel::INFO:
LOG_AT_LOC(location_, INFO) << result;
break;
default:
// No logging
break;
}
return result;
}
#undef LOG_AT_LOC
} // namespace cobalt::util