1 // Copyright 2021 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef GRPC_SRC_CORE_LIB_PROMISE_DETAIL_STATUS_H
16 #define GRPC_SRC_CORE_LIB_PROMISE_DETAIL_STATUS_H
17 
18 #include <grpc/support/port_platform.h>
19 
20 #include <utility>
21 
22 #include "absl/status/status.h"
23 #include "absl/status/statusor.h"
24 
25 // Helpers for dealing with absl::Status/StatusOr generically
26 
27 namespace grpc_core {
28 namespace promise_detail {
29 
30 // Convert with a move the input status to an absl::Status.
31 template <typename T>
IntoStatus(absl::StatusOr<T> * status)32 absl::Status IntoStatus(absl::StatusOr<T>* status) {
33   return std::move(status->status());
34 }
35 
36 // Convert with a move the input status to an absl::Status.
IntoStatus(absl::Status * status)37 inline absl::Status IntoStatus(absl::Status* status) {
38   return std::move(*status);
39 }
40 
41 }  // namespace promise_detail
42 
43 // Return true if the status represented by the argument is ok, false if not.
44 // By implementing this function for other, non-absl::Status types, those types
45 // can participate in TrySeq as result types that affect control flow.
IsStatusOk(const absl::Status & status)46 inline bool IsStatusOk(const absl::Status& status) { return status.ok(); }
47 
48 template <typename To, typename From>
49 struct StatusCastImpl;
50 
51 template <typename To>
52 struct StatusCastImpl<To, To> {
53   static To Cast(To&& t) { return std::move(t); }
54 };
55 
56 template <typename To>
57 struct StatusCastImpl<To, const To&> {
58   static To Cast(const To& t) { return t; }
59 };
60 
61 template <typename T>
62 struct StatusCastImpl<absl::StatusOr<T>, absl::Status> {
63   static absl::StatusOr<T> Cast(absl::Status&& t) { return std::move(t); }
64 };
65 
66 template <typename T>
67 struct StatusCastImpl<absl::StatusOr<T>, const absl::Status&> {
68   static absl::StatusOr<T> Cast(const absl::Status& t) { return t; }
69 };
70 
71 template <typename To, typename From>
72 To StatusCast(From&& from) {
73   return StatusCastImpl<To, From>::Cast(std::forward<From>(from));
74 }
75 
76 }  // namespace grpc_core
77 
78 #endif  // GRPC_SRC_CORE_LIB_PROMISE_DETAIL_STATUS_H
79