module Ecluse.Config.QueueTarget (
QueueTarget (..),
parseQueueTarget,
) where
import Data.Text qualified as T
import Ecluse.Config.MirrorCredential (isAccountId)
import Ecluse.Core.Text (nonBlank)
data QueueTarget
=
SqsTarget Text
|
PubSubTarget Text Text
deriving stock (QueueTarget -> QueueTarget -> Bool
(QueueTarget -> QueueTarget -> Bool)
-> (QueueTarget -> QueueTarget -> Bool) -> Eq QueueTarget
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: QueueTarget -> QueueTarget -> Bool
== :: QueueTarget -> QueueTarget -> Bool
$c/= :: QueueTarget -> QueueTarget -> Bool
/= :: QueueTarget -> QueueTarget -> Bool
Eq, Int -> QueueTarget -> ShowS
[QueueTarget] -> ShowS
QueueTarget -> String
(Int -> QueueTarget -> ShowS)
-> (QueueTarget -> String)
-> ([QueueTarget] -> ShowS)
-> Show QueueTarget
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> QueueTarget -> ShowS
showsPrec :: Int -> QueueTarget -> ShowS
$cshow :: QueueTarget -> String
show :: QueueTarget -> String
$cshowList :: [QueueTarget] -> ShowS
showList :: [QueueTarget] -> ShowS
Show)
parseQueueTarget :: Text -> Maybe QueueTarget
parseQueueTarget :: Text -> Maybe QueueTarget
parseQueueTarget Text
raw = Text -> Maybe QueueTarget
sqsTargetOf Text
raw Maybe QueueTarget -> Maybe QueueTarget -> Maybe QueueTarget
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Maybe QueueTarget
pubSubTargetOf Text
raw
sqsTargetOf :: Text -> Maybe QueueTarget
sqsTargetOf :: Text -> Maybe QueueTarget
sqsTargetOf Text
url = do
rest <- Text -> Text -> Maybe Text
T.stripPrefix Text
"https://" (Text -> Text
T.strip Text
url)
guard (T.all (\Char
c -> Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'?' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'#') rest)
let (authority, slashPath) = T.breakOn "/" rest
guard (T.all (/= ':') authority)
region <- nonBlank =<< T.stripSuffix ".amazonaws.com" =<< T.stripPrefix "sqs." (T.toLower authority)
guard (T.all (/= '.') region)
case T.splitOn "/" (T.drop 1 slashPath) of
[Text
account, Text
queueName]
| Text -> Bool
isAccountId Text
account Bool -> Bool -> Bool
&& Maybe Text -> Bool
forall a. Maybe a -> Bool
isJust (Text -> Maybe Text
nonBlank Text
queueName) ->
QueueTarget -> Maybe QueueTarget
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> QueueTarget
SqsTarget Text
region)
[Text]
_ -> Maybe QueueTarget
forall a. Maybe a
Nothing
pubSubTargetOf :: Text -> Maybe QueueTarget
pubSubTargetOf :: Text -> Maybe QueueTarget
pubSubTargetOf Text
raw = case HasCallStack => Text -> Text -> [Text]
Text -> Text -> [Text]
T.splitOn Text
"/" Text
raw of
[Text
"projects", Text
project, Text
"topics", Text
topic] ->
Text -> Text -> QueueTarget
PubSubTarget (Text -> Text -> QueueTarget)
-> Maybe Text -> Maybe (Text -> QueueTarget)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
nonBlank Text
project Maybe (Text -> QueueTarget) -> Maybe Text -> Maybe QueueTarget
forall a b. Maybe (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Maybe Text
nonBlank Text
topic
[Text]
_ -> Maybe QueueTarget
forall a. Maybe a
Nothing