create_init_submodule

Macro create_init_submodule 

Source
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)
}