meteosuisse 0.1.0

A reverse engineered wrapper around MétéoSuisse / MeteoSchweiz / MeteoSvizzera / MeteoSwiss
Documentation
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))
}