diff --git a/Cargo.lock b/Cargo.lock index 7a7468f..de623e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -249,7 +249,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "charming" -version = "0.2.4" +version = "0.2.5" dependencies = [ "deno_core", "handlebars", diff --git a/charming/src/datatype/source.rs b/charming/src/datatype/source.rs index 84ac87b..b55f2b0 100644 --- a/charming/src/datatype/source.rs +++ b/charming/src/datatype/source.rs @@ -5,17 +5,37 @@ use super::CompositeValue; #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize)] #[serde(untagged)] pub enum DataSource { - Integers(Vec>), + Integers(Vec>), Floats(Vec>), Mixed(Vec>), } impl From>> for DataSource { fn from(v: Vec>) -> Self { + let t: Vec> = v + .iter() + .map(|x| x.iter().map(|y| *y as i64).collect()) + .collect(); + DataSource::Integers(t) + } +} + +impl From>> for DataSource { + fn from(v: Vec>) -> Self { DataSource::Integers(v) } } +impl From>> for DataSource { + fn from(v: Vec>) -> Self { + let t: Vec> = v + .iter() + .map(|x| x.iter().map(|y| *y as f64).collect()) + .collect(); + DataSource::Floats(t) + } +} + impl From>> for DataSource { fn from(v: Vec>) -> Self { DataSource::Floats(v) @@ -45,6 +65,7 @@ macro_rules! ds { #[cfg(test)] mod test { + use crate::datatype::NumericValue; use super::*; @@ -55,6 +76,19 @@ mod test { assert_eq!(n, NumericValue::Integer(42)); } + #[test] + fn numeric_value_from_i64() { + let n: NumericValue = 42i64.into(); + assert_eq!(n, NumericValue::Integer(42)); + } + + #[test] + #[should_panic] + fn numeric_value_from_f32() { + let n: NumericValue = 0.618f32.into(); + assert_eq!(n, NumericValue::Float(0.618)); + } + #[test] fn numeric_value_from_f64() { let n: NumericValue = 0.618f64.into(); @@ -75,22 +109,51 @@ mod test { #[test] fn data_frame_from_integers() { - let ds: DataSource = vec![vec![1, 2, 3], vec![4, 5, 6]].into(); - assert_eq!(ds, DataSource::Integers(vec![vec![1, 2, 3], vec![4, 5, 6]])); + let ds: DataSource = vec![vec![1i32, 2i32, 3i32], vec![4i32, 5i32, 6i32]].into(); + assert_eq!( + ds, + DataSource::Integers(vec![vec![1i64, 2i64, 3i64], vec![4i64, 5i64, 6i64]]) + ); + } + + #[test] + fn data_frame_from_bigintegers() { + let ds: DataSource = vec![vec![1i64, 2i64, 3i64], vec![4i64, 5i64, 6i64]].into(); + assert_eq!( + ds, + DataSource::Integers(vec![vec![1i64, 2i64, 3i64], vec![4i64, 5i64, 6i64]]) + ); } #[test] fn data_frame_from_floats() { - let ds: DataSource = vec![vec![1.0, 2.0, 3.0], vec![4.0, 5.0, 6.0]].into(); + let ds: DataSource = + vec![vec![1.0f32, 2.0f32, 3.0f32], vec![4.0f32, 5.0f32, 6.0f32]].into(); assert_eq!( ds, - DataSource::Floats(vec![vec![1.0, 2.0, 3.0], vec![4.0, 5.0, 6.0]]) + DataSource::Floats(vec![ + vec![1.0f64, 2.0f64, 3.0f64], + vec![4.0f64, 5.0f64, 6.0f64] + ]) + ); + } + + #[test] + fn data_frame_from_bigfloats() { + let ds: DataSource = + vec![vec![1.0f64, 2.0f64, 3.0f64], vec![4.0f64, 5.0f64, 6.0f64]].into(); + assert_eq!( + ds, + DataSource::Floats(vec![ + vec![1.0f64, 2.0f64, 3.0f64], + vec![4.0f64, 5.0f64, 6.0f64] + ]) ); } #[test] fn data_frame_from_mixed() { - let ds = ds!([1, "Tuesday", 3.0], ["Monday", 2, "Wednesday"]); + let ds = ds!([1i32, "Tuesday", 3.0f32], ["Monday", 2i32, "Wednesday"]); assert_eq!( ds, DataSource::Mixed(vec![ diff --git a/charming/src/datatype/value.rs b/charming/src/datatype/value.rs index 07c8865..1f0f4dd 100644 --- a/charming/src/datatype/value.rs +++ b/charming/src/datatype/value.rs @@ -3,16 +3,28 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize)] #[serde(untagged)] pub enum NumericValue { - Integer(i32), + Integer(i64), Float(f64), } impl From for NumericValue { fn from(n: i32) -> Self { + NumericValue::Integer(n as i64) + } +} + +impl From for NumericValue { + fn from(n: i64) -> Self { NumericValue::Integer(n) } } +impl From for NumericValue { + fn from(n: f32) -> Self { + NumericValue::Float(n as f64) + } +} + impl From for NumericValue { fn from(n: f64) -> Self { NumericValue::Float(n)