use pyo3::{prelude::*, PyClass};
use rigetti_pyo3::create_init_submodule;
use crate::expression;
use crate::instruction;
use crate::program;
use crate::validation;
use crate::waveform;
pub(crate) mod errors;
create_init_submodule! {
errors: [
errors::QuilError,
errors::ValueError,
errors::ToQuilStringError,
errors::PickleError
],
submodules: [
"expression": expression::quilpy::init_submodule,
"instructions": instruction::quilpy::init_submodule,
"program": program::quilpy::init_submodule,
"validation": validation::quilpy::init_submodule,
"waveform": waveform::quilpy::init_submodule
],
}
#[pymodule]
#[pyo3(name = "_quil")]
fn init_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
let py = m.py();
init_submodule("quil._quil", py, m)?;
waveform::sampling::quilpy::register_abcs(py)?;
Ok(())
}
macro_rules! impl_to_quil {
($name: ident) => {
#[cfg_attr(feature = "stubs", gen_stub_pymethods)]
#[pyo3::pymethods]
impl $name {
#[pyo3(name = "to_quil")]
fn py_to_quil(&self) -> pyo3::PyResult<String> {
Ok(self.to_quil()?)
}
#[pyo3(name = "to_quil_or_debug")]
fn py_to_quil_or_debug(&self) -> String {
self.to_quil_or_debug()
}
}
};
}
pub(crate) use impl_to_quil;
pub(crate) fn py_cast_and_borrow<'a, 'py, T: PyClass + FromPyObject<'a, 'py>>(
obj: &'a Bound<'py, PyAny>,
) -> PyResult<Option<PyRef<'py, T>>> {
obj.cast::<T>()
.ok()
.map(Bound::try_borrow)
.transpose()
.map_err(Into::into)
}
pub(crate) fn py_cast_and_clone<'a, 'py, T: PyClass + FromPyObject<'a, 'py> + Clone>(
obj: &'a Bound<'py, PyAny>,
) -> PyResult<Option<T>> {
py_cast_and_borrow(obj).map(|obj| obj.as_deref().cloned())
}
#[cfg(feature = "stubs")]
pub(crate) mod stubs {
use pyo3_stub_gen::{module_doc, reexport_module_members};
reexport_module_members!("quil" from "quil._quil");
reexport_module_members!("quil.instructions" from "quil._quil.instructions");
reexport_module_members!("quil.expression" from "quil._quil.expression");
reexport_module_members!("quil.program" from "quil._quil.program");
reexport_module_members!("quil.validation" from "quil._quil.validation");
reexport_module_members!("quil.validation.identifier" from "quil._quil.validation.identifier");
reexport_module_members!("quil.waveform" from "quil._quil.waveform");
reexport_module_members!("quil.waveform.sampling" from "quil._quil.waveform.sampling");
module_doc!(
"quil._quil",
r#"
The `quil` package provides tools for constructing, manipulating,
parsing, and printing [Quil](https://github.com/quil-lang/quil) programs.
⚠️ This package is still in early development
and breaking changes should be expected between minor versions.
"#
);
}
#[cfg(feature = "stubs")]
pyo3_stub_gen::define_stub_info_gatherer!(stub_info);