diff options
author | Justin Worthe <justin@worthe-it.co.za> | 2019-01-05 21:32:48 +0200 |
---|---|---|
committer | Justin Worthe <justin@worthe-it.co.za> | 2019-01-05 21:32:48 +0200 |
commit | 3c217197966e61b469f78534ee41d838f3304c02 (patch) | |
tree | 8e9289c321b3174be3350568da84cbb17c4b086b | |
parent | 5c473e577023f426af158f59424a0edec1afd6fc (diff) |
Better error handling in qif file
-rw-r--r-- | src/main.rs | 4 | ||||
-rw-r--r-- | 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<PathBuf, OsString> { let path: PathBuf = ::std::convert::From::from(str); @@ -49,7 +50,8 @@ fn main() -> Result<(), Box<Error>> { 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); @@ -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( |