use df_derive::ToDataFrame;
use df_derive::dataframe::{ToDataFrame as _, ToDataFrameVec as _};
#[derive(ToDataFrame, Clone)]
struct Meta {
timestamp: i64,
note: String,
}
#[derive(ToDataFrame, Clone)]
struct Wrapper<T> {
id: u32,
payload: T,
}
#[derive(ToDataFrame, Clone)]
struct DefaultMeta<M = ()> {
value: i32,
meta: M,
}
#[derive(ToDataFrame, Clone)]
struct Pair<A, B> {
name: String,
left: A,
right: B,
}
#[derive(ToDataFrame, Clone)]
struct OptWrapper<T> {
id: u32,
payload: Option<T>,
}
#[derive(ToDataFrame, Clone)]
struct VecWrapper<T> {
id: u32,
payload: Vec<T>,
}
fn main() -> polars::prelude::PolarsResult<()> {
let row = Wrapper {
id: 1,
payload: Meta {
timestamp: 1_700_000_000,
note: "hello".into(),
},
};
println!("Wrapper<Meta> (single):\n{}\n", row.to_dataframe()?);
let rows = vec![
Wrapper {
id: 1,
payload: Meta {
timestamp: 1_700_000_000,
note: "first".into(),
},
},
Wrapper {
id: 2,
payload: Meta {
timestamp: 1_700_000_100,
note: "second".into(),
},
},
];
println!(
"Wrapper<Meta> (batch):\n{}\n",
rows.as_slice().to_dataframe()?
);
let unit = Wrapper { id: 7, payload: () };
println!("Wrapper<()> (unit payload):\n{}\n", unit.to_dataframe()?);
let default_meta: DefaultMeta = DefaultMeta {
value: 42,
meta: (),
};
println!(
"DefaultMeta (M defaults to ()):\n{}\n",
default_meta.to_dataframe()?
);
let pair = Pair {
name: "trade-1".into(),
left: Meta {
timestamp: 1,
note: "buy".into(),
},
right: Meta {
timestamp: 2,
note: "sell".into(),
},
};
println!("Pair<Meta, Meta>:\n{}\n", pair.to_dataframe()?);
let opts = vec![
OptWrapper {
id: 1,
payload: Some(Meta {
timestamp: 10,
note: "present".into(),
}),
},
OptWrapper {
id: 2,
payload: None,
},
];
println!(
"OptWrapper<Meta> (batch):\n{}\n",
opts.as_slice().to_dataframe()?
);
let vecs = vec![
VecWrapper {
id: 1,
payload: vec![
Meta {
timestamp: 1,
note: "a".into(),
},
Meta {
timestamp: 2,
note: "b".into(),
},
],
},
VecWrapper {
id: 2,
payload: vec![],
},
];
println!(
"VecWrapper<Meta> (batch):\n{}\n",
vecs.as_slice().to_dataframe()?
);
Ok(())
}