1 // 2 // 3 // Copyright 2017 gRPC authors. 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 // 17 // 18 19 #ifndef GRPC_SRC_CORE_LIB_CHANNEL_STATUS_UTIL_H 20 #define GRPC_SRC_CORE_LIB_CHANNEL_STATUS_UTIL_H 21 22 #include <grpc/support/port_platform.h> 23 24 #include <string> 25 26 #include "absl/status/status.h" 27 #include "absl/strings/string_view.h" 28 29 #include <grpc/status.h> 30 31 /// If \a status_str is a valid status string, sets \a status to the 32 /// corresponding status value and returns true. 33 bool grpc_status_code_from_string(const char* status_str, 34 grpc_status_code* status); 35 36 /// Returns the string form of \a status, or "UNKNOWN" if invalid. 37 const char* grpc_status_code_to_string(grpc_status_code status); 38 39 // Converts an int to grpc_status_code. If the int is not a valid status code, 40 // sets the code to GRPC_STATUS_UNKNOWN and returns false. Otherwise, returns 41 // true. 42 bool grpc_status_code_from_int(int status_int, grpc_status_code* status); 43 44 namespace grpc_core { 45 namespace internal { 46 47 /// A set of grpc_status_code values. 48 class StatusCodeSet { 49 public: Empty()50 bool Empty() const { return status_code_mask_ == 0; } 51 Add(grpc_status_code status)52 StatusCodeSet& Add(grpc_status_code status) { 53 status_code_mask_ |= (1 << status); 54 return *this; 55 } 56 Contains(grpc_status_code status)57 bool Contains(grpc_status_code status) const { 58 return status_code_mask_ & (1 << status); 59 } 60 61 bool operator==(const StatusCodeSet& other) const { 62 return status_code_mask_ == other.status_code_mask_; 63 } 64 65 std::string ToString() const; 66 67 private: 68 int status_code_mask_ = 0; // A bitfield of status codes in the set. 69 }; 70 71 } // namespace internal 72 73 // Optionally rewrites a status as per 74 // https://github.com/grpc/proposal/blob/master/A54-restrict-control-plane-status-codes.md. 75 // The source parameter indicates where the status came from. 76 absl::Status MaybeRewriteIllegalStatusCode(absl::Status status, 77 absl::string_view source); 78 79 } // namespace grpc_core 80 81 #endif // GRPC_SRC_CORE_LIB_CHANNEL_STATUS_UTIL_H 82