diff --git a/perde-core/src/lib.rs b/perde-core/src/lib.rs index bc696b0..5035cc3 100644 --- a/perde-core/src/lib.rs +++ b/perde-core/src/lib.rs @@ -21,7 +21,7 @@ pub mod prelude { pub use crate::object::{Object, ObjectRef}; pub use crate::schema::{Schema, WithSchema}; pub use crate::{ - bail, bail_type_err, bail_value_err, err, exception, impl_default_methods, method_fastcall, - method_varargs, module, submodule, type_err, value_err, + add_submodule, bail, bail_type_err, bail_value_err, err, exception, impl_default_methods, + method_fastcall, method_varargs, module, submodule, type_err, value_err, }; } diff --git a/perde-core/src/methods.rs b/perde-core/src/methods.rs index c3aa048..2eef63b 100644 --- a/perde-core/src/methods.rs +++ b/perde-core/src/methods.rs @@ -76,11 +76,26 @@ macro_rules! method_varargs { }; } +#[macro_export] +macro_rules! add_submodule { + ($module:ident) => { + |py: pyo3::Python<'_>, _: &str, m: &pyo3::types::PyModule| -> pyo3::PyResult<()> { + let submodule = $module(py)?; + m.add_submodule(submodule) + } + }; +} + #[macro_export] macro_rules! submodule { - ($module:tt) => { - |_: pyo3::Python<'_>, _: &str, m: &pyo3::types::PyModule| -> pyo3::PyResult<()> { - m.add_wrapped(pyo3::wrap_pymodule!($module)) + ($module:tt, $($cls:expr),*) => { + pub fn $module(py: pyo3::Python<'_>) -> pyo3::PyResult<&pyo3::types::PyModule> { + let m = pyo3::types::PyModule::new(py, stringify!($module))?; + $({ + let method = $cls; + method(py, concat!(stringify!($name), "\0"), m)?; + })* + Ok(m) } }; } @@ -191,7 +206,7 @@ macro_rules! impl_default_methods { } } - module!( + submodule!( $module_name, exception!($exception_type), method_varargs!(_loads, "loads", ""), diff --git a/perde/src/lib.rs b/perde/src/lib.rs index bf39c44..280692e 100644 --- a/perde/src/lib.rs +++ b/perde/src/lib.rs @@ -52,10 +52,10 @@ pub extern "C" fn resolve( module!( perde, - submodule!(json), - submodule!(toml), - submodule!(yaml), - submodule!(msgpack), + add_submodule!(json), + add_submodule!(toml), + add_submodule!(yaml), + add_submodule!(msgpack), exception!(Error), method_fastcall!(resolve, "resolve", "") );