{-# LANGUAGE OverloadedStrings #-}

module Database.Bolt.Transport.Message
    ( sendmsg
    , recvmsg
    ) where

import           Data.Monoid
import           Data.PackStream
import qualified Data.Text                       as T

import           Database.Bolt.Exception
import           Database.Bolt.Transport         (Transport)
import qualified Database.Bolt.Transport.Chunked as Chunked

-------- Message I/O --------

sendmsg :: (Transport t, ToPackStream a) => t -> a -> IO ()
sendmsg conn = Chunked.put conn . pack

recvmsg :: (Transport t, FromPackStream a) => t -> IO a
recvmsg conn = do
    ma <- Chunked.get conn unpack
    case ma of
        Left e  -> transportErr $ "Couldn't unpack received data: " <> T.pack e
        Right a -> return a