| // 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_ |