{-# LANGUAGE OverloadedStrings #-} module AWS.EventBridge.Rate where import Text.Megaparsec (Parsec, (<|>), try, parse, errorBundlePretty, optional) import Data.Void (Void) import Data.Text (Text) import qualified Data.Text as T import Text.Megaparsec.Char import Text.Megaparsec.Char.Lexer (decimal) import Data.Time (NominalDiffTime, secondsToNominalDiffTime) data RateExprT = RateMinutes Int | RateHours Int | RateDays Int deriving (Eq, Show) type Parser = Parsec Void Text evaluateRateT :: RateExprT -> Either String NominalDiffTime evaluateRateT (RateMinutes m) | m >= 1 && m <= 31536000 = Right (secondsToNominalDiffTime (fromIntegral (m * 60))) | otherwise = Left ("invalid rate minutes: " ++ show m ++ " (expected 1..31536000)") evaluateRateT (RateHours h) | h >= 1 && h <= 8760 = Right (secondsToNominalDiffTime (fromIntegral (h * 3600))) | otherwise = Left ("invalid rate hours: " ++ show h ++ " (expected 1..8760)") evaluateRateT (RateDays d) | d >= 1 && d <= 365 = Right (secondsToNominalDiffTime (fromIntegral (d * 86400))) | otherwise = Left ("invalid rate days: " ++ show d ++ " (expected 1..365)") parseRate :: Parser RateExprT parseRate = try parseRateMinutes <|> try parseRateHours <|> parseRateDays parseRateText :: Text -> Either String RateExprT parseRateText input = case parse parseRate "rate" (T.strip input) of Left err -> Left (errorBundlePretty err) Right val -> Right val parseRateMinutes :: Parser RateExprT parseRateMinutes = do _ <- string "rate(" m <- decimal _ <- space1 _ <- string "minute" _ <- optional (char 's') _ <- char ')' return (RateMinutes m) parseRateHours :: Parser RateExprT parseRateHours = do _ <- string "rate(" h <- decimal _ <- space1 _ <- string "hour" _ <- optional (char 's') _ <- char ')' return (RateHours h) parseRateDays :: Parser RateExprT parseRateDays = do _ <- string "rate(" d <- decimal _ <- space1 _ <- string "day" _ <- optional (char 's') _ <- char ')' return (RateDays d)