// Copyright 2018 The Fuchsia 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 COBALT_UTIL_STATUS_H_
#define COBALT_UTIL_STATUS_H_

#include <string>

#include "util/status_codes.h"

namespace cobalt {
namespace util {

class Status {
 public:
  Status() : code_(StatusCode::OK) {}

  Status(StatusCode code, const std::string &error_message)
      : code_(code), error_message_(error_message) {}

  Status(StatusCode code, const std::string &error_message,
         const std::string &error_details)
      : code_(code),
        error_message_(error_message),
        error_details_(error_details) {}

  // Pre-defined special status objects.
  static const Status &OK;
  static const Status &CANCELLED;

  StatusCode error_code() const { return code_; }
  std::string error_message() const { return error_message_; }
  std::string error_details() const { return error_details_; }

  bool ok() const { return code_ == StatusCode::OK; }

  // Ignores any errors. This method does nothing except potentially suppress
  // complaints from any tools that are checking that errors are not dropped on
  // the floor.
  void IgnoreError() {}

 private:
  StatusCode code_;
  std::string error_message_;
  std::string error_details_;
};

// Early-returns the status if it is an error, otherwise it proceeds.
//
// The argument expression is evaluated only once.
#define RETURN_IF_ERROR(__status) \
  do {                            \
    auto status = (__status);     \
    if (!status.ok()) {           \
      return status;              \
    }                             \
  } while (false)

}  // namespace util
}  // namespace cobalt

#endif  // COBALT_UTIL_STATUS_H_
