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 FlexibleContexts #-}
|
{-# LANGUAGE NoMonoLocalBinds #-}
|
||||||
{-# LANGUAGE TypeFamilies #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE PackageImports #-}
|
||||||
{-# LANGUAGE ScopedTypeVariables #-}
|
{-# LANGUAGE ScopedTypeVariables #-}
|
||||||
{-# LANGUAGE PackageImports #-}
|
{-# LANGUAGE TupleSections #-}
|
||||||
|
{-# LANGUAGE TypeFamilies #-}
|
||||||
{-|
|
{-|
|
||||||
|
|
||||||
Date parsing and utilities for hledger.
|
Date parsing and utilities for hledger.
|
||||||
@ -777,10 +778,17 @@ yyyymmdd = do
|
|||||||
failIfInvalidDate date
|
failIfInvalidDate date
|
||||||
|
|
||||||
ymd :: TextParser m SmartDate
|
ymd :: TextParser m SmartDate
|
||||||
ymd = liftA2 SmartAssumeStart yearp (optional $ try monthday) >>= failIfInvalidDate
|
ymd = do
|
||||||
where monthday = do
|
y <- yearp
|
||||||
sep <- datesepchar
|
fmap (SmartAssumeStart y) . optional . try $ do
|
||||||
liftA2 (,) decimal . optional $ char sep *> decimal
|
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 :: TextParser m (Month, MonthDay)
|
||||||
md = do
|
md = do
|
||||||
@ -943,6 +951,14 @@ periodexprdatespanp rdate = choice $ map try [
|
|||||||
-- |
|
-- |
|
||||||
-- >>> parsewith (doubledatespanp (fromGregorian 2018 01 01) <* eof) "20180101-201804"
|
-- >>> parsewith (doubledatespanp (fromGregorian 2018 01 01) <* eof) "20180101-201804"
|
||||||
-- Right DateSpan 2018Q1
|
-- 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 :: Day -> TextParser m DateSpan
|
||||||
doubledatespanp rdate = liftA2 fromToSpan
|
doubledatespanp rdate = liftA2 fromToSpan
|
||||||
(optional (string' "from" *> skipNonNewlineSpaces) *> smartdate)
|
(optional (string' "from" *> skipNonNewlineSpaces) *> smartdate)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user