packages feed

natskell-0.3.0.0: jetstream/JetStream/Options.hs

module JetStream.Options
  ( JetStreamConfig (..)
  , JetStreamContext (..)
  , JetStreamOption
  , defaultJetStreamConfig
  , newJetStreamContext
  , withDomain
  , withRequestTimeoutMicros
  ) where

import qualified API             as Nats
import qualified Data.ByteString as BS

data JetStreamConfig = JetStreamConfig
                         { configDomain               :: Maybe BS.ByteString
                         , configRequestTimeoutMicros :: Int
                         }
  deriving (Eq, Show)

data JetStreamContext = JetStreamContext
                          { contextClient               :: Nats.Client
                          , contextDomain               :: Maybe BS.ByteString
                          , contextRequestTimeoutMicros :: Int
                          }

type JetStreamOption = JetStreamConfig -> JetStreamConfig

defaultJetStreamConfig :: JetStreamConfig
defaultJetStreamConfig =
  JetStreamConfig
    { configDomain = Nothing
    , configRequestTimeoutMicros = 5 * 1000000
    }

newJetStreamContext :: Nats.Client -> [JetStreamOption] -> JetStreamContext
newJetStreamContext client options =
  let config = foldl (flip ($)) defaultJetStreamConfig options
  in JetStreamContext
    { contextClient = client
    , contextDomain = configDomain config
    , contextRequestTimeoutMicros = configRequestTimeoutMicros config
    }

withDomain :: BS.ByteString -> JetStreamOption
withDomain domain config =
  config { configDomain = Just domain }

withRequestTimeoutMicros :: Int -> JetStreamOption
withRequestTimeoutMicros timeoutMicros config =
  config { configRequestTimeoutMicros = max 1 timeoutMicros }