use pyo3::{ffi::c_str, prelude::*};
use serde::{Deserialize, Serialize};
use serde_pyobject::{from_pyobject, to_pyobject};
#[test]
fn check_pydantic_object() {
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct MyClass {
name: String,
age: i32,
}
Python::attach(|py| {
let result = py.run(
c_str!(
r#"
from pydantic import BaseModel
class MyClass(BaseModel):
name: str
age: int
"#
),
None,
None,
);
if let Err(err) = result {
if err.is_instance_of::<pyo3::exceptions::PyModuleNotFoundError>(py) {
eprintln!("Skipping test: pydantic is not installed");
return;
}
panic!("Unexpected error: {}", err);
}
let my_python_class = py
.eval(
c_str!(
r#"
MyClass(name="John", age=30)
"#
),
None,
None,
)
.unwrap();
let my_rust_class = MyClass {
name: "John".to_string(),
age: 30,
};
let any: Bound<'_, PyAny> = to_pyobject(py, &my_rust_class).unwrap();
println!("any: {:?}", any);
let rust_version: MyClass = from_pyobject(my_python_class).unwrap();
let python_version: MyClass = from_pyobject(any).unwrap();
assert_eq!(rust_version, python_version);
})
}