use pyo3::{types::*, Bound, PyResult, Python};
pub fn pydantic_model_as_dict<'py>(
py: Python<'py>,
obj: &Bound<'py, PyAny>,
) -> PyResult<Option<Bound<'py, PyDict>>> {
let module = match PyModule::import(py, "pydantic") {
Ok(m) => m,
Err(_) => {
log::debug!("pydantic module not found; skipping pydantic model check");
return Ok(None);
}
};
let base_model = module.getattr("BaseModel")?.cast_into::<PyType>()?;
if obj.is_instance(&base_model)? {
let model_dump_fn = obj.getattr("model_dump")?;
let dict_obj = model_dump_fn.call0()?;
let dict = dict_obj.cast_into::<PyDict>()?;
Ok(Some(dict))
} else {
Ok(None)
}
}