17#ifndef ACTIONENGINE_UTIL_STATUS_BUILDER_H_ 
   18#define ACTIONENGINE_UTIL_STATUS_BUILDER_H_ 
   25#include <absl/base/attributes.h> 
   26#include <absl/status/status.h> 
   28#include "actionengine/util/source_location.h" 
   32class ABSL_MUST_USE_RESULT StatusBuilder {
 
   34  StatusBuilder(
const StatusBuilder& sb);
 
   35  StatusBuilder& operator=(
const StatusBuilder& sb);
 
   37  StatusBuilder(StatusBuilder&&) = 
default;
 
   38  StatusBuilder& operator=(StatusBuilder&&) = 
default;
 
   43  StatusBuilder(
const absl::Status& original_status,
 
   44                act::util::source_location location)
 
   45      : impl_(original_status.ok()
 
   47                  : std::make_unique<Impl>(original_status, location)) {}
 
   49  StatusBuilder(absl::Status&& original_status,
 
   50                act::util::source_location location)
 
   51      : impl_(original_status.ok()
 
   53                  : std::make_unique<Impl>(std::move(original_status),
 
   59  StatusBuilder(absl::StatusCode code, act::util::source_location location)
 
   60      : impl_(code == absl::StatusCode::kOk
 
   62                  : std::make_unique<Impl>(absl::Status(code, 
""), location)) {}
 
   64  bool ok()
 const { 
return !impl_; }
 
   66  StatusBuilder& SetAppend() &;
 
   67  StatusBuilder&& SetAppend() &&;
 
   69  StatusBuilder& SetPrepend() &;
 
   70  StatusBuilder&& SetPrepend() &&;
 
   72  StatusBuilder& SetNoLogging() &;
 
   73  StatusBuilder&& SetNoLogging() &&;
 
   76  StatusBuilder& operator<<(
const T& msg) & {
 
   84  StatusBuilder&& operator<<(
const T& msg) && {
 
   85    return std::move(*
this << msg);
 
   88  operator absl::Status() const&;
 
   89  operator absl::Status() &&;
 
   91  absl::Status JoinMessageToStatus();
 
   97    enum class MessageJoinStyle {
 
  103    Impl(
const absl::Status& status, act::util::source_location location);
 
  104    Impl(absl::Status&& status, act::util::source_location location);
 
  106    Impl& operator=(
const Impl&);
 
  108    absl::Status JoinMessageToStatus();
 
  113    act::util::source_location location;
 
  115    bool no_logging = 
false;
 
  118    std::ostringstream stream;
 
  120    MessageJoinStyle join_style = MessageJoinStyle::kAnnotate;
 
  125  std::unique_ptr<Impl> impl_;
 
  128inline StatusBuilder AlreadyExistsErrorBuilder(
 
  129    act::util::source_location location) {
 
  130  return StatusBuilder(absl::StatusCode::kAlreadyExists, location);
 
  133inline StatusBuilder FailedPreconditionErrorBuilder(
 
  134    act::util::source_location location) {
 
  135  return StatusBuilder(absl::StatusCode::kFailedPrecondition, location);
 
  138inline StatusBuilder InternalErrorBuilder(act::util::source_location location) {
 
  139  return StatusBuilder(absl::StatusCode::kInternal, location);
 
  142inline StatusBuilder InvalidArgumentErrorBuilder(
 
  143    act::util::source_location location) {
 
  144  return StatusBuilder(absl::StatusCode::kInvalidArgument, location);
 
  147inline StatusBuilder NotFoundErrorBuilder(act::util::source_location location) {
 
  148  return StatusBuilder(absl::StatusCode::kNotFound, location);
 
  151inline StatusBuilder UnavailableErrorBuilder(
 
  152    act::util::source_location location) {
 
  153  return StatusBuilder(absl::StatusCode::kUnavailable, location);
 
  156inline StatusBuilder UnimplementedErrorBuilder(
 
  157    act::util::source_location location) {
 
  158  return StatusBuilder(absl::StatusCode::kUnimplemented, location);
 
  161inline StatusBuilder UnknownErrorBuilder(act::util::source_location location) {
 
  162  return StatusBuilder(absl::StatusCode::kUnknown, location);