module Network.Neks.Message (
parseRequests, formatRequests,
parseResponses, formatResponses
) where
import Data.ByteString (ByteString)
import Network.Neks.Actions (Request(Set, Get, Delete, Atomic), Reply(Found, NotFound))
import qualified Data.Serialize as Serialize
import Data.MessagePack (Object(ObjectArray, ObjectInt, ObjectBinary))
import Control.Applicative ((<$>))
formatRequests :: [Request] -> ByteString
formatRequests = Serialize.encode . ObjectArray . map format
where format request = ObjectArray $ case request of
Get k -> [ObjectInt 0, ObjectBinary k]
Set k v -> [ObjectInt 1, ObjectBinary k, ObjectBinary v]
Delete k -> [ObjectInt 2, ObjectBinary k]
Atomic requests -> [ObjectInt 3, ObjectArray (map format requests)]
formatResponses :: [Reply] -> ByteString
formatResponses = Serialize.encode . ObjectArray . map format
where format response = ObjectArray $ case response of
Found v -> [ObjectInt (1), ObjectBinary v]
NotFound -> [ObjectInt (2)]
decode bs = case Serialize.decode bs of
Right (ObjectArray messages) -> Right messages
error -> Left "Response decode failure"
parseRequests :: ByteString -> Either String [Request]
parseRequests bs = decode bs >>= mapM parse where
parse (ObjectArray [ObjectInt 0, ObjectBinary k]) = Right (Get k)
parse (ObjectArray [ObjectInt 1, ObjectBinary k, ObjectBinary v]) = Right (Set k v)
parse (ObjectArray [ObjectInt 2, ObjectBinary k]) = Right (Delete k)
parse (ObjectArray [ObjectInt 3, ObjectArray requests]) = Atomic <$> mapM parse requests
parse _ = Left "Invalid request structure"
parseResponses :: ByteString -> Either String [Reply]
parseResponses bs = decode bs >>= mapM parse where
parse (ObjectArray [ObjectInt (1), ObjectBinary v]) = Right (Found v)
parse (ObjectArray [ObjectInt (2)]) = Right NotFound
parse _ = Left "Incorrect response type"