module Data.MessagePack.RPC where import Data.Binary (Get, Put, get, getWord8, put) import Data.MessagePack (Object(..)) import Data.Text (Text) import qualified Data.MessagePack as MP import qualified Data.Vector as Vector data Answer = Success Object | Error Object deriving Show data Request = Request { requestMessageID :: Int , requestMethod :: Text , requestParams :: [Object] } deriving Show putRequest :: Request -> Put putRequest (Request msgID method params) = MP.putArray id $ Vector.fromList [MP.putInt 0, MP.putInt msgID, MP.putStr method, MP.putArray put $ Vector.fromList params] data Message = Response { responseMessageID :: Int , responseAnswer :: Answer } | Notification { notificationMethod :: Text , notificationParams :: [Object] } deriving Show getMessage :: Get Message getMessage = do _ <- getWord8 tpe <- MP.getInt case tpe of 1 -> do id' <- MP.getInt err <- get res <- get return $ Response id' $ f err res where f ObjectNil res = Success res f err ObjectNil = Error err f _ _ = Error ObjectNil 2 -> do method <- MP.getStr (ObjectArray params) <- get return $ Notification method (Vector.toList params) _ -> fail "unsupported message type"