// // // Copyright 2021 the gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // #ifndef GRPC_SRC_CORE_LIB_GPRPP_STATUS_HELPER_H #define GRPC_SRC_CORE_LIB_GPRPP_STATUS_HELPER_H #include <grpc/support/port_platform.h> #include <stdint.h> #include <string> #include <vector> #include "absl/status/status.h" #include "absl/strings/string_view.h" #include "absl/time/time.h" #include "absl/types/optional.h" #include "src/core/lib/gprpp/debug_location.h" extern "C" { struct google_rpc_Status; struct upb_Arena; } #define GRPC_RETURN_IF_ERROR(expr) … namespace grpc_core { /// This enum should have the same value of grpc_error_ints enum class StatusIntProperty { … }; /// This enum should have the same value of grpc_error_strs enum class StatusStrProperty { … }; /// This enum should have the same value of grpc_error_times enum class StatusTimeProperty { … }; /// Creates a status with given additional information absl::Status StatusCreate( absl::StatusCode code, absl::string_view msg, const DebugLocation& location, std::vector<absl::Status> children) GRPC_MUST_USE_RESULT; /// Sets the int property to the status void StatusSetInt(absl::Status* status, StatusIntProperty key, intptr_t value); /// Gets the int property from the status absl::optional<intptr_t> StatusGetInt( const absl::Status& status, StatusIntProperty key) GRPC_MUST_USE_RESULT; /// Sets the str property to the status void StatusSetStr(absl::Status* status, StatusStrProperty key, absl::string_view value); /// Gets the str property from the status absl::optional<std::string> StatusGetStr( const absl::Status& status, StatusStrProperty key) GRPC_MUST_USE_RESULT; /// Sets the time property to the status void StatusSetTime(absl::Status* status, StatusTimeProperty key, absl::Time time); /// Gets the time property from the status absl::optional<absl::Time> StatusGetTime( const absl::Status& status, StatusTimeProperty key) GRPC_MUST_USE_RESULT; /// Adds a child status to status void StatusAddChild(absl::Status* status, absl::Status child); /// Returns all children status from a status std::vector<absl::Status> StatusGetChildren(absl::Status status) GRPC_MUST_USE_RESULT; /// Returns a string representation from status /// Error status will be like /// STATUS[:MESSAGE] [{PAYLOADS[, children:[CHILDREN-STATUS-LISTS]]}] /// e.g. /// CANCELLATION:SampleMessage {errno:'2021', line:'54', children:[ABORTED]} std::string StatusToString(const absl::Status& status) GRPC_MUST_USE_RESULT; namespace internal { /// Builds a upb message, google_rpc_Status from a status /// This is for internal implementation & test only google_rpc_Status* StatusToProto(const absl::Status& status, upb_Arena* arena) GRPC_MUST_USE_RESULT; /// Builds a status from a upb message, google_rpc_Status /// This is for internal implementation & test only absl::Status StatusFromProto(google_rpc_Status* msg) GRPC_MUST_USE_RESULT; /// Returns ptr that is allocated in the heap memory and the given status is /// copied into. This ptr can be used to get Status later and should be /// freed by StatusFreeHeapPtr. This can be 0 in case of OkStatus. uintptr_t StatusAllocHeapPtr(absl::Status s); /// Frees the allocated status at heap ptr. void StatusFreeHeapPtr(uintptr_t ptr); /// Get the status from a heap ptr. absl::Status StatusGetFromHeapPtr(uintptr_t ptr); /// Move the status from a heap ptr. (GetFrom & FreeHeap) absl::Status StatusMoveFromHeapPtr(uintptr_t ptr); } // namespace internal } // namespace grpc_core #endif // GRPC_SRC_CORE_LIB_GPRPP_STATUS_HELPER_H