-- | High-level client implementation for JetStream.
module JetStream.Client
  ( newJetStream
  , JetStream
  , JetStreamOption
  , JetStreamRequestOption
  , JetStreamConfigError (..)
  , withDomain
  , withRequestTimeout
  , withRequestTimeoutMicros
  ) where

import qualified API                  as Nats
import           JetStream.API        (JetStream)
import qualified JetStream.Consumer   as Consumer
import qualified JetStream.KeyValue   as KeyValue
import qualified JetStream.Management as Management
import qualified JetStream.Message    as Message
import           JetStream.Options
    ( JetStream (..)
    , JetStreamConfigError (..)
    , JetStreamOption
    , tryNewJetStreamContext
    , withDomain
    , withRequestTimeout
    , withRequestTimeoutMicros
    )
import qualified JetStream.Publish    as Publish
import qualified JetStream.Stream     as Stream
import           JetStream.Types      (JetStreamRequestOption)

-- | Build JetStream capabilities from an existing NATS client.
newJetStream :: Nats.Client -> [JetStreamOption] -> Either JetStreamConfigError JetStream
newJetStream :: Client
-> [JetStreamOption] -> Either JetStreamConfigError JetStream
newJetStream Client
client [JetStreamOption]
options = do
  JetStreamContext
ctx <- Client
-> [JetStreamOption]
-> Either JetStreamConfigError JetStreamContext
tryNewJetStreamContext Client
client [JetStreamOption]
options
  let streamAPI :: StreamAPI
streamAPI = JetStreamContext -> StreamAPI
Stream.streamAPI JetStreamContext
ctx
      consumerAPI :: ConsumerAPI
consumerAPI = JetStreamContext -> ConsumerAPI
Consumer.consumerAPI JetStreamContext
ctx
      publishAPI :: PublishAPI
publishAPI = JetStreamContext -> PublishAPI
Publish.publishAPI JetStreamContext
ctx
      messageAPI :: MessageAPI
messageAPI = JetStreamContext -> ConsumerAPI -> MessageAPI
Message.messageAPI JetStreamContext
ctx ConsumerAPI
consumerAPI
  JetStream -> Either JetStreamConfigError JetStream
forall a. a -> Either JetStreamConfigError a
forall (f :: * -> *) a. Applicative f => a -> f a
pure JetStream
    { streams :: StreamAPI
streams = StreamAPI
streamAPI
    , consumers :: ConsumerAPI
consumers = ConsumerAPI
consumerAPI
    , publisher :: PublishAPI
publisher = PublishAPI
publishAPI
    , messages :: MessageAPI
messages = MessageAPI
messageAPI
    , management :: ManagementAPI
management = JetStreamContext -> ManagementAPI
Management.managementAPI JetStreamContext
ctx
    , keyValues :: KeyValueAPI
keyValues = StreamAPI -> PublishAPI -> MessageAPI -> KeyValueAPI
KeyValue.keyValueAPI StreamAPI
streamAPI PublishAPI
publishAPI MessageAPI
messageAPI
    }