// Copyright 2013 The Flutter 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 FLUTTER_FML_STATUS_H_
#define FLUTTER_FML_STATUS_H_

#include <string_view>

namespace fml {

enum class StatusCode {
  kOk,
  kCancelled,
  kUnknown,
  kInvalidArgument,
  kDeadlineExceeded,
  kNotFound,
  kAlreadyExists,
  kPermissionDenied,
  kResourceExhausted,
  kFailedPrecondition,
  kAborted,
  kOutOfRange,
  kUnimplemented,
  kInternal,
  kUnavailable,
  kDataLoss,
  kUnauthenticated
};

/// Class that represents the resolution of the execution of a procedure.  This
/// is used similarly to how exceptions might be used, typically as the return
/// value to a synchronous procedure or an argument to an asynchronous callback.
class Status final {
 public:
  /// Creates an 'ok' status.
  Status();

  Status(fml::StatusCode code, std::string_view message);

  fml::StatusCode code() const;

  /// A noop that helps with static analysis tools if you decide to ignore an
  /// error.
  void IgnoreError() const;

  /// @return 'true' when the code is kOk.
  bool ok() const;

  std::string_view message() const;

 private:
  fml::StatusCode code_;
  std::string_view message_;
};

inline Status::Status() : code_(fml::StatusCode::kOk), message_() {}

inline Status::Status(fml::StatusCode code, std::string_view message)
    : code_(code), message_(message) {}

inline fml::StatusCode Status::code() const {
  return code_;
}

inline void Status::IgnoreError() const {
  // noop
}

inline bool Status::ok() const {
  return code_ == fml::StatusCode::kOk;
}

inline std::string_view Status::message() const {
  return message_;
}

}  // namespace fml

#endif  // FLUTTER_FML_SIZE_H_
