summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Worthe <justin@worthe-it.co.za>2019-01-05 21:32:48 +0200
committerJustin Worthe <justin@worthe-it.co.za>2019-01-05 21:32:48 +0200
commit3c217197966e61b469f78534ee41d838f3304c02 (patch)
tree8e9289c321b3174be3350568da84cbb17c4b086b
parent5c473e577023f426af158f59424a0edec1afd6fc (diff)
Better error handling in qif file
-rw-r--r--src/main.rs4
-rw-r--r--src/qif.rs40
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);
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<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(