//===-- SBError.h -----------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_API_SBERROR_H
#define LLDB_API_SBERROR_H

#include "lldb/API/SBDefines.h"

namespace lldb_private {
class ScriptInterpreter;
} // namespace lldb_private

namespace lldb {

class LLDB_API SBError {
public:
  SBError();

  SBError(const lldb::SBError &rhs);

  ~SBError();

  const SBError &operator=(const lldb::SBError &rhs);

  const char *GetCString() const;

  void Clear();

  bool Fail() const;

  bool Success() const;

  uint32_t GetError() const;

  lldb::ErrorType GetType() const;

  void SetError(uint32_t err, lldb::ErrorType type);

  void SetErrorToErrno();

  void SetErrorToGenericError();

  void SetErrorString(const char *err_str);

  int SetErrorStringWithFormat(const char *format, ...)
      __attribute__((format(printf, 2, 3)));

  explicit operator bool() const;

  bool IsValid() const;

  bool GetDescription(lldb::SBStream &description);

protected:
  friend class SBBreakpoint;
  friend class SBBreakpointLocation;
  friend class SBBreakpointName;
  friend class SBCommandReturnObject;
  friend class SBCommunication;
  friend class SBData;
  friend class SBDebugger;
  friend class SBHostOS;
  friend class SBPlatform;
  friend class SBProcess;
  friend class SBReproducer;
  friend class SBStructuredData;
  friend class SBTarget;
  friend class SBThread;
  friend class SBTrace;
  friend class SBValue;
  friend class SBWatchpoint;
  friend class SBFile;

  friend class lldb_private::ScriptInterpreter;

  lldb_private::Status *get();

  lldb_private::Status *operator->();

  const lldb_private::Status &operator*() const;

  lldb_private::Status &ref();

  void SetError(const lldb_private::Status &lldb_error);

private:
  std::unique_ptr<lldb_private::Status> m_opaque_up;

  void CreateIfNeeded();
};

} // namespace lldb

#endif // LLDB_API_SBERROR_H
