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/qif.rs | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) (limited to 'src/qif.rs') 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