module API
(
Client (..)
, MsgView (..)
, PublishOption
, SubscribeOption
, withSubscriptionExpiry
, withQueueGroup
, withPayload
, withReplyCallback
, withReplyTo
, withHeaders
) where
import qualified Data.ByteString as BS
import Data.Time.Clock (NominalDiffTime)
import Lib.CallOption (CallOption)
import Publish.Config (PublishConfig)
import Subscription.Types (SubscribeConfig (..))
import qualified Types.Msg as Msg
import Types.Msg (Headers, Payload, SID, Subject)
data Client = Client
{ Client -> Subject -> [PublishOption] -> IO ()
publish :: Subject -> [PublishOption] -> IO ()
, Client
-> Subject
-> [SubscribeOption]
-> (Maybe MsgView -> IO ())
-> IO Subject
subscribe :: Subject -> [SubscribeOption] -> (Maybe MsgView -> IO ()) -> IO SID
, Client
-> Subject
-> [SubscribeOption]
-> (Maybe MsgView -> IO ())
-> IO Subject
request :: Subject -> [SubscribeOption] -> (Maybe MsgView -> IO ()) -> IO SID
, Client -> Subject -> IO ()
unsubscribe :: SID -> IO ()
, Client -> IO Subject
newInbox :: IO Subject
, Client -> IO () -> IO ()
ping :: IO () -> IO ()
, Client -> IO ()
flush :: IO ()
, Client -> IO ()
reset :: IO ()
, Client -> IO ()
close :: IO ()
}
data MsgView = MsgView
{
MsgView -> Subject
subject :: BS.ByteString
, MsgView -> Subject
sid :: BS.ByteString
, MsgView -> Maybe Subject
replyTo :: Maybe BS.ByteString
, MsgView -> Maybe Subject
payload :: Maybe BS.ByteString
, :: Maybe [(BS.ByteString, BS.ByteString)]
}
deriving (MsgView -> MsgView -> Bool
(MsgView -> MsgView -> Bool)
-> (MsgView -> MsgView -> Bool) -> Eq MsgView
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MsgView -> MsgView -> Bool
== :: MsgView -> MsgView -> Bool
$c/= :: MsgView -> MsgView -> Bool
/= :: MsgView -> MsgView -> Bool
Eq, Int -> MsgView -> ShowS
[MsgView] -> ShowS
MsgView -> String
(Int -> MsgView -> ShowS)
-> (MsgView -> String) -> ([MsgView] -> ShowS) -> Show MsgView
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MsgView -> ShowS
showsPrec :: Int -> MsgView -> ShowS
$cshow :: MsgView -> String
show :: MsgView -> String
$cshowList :: [MsgView] -> ShowS
showList :: [MsgView] -> ShowS
Show)
type PublishOption = CallOption PublishConfig
type SubscribeOption = CallOption SubscribeConfig
withSubscriptionExpiry :: NominalDiffTime -> SubscribeOption
withSubscriptionExpiry :: NominalDiffTime -> SubscribeOption
withSubscriptionExpiry NominalDiffTime
expirySeconds SubscribeConfig
cfg = SubscribeConfig
cfg { expiry = Just expirySeconds }
withQueueGroup :: Subject -> SubscribeOption
withQueueGroup :: Subject -> SubscribeOption
withQueueGroup Subject
queueGroup SubscribeConfig
cfg = SubscribeConfig
cfg { subscribeQueueGroup = Just queueGroup }
withPayload :: Payload -> PublishOption
withPayload :: Subject -> PublishOption
withPayload Subject
payload (Maybe Subject
_, Maybe (Maybe Msg -> IO ())
callback, Maybe [(Subject, Subject)]
headers, Maybe Subject
replyTo') =
(Subject -> Maybe Subject
forall a. a -> Maybe a
Just Subject
payload, Maybe (Maybe Msg -> IO ())
callback, Maybe [(Subject, Subject)]
headers, Maybe Subject
replyTo')
withReplyCallback :: (Maybe MsgView -> IO ()) -> PublishOption
withReplyCallback :: (Maybe MsgView -> IO ()) -> PublishOption
withReplyCallback Maybe MsgView -> IO ()
callback (Maybe Subject
payload, Maybe (Maybe Msg -> IO ())
_, Maybe [(Subject, Subject)]
headers, Maybe Subject
replyTo') =
(Maybe Subject
payload, (Maybe Msg -> IO ()) -> Maybe (Maybe Msg -> IO ())
forall a. a -> Maybe a
Just (Maybe MsgView -> IO ()
callback (Maybe MsgView -> IO ())
-> (Maybe Msg -> Maybe MsgView) -> Maybe Msg -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Msg -> MsgView) -> Maybe Msg -> Maybe MsgView
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Msg
msg -> MsgView
{ subject :: Subject
subject = Msg -> Subject
Msg.subject Msg
msg
, sid :: Subject
sid = Msg -> Subject
Msg.sid Msg
msg
, replyTo :: Maybe Subject
replyTo = Msg -> Maybe Subject
Msg.replyTo Msg
msg
, payload :: Maybe Subject
payload = Msg -> Maybe Subject
Msg.payload Msg
msg
, headers :: Maybe [(Subject, Subject)]
headers = Msg -> Maybe [(Subject, Subject)]
Msg.headers Msg
msg
})), Maybe [(Subject, Subject)]
headers, Maybe Subject
replyTo')
withReplyTo :: Subject -> PublishOption
withReplyTo :: Subject -> PublishOption
withReplyTo Subject
replySubject (Maybe Subject
payload, Maybe (Maybe Msg -> IO ())
callback, Maybe [(Subject, Subject)]
headers, Maybe Subject
_) =
(Maybe Subject
payload, Maybe (Maybe Msg -> IO ())
callback, Maybe [(Subject, Subject)]
headers, Subject -> Maybe Subject
forall a. a -> Maybe a
Just Subject
replySubject)
withHeaders :: Headers -> PublishOption
[(Subject, Subject)]
headers (Maybe Subject
payload, Maybe (Maybe Msg -> IO ())
callback, Maybe [(Subject, Subject)]
_, Maybe Subject
replyTo') =
(Maybe Subject
payload, Maybe (Maybe Msg -> IO ())
callback, [(Subject, Subject)] -> Maybe [(Subject, Subject)]
forall a. a -> Maybe a
Just [(Subject, Subject)]
headers, Maybe Subject
replyTo')