From 3c217197966e61b469f78534ee41d838f3304c02 Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Sat, 5 Jan 2019 21:32:48 +0200 Subject: Better error handling in qif file --- src/main.rs | 4 +++- src/qif.rs | 40 +++++++++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/main.rs b/src/main.rs index e39f589..d5e8ced 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,7 @@ use std::path::PathBuf; use std::result::Result; use std::fs::File; +use std::error::Error; fn parse_filepath(str: &OsStr) -> Result { let path: PathBuf = ::std::convert::From::from(str); @@ -49,7 +50,8 @@ fn main() -> Result<(), Box> { for line_result in lines { let line = line_result?; if line == String::from("^") { - qif_file.push(QifEntry::new(&next_entry)); + let new_qif_entry = QifEntry::new(&next_entry)?; + qif_file.push(new_qif_entry); next_entry.clear(); } else { next_entry.push(line); diff --git a/src/qif.rs b/src/qif.rs index 687c570..6854ec7 100644 --- a/src/qif.rs +++ b/src/qif.rs @@ -1,5 +1,7 @@ use std::fmt; use regex::Regex; +use std::result::Result; +use std::error::Error; pub struct QifFile { header: String, @@ -45,15 +47,35 @@ const DATE_PREFIX: &str = "D"; const AMOUNT_PREFIX: &str = "T"; const DESCRIPTION_PREFIX: &str = "M"; +#[derive(Debug)] +pub enum QifParsingError { + MissingDate, + MissingAmount, + MissingDescription +} + +impl fmt::Display for QifParsingError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{:?}", self) + } +} + +impl Error for QifParsingError {} + impl QifEntry { - pub fn new(lines: &Vec) -> QifEntry { - let date = lines.iter().find(|l| l.starts_with(DATE_PREFIX)).expect("No date"); - let amount = lines.iter().find(|l| l.starts_with(AMOUNT_PREFIX)).expect("No amount"); - let description = lines.iter().find(|l| l.starts_with(DESCRIPTION_PREFIX)).expect("No description"); - QifEntry { - date: date.chars().skip(1).collect(), - amount: amount.chars().skip(1).collect(), - description: description.chars().skip(1).collect() + pub fn new(lines: &Vec) -> Result { + let date = lines.iter().find(|l| l.starts_with(DATE_PREFIX)); + let amount = lines.iter().find(|l| l.starts_with(AMOUNT_PREFIX)); + let description = lines.iter().find(|l| l.starts_with(DESCRIPTION_PREFIX)); + match (date, amount, description) { + (Some(date), Some(amount), Some(description)) => Ok(QifEntry { + date: date.chars().skip(1).collect(), + amount: amount.chars().skip(1).collect(), + description: description.chars().skip(1).collect() + }), + (None, _, _) => Err(QifParsingError::MissingDate), + (_, None, _) => Err(QifParsingError::MissingAmount), + (_, _, None) => Err(QifParsingError::MissingDescription), } } @@ -103,7 +125,7 @@ fn replace_common(text: &str) -> String { (Regex::new(r"(?i)CELL C").unwrap(), "Cell C"), (Regex::new(r"(?i)ELECTRICITY").unwrap(), "Electricity"), (Regex::new(r"(?i)(COUNTRY VIEW|STAR STOP|Shell|Sasol)").unwrap(), "Petrol"), - (Regex::new(r"(?i)kung ?fu").unwrap(), "Kungfu Kitchen"), + (Regex::new(r"(?i)kung ?-?fu").unwrap(), "Kungfu Kitchen"), ); } COMMON_NAMES.iter().fold( -- cgit v1.2.3