{-# LANGUAGE DeriveGeneric #-}
module Database.Franz.Protocol
( apiVersion
, defaultPort
, IndexName
, FranzException(..)
, RequestType(..)
, ItemRef(..)
, Query(..)
, RawRequest(..)
, ResponseId
, ResponseHeader(..)
, PayloadHeader(..)) where
import Control.Exception (Exception)
import qualified Data.ByteString.Char8 as B
import Data.Serialize hiding (getInt64le)
import Database.Franz.Internal (getInt64le)
import Network.Socket (PortNumber)
import GHC.Generics (Generic)
apiVersion :: B.ByteString
apiVersion = B.pack "0"
defaultPort :: PortNumber
defaultPort = 1886
type IndexName = B.ByteString
data FranzException = MalformedRequest !String
| StreamNotFound !FilePath
| IndexNotFound !IndexName ![IndexName]
| InternalError !String
| ClientError !String
deriving (Show, Generic)
instance Serialize FranzException
instance Exception FranzException
data RequestType = AllItems | LastItem deriving (Show, Generic)
instance Serialize RequestType
data ItemRef = BySeqNum !Int
| ByIndex !IndexName !Int
deriving (Show, Generic)
instance Serialize ItemRef
data Query = Query
{ reqStream :: !B.ByteString
, reqFrom :: !ItemRef
, reqTo :: !ItemRef
, reqType :: !RequestType
} deriving (Show, Generic)
instance Serialize Query
data RawRequest
= RawRequest !ResponseId !Query
| RawClean !ResponseId deriving Generic
instance Serialize RawRequest
type ResponseId = Int
data ResponseHeader = Response !ResponseId
| ResponseWait !ResponseId
| ResponseError !ResponseId !FranzException
deriving (Show, Generic)
instance Serialize ResponseHeader
data PayloadHeader = PayloadHeader !Int !Int !Int ![B.ByteString]
instance Serialize PayloadHeader where
put (PayloadHeader s t u xs) = f s *> f t *> f u *> put xs where
f = putInt64le . fromIntegral
get = PayloadHeader <$> getInt64le <*> getInt64le <*> getInt64le <*> get