Initial import of just-about-working version

This commit is contained in:
2026-04-30 15:46:22 +02:00
commit f8f1165db7
8 changed files with 2414 additions and 0 deletions
+43
View File
@@ -0,0 +1,43 @@
mod transaction;
pub use transaction::Transaction;
pub mod ynab;
use csv::ReaderBuilder;
use std::io::Read;
enum BankFormat {
Bulder,
}
impl BankFormat {
fn from_str(format: &str) -> Result<BankFormat, String> {
match format {
"bulder" => Ok(BankFormat::Bulder),
_ => Err(format!("Bank '{}' not found", format)),
}
}
fn reader<R: Read>(&self, input: R) -> csv::Reader<R> {
match self {
BankFormat::Bulder => ReaderBuilder::new()
.has_headers(true)
.delimiter(b';')
.from_reader(input),
}
}
fn transform(&self, record: &csv::StringRecord) -> Result<Transaction, String> {
match self {
BankFormat::Bulder => Transaction::from_fields(&record[0], &record[9], &record[1]),
}
}
}
pub fn read_transactions<R: Read>(input: R, format: &str) -> Result<Vec<Transaction>, String> {
let format = BankFormat::from_str(format).unwrap();
format
.reader(input)
.records()
.map(|r| r.map_err(|e| format!("parse error: {}", e)))
.map(|r| r.and_then(|r| format.transform(&r)))
.collect::<Result<Vec<_>, _>>()
}