packages feed

natskell-0.3.0.0: jetstream/JetStream/Protocol/Headers.hs

{-# LANGUAGE OverloadedStrings #-}

module JetStream.Protocol.Headers
  ( statusHeader
  , descriptionHeader
  , lookupHeader
  , statusCode
  , statusDescription
  , statusError
  ) where

import qualified API                   as Nats
import qualified Data.ByteString       as BS
import qualified Data.ByteString.Char8 as BC
import           Data.Maybe            (fromMaybe, listToMaybe)
import           JetStream.Error       (JetStreamError (JetStreamStatusError))

statusHeader :: BS.ByteString
statusHeader = "Status"

descriptionHeader :: BS.ByteString
descriptionHeader = "Description"

lookupHeader :: BS.ByteString -> Nats.MsgView -> Maybe BS.ByteString
lookupHeader name msg =
  listToMaybe
    [ value
    | (key, value) <- fromMaybe [] (Nats.headers msg)
    , key == name
    ]

statusCode :: Nats.MsgView -> Maybe Int
statusCode msg = do
  value <- lookupHeader statusHeader msg
  case BC.readInt value of
    Just (code, rest)
      | BS.null rest ->
          Just code
    _ ->
      Nothing

statusDescription :: Nats.MsgView -> Maybe BS.ByteString
statusDescription =
  lookupHeader descriptionHeader

statusError :: Nats.MsgView -> Maybe JetStreamError
statusError msg =
  fmap (\code -> JetStreamStatusError code (statusDescription msg)) (statusCode msg)