summaryrefslogtreecommitdiffstats
path: root/cli/src/search.rs
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-08-01 01:22:08 +0200
committerGustav Sörnäs <gustav@sornas.net>2021-08-01 01:22:08 +0200
commit58fff5695603443c0b5a9b82dba3ac6a92819219 (patch)
tree31001b7d55c2ccbe3827041eefde3ebc128a1edb /cli/src/search.rs
parent77f1c55974df0e3e9f088eb8972dae83cbae70cc (diff)
downloadmoney-58fff5695603443c0b5a9b82dba3ac6a92819219.tar.gz
filter on amount compares
Diffstat (limited to 'cli/src/search.rs')
-rw-r--r--cli/src/search.rs40
1 files changed, 39 insertions, 1 deletions
diff --git a/cli/src/search.rs b/cli/src/search.rs
index 86d057b..c19437f 100644
--- a/cli/src/search.rs
+++ b/cli/src/search.rs
@@ -1,4 +1,6 @@
use chrono::{naive::NaiveDate, Duration};
+use rust_decimal::Decimal;
+use std::str::FromStr;
use crate::transaction::{Category, Transaction};
@@ -40,11 +42,20 @@ impl DateIsh {
}
}
+pub enum Comparison {
+ Equal,
+ Greater,
+ GreaterOrEqual,
+ Less,
+ LessOrEqual,
+}
+
pub enum Constraint {
Category(Category),
Before(DateIsh),
After(DateIsh),
- On(DateIsh)
+ On(DateIsh),
+ AmountCompare(Decimal, Comparison),
}
impl Constraint {
@@ -54,6 +65,13 @@ impl Constraint {
Constraint::Before(date) => transaction.date < date.clone().get(),
Constraint::After(date) => transaction.date >= date.clone().get(),
Constraint::On(date) => transaction.date == date.clone().get(),
+ Constraint::AmountCompare(amount, comparison) => match comparison {
+ Comparison::Equal => &transaction.amount == amount,
+ Comparison::Greater => &transaction.amount > amount,
+ Comparison::GreaterOrEqual => &transaction.amount >= amount,
+ Comparison::Less => &transaction.amount < amount,
+ Comparison::LessOrEqual => &transaction.amount <= amount,
+ }
}
}
}
@@ -137,6 +155,10 @@ impl<'t> Search<'t> {
("before", date_ish) => Constraint::Before(DateIsh::parse(date_ish)),
("after", date_ish) => Constraint::After(DateIsh::parse(date_ish)),
("on", date_ish) => Constraint::On(DateIsh::parse(date_ish)),
+ ("amount", comparison) => {
+ let (amount, comparison) = parse_comparison(comparison).unwrap();
+ Constraint::AmountCompare(amount, comparison)
+ }
_ => panic!(),
};
@@ -145,3 +167,19 @@ impl<'t> Search<'t> {
self
}
}
+
+fn parse_comparison(s: &str) -> Option<(Decimal, Comparison)> {
+ if s.starts_with(">=") {
+ Some((Decimal::from_str(&s[2..]).ok()?, Comparison::GreaterOrEqual))
+ } else if s.starts_with("<=") {
+ Some((Decimal::from_str(&s[2..]).ok()?, Comparison::LessOrEqual))
+ } else if s.starts_with("=") {
+ Some((Decimal::from_str(&s[1..]).ok()?, Comparison::Equal))
+ } else if s.starts_with(">") {
+ Some((Decimal::from_str(&s[1..]).ok()?, Comparison::Greater))
+ } else if s.starts_with("<") {
+ Some((Decimal::from_str(&s[1..]).ok()?, Comparison::Less))
+ } else {
+ None
+ }
+}