error_details.h 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. #ifndef GRPCPP_SUPPORT_ERROR_DETAILS_H
  19. #define GRPCPP_SUPPORT_ERROR_DETAILS_H
  20. #include <grpcpp/support/status.h>
  21. namespace grpc {
  22. /// Map a \a grpc::Status to a \a google::rpc::Status.
  23. /// The given \a to object will be cleared.
  24. /// On success, returns status with OK.
  25. /// Returns status with \a INVALID_ARGUMENT, if failed to deserialize.
  26. /// Returns status with \a FAILED_PRECONDITION, if \a to is nullptr.
  27. ///
  28. /// \note
  29. /// This function is a template to avoid a build dep on \a status.proto.
  30. /// However, this function still requires that \tparam T is of type
  31. /// \a google::rpc::Status, which is defined at
  32. /// https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto
  33. template <typename T>
  34. grpc::Status ExtractErrorDetails(const grpc::Status& from, T* to) {
  35. if (to == nullptr) {
  36. return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "");
  37. }
  38. if (!to->ParseFromString(from.error_details())) {
  39. return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, "");
  40. }
  41. return grpc::Status::OK;
  42. }
  43. inline grpc::Status ExtractErrorDetails(const grpc::Status&, std::nullptr_t) {
  44. return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "");
  45. }
  46. /// Map \a google::rpc::Status to a \a grpc::Status.
  47. /// Returns OK on success.
  48. /// Returns status with \a FAILED_PRECONDITION if \a to is nullptr.
  49. ///
  50. /// \note
  51. /// This function is a template to avoid a build dep on \a status.proto.
  52. /// However, this function still requires that \tparam T is of type
  53. /// \a google::rpc::Status, which is defined at
  54. /// https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto
  55. template <typename T>
  56. grpc::Status SetErrorDetails(const T& from, grpc::Status* to) {
  57. if (to == nullptr) {
  58. return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "");
  59. }
  60. grpc::StatusCode code = grpc::StatusCode::UNKNOWN;
  61. if (from.code() >= grpc::StatusCode::OK &&
  62. from.code() <= grpc::StatusCode::UNAUTHENTICATED) {
  63. code = static_cast<grpc::StatusCode>(from.code());
  64. }
  65. *to = grpc::Status(code, from.message(), from.SerializeAsString());
  66. return grpc::Status::OK;
  67. }
  68. } // namespace grpc
  69. #endif // GRPCPP_SUPPORT_ERROR_DETAILS_H