#[macro_export]
macro_rules! load_polars_df {
($df:expr) => {{
let df = $df;
let mut dataset: $crate::core::data::Dataset = $crate::core::data::Dataset::new();
for series in df.columns() {
let name = series.name().to_string();
match series.dtype() {
polars::prelude::DataType::Float32 => {
let ca = series.f32().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<f32>> = ca.into_iter().collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::Float64 => {
let ca = series.f64().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<f64>> = ca.into_iter().collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::Int64 => {
let ca = series.i64().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<i64>> = ca.into_iter().collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::Int32 => {
let ca = series.i32().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<i32>> = ca.into_iter().collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::UInt32 => {
let ca = series.u32().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<u32>> = ca.into_iter().collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::String => {
let ca = series.str().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<String>> = ca
.into_iter()
.map(|opt| opt.map(|s| s.to_string()))
.collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::Datetime(unit, _) => {
let ca = series.datetime().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' datetime cast error: {}",
name, e
))
})?;
let mut dt_vec: Vec<Option<$crate::prelude::OffsetDateTime>> =
Vec::with_capacity(ca.len());
let physical_ca = ca.physical();
for opt_ts in physical_ca.into_iter() {
let dt = opt_ts.and_then(|ts| {
let nanos = match unit {
polars::prelude::TimeUnit::Milliseconds => (ts as i128) * 1_000_000,
polars::prelude::TimeUnit::Microseconds => (ts as i128) * 1_000,
polars::prelude::TimeUnit::Nanoseconds => ts as i128,
};
$crate::prelude::OffsetDateTime::from_unix_timestamp_nanos(nanos).ok()
});
dt_vec.push(dt);
}
dataset.add_column(name, dt_vec)?;
}
_ => {
}
}
}
let res: std::result::Result<$crate::core::data::Dataset, $crate::error::ChartonError> =
Ok(dataset);
res
}};
}
#[macro_export]
macro_rules! chart {
(&$ds:expr) => {
$crate::chart::Chart::build($ds.clone())
};
($ds:expr) => {
$crate::chart::Chart::build($ds)
};
($( $(&)? $col:ident ),+ $(,)?) => {{
let mut ds = $crate::core::data::Dataset::new();
let mut result = Ok(ds);
$(
// We pass the tokens exactly as matched to the internal parser
result = $crate::chart!(@parse_col result, $col);
)+
result.and_then(|ds| $crate::chart::Chart::build(ds))
}};
(@parse_col $res:ident, &$name:ident) => {
$res.and_then(|mut d| {
d.add_column(stringify!($name), $name.clone())?;
Ok(d)
})
};
(@parse_col $res:ident, $name:ident) => {
$res.and_then(|mut d| {
d.add_column(stringify!($name), $name.clone())?;
Ok(d)
})
};
}
#[macro_export]
macro_rules! load_polars_v42_52 {
($df:expr) => {{
let df = $df;
let mut dataset: $crate::core::data::Dataset = $crate::core::data::Dataset::new();
for series in df.get_columns() {
let name = series.name().to_string();
match series.dtype() {
polars::prelude::DataType::Float32 => {
let ca = series.f32().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<f32>> = ca.into_iter().collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::Float64 => {
let ca = series.f64().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<f64>> = ca.into_iter().collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::Int64 => {
let ca = series.i64().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<i64>> = ca.into_iter().collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::Int32 => {
let ca = series.i32().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<i32>> = ca.into_iter().collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::UInt32 => {
let ca = series.u32().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<u32>> = ca.into_iter().collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::String => {
let ca = series.str().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' cast error: {}",
name, e
))
})?;
let vec: Vec<Option<String>> = ca
.into_iter()
.map(|opt| opt.map(|s| s.to_string()))
.collect();
dataset.add_column(name, vec)?;
}
polars::prelude::DataType::Datetime(unit, _) => {
let ca = series.datetime().map_err(|e| {
$crate::error::ChartonError::Data(format!(
"Column '{}' datetime cast error: {}",
name, e
))
})?;
let mut dt_vec: Vec<Option<$crate::prelude::OffsetDateTime>> =
Vec::with_capacity(ca.len());
let physical_ca = ca.physical();
for opt_ts in physical_ca.into_iter() {
let dt = opt_ts.and_then(|ts| {
let nanos = match unit {
polars::prelude::TimeUnit::Milliseconds => (ts as i128) * 1_000_000,
polars::prelude::TimeUnit::Microseconds => (ts as i128) * 1_000,
polars::prelude::TimeUnit::Nanoseconds => ts as i128,
};
$crate::prelude::OffsetDateTime::from_unix_timestamp_nanos(nanos).ok()
});
dt_vec.push(dt);
}
dataset.add_column(name, dt_vec)?;
}
_ => {
}
}
}
let res: std::result::Result<$crate::core::data::Dataset, $crate::error::ChartonError> =
Ok(dataset);
res
}};
}