10 #include "base/macros.h" 11 #include "util/status.pb.h" 17 constexpr
Status() noexcept {}
21 : error_detail_(status.error_detail_ ?
new ErrorDetail(*status.error_detail_) :
nullptr) {}
24 Status(
Status&& st) noexcept : error_detail_(std::move(st.error_detail_)) {}
27 Status(StatusCode::Code code) : error_detail_(
new ErrorDetail(code)) {}
30 Status(StatusCode::Code code, std::string error_msg)
31 : error_detail_(
new ErrorDetail(code, std::move(error_msg))) {}
34 Status(std::string error_msg)
35 : error_detail_(
new ErrorDetail(StatusCode::INTERNAL_ERROR, std::move(error_msg))) {}
39 if (LIKELY(!status.error_detail_)) {
40 error_detail_.reset();
42 error_detail_.reset(
new ErrorDetail{*status.error_detail_});
48 std::swap(error_detail_, status.error_detail_);
52 bool ok()
const {
return !error_detail_; }
54 bool IsCancelled()
const {
55 return error_detail_ && error_detail_->error_code == StatusCode::CANCELLED;
61 void AddError(
const Status& status);
62 void AddErrorMsg(StatusCode::Code code,
const std::string& msg);
63 void AddErrorMsg(
const std::string& msg);
64 void GetErrorMsgs(std::vector<std::string>* msgs)
const;
65 void GetErrorMsg(std::string* msg)
const;
67 std::string ToString()
const {
73 StatusCode::Code code()
const {
74 return error_detail_ == NULL ? StatusCode::OK : error_detail_->error_code;
78 static const Status CANCELLED;
80 friend std::ostream& operator<<(std::ostream& o,
const Status& status);
83 static Status ByCode(StatusCode::Code code) {
return Status(code); }
86 StatusCode::Code error_code;
87 std::vector<std::string> error_msgs;
89 ErrorDetail(StatusCode::Code code) : error_code(code) {}
90 ErrorDetail(StatusCode::Code code, std::string msg) : error_code(code) {
91 error_msgs.push_back(std::move(msg));
95 std::unique_ptr<ErrorDetail> error_detail_;
105 bool ok()
const {
return status.ok(); }
120 std::string ToString()
const {
return status.ToString(); }
124 status = std::move(o.status);
125 obj = std::move(o.obj);
132 bool StatusFailPrintImpl(
const Status& st);
134 void PrintFatal(
const char* file,
unsigned line_num,
const Status& st);
136 template<
typename T> T CheckedGet(
const char* file,
unsigned line_num, StatusObject<T>&& st_obj) {
138 PrintFatal(file, line_num, st_obj.status);
140 return std::move(st_obj.obj);
146 #define RETURN_IF_ERROR(stmt) \ 148 auto __status__ = (stmt); \ 149 if (UNLIKELY(!__status__.ok())) \ 154 #define GET_UNLESS_ERROR(var, stmt) \ 155 decltype((stmt).obj) var; \ 157 auto __res__ = (stmt); \ 158 if (UNLIKELY(!__res__.ok())) \ 159 return __res__.status; \ 160 var = std::move(__res__.obj); \ 165 #define CHECK_STATUS(stmt) \ 166 LOG_IF(FATAL, UNLIKELY(::util::detail::StatusFailPrintImpl(stmt))) << \ 167 "status check failed on <" #stmt ">" 169 #define CHECKED_GET(stmt) ::util::detail::CheckedGet(__FILE__, __LINE__, stmt)