summaryrefslogtreecommitdiffstats
path: root/src/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.rs')
-rw-r--r--src/parser.rs59
1 files changed, 56 insertions, 3 deletions
diff --git a/src/parser.rs b/src/parser.rs
index bfa70e7..251ec31 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -206,12 +206,14 @@ impl AmountExpr {
use iso8601::parsers::parse_date;
use iso8601::parsers::parse_datetime;
-named!(exact_date_parser<ExactDate>, alt!(
+// The order is relevant here, because datetime is longer than date, we must parse datetime before
+// date.
+named!(exact_date_parser<ExactDate>, alt_complete!(
tag!("today") => { |_| ExactDate::Today } |
tag!("yesterday") => { |_| ExactDate::Yesterday } |
tag!("tomorrow") => { |_| ExactDate::Tomorrow } |
- do_parse!(d: parse_date >> (ExactDate::Iso8601Date(d))) |
- do_parse!(d: parse_datetime >> (ExactDate::Iso8601DateTime(d)))
+ do_parse!(d: parse_datetime >> (ExactDate::Iso8601DateTime(d))) |
+ do_parse!(d: parse_date >> (ExactDate::Iso8601Date(d)))
));
#[derive(Debug, PartialEq, Eq)]
@@ -424,6 +426,57 @@ mod tests {
}
#[test]
+ fn test_parse_expressions_date() {
+ use iso8601::Date;
+ let res = exact_date_parser(&b"2017-01-01"[..]);
+ assert!(res.is_done());
+
+ match res.unwrap().1 {
+ ExactDate::Iso8601DateTime(_) => assert!(false),
+ ExactDate::Iso8601Date(d) => {
+ match d {
+ Date::YMD { year, month, day } => {
+ assert_eq!(year, 2017);
+ assert_eq!(month, 1);
+ assert_eq!(day, 1)
+ },
+ _ => assert!(false),
+ }
+ },
+ ExactDate::Tomorrow => assert!(false),
+ ExactDate::Yesterday => assert!(false),
+ ExactDate::Today => assert!(false),
+ };
+ }
+
+ #[test]
+ fn test_parse_expressions_datetime() {
+ use iso8601::Date;
+ let res = exact_date_parser(&b"2017-01-01T22:00:11"[..]);
+ assert!(res.is_done());
+
+ match res.unwrap().1 {
+ ExactDate::Iso8601DateTime(obj) => {
+ match obj.date {
+ Date::YMD { year, month, day } => {
+ assert_eq!(year, 2017);
+ assert_eq!(month, 1);
+ assert_eq!(day, 1)
+ },
+ _ => assert!(false),
+ }
+ assert_eq!(obj.time.hour, 22);
+ assert_eq!(obj.time.minute, 0);
+ assert_eq!(obj.time.second, 11);
+ },
+ ExactDate::Iso8601Date(_) => assert!(false),
+ ExactDate::Tomorrow => assert!(false),
+ ExactDate::Yesterday => assert!(false),
+ ExactDate::Today => assert!(false),
+ };
+ }
+
+ #[test]
fn test_expressions_to_date() {
let res = amount_expr(&b"5min + 12min"[..]);
assert!(res.is_done());