franz-0.3: src/Database/Franz/Protocol.hs
{-# 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 -- ^ sequential number
| ByIndex !IndexName !Int -- ^ index name and value
deriving (Show, Generic)
instance Serialize ItemRef
data Query = Query
{ reqStream :: !B.ByteString
, reqFrom :: !ItemRef -- ^ name of the index to search
, reqTo :: !ItemRef -- ^ name of the index to search
, 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
-- ^ response ID, number of streams; there are items satisfying the query
| ResponseWait !ResponseId -- ^ response ID; requested elements are not available right now
| ResponseError !ResponseId !FranzException -- ^ something went wrong
deriving (Show, Generic)
instance Serialize ResponseHeader
-- | Initial seqno, final seqno, base offset, index names
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