| // Copyright (c) 2022 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef QUICHE_COMMON_QUICHE_STATUS_UTILS_H_ |
| #define QUICHE_COMMON_QUICHE_STATUS_UTILS_H_ |
| |
| #include <utility> |
| |
| #include "absl/base/optimization.h" |
| #include "absl/status/status.h" |
| #include "absl/strings/str_cat.h" |
| |
| namespace quiche { |
| |
| // A simplified version of the standard google3 "return if error" macro. Unlike |
| // the standard version, this does not come with a StatusBuilder support; the |
| // AppendToStatus() function below is meant to partially fill that gap. |
| #define QUICHE_RETURN_IF_ERROR(expr) \ |
| do { \ |
| absl::Status quiche_status_macro_value = (expr); \ |
| if (ABSL_PREDICT_FALSE(!quiche_status_macro_value.ok())) { \ |
| return quiche_status_macro_value; \ |
| } \ |
| } while (0) |
| |
| // Copies absl::Status payloads from `original` to `target`; required to copy a |
| // status correctly. |
| inline void CopyStatusPayloads(const absl::Status& original, |
| absl::Status& target) { |
| original.ForEachPayload([&](absl::string_view key, const absl::Cord& value) { |
| target.SetPayload(key, value); |
| }); |
| } |
| |
| // Appends additional into to a status message if the status message is |
| // an error. |
| template <typename... T> |
| absl::Status AppendToStatus(absl::Status input, T&&... args) { |
| if (ABSL_PREDICT_TRUE(input.ok())) { |
| return input; |
| } |
| absl::Status result = absl::Status( |
| input.code(), absl::StrCat(input.message(), std::forward<T>(args)...)); |
| CopyStatusPayloads(input, result); |
| return result; |
| } |
| |
| } // namespace quiche |
| |
| #endif // QUICHE_COMMON_QUICHE_STATUS_UTILS_H_ |