macro_rules! create_init_submodule {
(
$(#[$meta:meta])*
$(classes: [ $($class: ty),+ ],)?
$(consts: [ $($const: ident),+ ],)?
$(errors: [ $($error: ty),+ ],)?
$(funcs: [ $($func: path),+ ],)?
$(submodules: [ $($mod_name: literal: $init_submod: path),+ ],)?
) => { ... };
}Expand description
Create a crate-private function init_submodule to set up this submodule and call the same
function on child modules (which should also use this macro).
This generates boilerplate for exposing classes, exceptions, functions, and child modules to the Python runtime, including a hack to allow importing from submodules, i.e.:
from foo.bar import bazยงExample
use rigetti_pyo3::{py_wrap_type, py_wrap_error, wrap_error, create_init_submodule};
use rigetti_pyo3::pyo3::{pyfunction, pymodule, Python, PyResult, types::PyModule};
use rigetti_pyo3::pyo3::exceptions::PyRuntimeError;
#[pyfunction]
fn do_nothing() {}
py_wrap_type! {
PyCoolString(String) as "CoolString";
}
wrap_error!{
RustIOError(std::io::Error);
}
py_wrap_error!(errors, RustIOError, IOError, PyRuntimeError);
mod my_submodule {
use rigetti_pyo3::{py_wrap_type, create_init_submodule};
py_wrap_type! {
PyCoolInt(i32) as "CoolInt";
}
create_init_submodule! {
classes: [ PyCoolInt ],
}
}
create_init_submodule! {
/// Initialize this module and all its submodules
classes: [ PyCoolString ],
errors: [ IOError ],
funcs: [ do_nothing ],
submodules: [ "my_submodule": my_submodule::init_submodule ],
}
#[pymodule]
fn example(py: Python<'_>, m: &PyModule) -> PyResult<()> {
init_submodule("example", py, m)
}