diff options
Diffstat (limited to 'grpc/include/grpcpp/support/error_details.h')
-rw-r--r-- | grpc/include/grpcpp/support/error_details.h | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/grpc/include/grpcpp/support/error_details.h b/grpc/include/grpcpp/support/error_details.h index 15b917f6..72305e8f 100644 --- a/grpc/include/grpcpp/support/error_details.h +++ b/grpc/include/grpcpp/support/error_details.h @@ -21,12 +21,6 @@ #include <grpcpp/support/status.h> -namespace google { -namespace rpc { -class Status; -} // namespace rpc -} // namespace google - namespace grpc { /// Map a \a grpc::Status to a \a google::rpc::Status. @@ -34,14 +28,48 @@ namespace grpc { /// On success, returns status with OK. /// Returns status with \a INVALID_ARGUMENT, if failed to deserialize. /// Returns status with \a FAILED_PRECONDITION, if \a to is nullptr. -grpc::Status ExtractErrorDetails(const grpc::Status& from, - ::google::rpc::Status* to); +/// +/// \note +/// This function is a template to avoid a build dep on \a status.proto. +/// However, this function still requires that \tparam T is of type +/// \a google::rpc::Status, which is defined at +/// https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto +template <typename T> +grpc::Status ExtractErrorDetails(const grpc::Status& from, T* to) { + if (to == nullptr) { + return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, ""); + } + if (!to->ParseFromString(from.error_details())) { + return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, ""); + } + return grpc::Status::OK; +} +inline grpc::Status ExtractErrorDetails(const grpc::Status&, std::nullptr_t) { + return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, ""); +} /// Map \a google::rpc::Status to a \a grpc::Status. /// Returns OK on success. /// Returns status with \a FAILED_PRECONDITION if \a to is nullptr. -grpc::Status SetErrorDetails(const ::google::rpc::Status& from, - grpc::Status* to); +/// +/// \note +/// This function is a template to avoid a build dep on \a status.proto. +/// However, this function still requires that \tparam T is of type +/// \a google::rpc::Status, which is defined at +/// https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto +template <typename T> +grpc::Status SetErrorDetails(const T& from, grpc::Status* to) { + if (to == nullptr) { + return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, ""); + } + grpc::StatusCode code = grpc::StatusCode::UNKNOWN; + if (from.code() >= grpc::StatusCode::OK && + from.code() <= grpc::StatusCode::UNAUTHENTICATED) { + code = static_cast<grpc::StatusCode>(from.code()); + } + *to = grpc::Status(code, from.message(), from.SerializeAsString()); + return grpc::Status::OK; +} } // namespace grpc |