@@ -267,7 +267,6 @@ pub fn rules_datetime(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
267267 a. value ( ) . the_nth_not_immediate ( 0 )
268268 }
269269 ) ;
270- // TODO: add restrictions on datetime form
271270 b. rule_2 ( "this <datetime>" ,
272271 b. reg ( r#"the|this|current|coming"# ) ?,
273272 datetime_check ! ( |datetime: & DatetimeValue | !form!( Form :: PartOfDay ( _) ) ( datetime) && !form!( Form :: Meal ) ( datetime) ) ,
@@ -277,7 +276,6 @@ pub fn rules_datetime(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
277276 . datetime_kind ( a. value ( ) . datetime_kind . clone ( ) ) )
278277 }
279278 ) ;
280- // TODO: add restrictions on datetime form
281279 b. rule_2 ( "next <datetime>" ,
282280 b. reg ( r#"(?:the |this )?next"# ) ?,
283281 datetime_check ! ( |datetime: & DatetimeValue | !form!( Form :: PartOfDay ( _) ) ( datetime) && !form!( Form :: Meal ) ( datetime) ) ,
@@ -287,7 +285,6 @@ pub fn rules_datetime(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
287285 . datetime_kind ( a. value ( ) . datetime_kind . clone ( ) ) )
288286 }
289287 ) ;
290- // TODO: add restrictions on datetime form
291288 b. rule_2 ( "last <datetime>" ,
292289 b. reg ( r#"this past|(?:the |this )?last"# ) ?,
293290 datetime_check ! ( |datetime: & DatetimeValue | !form!( Form :: PartOfDay ( _) ) ( datetime) && !form!( Form :: Meal ) ( datetime) ) ,
@@ -434,19 +431,15 @@ pub fn rules_datetime(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
434431 ordinal_check ! ( |ordinal: & OrdinalValue | 1 <= ordinal. value && ordinal. value <= 31 ) ,
435432 |month, ordinal| {
436433 let m = month. value ( ) . form_month ( ) ?;
437- let form = Form :: MonthDay ( Some ( MonthDayForm { month : m, day_of_month : ordinal. value ( ) . value as u32 } ) ) ;
438- Ok ( month. value ( ) . intersect ( & helpers:: day_of_month ( ordinal. value ( ) . value as u32 ) ?) ?
439- . form ( form) )
440-
434+ helpers:: month_day ( m, ordinal. value ( ) . value as u32 )
441435 }
442436 ) ;
443437 b. rule_2 ( "<named-month> <day-of-month> (non ordinal)" ,
444438 datetime_check ! ( form!( Form :: Month ( _) ) ) ,
445439 integer_check_by_range ! ( 1 , 31 ) ,
446440 |month, integer| {
447441 let m = month. value ( ) . form_month ( ) ?;
448- let form = Form :: MonthDay ( Some ( MonthDayForm { month : m, day_of_month : integer. value ( ) . value as u32 } ) ) ;
449- Ok ( month. value ( ) . intersect ( & helpers:: day_of_month ( integer. value ( ) . value as u32 ) ?) ?. form ( form) )
442+ helpers:: month_day ( m, integer. value ( ) . value as u32 )
450443 }
451444 ) ;
452445 b. rule_3 ( "<named-month> the <day-of-month> (non ordinal)" ,
@@ -455,8 +448,7 @@ pub fn rules_datetime(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
455448 integer_check_by_range ! ( 1 , 31 ) ,
456449 |month, _, integer| {
457450 let m = month. value ( ) . form_month ( ) ?;
458- let form = Form :: MonthDay ( Some ( MonthDayForm { month : m, day_of_month : integer. value ( ) . value as u32 } ) ) ;
459- Ok ( month. value ( ) . intersect ( & helpers:: day_of_month ( integer. value ( ) . value as u32 ) ?) ?. form ( form) )
451+ helpers:: month_day ( m, integer. value ( ) . value as u32 )
460452 }
461453 ) ;
462454 b. rule_3 ( "<day-of-month> (ordinal) of <named-month>" ,
@@ -465,8 +457,7 @@ pub fn rules_datetime(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
465457 datetime_check ! ( form!( Form :: Month ( _) ) ) ,
466458 |ordinal, _, month| {
467459 let m = month. value ( ) . form_month ( ) ?;
468- let form = Form :: MonthDay ( Some ( MonthDayForm { month : m, day_of_month : ordinal. value ( ) . value as u32 } ) ) ;
469- Ok ( month. value ( ) . intersect ( & helpers:: day_of_month ( ordinal. value ( ) . value as u32 ) ?) ?. form ( form) )
460+ helpers:: month_day ( m, ordinal. value ( ) . value as u32 )
470461 }
471462 ) ;
472463 b. rule_3 ( "<day-of-month> (non ordinal) of <named-month>" ,
@@ -475,26 +466,23 @@ pub fn rules_datetime(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
475466 datetime_check ! ( form!( Form :: Month ( _) ) ) ,
476467 |integer, _, month| {
477468 let m = month. value ( ) . form_month ( ) ?;
478- let form = Form :: MonthDay ( Some ( MonthDayForm { month : m, day_of_month : integer. value ( ) . value as u32 } ) ) ;
479- Ok ( month. value ( ) . intersect ( & helpers:: day_of_month ( integer. value ( ) . value as u32 ) ?) ?. form ( form) )
469+ helpers:: month_day ( m, integer. value ( ) . value as u32 )
480470 }
481471 ) ;
482472 b. rule_2 ( "<day-of-month> (non ordinal) <named-month>" ,
483473 integer_check_by_range ! ( 1 , 31 ) ,
484474 datetime_check ! ( form!( Form :: Month ( _) ) ) ,
485475 |integer, month| {
486476 let m = month. value ( ) . form_month ( ) ?;
487- let form = Form :: MonthDay ( Some ( MonthDayForm { month : m, day_of_month : integer. value ( ) . value as u32 } ) ) ;
488- Ok ( month. value ( ) . intersect ( & helpers:: day_of_month ( integer. value ( ) . value as u32 ) ?) ?. form ( form) )
477+ helpers:: month_day ( m, integer. value ( ) . value as u32 )
489478 }
490479 ) ;
491480 b. rule_2 ( "<day-of-month>(ordinal) <named-month>" ,
492481 ordinal_check ! ( |ordinal: & OrdinalValue | 1 <= ordinal. value && ordinal. value <= 31 ) ,
493482 datetime_check ! ( form!( Form :: Month ( _) ) ) ,
494483 |ordinal, month| {
495484 let m = month. value ( ) . form_month ( ) ?;
496- let form = Form :: MonthDay ( Some ( MonthDayForm { month : m, day_of_month : ordinal. value ( ) . value as u32 } ) ) ;
497- Ok ( month. value ( ) . intersect ( & helpers:: day_of_month ( ordinal. value ( ) . value as u32 ) ?) ?. form ( form) )
485+ helpers:: month_day ( m, ordinal. value ( ) . value as u32 )
498486 }
499487 ) ;
500488 /* END OF DATETIME - DATE - DATES */
@@ -904,7 +892,7 @@ pub fn rules_datetime(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
904892 datetime_check ! ( |datetime: & DatetimeValue | form!( Form :: PartOfDay ( _) ) ( datetime) || form!( Form :: Meal ) ( datetime) ) ,
905893 |_, datetime| Ok ( datetime. value ( ) . clone ( ) . latent ( ) )
906894 ) ;
907- b. rule_2 ( "in|for≤ |during the <part-of-day>" ,
895+ b. rule_2 ( "in|for|during the <part-of-day>" ,
908896 b. reg ( r#"(?:in|for|during)(?: the)?"# ) ?,
909897 datetime_check ! ( |datetime: & DatetimeValue | form!( Form :: PartOfDay ( _) ) ( datetime) || form!( Form :: Meal ) ( datetime) ) ,
910898 |_, datetime| Ok ( datetime. value ( ) . clone ( ) . not_latent ( ) )
@@ -989,25 +977,33 @@ pub fn rules_datetime(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
989977 Ok ( friday. span_to ( & monday, false ) ?. datetime_kind ( DatetimeKind :: DatePeriod ) )
990978 }
991979 ) ;
992- b. rule_1_terminal ( "season" ,
980+ b. rule_1_terminal ( "season - summer " ,
993981 b. reg ( r#"(?:the )?summer"# ) ?,
994982 |_| Ok ( helpers:: month_day ( 6 , 21 ) ?
995983 . span_to ( & helpers:: month_day ( 9 , 23 ) ?, false ) ?
996984 . form ( Form :: Season ) )
997985 ) ;
998- b. rule_1_terminal ( "season" ,
986+ b. rule_1_terminal ( "season - fall " ,
999987 b. reg ( r#"(?:the )?(?:fall|autumn)"# ) ?,
1000988 |_| Ok ( helpers:: month_day ( 9 , 23 ) ?
1001989 . span_to ( & helpers:: month_day ( 12 , 21 ) ?, false ) ?
1002990 . form ( Form :: Season ) )
1003991 ) ;
1004- b. rule_1_terminal ( "season" ,
992+ b. rule_1_terminal ( "season - winter " ,
1005993 b. reg ( r#"(?:the )?winter"# ) ?,
1006994 |_| Ok ( helpers:: month_day ( 12 , 21 ) ?
1007995 . span_to ( & helpers:: month_day ( 3 , 20 ) ?, false ) ?
1008996 . form ( Form :: Season ) )
1009997 ) ;
1010- b. rule_1_terminal ( "season" ,
998+ // FIXME: Also add support for combined years? e.g. "winter 2014-2015"
999+ b. rule_2 ( "season - winter <year>" ,
1000+ b. reg ( r#"(?:the )?winter(?: of)?"# ) ?,
1001+ datetime_check ! ( form!( Form :: Year ( _) ) ) ,
1002+ |_, year| Ok ( helpers:: year_month_day ( year. value ( ) . form_year ( ) ?, 12 , 21 ) ?
1003+ . span_to ( & helpers:: year_month_day ( year. value ( ) . form_year ( ) ? + ( 1 as i32 ) , 3 , 20 ) ?, false ) ?
1004+ . form ( Form :: Season ) )
1005+ ) ;
1006+ b. rule_1_terminal ( "season - spring" ,
10111007 b. reg ( r#"(?:the )?spring"# ) ?,
10121008 |_| Ok ( helpers:: month_day ( 3 , 20 ) ?
10131009 . span_to ( & helpers:: month_day ( 6 , 21 ) ?, false ) ?
@@ -1041,21 +1037,21 @@ pub fn rules_datetime(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
10411037 } ) ;
10421038 b. rule_2 ( "<time-of-day> approximately" ,
10431039 datetime_check ! ( form!( Form :: TimeOfDay ( _) ) ) ,
1044- b. reg ( r#"(?: -?ish|approximately) "# ) ?,
1040+ b. reg ( r#"-?ish|approximately"# ) ?,
10451041 |datetime, _| Ok ( datetime. value ( ) . clone ( ) . not_latent ( ) . precision ( Precision :: Approximate ) )
10461042 ) ;
10471043 b. rule_2 ( "about <time-of-day>" ,
1048- b. reg ( r#"(?: about|around|approximately) "# ) ?,
1044+ b. reg ( r#"about|around|approximately"# ) ?,
10491045 datetime_check ! ( form!( Form :: TimeOfDay ( _) ) ) ,
10501046 |_, datetime| Ok ( datetime. value ( ) . clone ( ) . not_latent ( ) . precision ( Precision :: Approximate ) )
10511047 ) ;
10521048 b. rule_2 ( "<time-of-day> sharp" ,
10531049 datetime_check ! ( form!( Form :: TimeOfDay ( _) ) ) ,
1054- b. reg ( r#"(?: sharp|exactly|precisely) "# ) ?,
1050+ b. reg ( r#"sharp|exactly|precisely"# ) ?,
10551051 |datetime, _| Ok ( datetime. value ( ) . clone ( ) . not_latent ( ) . precision ( Precision :: Exact ) )
10561052 ) ;
10571053 b. rule_2 ( "exactly <time-of-day>" ,
1058- b. reg ( r#"(?: exactly|precisely) "# ) ?,
1054+ b. reg ( r#"exactly|precisely"# ) ?,
10591055 datetime_check ! ( form!( Form :: TimeOfDay ( _) ) ) ,
10601056 |_, datetime| Ok ( datetime. value ( ) . clone ( ) . not_latent ( ) . precision ( Precision :: Exact ) )
10611057 ) ;
0 commit comments