{-# LANGUAGE TemplateHaskell #-}
module Data.Time.TH (mkUTCTime) where
import Control.Applicative ((<*))
import Data.Time (UTCTime(..), Day(..))
import qualified Data.Text as T
import qualified Data.Attoparsec.Text as A
import Language.Haskell.TH
import Data.Aeson.Extra.Time (utcTime)
mkUTCTime :: String -> Q Exp
mkUTCTime s =
case A.parseOnly (utcTime <* A.endOfInput) (T.pack s) of
Left err -> fail $ "could not parse UTCTime: " ++ err
Right (UTCTime (ModifiedJulianDay d) dt) ->
[| UTCTime (ModifiedJulianDay $(d')) $(dt') :: UTCTime |]
where d' = return $ LitE $ integerL d
dt' = return $ LitE $ rationalL $ toRational dt