lib: For ymd date parsing, don't consume invalid date components.
This commit is contained in:
		
							parent
							
								
									97545018f4
								
							
						
					
					
						commit
						5a6d38fdf2
					
				| @ -1,9 +1,10 @@ | ||||
| {-# LANGUAGE NoMonoLocalBinds #-} | ||||
| {-# LANGUAGE FlexibleContexts #-} | ||||
| {-# LANGUAGE TypeFamilies #-} | ||||
| {-# LANGUAGE OverloadedStrings #-} | ||||
| {-# LANGUAGE FlexibleContexts    #-} | ||||
| {-# LANGUAGE NoMonoLocalBinds    #-} | ||||
| {-# LANGUAGE OverloadedStrings   #-} | ||||
| {-# LANGUAGE PackageImports      #-} | ||||
| {-# LANGUAGE ScopedTypeVariables #-} | ||||
| {-# LANGUAGE PackageImports #-} | ||||
| {-# LANGUAGE TupleSections       #-} | ||||
| {-# LANGUAGE TypeFamilies        #-} | ||||
| {-| | ||||
| 
 | ||||
| Date parsing and utilities for hledger. | ||||
| @ -777,10 +778,17 @@ yyyymmdd = do | ||||
|   failIfInvalidDate date | ||||
| 
 | ||||
| ymd :: TextParser m SmartDate | ||||
| ymd = liftA2 SmartAssumeStart yearp (optional $ try monthday) >>= failIfInvalidDate | ||||
|   where monthday = do | ||||
|             sep <- datesepchar | ||||
|             liftA2 (,) decimal . optional $ char sep *> decimal | ||||
| ymd = do | ||||
|     y <- yearp | ||||
|     fmap (SmartAssumeStart y) . optional . try $ do | ||||
|         sep <- datesepchar | ||||
|         m <- decimal | ||||
|         unless (validMonth m) $ Fail.fail ("Bad month " <> show m) | ||||
|         fmap (m,) . optional . try $ do | ||||
|             _ <- char sep | ||||
|             d <- decimal | ||||
|             failIfInvalidDate $ SmartAssumeStart y (Just (m, Just d)) | ||||
|             return d | ||||
| 
 | ||||
| md :: TextParser m (Month, MonthDay) | ||||
| md = do | ||||
| @ -943,6 +951,14 @@ periodexprdatespanp rdate = choice $ map try [ | ||||
| -- | | ||||
| -- >>> parsewith (doubledatespanp (fromGregorian 2018 01 01) <* eof) "20180101-201804" | ||||
| -- Right DateSpan 2018Q1 | ||||
| -- >>> parsewith (doubledatespanp (fromGregorian 2018 01 01) <* eof) "2017..2018" | ||||
| -- Right DateSpan 2017 | ||||
| -- >>> parsewith (doubledatespanp (fromGregorian 2018 01 01) <* eof) "2017-2018" | ||||
| -- Right DateSpan 2017 | ||||
| -- >>> parsewith (doubledatespanp (fromGregorian 2018 01 01) <* eof) "2017-01-2018" | ||||
| -- Right DateSpan 2017 | ||||
| -- >>> parsewith (doubledatespanp (fromGregorian 2018 01 01) <* eof) "2017-01-01-2018" | ||||
| -- Right DateSpan 2017 | ||||
| doubledatespanp :: Day -> TextParser m DateSpan | ||||
| doubledatespanp rdate = liftA2 fromToSpan | ||||
|     (optional (string' "from" *> skipNonNewlineSpaces) *> smartdate) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user