From 49e14e27165ef5dd1884e6d31cd5ff39314118be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Mon, 2 Aug 2021 23:22:50 +0200 Subject: initial nom filter parsing --- cli/src/search.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'cli/src/search.rs') diff --git a/cli/src/search.rs b/cli/src/search.rs index d140caf..b11ee78 100644 --- a/cli/src/search.rs +++ b/cli/src/search.rs @@ -1,4 +1,5 @@ use chrono::{naive::NaiveDate, Duration}; +use nom::{branch::alt, character::complete::char, combinator::map, sequence::tuple}; use rust_decimal::Decimal; use std::str::FromStr; @@ -98,6 +99,10 @@ impl Constraint { } } } + + fn parse(i: &str) -> nom::IResult<&str, Self> { + todo!() + } } #[derive(Clone)] @@ -107,6 +112,28 @@ pub enum Filter { Subtract(Constraint), } +impl Filter { + fn parse(i: &str) -> nom::IResult<&str, Self> { + alt(( + map( + tuple(( + char('+'), + Constraint::parse, + )), + |(_, constraint)| Filter::Union(constraint) + ), + map( + tuple(( + char('-'), + Constraint::parse, + )), + |(_, constraint)| Filter::Subtract(constraint) + ), + map(Constraint::parse, Filter::Intersect), + ))(i) + } +} + #[derive(Clone)] pub struct Search<'t> { filtered: Vec, -- cgit v1.2.1