Explorar el Código

Merge pull request #8354 from Yannic/refactor_status

[C++] Refactor util::Status
Adam Cozzette hace 4 años
padre
commit
9ad97629be

+ 2 - 2
conformance/conformance_cpp.cc

@@ -134,7 +134,7 @@ void DoTest(const ConformanceRequest& request, ConformanceResponse* response) {
                              &proto_binary, options);
                              &proto_binary, options);
       if (!status.ok()) {
       if (!status.ok()) {
         response->set_parse_error(string("Parse error: ") +
         response->set_parse_error(string("Parse error: ") +
-                                  std::string(status.error_message()));
+                                  std::string(status.message()));
         return;
         return;
       }
       }
 
 
@@ -189,7 +189,7 @@ void DoTest(const ConformanceRequest& request, ConformanceResponse* response) {
       if (!status.ok()) {
       if (!status.ok()) {
         response->set_serialize_error(
         response->set_serialize_error(
             string("Failed to serialize JSON output: ") +
             string("Failed to serialize JSON output: ") +
-            std::string(status.error_message()));
+            std::string(status.message()));
         return;
         return;
       }
       }
       break;
       break;

+ 1 - 3
src/google/protobuf/stubs/logging.h

@@ -33,6 +33,7 @@
 
 
 #include <google/protobuf/stubs/macros.h>
 #include <google/protobuf/stubs/macros.h>
 #include <google/protobuf/stubs/port.h>
 #include <google/protobuf/stubs/port.h>
+#include <google/protobuf/stubs/status.h>
 
 
 #include <google/protobuf/port_def.inc>
 #include <google/protobuf/port_def.inc>
 
 
@@ -64,9 +65,6 @@ enum LogLevel {
 };
 };
 
 
 class StringPiece;
 class StringPiece;
