module Network.MessagePack.Types.Spec
  ( Request
  , Response
  , packRequest
  , packResponse
  , unpackRequest
  , unpackResponse
  ) where

import qualified Data.ByteString.Lazy as L
import qualified Data.List            as List
import           Data.MessagePack     (MessagePack, Object, fromObject, pack)

type Request ix = (Int, Int, ix, [Object])
type Response   = (Int, Int, Object, Object)

packRequest :: (Eq mth, MessagePack mth) => [mth] -> Request mth -> L.ByteString
packRequest [] req = pack req
packRequest mths req@(rtype, msgid, mth, obj) =
  case List.elemIndex mth mths of
    Nothing -> pack req
    Just ix -> pack (rtype, msgid, ix, obj)


packResponse :: Response -> L.ByteString
packResponse = pack

unpackResponse :: Object -> Maybe Response
unpackResponse = fromObject

unpackRequest :: MessagePack ix => Object -> Maybe (Request ix)
unpackRequest = fromObject