#![deny(missing_docs)]
#![deny(rustdoc::missing_crate_level_docs)]
#![deny(missing_debug_implementations)]
use pyo3::prelude::*;
use pyo3::types::PyDict;
use pyo3::wrap_pymodule;
pub mod operations;
pub mod measurements;
pub mod devices;
mod circuit;
pub use circuit::{convert_into_circuit, CircuitWrapper, OperationIteratorWrapper};
mod quantum_program;
pub use quantum_program::{convert_into_quantum_program, QuantumProgramWrapper};
pub mod noise_models;
#[cfg(feature = "circuitdag")]
mod circuitdag;
#[cfg(feature = "circuitdag")]
pub use circuitdag::{convert_into_circuitdag, CircuitDagWrapper};
pub const QOQO_VERSION: &str = env!("CARGO_PKG_VERSION");
use roqoqo::{RoqoqoBackendError, RoqoqoError};
use thiserror::Error;
#[derive(Error, Debug, PartialEq)]
pub enum QoqoError {
#[error("Converting PyAny to Operation not possible")]
ConversionError,
#[error("Cannot extract roqoqo object from python object")]
CannotExtractObject,
#[error("Package versions of qoqo and roqoqo do not match versions of qoqo object passed from python")]
VersionMismatch,
#[error(transparent)]
RoqoqoError(#[from] RoqoqoError),
}
#[derive(Error, Debug, PartialEq)]
pub enum QoqoBackendError {
#[error("Cannot extract rust object from python object")]
CannotExtractObject,
#[error("Package versions of qoqo backend and roqoqo backend do not match versions of qoqo object passed from python")]
VersionMismatch,
#[error(transparent)]
RoqoqoBackendError(#[from] RoqoqoBackendError),
}
#[pymodule]
fn qoqo(_py: Python, module: &PyModule) -> PyResult<()> {
module.add_class::<CircuitWrapper>()?;
module.add_class::<QuantumProgramWrapper>()?;
#[cfg(feature = "circuitdag")]
module.add_class::<CircuitDagWrapper>()?;
let wrapper = wrap_pymodule!(operations::operations);
module.add_wrapped(wrapper)?;
let wrapper2 = wrap_pymodule!(measurements::measurements);
module.add_wrapped(wrapper2)?;
let wrapper3 = wrap_pymodule!(devices::devices);
module.add_wrapped(wrapper3)?;
let wrapper4 = wrap_pymodule!(noise_models::noise_models);
module.add_wrapped(wrapper4)?;
let system = PyModule::import(_py, "sys")?;
let system_modules: &PyDict = system.getattr("modules")?.downcast()?;
system_modules.set_item("qoqo.operations", module.getattr("operations")?)?;
system_modules.set_item("qoqo.measurements", module.getattr("measurements")?)?;
system_modules.set_item("qoqo.devices", module.getattr("devices")?)?;
system_modules.set_item("qoqo.noise_models", module.getattr("noise_models")?)?;
Ok(())
}