use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Debug)]
pub struct TimePoint {
pub timestamp: i64,
pub value: f64,
}
#[derive(Debug)]
pub struct TimeSeries(pub Vec<TimePoint>);
#[derive(Debug)]
pub struct TimePointVariance {
pub timestamp: i64,
pub min: f64,
pub max: f64,
}
#[derive(Debug)]
pub struct TimeSeriesVariance(pub Vec<TimePointVariance>);
pub fn deserialize_ts<'de, D>(deserializer: D) -> Result<TimeSeries, D::Error>
where
D: Deserializer<'de>,
{
let raw: Vec<[f64; 2]> = Vec::deserialize(deserializer)?;
let points = raw
.into_iter()
.map(|arr| TimePoint {
timestamp: arr[0] as i64,
value: arr[1],
})
.collect();
Ok(TimeSeries(points))
}
pub fn deserialize_ts_inside_data<'de, D>(deserializer: D) -> Result<TimeSeries, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
struct DataWrapper {
data: Vec<[f64; 2]>,
}
let wrapper = DataWrapper::deserialize(deserializer)?;
let points = wrapper
.data
.into_iter()
.map(|arr| TimePoint {
timestamp: arr[0] as i64,
value: arr[1],
})
.collect();
Ok(TimeSeries(points))
}
pub fn deserialize_ts_variance<'de, D>(deserializer: D) -> Result<TimeSeriesVariance, D::Error>
where
D: Deserializer<'de>,
{
let raw: Vec<[f64; 3]> = Vec::deserialize(deserializer)?;
let points = raw
.into_iter()
.map(|arr| TimePointVariance {
timestamp: arr[0] as i64,
min: arr[1],
max: arr[2],
})
.collect();
Ok(TimeSeriesVariance(points))
}