diff --git a/src/files/commands.rs b/src/files/commands.rs index 80a9065..a699ce3 100644 --- a/src/files/commands.rs +++ b/src/files/commands.rs @@ -267,6 +267,7 @@ pub enum Statement { from: NaiveDate, to: NaiveDate, }, + Remind(Option>), } #[derive(Debug, Clone, Copy)] diff --git a/src/files/format.rs b/src/files/format.rs index 81fa4e0..a7764f4 100644 --- a/src/files/format.rs +++ b/src/files/format.rs @@ -221,6 +221,8 @@ impl fmt::Display for Statement { Statement::Until(None) => writeln!(f, "UNTIL *"), Statement::Except(date) => writeln!(f, "EXCEPT {}", date), Statement::Move { from, to, .. } => writeln!(f, "MOVE {} TO {}", from, to), + Statement::Remind(Some(delta)) => writeln!(f, "REMIND {}", delta), + Statement::Remind(None) => writeln!(f, "REMIND *"), } } } diff --git a/src/files/grammar.pest b/src/files/grammar.pest index c999230..d071cbb 100644 --- a/src/files/grammar.pest +++ b/src/files/grammar.pest @@ -107,8 +107,9 @@ stmt_from = !{ "FROM" ~ (datum | "*") ~ eol } stmt_until = !{ "UNTIL" ~ (datum | "*") ~ eol } stmt_except = !{ "EXCEPT" ~ datum ~ eol } stmt_move = !{ "MOVE" ~ datum ~ "TO" ~ datum ~ eol } +stmt_remind = !{ "REMIND" ~ (delta | "*") ~ eol } -statements = { (stmt_date | stmt_bdate | stmt_from | stmt_until | stmt_except | stmt_move)* } +statements = { (stmt_date | stmt_bdate | stmt_from | stmt_until | stmt_except | stmt_move | stmt_remind)* } donedate = { datum ~ time ~ "--" ~ datum ~ time diff --git a/src/files/parse.rs b/src/files/parse.rs index d8807b9..cfcaaf6 100644 --- a/src/files/parse.rs +++ b/src/files/parse.rs @@ -623,6 +623,17 @@ fn parse_stmt_move(p: Pair<'_, Rule>) -> Result { Ok(Statement::Move { span, from, to }) } +fn parse_stmt_remind(p: Pair<'_, Rule>) -> Result { + assert_eq!(p.as_rule(), Rule::stmt_remind); + let mut p = p.into_inner(); + let delta = match p.next() { + Some(p) => Some(parse_delta(p)?), + None => None, + }; + assert_eq!(p.next(), None); + Ok(Statement::Remind(delta)) +} + fn parse_statements(p: Pair<'_, Rule>, task: bool) -> Result> { assert_eq!(p.as_rule(), Rule::statements); let mut statements = vec![]; @@ -635,6 +646,7 @@ fn parse_statements(p: Pair<'_, Rule>, task: bool) -> Result> { Rule::stmt_until => parse_stmt_until(p)?, Rule::stmt_except => parse_stmt_except(p)?, Rule::stmt_move => parse_stmt_move(p)?, + Rule::stmt_remind => parse_stmt_remind(p)?, _ => unreachable!(), }); }