diff options
author | Taku Kudo <taku@google.com> | 2018-04-28 20:50:07 +0300 |
---|---|---|
committer | Taku Kudo <taku@google.com> | 2018-04-28 20:50:07 +0300 |
commit | d16531bfb866e2fca246a36316876b934aa427f7 (patch) | |
tree | 0215e1b3555b02363b17d425b3c94200d92cb6fd /src/error.cc | |
parent | baf5d7a2995018ede996173cdf0febcdf23cba2d (diff) |
Uses util::Status to propagate error messages
Diffstat (limited to 'src/error.cc')
-rw-r--r-- | src/error.cc | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/error.cc b/src/error.cc index a3e57cb..b9787b3 100644 --- a/src/error.cc +++ b/src/error.cc @@ -14,10 +14,119 @@ #include <cstring> #include "common.h" +#include "sentencepiece_processor.h" namespace sentencepiece { namespace error { jmp_buf gTestJmp; bool gTestMode = false; } // namespace error + +namespace util { + +Status::Status() {} +Status::~Status() {} + +struct Status::Rep { + error::Code code; + std::string error_message; +}; + +Status::Status(error::Code code, const char* error_message) : rep_(new Rep) { + rep_->code = code; + rep_->error_message = error_message; +} + +Status::Status(error::Code code, const std::string& error_message) + : rep_(new Rep) { + rep_->code = code; + rep_->error_message = error_message; +} + +Status::Status(const Status& s) + : rep_((s.rep_ == nullptr) ? nullptr : new Rep(*s.rep_)) {} + +void Status::operator=(const Status& s) { + if (rep_ != s.rep_) + rep_.reset((s.rep_ == nullptr) ? nullptr : new Rep(*s.rep_)); +} + +bool Status::operator==(const Status& s) const { return (rep_ == s.rep_); } + +bool Status::operator!=(const Status& s) const { return (rep_ != s.rep_); } + +const char* Status::error_message() const { + return ok() ? "" : rep_->error_message.c_str(); +} + +error::Code Status::code() const { return ok() ? error::OK : rep_->code; } + +std::string Status::ToString() const { + if (rep_ == nullptr) return "OK"; + + std::string result; + switch (code()) { + case error::CANCELLED: + result = "Cancelled"; + break; + case error::UNKNOWN: + result = "Unknown"; + break; + case error::INVALID_ARGUMENT: + result = "Invalid argument"; + break; + case error::DEADLINE_EXCEEDED: + result = "Deadline exceeded"; + break; + case error::NOT_FOUND: + result = "Not found"; + break; + case error::ALREADY_EXISTS: + result = "Already exists"; + break; + case error::PERMISSION_DENIED: + result = "Permission denied"; + break; + case error::UNAUTHENTICATED: + result = "Unauthenticated"; + break; + case error::RESOURCE_EXHAUSTED: + result = "Resource exhausted"; + break; + case error::FAILED_PRECONDITION: + result = "Failed precondition"; + break; + case error::ABORTED: + result = "Aborted"; + break; + case error::OUT_OF_RANGE: + result = "Out of range"; + break; + case error::UNIMPLEMENTED: + result = "Unimplemented"; + break; + case error::INTERNAL: + result = "Internal"; + break; + case error::UNAVAILABLE: + result = "Unavailable"; + break; + case error::DATA_LOSS: + result = "Data loss"; + break; + default: + result = "Unkown code:"; + break; + } + + result += ": "; + result += rep_->error_message; + return result; +} + +void Status::IgnoreError() {} + +Status OkStatus() { return Status(); } + +} // namespace util } // namespace sentencepiece |