Skip to content

Commit b0dbf57

Browse files
committed
fail if hour is 24 and other components are more then 0
1 parent 7b03791 commit b0dbf57

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

src/Data/Formatter/DateTime.purs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import Prelude
1616

1717
import Control.Alt ((<|>))
1818
import Control.Alternative (class Alternative)
19-
import Control.Apply (lift2)
19+
import Control.Apply (applySecond, lift2)
2020
import Control.Lazy as Z
2121
import Control.Monad.Reader.Trans (ReaderT, runReaderT, ask)
2222
import Control.Monad.State (State, modify, put, runState)
@@ -27,7 +27,7 @@ import Data.DateTime as DT
2727
import Data.DateTime.Instant (instant, toDateTime, fromDateTime, unInstant)
2828
import Data.Either (Either(..), either)
2929
import Data.Enum (fromEnum, toEnum)
30-
import Data.Foldable (foldMap)
30+
import Data.Foldable (foldMap, for_)
3131
import Data.Formatter.Internal (foldDigits)
3232
import Data.Formatter.Parser.Number (parseDigit)
3333
import Data.Formatter.Parser.Utils (runP, oneOfAs)
@@ -237,15 +237,14 @@ initialAccum =
237237
}
238238

239239
unformatAccumToDateTime UnformatAccum Either String DT.DateTime
240-
unformatAccumToDateTime a =
240+
unformatAccumToDateTime a = applySecond (validAccum a) $
241241
DT.DateTime
242242
<$> (D.canonicalDate
243243
<$> (maybe (Left "Incorrect year") pure $ toEnum $ fromMaybe zero a.year)
244244
<*> (maybe (Left "Incorrect month") pure $ toEnum $ fromMaybe one a.month)
245245
<*> (maybe (Left "Incorrect day") pure $ toEnum
246-
$ adjustDay a.meridiem a.hour
246+
$ adjustDay a.hour
247247
$ fromMaybe one a.day))
248-
249248
<*> (T.Time
250249
<$> (maybe
251250
(Left "Incorrect hour") pure
@@ -256,9 +255,15 @@ unformatAccumToDateTime a =
256255
<*> (maybe (Left "Incorrect second") pure $ toEnum $ fromMaybe zero a.second)
257256
<*> (maybe (Left "Incorrect millisecond") pure $ toEnum $ fromMaybe zero a.millisecond))
258257

259-
adjustDay Maybe Meridiem Maybe Int Int Int
260-
adjustDay Nothing (Just 24) n = n + 1
261-
adjustDay _ _ n = n
258+
validAccum :: UnformatAccum Either String Unit
259+
validAccum { hour, minute, second, millisecond } = case hour of
260+
Just 24 → for_ [minute, second, millisecond] \val ->
261+
when (fromMaybe 0 val > 0) $ Left "When hour is 24, other time component must be 0"
262+
_ -> pure unit
263+
264+
adjustDay Maybe Int Int Int
265+
adjustDay (Just 24) n = n + 1
266+
adjustDay _ n = n
262267

263268
adjustMeridiem Maybe Meridiem Int Int
264269
adjustMeridiem (Just AM) 12 = 0

0 commit comments

Comments
 (0)