// Copyright 2019 The IREE Authors
//
// Licensed 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 IREE_BINDINGS_PYTHON_IREE_COMMON_STATUS_UTILS_H_
#define IREE_BINDINGS_PYTHON_IREE_COMMON_STATUS_UTILS_H_

#include <nanobind/nanobind.h>

#include "iree/base/api.h"

namespace iree {
namespace python {

// Raises a value error with the given message.
// Correct usage:
//   throw RaiseValueError(PyExc_ValueError, "Foobar'd");
nanobind::python_error RaisePyError(PyObject* exc_class, const char* message);

// Raises a value error with the given message.
// Correct usage:
//   throw RaiseValueError("Foobar'd");
inline nanobind::python_error RaiseValueError(const char* message) {
  return RaisePyError(PyExc_ValueError, message);
}

nanobind::python_error ApiStatusToPyExc(iree_status_t status,
                                        const char* message);

inline void CheckApiStatus(iree_status_t status, const char* message) {
  if (iree_status_is_ok(status)) {
    return;
  }
  throw ApiStatusToPyExc(status, message);
}

inline void CheckApiNotNull(const void* p, const char* message) {
  if (!p) {
    throw RaiseValueError(message);
  }
}

}  // namespace python
}  // namespace iree

#endif  // IREE_BINDINGS_PYTHON_IREE_COMMON_STATUS_UTILS_H_
