When exposing a Rust library through multi-language bindings, treat the binding surface as a single canonical API: mirror the underlying Rust types/surfaces instead of reshaping them differently per client, and ensure exported classes/functions are actually registered so clients can import them.
Apply this as:
Example (Python binding wiring):
#[pyclass(name = "PageSignals")]
pub struct PyPageSignals { /* fields */ }
// In module init
fn pdf_inspector(m: &PyModule) -> PyResult<()> {
m.add_class::<PyPageSignals>()?;
Ok(())
}
And verify from Python (conceptually): hasattr(pdf_inspector, "PageSignals").