1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // https://developers.google.com/protocol-buffers/ 4 // 5 // Redistribution and use in source and binary forms, with or without 6 // modification, are permitted provided that the following conditions are 7 // met: 8 // 9 // * Redistributions of source code must retain the above copyright 10 // notice, this list of conditions and the following disclaimer. 11 // * Redistributions in binary form must reproduce the above 12 // copyright notice, this list of conditions and the following disclaimer 13 // in the documentation and/or other materials provided with the 14 // distribution. 15 // * Neither the name of Google Inc. nor the names of its 16 // contributors may be used to endorse or promote products derived from 17 // this software without specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 #include <google/protobuf/stubs/status.h> 31 32 #include <ostream> 33 #include <stdio.h> 34 #include <string> 35 #include <utility> 36 37 namespace google { 38 namespace protobuf { 39 namespace util { 40 namespace error { 41 inline string CodeEnumToString(error::Code code) { 42 switch (code) { 43 case OK: 44 return "OK"; 45 case CANCELLED: 46 return "CANCELLED"; 47 case UNKNOWN: 48 return "UNKNOWN"; 49 case INVALID_ARGUMENT: 50 return "INVALID_ARGUMENT"; 51 case DEADLINE_EXCEEDED: 52 return "DEADLINE_EXCEEDED"; 53 case NOT_FOUND: 54 return "NOT_FOUND"; 55 case ALREADY_EXISTS: 56 return "ALREADY_EXISTS"; 57 case PERMISSION_DENIED: 58 return "PERMISSION_DENIED"; 59 case UNAUTHENTICATED: 60 return "UNAUTHENTICATED"; 61 case RESOURCE_EXHAUSTED: 62 return "RESOURCE_EXHAUSTED"; 63 case FAILED_PRECONDITION: 64 return "FAILED_PRECONDITION"; 65 case ABORTED: 66 return "ABORTED"; 67 case OUT_OF_RANGE: 68 return "OUT_OF_RANGE"; 69 case UNIMPLEMENTED: 70 return "UNIMPLEMENTED"; 71 case INTERNAL: 72 return "INTERNAL"; 73 case UNAVAILABLE: 74 return "UNAVAILABLE"; 75 case DATA_LOSS: 76 return "DATA_LOSS"; 77 } 78 79 // No default clause, clang will abort if a code is missing from 80 // above switch. 81 return "UNKNOWN"; 82 } 83 } // namespace error. 84 85 const Status Status::OK = Status(); 86 const Status Status::CANCELLED = Status(error::CANCELLED, ""); 87 const Status Status::UNKNOWN = Status(error::UNKNOWN, ""); 88 89 Status::Status() : error_code_(error::OK) { 90 } 91 92 Status::Status(error::Code error_code, StringPiece error_message) 93 : error_code_(error_code) { 94 if (error_code != error::OK) { 95 error_message_ = error_message.ToString(); 96 } 97 } 98 99 Status::Status(const Status& other) 100 : error_code_(other.error_code_), error_message_(other.error_message_) { 101 } 102 103 Status& Status::operator=(const Status& other) { 104 error_code_ = other.error_code_; 105 error_message_ = other.error_message_; 106 return *this; 107 } 108 109 bool Status::operator==(const Status& x) const { 110 return error_code_ == x.error_code_ && 111 error_message_ == x.error_message_; 112 } 113 114 string Status::ToString() const { 115 if (error_code_ == error::OK) { 116 return "OK"; 117 } else { 118 if (error_message_.empty()) { 119 return error::CodeEnumToString(error_code_); 120 } else { 121 return error::CodeEnumToString(error_code_) + ":" + 122 error_message_; 123 } 124 } 125 } 126 127 ostream& operator<<(ostream& os, const Status& x) { 128 os << x.ToString(); 129 return os; 130 } 131 132 } // namespace util 133 } // namespace protobuf 134 } // namespace google 135