module Network.AMQP.Worker.Queue where
import Data.Text (Text)
import qualified Network.AMQP as AMQP
import Network.AMQP (ExchangeOpts(..), QueueOpts(..))
import Network.AMQP.Worker.Key (RoutingKey(..), BindingKey(..), QueueKey(..))
import Network.AMQP.Worker.Connection (Connection, withChannel)
type ExchangeName = Text
exchange :: ExchangeName -> Exchange
exchange nm =
Exchange $ AMQP.newExchange { exchangeName = nm, exchangeType = "topic" }
queue :: Exchange -> RoutingKey -> Queue Direct msg
queue exg (RoutingKey key) =
Queue exg (RoutingKey key) $ AMQP.newQueue { queueName = key }
topicQueue :: Exchange -> BindingKey -> Queue Topic msg
topicQueue exg key =
Queue exg key $ AMQP.newQueue { queueName = showKey key }
data Exchange =
Exchange AMQP.ExchangeOpts
deriving (Show, Eq)
data Queue queueType msg =
Queue Exchange queueType AMQP.QueueOpts
deriving (Show, Eq)
type Direct = RoutingKey
type Topic = BindingKey
initQueue :: (QueueKey key) => Connection -> Queue key msg -> IO ()
initQueue conn (Queue (Exchange exg) key options) =
withChannel conn $ \chan -> do
_ <- AMQP.declareExchange chan exg
_ <- AMQP.declareQueue chan options
_ <- AMQP.bindQueue chan (AMQP.queueName options) (AMQP.exchangeName exg) (showKey key)
return ()