-namespace util {
-class Status;
-}
 class uint128;
 class uint128;
 namespace internal {
 namespace internal {
 
 

+ 32 - 28
src/google/protobuf/stubs/status.cc

@@ -37,42 +37,44 @@
 namespace google {
 namespace google {
 namespace protobuf {
 namespace protobuf {
 namespace util {
 namespace util {
-namespace error {
-inline std::string CodeEnumToString(error::Code code) {
+namespace status_internal {
+namespace {
+
+inline std::string StatusCodeToString(StatusCode code) {
   switch (code) {
   switch (code) {
-    case OK:
+    case StatusCode::kOk:
       return "OK";
       return "OK";
-    case CANCELLED:
+    case StatusCode::kCancelled:
       return "CANCELLED";
       return "CANCELLED";
-    case UNKNOWN:
+    case StatusCode::kUnknown:
       return "UNKNOWN";
       return "UNKNOWN";
-    case INVALID_ARGUMENT:
+    case StatusCode::kInvalidArgument:
       return "INVALID_ARGUMENT";
       return "INVALID_ARGUMENT";
-    case DEADLINE_EXCEEDED:
+    case StatusCode::kDeadlineExceeded:
       return "DEADLINE_EXCEEDED";
       return "DEADLINE_EXCEEDED";
-    case NOT_FOUND:
+    case StatusCode::kNotFound:
       return "NOT_FOUND";
       return "NOT_FOUND";
-    case ALREADY_EXISTS:
+    case StatusCode::kAlreadyExists:
       return "ALREADY_EXISTS";
       return "ALREADY_EXISTS";
-    case PERMISSION_DENIED:
+    case StatusCode::kPermissionDenied:
       return "PERMISSION_DENIED";
       return "PERMISSION_DENIED";
-    case UNAUTHENTICATED:
+    case StatusCode::kUnauthenticated:
       return "UNAUTHENTICATED";
       return "UNAUTHENTICATED";
-    case RESOURCE_EXHAUSTED:
+    case StatusCode::kResourceExhausted:
       return "RESOURCE_EXHAUSTED";
       return "RESOURCE_EXHAUSTED";
-    case FAILED_PRECONDITION:
+    case StatusCode::kFailedPrecondition:
       return "FAILED_PRECONDITION";
       return "FAILED_PRECONDITION";
-    case ABORTED:
+    case StatusCode::kAborted:
       return "ABORTED";
       return "ABORTED";
-    case OUT_OF_RANGE:
+    case StatusCode::kOutOfRange:
       return "OUT_OF_RANGE";
       return "OUT_OF_RANGE";
-    case UNIMPLEMENTED:
+    case StatusCode::kUnimplemented:
       return "UNIMPLEMENTED";
       return "UNIMPLEMENTED";
-    case INTERNAL:
+    case StatusCode::kInternal:
       return "INTERNAL";
       return "INTERNAL";
-    case UNAVAILABLE:
+    case StatusCode::kUnavailable:
       return "UNAVAILABLE";
       return "UNAVAILABLE";
-    case DATA_LOSS:
+    case StatusCode::kDataLoss:
       return "DATA_LOSS";
       return "DATA_LOSS";
   }
   }
 
 
@@ -80,18 +82,19 @@ inline std::string CodeEnumToString(error::Code code) {
   // above switch.
   // above switch.
   return "UNKNOWN";
   return "UNKNOWN";
 }
 }
-}  // namespace error.
+
+}  // namespace
 
 
 const Status Status::OK = Status();
 const Status Status::OK = Status();
-const Status Status::CANCELLED = Status(error::CANCELLED, "");
-const Status Status::UNKNOWN = Status(error::UNKNOWN, "");
+const Status Status::CANCELLED = Status(StatusCode::kCancelled, "");
+const Status Status::UNKNOWN = Status(StatusCode::kUnknown, "");
 
 
-Status::Status() : error_code_(error::OK) {
+Status::Status() : error_code_(StatusCode::kOk) {
 }
 }
 
 
-Status::Status(error::Code error_code, StringPiece error_message)
+Status::Status(StatusCode error_code, StringPiece error_message)
     : error_code_(error_code) {
     : error_code_(error_code) {
-  if (error_code != error::OK) {
+  if (error_code != StatusCode::kOk) {
     error_message_ = error_message.ToString();
     error_message_ = error_message.ToString();
   }
   }
 }
 }
@@ -112,13 +115,13 @@ bool Status::operator==(const Status& x) const {
 }
 }
 
 
 std::string Status::ToString() const {
 std::string Status::ToString() const {
-  if (error_code_ == error::OK) {
+  if (error_code_ == StatusCode::kOk) {
     return "OK";
     return "OK";
   } else {
   } else {
     if (error_message_.empty()) {
     if (error_message_.empty()) {
-      return error::CodeEnumToString(error_code_);
+      return StatusCodeToString(error_code_);
     } else {
     } else {
-      return error::CodeEnumToString(error_code_) + ":" +
+      return StatusCodeToString(error_code_) + ":" +
           error_message_;
           error_message_;
     }
     }
   }
   }
@@ -129,6 +132,7 @@ std::ostream& operator<<(std::ostream& os, const Status& x) {
   return os;
   return os;
 }
 }
 
 
+}  // namespace status_internal
 }  // namespace util
 }  // namespace util
 }  // namespace protobuf
 }  // namespace protobuf
 }  // namespace google
 }  // namespace google

+ 42 - 33
src/google/protobuf/stubs/status.h

@@ -27,13 +27,12 @@
 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
 #ifndef GOOGLE_PROTOBUF_STUBS_STATUS_H_
 #ifndef GOOGLE_PROTOBUF_STUBS_STATUS_H_
 #define GOOGLE_PROTOBUF_STUBS_STATUS_H_
 #define GOOGLE_PROTOBUF_STUBS_STATUS_H_
 
 
-#include <iosfwd>
 #include <string>
 #include <string>
 
 
-#include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/stringpiece.h>
 #include <google/protobuf/stubs/stringpiece.h>
 
 
 #include <google/protobuf/port_def.inc>
 #include <google/protobuf/port_def.inc>
@@ -41,28 +40,28 @@
 namespace google {
 namespace google {
 namespace protobuf {
 namespace protobuf {
 namespace util {
 namespace util {
-namespace error {
+namespace status_internal {
+
 // These values must match error codes defined in google/rpc/code.proto.
 // These values must match error codes defined in google/rpc/code.proto.
-enum Code {
-  OK = 0,
-  CANCELLED = 1,
-  UNKNOWN = 2,
-  INVALID_ARGUMENT = 3,
-  DEADLINE_EXCEEDED = 4,
-  NOT_FOUND = 5,
-  ALREADY_EXISTS = 6,
-  PERMISSION_DENIED = 7,
-  UNAUTHENTICATED = 16,
-  RESOURCE_EXHAUSTED = 8,
-  FAILED_PRECONDITION = 9,
-  ABORTED = 10,
-  OUT_OF_RANGE = 11,
-  UNIMPLEMENTED = 12,
-  INTERNAL = 13,
-  UNAVAILABLE = 14,
-  DATA_LOSS = 15,
+enum class StatusCode : int {
+  kOk = 0,
+  kCancelled = 1,
+  kUnknown = 2,
+  kInvalidArgument = 3,
+  kDeadlineExceeded = 4,
+  kNotFound = 5,
+  kAlreadyExists = 6,
+  kPermissionDenied = 7,
+  kUnauthenticated = 16,
+  kResourceExhausted = 8,
+  kFailedPrecondition = 9,
+  kAborted = 10,
+  kOutOfRange = 11,
+  kUnimplemented = 12,
+  kInternal = 13,
+  kUnavailable = 14,
+  kDataLoss = 15,
 };
 };
-}  // namespace error
 
 
 class PROTOBUF_EXPORT Status {
 class PROTOBUF_EXPORT Status {
  public:
  public:
@@ -71,9 +70,9 @@ class PROTOBUF_EXPORT Status {
 
 
   // Create a status in the canonical error space with the specified
   // Create a status in the canonical error space with the specified
   // code, and error message.  If "code == 0", error_message is
   // code, and error message.  If "code == 0", error_message is
-  // ignored and a Status object identical to Status::OK is
+  // ignored and a Status object identical to Status::kOk is
   // constructed.
   // constructed.
-  Status(error::Code error_code, StringPiece error_message);
+  Status(StatusCode error_code, StringPiece error_message);
   Status(const Status&);
   Status(const Status&);
   Status& operator=(const Status& x);
   Status& operator=(const Status& x);
   ~Status() {}
   ~Status() {}
@@ -85,17 +84,11 @@ class PROTOBUF_EXPORT Status {
 
 
   // Accessor
   // Accessor
   bool ok() const {
   bool ok() const {
-    return error_code_ == error::OK;
+    return error_code_ == StatusCode::kOk;
   }
   }
-  int error_code() const {
+  StatusCode code() const {
     return error_code_;
     return error_code_;
   }
   }
-  error::Code code() const {
-    return error_code_;
-  }
-  StringPiece error_message() const {
-    return error_message_;
-  }
   StringPiece message() const {
   StringPiece message() const {
     return error_message_;
     return error_message_;
   }
   }
@@ -109,13 +102,29 @@ class PROTOBUF_EXPORT Status {
   std::string ToString() const;
   std::string ToString() const;
 
 
  private:
  private:
-  error::Code error_code_;
+  StatusCode error_code_;
   std::string error_message_;
   std::string error_message_;
 };
 };
 
 
 // Prints a human-readable representation of 'x' to 'os'.
 // Prints a human-readable representation of 'x' to 'os'.
 PROTOBUF_EXPORT std::ostream& operator<<(std::ostream& os, const Status& x);
 PROTOBUF_EXPORT std::ostream& operator<<(std::ostream& os, const Status& x);
 
 
+}  // namespace status_internal
+
+using ::google::protobuf::util::status_internal::Status;
+using ::google::protobuf::util::status_internal::StatusCode;
+
+namespace error {
+
+// TODO(yannic): Remove these.
+constexpr StatusCode OK = StatusCode::kOk;
+constexpr StatusCode CANCELLED = StatusCode::kCancelled;
+constexpr StatusCode UNKNOWN = StatusCode::kUnknown;
+constexpr StatusCode INVALID_ARGUMENT = StatusCode::kInvalidArgument;
+constexpr StatusCode NOT_FOUND = StatusCode::kNotFound;
+constexpr StatusCode INTERNAL = StatusCode::kInternal;
+
+}  // namespace error
 }  // namespace util
 }  // namespace util
 }  // namespace protobuf
 }  // namespace protobuf
 }  // namespace google
 }  // namespace google

+ 3 - 7
src/google/protobuf/stubs/status_test.cc

@@ -39,17 +39,13 @@ namespace protobuf {
 namespace {
 namespace {
 TEST(Status, Empty) {
 TEST(Status, Empty) {
   util::Status status;
   util::Status status;
-  EXPECT_EQ(util::error::OK, util::Status::OK.error_code());
   EXPECT_EQ(util::error::OK, util::Status::OK.code());
   EXPECT_EQ(util::error::OK, util::Status::OK.code());
   EXPECT_EQ("OK", util::Status::OK.ToString());
   EXPECT_EQ("OK", util::Status::OK.ToString());
 }
 }
 
 
 TEST(Status, GenericCodes) {
 TEST(Status, GenericCodes) {
-  EXPECT_EQ(util::error::OK, util::Status::OK.error_code());
   EXPECT_EQ(util::error::OK, util::Status::OK.code());
   EXPECT_EQ(util::error::OK, util::Status::OK.code());
-  EXPECT_EQ(util::error::CANCELLED, util::Status::CANCELLED.error_code());
   EXPECT_EQ(util::error::CANCELLED, util::Status::CANCELLED.code());
   EXPECT_EQ(util::error::CANCELLED, util::Status::CANCELLED.code());
-  EXPECT_EQ(util::error::UNKNOWN, util::Status::UNKNOWN.error_code());
   EXPECT_EQ(util::error::UNKNOWN, util::Status::UNKNOWN.code());
   EXPECT_EQ(util::error::UNKNOWN, util::Status::UNKNOWN.code());
 }
 }
 
 
@@ -69,17 +65,17 @@ TEST(Status, CheckOK) {
 TEST(Status, ErrorMessage) {
 TEST(Status, ErrorMessage) {
   util::Status status(util::error::INVALID_ARGUMENT, "");
   util::Status status(util::error::INVALID_ARGUMENT, "");
   EXPECT_FALSE(status.ok());
   EXPECT_FALSE(status.ok());
-  EXPECT_EQ("", status.error_message().ToString());
+  EXPECT_EQ("", status.message().ToString());
   EXPECT_EQ("", status.message().ToString());
   EXPECT_EQ("", status.message().ToString());
   EXPECT_EQ("INVALID_ARGUMENT", status.ToString());
   EXPECT_EQ("INVALID_ARGUMENT", status.ToString());
   status = util::Status(util::error::INVALID_ARGUMENT, "msg");
   status = util::Status(util::error::INVALID_ARGUMENT, "msg");
   EXPECT_FALSE(status.ok());
   EXPECT_FALSE(status.ok());
-  EXPECT_EQ("msg", status.error_message().ToString());
+  EXPECT_EQ("msg", status.message().ToString());
   EXPECT_EQ("msg", status.message().ToString());
   EXPECT_EQ("msg", status.message().ToString());
   EXPECT_EQ("INVALID_ARGUMENT:msg", status.ToString());
   EXPECT_EQ("INVALID_ARGUMENT:msg", status.ToString());
   status = util::Status(util::error::OK, "msg");
   status = util::Status(util::error::OK, "msg");
   EXPECT_TRUE(status.ok());
   EXPECT_TRUE(status.ok());
-  EXPECT_EQ("", status.error_message().ToString());
+  EXPECT_EQ("", status.message().ToString());
   EXPECT_EQ("", status.message().ToString());
   EXPECT_EQ("", status.message().ToString());
   EXPECT_EQ("OK", status.ToString());
   EXPECT_EQ("OK", status.ToString());
 }
 }

+ 7 - 6
src/google/protobuf/stubs/statusor.h

@@ -32,7 +32,7 @@
 // object. StatusOr models the concept of an object that is either a
 // object. StatusOr models the concept of an object that is either a
 // usable value, or an error Status explaining why such a value is
 // usable value, or an error Status explaining why such a value is
 // not present. To this end, StatusOr<T> does not allow its Status
 // not present. To this end, StatusOr<T> does not allow its Status
-// value to be Status::OK. Further, StatusOr<T*> does not allow the
+// value to be Status::kOk. Further, StatusOr<T*> does not allow the
 // contained pointer to be nullptr.
 // contained pointer to be nullptr.
 //
 //
 // The primary use-case for StatusOr<T> is as the return value of a
 // The primary use-case for StatusOr<T> is as the return value of a
@@ -110,8 +110,8 @@ class StatusOr {
   // value, so it is convenient and sensible to be able to do 'return
   // value, so it is convenient and sensible to be able to do 'return
   // Status()' when the return type is StatusOr<T>.
   // Status()' when the return type is StatusOr<T>.
   //
   //
-  // REQUIRES: status != Status::OK. This requirement is DCHECKed.
-  // In optimized builds, passing Status::OK here will have the effect
+  // REQUIRES: status != Status::kOk. This requirement is DCHECKed.
+  // In optimized builds, passing Status::kOk here will have the effect
   // of passing PosixErrorSpace::EINVAL as a fallback.
   // of passing PosixErrorSpace::EINVAL as a fallback.
   StatusOr(const Status& status);  // NOLINT
   StatusOr(const Status& status);  // NOLINT
 
 
@@ -143,7 +143,7 @@ class StatusOr {
   StatusOr& operator=(const StatusOr<U>& other);
   StatusOr& operator=(const StatusOr<U>& other);
 
 
   // Returns a reference to our status. If this contains a T, then
   // Returns a reference to our status. If this contains a T, then
-  // returns Status::OK.
+  // returns Status::kOk.
   const Status& status() const;
   const Status& status() const;
 
 
   // Returns this->status().ok()
   // Returns this->status().ok()
@@ -196,7 +196,8 @@ inline StatusOr<T>::StatusOr()
 template<typename T>
 template<typename T>
 inline StatusOr<T>::StatusOr(const Status& status) {
 inline StatusOr<T>::StatusOr(const Status& status) {
   if (status.ok()) {
   if (status.ok()) {
-    status_ = Status(error::INTERNAL, "Status::OK is not a valid argument.");
+    status_ =
+        Status(StatusCode::kInternal, "Status::kOk is not a valid argument.");
   } else {
   } else {
     status_ = status;
     status_ = status;
   }
   }
@@ -205,7 +206,7 @@ inline StatusOr<T>::StatusOr(const Status& status) {
 template<typename T>
 template<typename T>
 inline StatusOr<T>::StatusOr(const T& value) {
 inline StatusOr<T>::StatusOr(const T& value) {
   if (internal::StatusOrHelper::Specialize<T>::IsValueNull(value)) {
   if (internal::StatusOrHelper::Specialize<T>::IsValueNull(value)) {
-    status_ = Status(error::INTERNAL, "nullptr is not a valid argument.");
+    status_ = Status(StatusCode::kInternal, "nullptr is not a valid argument.");
   } else {
   } else {
     status_ = Status::OK;
     status_ = Status::OK;
     value_ = value;
     value_ = value;

+ 0 - 1
src/google/protobuf/util/internal/datapiece.cc

@@ -48,7 +48,6 @@ namespace util {
 namespace converter {
 namespace converter {
 
 
 using util::Status;
 using util::Status;
-using util::error::Code;
 
 
 namespace {
 namespace {
 
 

+ 2 - 2
src/google/protobuf/util/internal/json_stream_parser_test.cc

@@ -139,7 +139,7 @@ class JsonStreamParserTest : public ::testing::Test {
       }) {
       }) {
     util::Status result = RunTest(json, split, setup);
     util::Status result = RunTest(json, split, setup);
     EXPECT_EQ(util::error::INVALID_ARGUMENT, result.code());
     EXPECT_EQ(util::error::INVALID_ARGUMENT, result.code());
-    StringPiece error_message(result.error_message());
+    StringPiece error_message(result.message());
     EXPECT_EQ(error_prefix, error_message.substr(0, error_prefix.size()));
     EXPECT_EQ(error_prefix, error_message.substr(0, error_prefix.size()));
   }
   }
 
 
@@ -150,7 +150,7 @@ class JsonStreamParserTest : public ::testing::Test {
       }) {
       }) {
     util::Status result = RunTest(json, split, setup);
     util::Status result = RunTest(json, split, setup);
     EXPECT_EQ(util::error::INVALID_ARGUMENT, result.code());
     EXPECT_EQ(util::error::INVALID_ARGUMENT, result.code());
-    StringPiece error_message(result.error_message());
+    StringPiece error_message(result.message());
     EXPECT_EQ(error_prefix, error_message.substr(0, error_prefix.size()));
     EXPECT_EQ(error_prefix, error_message.substr(0, error_prefix.size()));
   }
   }
 
 

+ 1 - 4
src/google/protobuf/util/internal/protostream_objectsource.cc

@@ -60,11 +60,8 @@
 namespace google {
 namespace google {
 namespace protobuf {
 namespace protobuf {
 namespace util {
 namespace util {
-namespace error {
-using util::error::Code;
-using util::error::INTERNAL;
-}  // namespace error
 namespace converter {
 namespace converter {
+
 using ::PROTOBUF_NAMESPACE_ID::internal::WireFormat;
 using ::PROTOBUF_NAMESPACE_ID::internal::WireFormat;
 using ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite;
 using ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite;