Improved csv reading and cleanup up serialization.

[?]
Jul 13, 2021, 9:42 AM
YMV7RPQ5TFBETNHRMS26MGHJXEAYRMIF4F7Z6ITGRCG65TOGSNDAC

Dependencies

  • [2] IYW574EK Created RegularTimeSeriesIter.
  • [3] XCCNAGMZ Created with_range() fn on RegularTimeSeries.
  • [4] QYLGEDIV First record.
  • [5] XIWTRGR6 Prepare to make external iterator for TimeSeries.

Change contents

  • edit in src/lib.rs at line 5
    [4.78]
    [4.112]
    pub mod error;
    use crate::error::*;
  • edit in src/lib.rs at line 12
    [4.236][2.129:152]()
    use std::fmt::Display;
  • replacement in src/lib.rs at line 41
    [4.789][4.789:809]()
    self.0 % 12
    [4.789]
    [4.809]
    self.0 % 12 + 1
  • replacement in src/lib.rs at line 73
    [4.96][4.96:165]()
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    [4.96]
    [4.165]
    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
  • edit in src/lib.rs at line 103
    [2.767][2.767:776](),[2.776][4.1806:1893](),[4.1806][4.1806:1893](),[4.1898][4.1898:1995](),[4.1996][4.1996:2046](),[4.2047][4.2047:2111](),[4.2112][4.2112:2279]()
    }
    }
    /// Errors. TODO: Should be moved to its own module.
    #[derive(Debug)]
    pub enum Error {
    /// Tried to construct a `RegularTimeSeries` from an irregular `TimeSeries`.
    NotRegular,
    /// The `TimeSeries` is empty.
    NoPoint1s,
    /// The `TimeSeries` has only one datapoint.
    OnePoint1,
    /// Could not parse date.
    ParseErr,
    }
    impl Display for Error {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    write!(f, "{:?}", self)
  • edit in src/lib.rs at line 141
    [4.3444]
    [4.3444]
    /// Push a `DatePoint` onto `Self`.
    pub fn push(&mut self, date_point: DatePoint<N>) {
    self.0.push(date_point)
    }
  • replacement in src/lib.rs at line 147
    [4.3499][4.3499:3962]()
    pub fn from_csv(path: &str) -> TimeSeries<1> {
    let s = fs::read_to_string(path).unwrap();
    let v = s.lines().map(|line| {
    DatePoint::<1>::new(
    MonthlyDate::ym(
    line[..4].parse().unwrap(),
    line[5..7].parse().unwrap(),
    ),
    [line[12..].parse::<f32>().unwrap()],
    )
    }).collect::<Vec<DatePoint::<1>>>();
    TimeSeries::new(v)
    [4.3499]
    [4.3962]
    pub fn from_csv(path: &str) -> Result<TimeSeries<1>, Error> {
    let s = match fs::read_to_string(path) {
    Ok(s) => s,
    Err(_) => {
    println!("Could not find file [{}].", path);
    panic!()
    },
    };
    let mut v: Vec<DatePoint<1>> = Vec::new();
    for (i, line) in s.lines().enumerate() {
    let year = match line[..4].parse() {
    Ok(y) => y,
    Err(_) => {
    return Err(failed_to_parse_csv_date(path, i + 1, line))
    },
    };
    let month = match line[5..7].parse() {
    Ok(m) => m,
    Err(_) => {
    return Err(failed_to_parse_csv_date(path, i + 1, line))
    },
    };
    let value = match line[12..].parse::<f32>() {
    Ok(value) => value,
    Err(_) => {
    return Err(failed_to_parse_csv_value(path, i + 1, line))
    },
    };
    let dp = DatePoint::<1>::new(
    MonthlyDate::ym(year, month),
    [value],
    );
    v.push(dp);
    }
    Ok(TimeSeries::new(v))
  • replacement in src/lib.rs at line 200
    [4.4384][4.4384:4510]()
    if self.0.is_empty() { return Err(Error::NoPoint1s) };
    if self.0.len() == 1 { return Err(Error::OnePoint1) };
    [4.4384]
    [4.4510]
    if self.0.is_empty() { return Err(time_series_is_empty()) };
    if self.0.len() == 1 { return Err(time_series_has_only_one_point()) };
  • replacement in src/lib.rs at line 283
    [4.5184][4.5184:5212]()
    #[derive(Debug, Serialize)]
    [4.5184]
    [4.5212]
    #[derive(Debug)]
  • edit in src/lib.rs at line 289
    [4.297]
    [4.297]
    impl<const N: usize> Serialize for RegularTimeSeries<N> {
    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
    where
    S: Serializer,
    {
    serializer.serialize_newtype_struct("RegularTimeSeries", &self.ts)
    }
    }
  • edit in src/lib.rs at line 328
    [4.1546]
    [3.0]
    }
  • edit in src/lib.rs at line 330
    [3.1]
    [3.1]
    impl<const N: usize> RegularTimeSeries<N> {
  • replacement in src/lib.rs at line 518
    [4.8251][4.8251:8317]()
    fn try_from(ts: TimeSeries<N>) -> Result<Self, Self::Error> {
    [4.8251]
    [4.8317]
    fn try_from(ts: TimeSeries<N>) -> std::result::Result<Self, Self::Error> {
  • replacement in src/lib.rs at line 527
    [4.8597][4.8597:8642]()
    false => Err(Error::NotRegular),
    [4.8597]
    [4.8642]
    false => Err(expected_regular_time_series()),
  • replacement in src/lib.rs at line 540
    [4.8859][4.8859:8917]()
    Deserialize, Deserializer, Serialize, Serializer,
    [4.8859]
    [4.8917]
    Deserialize, Serialize, Serializer,
    // Deserializer
  • replacement in src/lib.rs at line 585
    [4.10214][4.10214:10467]()
    pub fn deserialize<'de, D, T, const N: usize>(deserializer: D) -> Result<[T; N], D::Error>
    where
    D: Deserializer<'de>,
    T: Deserialize<'de>,
    {
    deserializer.deserialize_tuple(N, ArrayVisitor::<T, N>(PhantomData))
    }
    [4.10214]
    [4.10467]
    // pub fn deserialize<'de, D, T, const N: usize>(deserializer: D) -> Result<[T; N], D::Error>
    // where
    // D: Deserializer<'de>,
    // T: Deserialize<'de>,
    // {
    // deserializer.deserialize_tuple(N, ArrayVisitor::<T, N>(PhantomData))
    // }
  • file addition: error.rs (-xw-xw-x--)
    [4.6]
    use std::fmt;
    /// A time_series error.
    #[derive(Debug)]
    pub struct Error(String);
    impl fmt::Display for Error {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    write!(f, "{}", self.0)
    }
    }
    ///
    pub fn expected_regular_time_series() -> Error {
    Error(format!(
    "[time_series:01] Expected regular time-series."
    ))
    }
    ///
    pub fn failed_to_parse_csv_date(file: &str, line_num: usize, line: &str) -> Error {
    Error(format!(
    "[time_series:02] Line: {} file: {}, . Failed to parse date on line [{}].",
    line_num,
    file,
    line,
    ))
    }
    ///
    pub fn failed_to_parse_csv_value(file: &str, line_num: usize, line: &str) -> Error {
    Error(format!(
    "[time_series:03] Line: {} file: {}. Failed to parse value on line [{}].",
    line_num,
    file,
    line,
    ))
    }
    pub fn time_series_has_only_one_point() -> Error {
    Error(format!(
    "[time_series:04] Time-series has only one point.",
    ))
    }
    pub fn time_series_is_empty() -> Error {
    Error(format!(
    "[time_series:05] Time-series is empty.",
    ))
    }