// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef IREE_BINDINGS_PYTHON_PYIREE_STATUS_UTILS_H_
#define IREE_BINDINGS_PYTHON_PYIREE_STATUS_UTILS_H_

#include "base/api.h"
#include "base/status.h"
#include "pybind11/pytypes.h"

namespace iree {
namespace python {

// Converts a failing status to a throwable exception, setting Python
// error information.
// Correct usage is something like:
//   if (!status.ok()) {
//     throw StatusToPyExc(status);
//   }
pybind11::error_already_set StatusToPyExc(const Status& status);

// Raises a value error with the given message.
// Correct usage:
//   throw RaiseValueError("Foobar'd");
pybind11::error_already_set RaiseValueError(const char* message);

// Consumes a StatusOr<T>, returning an rvalue reference to the T if the
// status is ok(). Otherwise, throws an exception.
template <typename T>
T&& PyConsumeStatusOr(iree::StatusOr<T>&& sor) {
  if (sor.ok()) {
    return std::move(*sor);
  }
  throw StatusToPyExc(sor.status());
}

pybind11::error_already_set ApiStatusToPyExc(iree_status_t status,
                                             const char* message);

static void CheckApiStatus(iree_status_t status, const char* message) {
  if (status == IREE_STATUS_OK) {
    return;
  }
  throw ApiStatusToPyExc(status, message);
}

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

}  // namespace python
}  // namespace iree

#endif  // IREE_BINDINGS_PYTHON_PYIREE_STATUS_UTILS_H_
