diff options
Diffstat (limited to 'src/qif.rs')
-rw-r--r-- | src/qif.rs | 40 |
1 files changed, 31 insertions, 9 deletions
@@ -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<String>) -> 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<String>) -> Result<QifEntry, QifParsingError> { + 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( |