summaryrefslogtreecommitdiff
path: root/src/qif.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/qif.rs')
-rw-r--r--src/qif.rs40
1 files changed, 31 insertions, 9 deletions
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(