{% if signature %}
#[pyo3(signature = ({{ signature }}))]
#[allow(clippy::missing_errors_doc)]
{% else %}
#[allow(clippy::missing_errors_doc)]
{% endif %}
pub fn {{ method_name }}({{ params_str }}) -> pyo3::PyResult<pyo3::Py<pyo3::PyAny>> {
const {{ capsule_cstr }}_NAME: &::std::ffi::CStr = c"{{ capsule_name }}";
{{ capsule_param_extract }} let result = {{ core_call }}{{ err_map_suffix }};
let raw_ptr = result.into_raw();
// SAFETY: raw_ptr is a valid pointer derived from into_raw() on a value with program lifetime.
let capsule_ptr = unsafe { pyo3::ffi::PyCapsule_New(raw_ptr as *mut _, {{ capsule_cstr }}_NAME.as_ptr(), None) };
if capsule_ptr.is_null() {
return Err(pyo3::exceptions::PyRuntimeError::new_err("Failed to create PyCapsule"));
}
// SAFETY: capsule_ptr is a valid, non-null Python object pointer we just created above.
{% if module_path %}
let _capsule_obj = unsafe { pyo3::Bound::from_owned_ptr(py, capsule_ptr) };
let _ts_mod = py.import("{{ module_path }}")?;
let _cls = _ts_mod.getattr("{{ class_name }}")?;
Ok(_cls.call1((_capsule_obj,))?.unbind())
{% else %}
Ok(unsafe { pyo3::Bound::from_owned_ptr(py, capsule_ptr) }.unbind())
{% endif %}
}