module Data.Hermes.Decoder.Time
( day
, localTime
, month
, quarter
, timeOfDay
, timeZone
, utcTime
, zonedTime
) where
import qualified Data.Attoparsec.Text as AT
import qualified Data.Attoparsec.Time as ATime
import Data.Text (Text)
import qualified Data.Time as Time
import qualified Data.Time.Calendar.Month.Compat as Time
import qualified Data.Time.Calendar.Quarter.Compat as Time
import qualified Data.Time.LocalTime as Local
import Data.Hermes.Decoder.Types (Decoder)
import Data.Hermes.Decoder.Value (withText)
import Data.Hermes.SIMDJSON
runAttoDate :: AT.Parser a -> Text -> Decoder a
runAttoDate :: forall a. Parser a -> Text -> Decoder a
runAttoDate Parser a
p Text
t =
case forall a. Parser a -> Text -> Either String a
AT.parseOnly (Parser a
p forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall t. Chunk t => Parser t ()
AT.endOfInput) Text
t of
Left String
err -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall a b. (a -> b) -> a -> b
$ String
"Could not parse date: " forall a. Semigroup a => a -> a -> a
<> String
err
Right a
r -> forall (f :: * -> *) a. Applicative f => a -> f a
pure a
r
{-# INLINE runAttoDate #-}
day :: Value -> Decoder Time.Day
day :: Value -> Decoder Day
day = forall a. (Text -> Decoder a) -> Value -> Decoder a
withText forall a b. (a -> b) -> a -> b
$ forall a. Parser a -> Text -> Decoder a
runAttoDate Parser Day
ATime.day
month :: Value -> Decoder Time.Month
month :: Value -> Decoder Month
month = forall a. (Text -> Decoder a) -> Value -> Decoder a
withText forall a b. (a -> b) -> a -> b
$ forall a. Parser a -> Text -> Decoder a
runAttoDate Parser Month
ATime.month
quarter :: Value -> Decoder Time.Quarter
quarter :: Value -> Decoder Quarter
quarter = forall a. (Text -> Decoder a) -> Value -> Decoder a
withText forall a b. (a -> b) -> a -> b
$ forall a. Parser a -> Text -> Decoder a
runAttoDate Parser Quarter
ATime.quarter
timeOfDay :: Value -> Decoder Local.TimeOfDay
timeOfDay :: Value -> Decoder TimeOfDay
timeOfDay = forall a. (Text -> Decoder a) -> Value -> Decoder a
withText forall a b. (a -> b) -> a -> b
$ forall a. Parser a -> Text -> Decoder a
runAttoDate Parser TimeOfDay
ATime.timeOfDay
timeZone :: Value -> Decoder (Maybe Local.TimeZone)
timeZone :: Value -> Decoder (Maybe TimeZone)
timeZone = forall a. (Text -> Decoder a) -> Value -> Decoder a
withText forall a b. (a -> b) -> a -> b
$ forall a. Parser a -> Text -> Decoder a
runAttoDate Parser (Maybe TimeZone)
ATime.timeZone
localTime :: Value -> Decoder Local.LocalTime
localTime :: Value -> Decoder LocalTime
localTime = forall a. (Text -> Decoder a) -> Value -> Decoder a
withText forall a b. (a -> b) -> a -> b
$ forall a. Parser a -> Text -> Decoder a
runAttoDate Parser LocalTime
ATime.localTime
utcTime :: Value -> Decoder Time.UTCTime
utcTime :: Value -> Decoder UTCTime
utcTime = forall a. (Text -> Decoder a) -> Value -> Decoder a
withText forall a b. (a -> b) -> a -> b
$ forall a. Parser a -> Text -> Decoder a
runAttoDate Parser UTCTime
ATime.utcTime
zonedTime :: Value -> Decoder Local.ZonedTime
zonedTime :: Value -> Decoder ZonedTime
zonedTime = forall a. (Text -> Decoder a) -> Value -> Decoder a
withText forall a b. (a -> b) -> a -> b
$ forall a. Parser a -> Text -> Decoder a
runAttoDate Parser ZonedTime
ATime.zonedTime