xref: /aosp_15_r20/external/grpc-grpc/include/grpcpp/impl/status.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker //
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPCPP_IMPL_STATUS_H
20*cc02d7e2SAndroid Build Coastguard Worker #define GRPCPP_IMPL_STATUS_H
21*cc02d7e2SAndroid Build Coastguard Worker 
22*cc02d7e2SAndroid Build Coastguard Worker // IWYU pragma: private, include <grpcpp/support/status.h>
23*cc02d7e2SAndroid Build Coastguard Worker 
24*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/status.h>
25*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h>
26*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/config.h>
27*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/status_code_enum.h>
28*cc02d7e2SAndroid Build Coastguard Worker 
29*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
30*cc02d7e2SAndroid Build Coastguard Worker 
31*cc02d7e2SAndroid Build Coastguard Worker /// Did it work? If it didn't, why?
32*cc02d7e2SAndroid Build Coastguard Worker ///
33*cc02d7e2SAndroid Build Coastguard Worker /// See \a grpc::StatusCode for details on the available code and their meaning.
34*cc02d7e2SAndroid Build Coastguard Worker class GRPC_MUST_USE_RESULT_WHEN_USE_STRICT_WARNING GRPCXX_DLL Status {
35*cc02d7e2SAndroid Build Coastguard Worker  public:
36*cc02d7e2SAndroid Build Coastguard Worker   /// Construct an OK instance.
Status()37*cc02d7e2SAndroid Build Coastguard Worker   Status() : code_(StatusCode::OK) {
38*cc02d7e2SAndroid Build Coastguard Worker     // Static assertions to make sure that the C++ API value correctly
39*cc02d7e2SAndroid Build Coastguard Worker     // maps to the core surface API value
40*cc02d7e2SAndroid Build Coastguard Worker     static_assert(StatusCode::OK == static_cast<StatusCode>(GRPC_STATUS_OK),
41*cc02d7e2SAndroid Build Coastguard Worker                   "Mismatched status code");
42*cc02d7e2SAndroid Build Coastguard Worker     static_assert(
43*cc02d7e2SAndroid Build Coastguard Worker         StatusCode::CANCELLED == static_cast<StatusCode>(GRPC_STATUS_CANCELLED),
44*cc02d7e2SAndroid Build Coastguard Worker         "Mismatched status code");
45*cc02d7e2SAndroid Build Coastguard Worker     static_assert(
46*cc02d7e2SAndroid Build Coastguard Worker         StatusCode::UNKNOWN == static_cast<StatusCode>(GRPC_STATUS_UNKNOWN),
47*cc02d7e2SAndroid Build Coastguard Worker         "Mismatched status code");
48*cc02d7e2SAndroid Build Coastguard Worker     static_assert(StatusCode::INVALID_ARGUMENT ==
49*cc02d7e2SAndroid Build Coastguard Worker                       static_cast<StatusCode>(GRPC_STATUS_INVALID_ARGUMENT),
50*cc02d7e2SAndroid Build Coastguard Worker                   "Mismatched status code");
51*cc02d7e2SAndroid Build Coastguard Worker     static_assert(StatusCode::DEADLINE_EXCEEDED ==
52*cc02d7e2SAndroid Build Coastguard Worker                       static_cast<StatusCode>(GRPC_STATUS_DEADLINE_EXCEEDED),
53*cc02d7e2SAndroid Build Coastguard Worker                   "Mismatched status code");
54*cc02d7e2SAndroid Build Coastguard Worker     static_assert(
55*cc02d7e2SAndroid Build Coastguard Worker         StatusCode::NOT_FOUND == static_cast<StatusCode>(GRPC_STATUS_NOT_FOUND),
56*cc02d7e2SAndroid Build Coastguard Worker         "Mismatched status code");
57*cc02d7e2SAndroid Build Coastguard Worker     static_assert(StatusCode::ALREADY_EXISTS ==
58*cc02d7e2SAndroid Build Coastguard Worker                       static_cast<StatusCode>(GRPC_STATUS_ALREADY_EXISTS),
59*cc02d7e2SAndroid Build Coastguard Worker                   "Mismatched status code");
60*cc02d7e2SAndroid Build Coastguard Worker     static_assert(StatusCode::PERMISSION_DENIED ==
61*cc02d7e2SAndroid Build Coastguard Worker                       static_cast<StatusCode>(GRPC_STATUS_PERMISSION_DENIED),
62*cc02d7e2SAndroid Build Coastguard Worker                   "Mismatched status code");
63*cc02d7e2SAndroid Build Coastguard Worker     static_assert(StatusCode::UNAUTHENTICATED ==
64*cc02d7e2SAndroid Build Coastguard Worker                       static_cast<StatusCode>(GRPC_STATUS_UNAUTHENTICATED),
65*cc02d7e2SAndroid Build Coastguard Worker                   "Mismatched status code");
66*cc02d7e2SAndroid Build Coastguard Worker     static_assert(StatusCode::RESOURCE_EXHAUSTED ==
67*cc02d7e2SAndroid Build Coastguard Worker                       static_cast<StatusCode>(GRPC_STATUS_RESOURCE_EXHAUSTED),
68*cc02d7e2SAndroid Build Coastguard Worker                   "Mismatched status code");
69*cc02d7e2SAndroid Build Coastguard Worker     static_assert(StatusCode::FAILED_PRECONDITION ==
70*cc02d7e2SAndroid Build Coastguard Worker                       static_cast<StatusCode>(GRPC_STATUS_FAILED_PRECONDITION),
71*cc02d7e2SAndroid Build Coastguard Worker                   "Mismatched status code");
72*cc02d7e2SAndroid Build Coastguard Worker     static_assert(
73*cc02d7e2SAndroid Build Coastguard Worker         StatusCode::ABORTED == static_cast<StatusCode>(GRPC_STATUS_ABORTED),
74*cc02d7e2SAndroid Build Coastguard Worker         "Mismatched status code");
75*cc02d7e2SAndroid Build Coastguard Worker     static_assert(StatusCode::OUT_OF_RANGE ==
76*cc02d7e2SAndroid Build Coastguard Worker                       static_cast<StatusCode>(GRPC_STATUS_OUT_OF_RANGE),
77*cc02d7e2SAndroid Build Coastguard Worker                   "Mismatched status code");
78*cc02d7e2SAndroid Build Coastguard Worker     static_assert(StatusCode::UNIMPLEMENTED ==
79*cc02d7e2SAndroid Build Coastguard Worker                       static_cast<StatusCode>(GRPC_STATUS_UNIMPLEMENTED),
80*cc02d7e2SAndroid Build Coastguard Worker                   "Mismatched status code");
81*cc02d7e2SAndroid Build Coastguard Worker     static_assert(
82*cc02d7e2SAndroid Build Coastguard Worker         StatusCode::INTERNAL == static_cast<StatusCode>(GRPC_STATUS_INTERNAL),
83*cc02d7e2SAndroid Build Coastguard Worker         "Mismatched status code");
84*cc02d7e2SAndroid Build Coastguard Worker     static_assert(StatusCode::UNAVAILABLE ==
85*cc02d7e2SAndroid Build Coastguard Worker                       static_cast<StatusCode>(GRPC_STATUS_UNAVAILABLE),
86*cc02d7e2SAndroid Build Coastguard Worker                   "Mismatched status code");
87*cc02d7e2SAndroid Build Coastguard Worker     static_assert(
88*cc02d7e2SAndroid Build Coastguard Worker         StatusCode::DATA_LOSS == static_cast<StatusCode>(GRPC_STATUS_DATA_LOSS),
89*cc02d7e2SAndroid Build Coastguard Worker         "Mismatched status code");
90*cc02d7e2SAndroid Build Coastguard Worker   }
91*cc02d7e2SAndroid Build Coastguard Worker 
92*cc02d7e2SAndroid Build Coastguard Worker   /// Construct an instance with associated \a code and \a error_message.
93*cc02d7e2SAndroid Build Coastguard Worker   /// It is an error to construct an OK status with non-empty \a error_message.
94*cc02d7e2SAndroid Build Coastguard Worker   /// Note that \a message is intentionally accepted as a const reference
95*cc02d7e2SAndroid Build Coastguard Worker   /// instead of a value (which results in a copy instead of a move) to allow
96*cc02d7e2SAndroid Build Coastguard Worker   /// for easy transition to absl::Status in the future which accepts an
97*cc02d7e2SAndroid Build Coastguard Worker   /// absl::string_view as a parameter.
Status(StatusCode code,const std::string & error_message)98*cc02d7e2SAndroid Build Coastguard Worker   Status(StatusCode code, const std::string& error_message)
99*cc02d7e2SAndroid Build Coastguard Worker       : code_(code), error_message_(error_message) {}
100*cc02d7e2SAndroid Build Coastguard Worker 
101*cc02d7e2SAndroid Build Coastguard Worker   /// Construct an instance with \a code,  \a error_message and
102*cc02d7e2SAndroid Build Coastguard Worker   /// \a error_details. It is an error to construct an OK status with non-empty
103*cc02d7e2SAndroid Build Coastguard Worker   /// \a error_message and/or \a error_details.
Status(StatusCode code,const std::string & error_message,const std::string & error_details)104*cc02d7e2SAndroid Build Coastguard Worker   Status(StatusCode code, const std::string& error_message,
105*cc02d7e2SAndroid Build Coastguard Worker          const std::string& error_details)
106*cc02d7e2SAndroid Build Coastguard Worker       : code_(code),
107*cc02d7e2SAndroid Build Coastguard Worker         error_message_(error_message),
108*cc02d7e2SAndroid Build Coastguard Worker         binary_error_details_(error_details) {}
109*cc02d7e2SAndroid Build Coastguard Worker 
110*cc02d7e2SAndroid Build Coastguard Worker   // Pre-defined special status objects.
111*cc02d7e2SAndroid Build Coastguard Worker   /// An OK pre-defined instance.
112*cc02d7e2SAndroid Build Coastguard Worker   static const Status& OK;
113*cc02d7e2SAndroid Build Coastguard Worker   /// A CANCELLED pre-defined instance.
114*cc02d7e2SAndroid Build Coastguard Worker   static const Status& CANCELLED;
115*cc02d7e2SAndroid Build Coastguard Worker 
116*cc02d7e2SAndroid Build Coastguard Worker   /// Return the instance's error code.
error_code()117*cc02d7e2SAndroid Build Coastguard Worker   StatusCode error_code() const { return code_; }
118*cc02d7e2SAndroid Build Coastguard Worker   /// Return the instance's error message.
error_message()119*cc02d7e2SAndroid Build Coastguard Worker   std::string error_message() const { return error_message_; }
120*cc02d7e2SAndroid Build Coastguard Worker   /// Return the (binary) error details.
121*cc02d7e2SAndroid Build Coastguard Worker   // Usually it contains a serialized google.rpc.Status proto.
error_details()122*cc02d7e2SAndroid Build Coastguard Worker   std::string error_details() const { return binary_error_details_; }
123*cc02d7e2SAndroid Build Coastguard Worker 
124*cc02d7e2SAndroid Build Coastguard Worker   /// Is the status OK?
ok()125*cc02d7e2SAndroid Build Coastguard Worker   bool ok() const { return code_ == StatusCode::OK; }
126*cc02d7e2SAndroid Build Coastguard Worker 
127*cc02d7e2SAndroid Build Coastguard Worker   // Ignores any errors. This method does nothing except potentially suppress
128*cc02d7e2SAndroid Build Coastguard Worker   // complaints from any tools that are checking that errors are not dropped on
129*cc02d7e2SAndroid Build Coastguard Worker   // the floor.
IgnoreError()130*cc02d7e2SAndroid Build Coastguard Worker   void IgnoreError() const {}
131*cc02d7e2SAndroid Build Coastguard Worker 
132*cc02d7e2SAndroid Build Coastguard Worker  private:
133*cc02d7e2SAndroid Build Coastguard Worker   StatusCode code_;
134*cc02d7e2SAndroid Build Coastguard Worker   std::string error_message_;
135*cc02d7e2SAndroid Build Coastguard Worker   std::string binary_error_details_;
136*cc02d7e2SAndroid Build Coastguard Worker };
137*cc02d7e2SAndroid Build Coastguard Worker 
138*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
139*cc02d7e2SAndroid Build Coastguard Worker 
140*cc02d7e2SAndroid Build Coastguard Worker #endif  // GRPCPP_IMPL_STATUS_H
141