{-# LANGUAGE DuplicateRecordFields, DeriveGeneric #-}
module Network.Greskell.WebSocket.Request
(
RequestMessage(..),
Operation(..),
toRequestMessage,
makeRequestMessage
) where
import Control.Applicative ((<$>), (<*>))
import Data.Aeson (Object, ToJSON(..), FromJSON(..))
import Data.Text (Text)
import Data.UUID (UUID)
import Data.UUID.V4 (nextRandom)
import GHC.Generics (Generic)
import qualified Network.Greskell.WebSocket.Request.Aeson as GAeson
import Network.Greskell.WebSocket.Request.Common (Operation(..))
data RequestMessage =
RequestMessage
{ requestId :: !UUID,
op :: !Text,
processor :: !Text,
args :: !Object
}
deriving (Show,Eq,Generic)
instance ToJSON RequestMessage where
toJSON = GAeson.genericToJSON GAeson.opt
toEncoding = GAeson.genericToEncoding GAeson.opt
instance FromJSON RequestMessage where
parseJSON = GAeson.genericParseJSON GAeson.opt
toRequestMessage :: Operation o => UUID -> o -> RequestMessage
toRequestMessage rid o =
RequestMessage { requestId = rid,
op = opName o,
processor = opProcessor o,
args = opArgs o
}
makeRequestMessage :: Operation o => o -> IO RequestMessage
makeRequestMessage o = toRequestMessage <$> nextRandom <*> pure o