diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-08-01 01:22:08 +0200 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2021-08-01 01:22:08 +0200 |
| commit | 58fff5695603443c0b5a9b82dba3ac6a92819219 (patch) | |
| tree | 31001b7d55c2ccbe3827041eefde3ebc128a1edb /cli/src | |
| parent | 77f1c55974df0e3e9f088eb8972dae83cbae70cc (diff) | |
| download | money-58fff5695603443c0b5a9b82dba3ac6a92819219.tar.gz | |
filter on amount compares
Diffstat (limited to 'cli/src')
| -rw-r--r-- | cli/src/search.rs | 40 |
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 + } +} |
