use df_derive::ToDataFrame;
use df_derive::dataframe::ToDataFrameVec as _;
#[derive(ToDataFrame, Clone)]
struct IntPayload {
timestamp: i64,
seq: u32,
}
#[derive(ToDataFrame, Clone)]
struct StringPayload {
name: String,
note: String,
}
#[derive(ToDataFrame, Clone)]
struct Generic<T> {
value: T,
label: String,
}
#[derive(ToDataFrame, Clone)]
struct Outer {
id: u32,
inner: Generic<IntPayload>,
list: Vec<Generic<StringPayload>>,
}
fn main() -> polars::prelude::PolarsResult<()> {
let rows = vec![
Outer {
id: 1,
inner: Generic {
value: IntPayload {
timestamp: 1_700_000_000,
seq: 1,
},
label: "alpha".into(),
},
list: vec![
Generic {
value: StringPayload {
name: "first".into(),
note: "x".into(),
},
label: "list-a".into(),
},
Generic {
value: StringPayload {
name: "second".into(),
note: "y".into(),
},
label: "list-b".into(),
},
],
},
Outer {
id: 2,
inner: Generic {
value: IntPayload {
timestamp: 1_700_000_100,
seq: 2,
},
label: "beta".into(),
},
list: vec![],
},
];
println!("Outer (batch):\n{}", rows.as_slice().to_dataframe()?);
let schema = <Outer as df_derive::dataframe::ToDataFrame>::schema()?;
println!("\nSchema (generic instantiations flatten with dot notation):");
for (name, dtype) in schema {
println!(" {name}: {dtype:?}");
}
Ok(())
}