From 2724d2aefe2ed00410c0743a344b1670b93cf629 Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 19 Nov 2021 01:04:48 +0100 Subject: [PATCH] Parse FROM, UNTIL and EXCEPT --- src/parse.rs | 58 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/src/parse.rs b/src/parse.rs index bffae10..9a548b9 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -13,6 +13,7 @@ struct TodayfileParser; type Result = result::Result>; +#[must_use] fn fail, T>(span: Span, message: S) -> Result { Err(Error::new_from_span( ErrorVariant::CustomError { @@ -46,6 +47,31 @@ fn parse_datum(p: Pair) -> Result { } } +fn parse_date(p: Pair) -> Result { + dbg!(p); + todo!() +} + +fn parse_from(p: Pair) -> Result { + assert_eq!(p.as_rule(), Rule::from); + parse_datum(p.into_inner().next().unwrap()) +} + +fn parse_until(p: Pair) -> Result { + assert_eq!(p.as_rule(), Rule::until); + parse_datum(p.into_inner().next().unwrap()) +} + +fn parse_except(p: Pair) -> Result { + assert_eq!(p.as_rule(), Rule::except); + parse_datum(p.into_inner().next().unwrap()) +} + +fn parse_done(p: Pair) -> Result { + dbg!(p); + todo!() +} + #[derive(Default)] struct Options { when: Vec, @@ -55,26 +81,6 @@ struct Options { done: Vec, } -fn parse_date(p: Pair, opts: &mut Options) -> Result<()> { - todo!() -} - -fn parse_from(p: Pair, opts: &mut Options) -> Result<()> { - todo!() -} - -fn parse_until(p: Pair, opts: &mut Options) -> Result<()> { - todo!() -} - -fn parse_except(p: Pair, opts: &mut Options) -> Result<()> { - todo!() -} - -fn parse_done(p: Pair, opts: &mut Options) -> Result<()> { - todo!() -} - fn parse_options(p: Pair) -> Result { assert!(matches!( p.as_rule(), @@ -84,11 +90,13 @@ fn parse_options(p: Pair) -> Result { let mut opts = Options::default(); for opt in p.into_inner() { match opt.as_rule() { - Rule::date => parse_date(opt, &mut opts)?, - Rule::from => parse_from(opt, &mut opts)?, - Rule::until => parse_until(opt, &mut opts)?, - Rule::except => parse_except(opt, &mut opts)?, - Rule::done => parse_done(opt, &mut opts)?, + Rule::date => opts.when.push(parse_date(opt)?), + Rule::from if opts.from.is_none() => opts.from = Some(parse_from(opt)?), + Rule::from => fail(opt.as_span(), "FROM already defined earlier")?, + Rule::until if opts.until.is_none() => opts.until = Some(parse_until(opt)?), + Rule::until => fail(opt.as_span(), "UNTIL already defined earlier")?, + Rule::except => opts.except.push(parse_except(opt)?), + Rule::done => opts.done.push(parse_done(opt)?), _ => unreachable!(), } }