use df_derive::ToDataFrame;
use df_derive::dataframe;
use df_derive::dataframe::ToDataFrameVec;
#[derive(ToDataFrame, Clone)]
struct Profile {
handle: String,
score: f64,
}
#[derive(ToDataFrame, Clone)]
struct User {
id: u32,
#[allow(clippy::option_option)]
profile: Option<Option<Profile>>,
}
fn main() -> polars::prelude::PolarsResult<()> {
let users = vec![
User {
id: 1,
profile: Some(Some(Profile {
handle: "alice".into(),
score: 87.5,
})),
},
User {
id: 2,
profile: Some(None),
},
User {
id: 3,
profile: None,
},
];
let df = users.as_slice().to_dataframe()?;
println!("Option<Option<Struct>> DataFrame:");
println!("{df}");
let schema = <User as dataframe::ToDataFrame>::schema()?;
println!("\nSchema (profile fields are flattened with dot notation):");
for (name, dtype) in schema {
println!(" {name}: {dtype:?}");
}
Ok(())
}