use pyo3::{ffi::c_str, prelude::*};
use serde::{Deserialize, Serialize};
use serde_pyobject::{from_pyobject, to_pyobject};
#[test]
fn check_dataclass_object() {
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct MyClass {
name: String,
age: i32,
}
Python::attach(|py| {
py.run(
c_str!(
r#"
from dataclasses import dataclass
@dataclass
class MyClass:
name: str
age: int
"#
),
None,
None,
)
.unwrap();
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);
})
}
#[test]
fn check_dataclass_object_nested() {
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct MyClassNested {
name: String,
age: i32,
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct MyClass {
my_class: MyClassNested,
}
Python::attach(|py| {
py.run(
c_str!(
r#"
from dataclasses import dataclass
@dataclass
class MyClassNested:
name: str
age: int
@dataclass
class MyClass:
my_class: MyClassNested
"#
),
None,
None,
)
.unwrap();
let my_python_class = py
.eval(
c_str!(
r#"
MyClass(my_class=MyClassNested(name="John", age=30))
"#
),
None,
None,
)
.unwrap();
let my_rust_class = MyClass {
my_class: MyClassNested {
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);
})
}