module Network.Nats.Protocol.Types ( makeMessageParseError
, makeSubject
, maxPayloadSize
, NatsServerInfo (..)
, NatsConnectionOptions (..)
, Subject (..)
, Subscription
, SubscriptionId (..)
, ProtocolError (..)
)
where
import Control.Exception
import Data.Aeson hiding (Object)
import Data.Aeson.Types (Options(..))
import Data.Default
import Data.Typeable
import GHC.Generics
import qualified Data.ByteString.Char8 as BS
import qualified Data.Text as T
data NatsServerInfo = NatsServerInfo{ _srv_server_id :: T.Text
, _srv_version :: T.Text
, _srv_go :: T.Text
, _srv_host :: T.Text
, _srv_port :: Int
, _srv_auth_required :: Maybe Bool
, _srv_ssl_required :: Maybe Bool
, _srv_max_payload :: Int
}
deriving (Generic, Show)
instance FromJSON NatsServerInfo where
parseJSON = genericParseJSON defaultOptions{ fieldLabelModifier = stripPrefix "_srv_" }
instance ToJSON NatsServerInfo where
toEncoding = genericToEncoding defaultOptions{ fieldLabelModifier = stripPrefix "_srv_" }
maxPayloadSize :: NatsServerInfo -> Int
maxPayloadSize = _srv_max_payload
data NatsConnectionOptions = NatsConnectionOptions{ clnt_verbose :: Bool
, clnt_pedantic :: Bool
, clnt_ssl_required :: Bool
, clnt_name :: T.Text
, clnt_lang :: T.Text
, clnt_version :: T.Text
, clnt_protocol :: Int
}
deriving (Generic, Show)
instance FromJSON NatsConnectionOptions where
parseJSON = genericParseJSON defaultOptions{ fieldLabelModifier = stripPrefix "clnt_" }
instance ToJSON NatsConnectionOptions where
toEncoding = genericToEncoding defaultOptions{ fieldLabelModifier = stripPrefix "clnt_" }
instance Default NatsConnectionOptions where
def = NatsConnectionOptions { clnt_verbose = False
, clnt_pedantic = False
, clnt_ssl_required = False
, clnt_name = ""
, clnt_lang = "haskell"
, clnt_version = "0.1.0"
, clnt_protocol = 1
}
newtype Subject = Subject BS.ByteString deriving (Show)
makeSubject :: BS.ByteString -> Subject
makeSubject bs = Subject bs
data Subscription = Subscription { _subject :: Subject
, _subscriptionId :: SubscriptionId
}
deriving (Show)
newtype SubscriptionId = SubscriptionId BS.ByteString
deriving (Show, Ord, Eq)
stripPrefix :: String -> String -> String
stripPrefix prefix = drop prefixLength
where prefixLength = length prefix
data ProtocolError = MessageParseError String
deriving (Show, Typeable)
instance Exception ProtocolError
makeMessageParseError :: String -> ProtocolError
makeMessageParseError reason = MessageParseError reason