diff --git a/Cargo.lock b/Cargo.lock index 6f9fabfe..bdd62e79 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2586,6 +2586,7 @@ dependencies = [ "chrono", "eyre", "half", + "num", ] [[package]] diff --git a/libraries/arrow-convert/Cargo.toml b/libraries/arrow-convert/Cargo.toml index 066c0bcc..d180dc40 100644 --- a/libraries/arrow-convert/Cargo.toml +++ b/libraries/arrow-convert/Cargo.toml @@ -13,4 +13,5 @@ repository.workspace = true arrow = { workspace = true } eyre = "0.6.8" half = "2.5.0" +num = "0.4.3" chrono = "0.4.39" diff --git a/libraries/arrow-convert/src/lib.rs b/libraries/arrow-convert/src/lib.rs index 0c405403..cf293161 100644 --- a/libraries/arrow-convert/src/lib.rs +++ b/libraries/arrow-convert/src/lib.rs @@ -1,6 +1,7 @@ use arrow::array::{Array, Float32Array, Float64Array, Int32Array, Int64Array, UInt32Array}; use arrow::datatypes::DataType; use eyre::{eyre, ContextCompat, Result}; +use num::NumCast; use std::ops::{Deref, DerefMut}; mod from_impls; @@ -31,7 +32,10 @@ impl DerefMut for ArrowData { macro_rules! register_array_handlers { ($(($variant:path, $array_type:ty, $type_name:expr)),* $(,)?) => { - pub fn into_vec_f64(data: &ArrowData) -> Result> { + pub fn into_vec(data: &ArrowData) -> Result> + where + T: Copy + NumCast + 'static, + { match data.data_type() { $( $variant => { @@ -39,7 +43,13 @@ macro_rules! register_array_handlers { .as_any() .downcast_ref() .context(concat!("series is not ", $type_name))?; - Ok(buffer.values().iter().map(|&v| v as f64).collect()) + + let mut result = Vec::with_capacity(buffer.len()); + for &v in buffer.values() { + let converted = NumCast::from(v).context(format!("Failed to cast value from {} to target type",$type_name))?; + result.push(converted); + } + Ok(result) } ),* // Error handling for unsupported types diff --git a/node-hub/dora-rerun/src/series.rs b/node-hub/dora-rerun/src/series.rs index 43b57cfe..931db8af 100644 --- a/node-hub/dora-rerun/src/series.rs +++ b/node-hub/dora-rerun/src/series.rs @@ -1,9 +1,9 @@ -use dora_node_api::{dora_core::config::DataId, into_vec_f64, ArrowData}; +use dora_node_api::{dora_core::config::DataId, into_vec, ArrowData}; use eyre::{Context, Result}; use rerun::RecordingStream; pub fn update_series(rec: &RecordingStream, id: DataId, data: ArrowData) -> Result<()> { - let series = into_vec_f64(&data).context("could not cast values")?; + let series = into_vec::(&data).context("could not cast values")?; for (i, value) in series.iter().enumerate() { rec.log( format!("{}_{}", id.as_str(), i),