diff --git a/src/parse.rs b/src/parse.rs index 433eb18..097a4c6 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -31,6 +31,11 @@ fn fail, T>(span: Span, message: S) -> Result { Err(error(span, message)) } +fn parse_number(p: Pair) -> i32 { + assert_eq!(p.as_rule(), Rule::number); + p.as_str().parse().unwrap() +} + fn parse_title(p: Pair) -> String { assert_eq!(p.as_rule(), Rule::title); let p = p.into_inner().next().unwrap(); @@ -112,7 +117,7 @@ fn parse_amount(p: Pair) -> Amount { _ => unreachable!(), }) } - Rule::amount_value => value = p.as_str().parse().unwrap(), + Rule::number => value = parse_number(p), _ => unreachable!(), } } @@ -270,11 +275,6 @@ fn parse_date_fixed(p: Pair) -> Result { Ok(spec) } -fn parse_number(p: Pair) -> i32 { - assert_eq!(p.as_rule(), Rule::number); - p.as_str().parse().unwrap() -} - fn parse_boolean(p: Pair) -> bool { assert_eq!(p.as_rule(), Rule::boolean); match p.as_str() { diff --git a/src/parse/todayfile.pest b/src/parse/todayfile.pest index 117b3eb..1a9aff7 100644 --- a/src/parse/todayfile.pest +++ b/src/parse/todayfile.pest @@ -3,6 +3,8 @@ WHITESPACE = _{ !eol ~ WHITE_SPACE } rest_some = { (!eol ~ ANY)+ } rest_any = { (!eol ~ ANY)* } +number = @{ ASCII_DIGIT{1,9} } // Fits into an i32 + title = { WHITESPACE ~ rest_some ~ eol } year = @{ ASCII_DIGIT{4} } @@ -18,8 +20,7 @@ time = ${ hour ~ ":" ~ minute } weekday = { "mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun" } amount_sign = { "+" | "-" } -amount_value = @{ ASCII_DIGIT{1,9} } // Fits into an i32 -amount = { amount_sign? ~ amount_value? } +amount = { amount_sign? ~ number? } delta_weekdays = { amount ~ weekday } delta_minutes = { amount ~ "min" } delta_years = { amount ~ "y" } @@ -41,7 +42,6 @@ delta = { )+ } -number = @{ ("+" | "-")? ~ ASCII_DIGIT{1,9} } // Fits into an i32 boolean = { "true" | "false" } variable = { "mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun"