From f42cf01a158eb2af9f1682312e2f838f949d1340 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 2 May 2022 12:49:03 +0200 Subject: [PATCH] Fix cli arg anchoring --- CHANGELOG.md | 3 +++ src/files/cli.rs | 31 +++++++++++++++++++++++++------ src/files/grammar.pest | 9 +++++++-- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c219af..9edef0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Changed - Birthdays for current day are now highlighted +### Fixed +- `--date` accepting incomplete expressions + ## 0.2.0 - 2022-03-18 ### Added diff --git a/src/files/cli.rs b/src/files/cli.rs index 6f72ca9..ddd804f 100644 --- a/src/files/cli.rs +++ b/src/files/cli.rs @@ -57,11 +57,17 @@ fn parse_cli_date(p: Pair<'_, Rule>) -> Result { Ok(CliDate { datum, delta }) } +fn parse_cli_date_arg(p: Pair<'_, Rule>) -> Result { + assert_eq!(p.as_rule(), Rule::cli_date_arg); + let p = p.into_inner().next().unwrap(); + parse_cli_date(p) +} + impl FromStr for CliDate { type Err = ParseError<()>; fn from_str(s: &str) -> result::Result> { - from_str_via_parse(s, Rule::cli_date, parse_cli_date) + from_str_via_parse(s, Rule::cli_date_arg, parse_cli_date_arg) } } @@ -81,11 +87,17 @@ fn parse_cli_ident(p: Pair<'_, Rule>) -> Result { }) } +fn parse_cli_ident_arg(p: Pair<'_, Rule>) -> Result { + assert_eq!(p.as_rule(), Rule::cli_ident_arg); + let p = p.into_inner().next().unwrap(); + parse_cli_ident(p) +} + impl FromStr for CliIdent { type Err = ParseError<()>; fn from_str(s: &str) -> result::Result> { - from_str_via_parse(s, Rule::cli_ident, parse_cli_ident) + from_str_via_parse(s, Rule::cli_ident_arg, parse_cli_ident_arg) } } @@ -135,11 +147,12 @@ fn parse_cli_range(p: Pair<'_, Rule>) -> Result { let (start, start_delta) = parse_cli_range_start(p.next().unwrap())?; let (end, end_delta) = match p.next() { - // For some reason, the EOI gets captured but the SOI doesn't. - Some(p) if p.as_rule() != Rule::EOI => parse_cli_range_end(p)?, - _ => (None, None), + Some(p) => parse_cli_range_end(p)?, + None => (None, None), }; + assert_eq!(p.next(), None); + Ok(CliRange { start, start_delta, @@ -148,11 +161,17 @@ fn parse_cli_range(p: Pair<'_, Rule>) -> Result { }) } +fn parse_cli_range_arg(p: Pair<'_, Rule>) -> Result { + assert_eq!(p.as_rule(), Rule::cli_range_arg); + let p = p.into_inner().next().unwrap(); + parse_cli_range(p) +} + impl FromStr for CliRange { type Err = ParseError<()>; fn from_str(s: &str) -> result::Result> { - from_str_via_parse(s, Rule::cli_range, parse_cli_range) + from_str_via_parse(s, Rule::cli_range_arg, parse_cli_range_arg) } } diff --git a/src/files/grammar.pest b/src/files/grammar.pest index 894a695..278c4b6 100644 --- a/src/files/grammar.pest +++ b/src/files/grammar.pest @@ -152,8 +152,13 @@ file = ${ SOI ~ (empty_line* ~ command)* ~ empty_line* ~ WHITESPACE* ~ EOI } today = { "today" | "t" } cli_datum = { datum | today } cli_date = { cli_datum ~ delta? } -cli_ident = { SOI ~ (cli_date | number) ~ EOI } +cli_ident = { cli_date | number } cli_range_start = { cli_datum ~ delta? } cli_range_end = { cli_datum ~ delta? | delta } -cli_range = { SOI ~ cli_range_start ~ ("--" ~ cli_range_end)? ~ EOI } +cli_range = { cli_range_start ~ ("--" ~ cli_range_end)? } + +cli_date_arg = { SOI ~ cli_date ~ EOI } +cli_ident_arg = { SOI ~ cli_ident ~ EOI } +cli_range_arg = { SOI ~ cli_range ~ EOI } + cli_command = ${ SOI ~ empty_line* ~ command ~ empty_line* ~ WHITESPACE* ~ EOI }