Improved csv reading and cleanup up serialization.
[?]
Jul 13, 2021, 9:42 AM
YMV7RPQ5TFBETNHRMS26MGHJXEAYRMIF4F7Z6ITGRCG65TOGSNDACDependencies
- [2]
IYW574EKCreated RegularTimeSeriesIter. - [3]
XCCNAGMZCreated with_range() fn on RegularTimeSeries. - [4]
QYLGEDIVFirst record. - [5]
XIWTRGR6Prepare to make external iterator for TimeSeries.
Change contents
- edit in src/lib.rs at line 5
pub mod error;use crate::error::*; - edit in src/lib.rs at line 12
use std::fmt::Display; - replacement in src/lib.rs at line 41
self.0 % 12self.0 % 12 + 1 - replacement in src/lib.rs at line 73
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>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
/// 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
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)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
if self.0.is_empty() { return Err(Error::NoPoint1s) };if self.0.len() == 1 { return Err(Error::OnePoint1) };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
#[derive(Debug, Serialize)]#[derive(Debug)] - edit in src/lib.rs at line 289
impl<const N: usize> Serialize for RegularTimeSeries<N> {fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>whereS: Serializer,{serializer.serialize_newtype_struct("RegularTimeSeries", &self.ts)}} - edit in src/lib.rs at line 328
} - edit in src/lib.rs at line 330
impl<const N: usize> RegularTimeSeries<N> { - replacement in src/lib.rs at line 518
fn try_from(ts: TimeSeries<N>) -> Result<Self, Self::Error> {fn try_from(ts: TimeSeries<N>) -> std::result::Result<Self, Self::Error> { - replacement in src/lib.rs at line 527
false => Err(Error::NotRegular),false => Err(expected_regular_time_series()), - replacement in src/lib.rs at line 540
Deserialize, Deserializer, Serialize, Serializer,Deserialize, Serialize, Serializer,// Deserializer - replacement in src/lib.rs at line 585
pub fn deserialize<'de, D, T, const N: usize>(deserializer: D) -> Result<[T; N], D::Error>whereD: Deserializer<'de>,T: Deserialize<'de>,{deserializer.deserialize_tuple(N, ArrayVisitor::<T, N>(PhantomData))}// 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[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.",))}