{-# LANGUAGE OverloadedStrings #-}
module AWS.EventBridge.OneTime where
import Data.Text (Text)
import qualified Data.Text as T
import Data.Time (UTCTime)
import Data.Time.Format (defaultTimeLocale, parseTimeM)
import Data.Time.LocalTime (LocalTime, localTimeToUTC, utc)
import Data.Void (Void)
import Text.Megaparsec
import Text.Megaparsec.Char (char, space, string)
type Parser = Parsec Void Text
newtype OneTimeExprT
= OneTime UTCTime
deriving (Eq, Show)
evaluateOneTimeT :: OneTimeExprT -> UTCTime
evaluateOneTimeT (OneTime t) = t
parseOneTimeText :: Text -> Either String OneTimeExprT
parseOneTimeText input =
case parse parseOneTime "one-time" (T.strip input) of
Left err -> Left (errorBundlePretty err)
Right expr -> Right expr
parseOneTime :: Parser OneTimeExprT
parseOneTime = do
_ <- string "at("
_ <- space
raw <- takeWhile1P (Just "timestamp") (/= ')')
ts <- case timestampFromText (T.strip raw) of
Just ts' -> pure ts'
Nothing -> fail "invalid one-time timestamp"
_ <- space
_ <- char ')'
eof
pure (OneTime ts)
timestampFromText :: Text -> Maybe UTCTime
timestampFromText = parseLocal
where
parseLocal t = do
local <- parseTimeM True defaultTimeLocale "%Y-%m-%dT%H:%M:%S" (T.unpack t) :: Maybe LocalTime
pure (localTimeToUTC utc local)