summaryrefslogtreecommitdiffstats
path: root/cli/src
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-07-29 16:47:16 +0200
committerGustav Sörnäs <gustav@sornas.net>2021-07-29 16:47:16 +0200
commit2349b42a13dc6cabf92b53d370245281b73c5395 (patch)
treed74f7541049247a5ea93f19f1a55f04967de4446 /cli/src
parent0e2f1896ef8a2e4e85b4bf5e4d97f4bc8a032676 (diff)
downloadmoney-2349b42a13dc6cabf92b53d370245281b73c5395.tar.gz
date constraints
Diffstat (limited to 'cli/src')
-rw-r--r--cli/src/main.rs12
-rw-r--r--cli/src/search.rs25
2 files changed, 32 insertions, 5 deletions
diff --git a/cli/src/main.rs b/cli/src/main.rs
index 48bbb1d..d1e793d 100644
--- a/cli/src/main.rs
+++ b/cli/src/main.rs
@@ -1,4 +1,4 @@
-use chrono::naive::NaiveDate;
+use chrono::{naive::NaiveDate, Duration};
use rust_decimal::Decimal;
use std::path::PathBuf;
use std::str::FromStr;
@@ -9,7 +9,7 @@ mod search;
mod store;
mod transaction;
-use search::{Constraint, Search};
+use search::{Constraint, DateFilter, Search};
use store::Store;
use transaction::{Transaction, TransactionKind};
@@ -72,7 +72,11 @@ fn main() {
let mut store = Store::open(PathBuf::from("store")).unwrap();
let search = Search::new(store.transactions());
- let search = search.subtract(Constraint::Category("a".to_string()));
+ // let search = search.subtract(Constraint::Category("a".to_string()));
+ let search = search.subtract(Constraint::Date(DateFilter::Relative {
+ start: None,
+ end: Some(Duration::days(-2)),
+ }));
let args = Mn::from_args();
eprintln!("{:?}", args);
@@ -108,7 +112,7 @@ fn main() {
println!("{}", store.categories().join("\n"));
}
Command::Show => {
- let mut transactions = store.transactions();
+ let mut transactions = search.get();
transactions.sort_by(|t1, t2| t1.date.cmp(&t2.date));
println!("{}", Table::new(transactions).with(Style::psql()));
}
diff --git a/cli/src/search.rs b/cli/src/search.rs
index d388a8b..54eea67 100644
--- a/cli/src/search.rs
+++ b/cli/src/search.rs
@@ -27,7 +27,30 @@ impl Constraint {
fn satisfies(&self, t: &Transaction) -> bool {
match self {
Constraint::Category(category) => category == &t.category,
- Constraint::Date(_) => todo!(),
+ Constraint::Date(DateFilter::Relative {
+ start,
+ end,
+ }) => {
+ if let (Some(start), Some(end)) = (start, end) {
+ assert!(start < end);
+ }
+ let now = chrono::offset::Local::today().naive_utc();
+ let start_valid = start.map(|start| t.date > now + start).unwrap_or(true);
+ let end_valid = end.map(|end| t.date < now + end).unwrap_or(true);
+ start_valid && end_valid
+ },
+ Constraint::Date(DateFilter::Absolute {
+ start,
+ end,
+ }) => {
+ if let (Some(start), Some(end)) = (start, end) {
+ assert!(start < end);
+ }
+ let now = chrono::offset::Local::today().naive_utc();
+ let start_valid = start.map(|start| t.date > start).unwrap_or(true);
+ let end_valid = end.map(|end| t.date < end).unwrap_or(true);
+ start_valid && end_valid
+ },
}
}
}