packages feed

greskell-websocket-1.0.0.1: src/Network/Greskell/WebSocket/Request.hs

{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE DuplicateRecordFields #-}
-- |
-- Module: Network.Greskell.WebSocket.Request
-- Description: Request to Gremlin Server
-- Maintainer: Toshio Ito <debug.ito@gmail.com>
--
--
module Network.Greskell.WebSocket.Request
    ( -- * RequestMessage
      RequestMessage (..)
    , Operation (..)
    , toRequestMessage
    , makeRequestMessage
    ) where

import           Control.Applicative                       ((<$>), (<*>))
import           Data.Aeson                                (FromJSON (..), Object, ToJSON (..))
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 (..))


-- | RequestMessage to a Gremlin Server. See
-- <http://tinkerpop.apache.org/docs/current/dev/provider/>.
data RequestMessage
  = RequestMessage
      { requestId :: !UUID
      , op        :: !Text
      , processor :: !Text
      , args      :: !Object
      }
  deriving (Eq, Generic, Show)

instance ToJSON RequestMessage where
  toJSON = GAeson.genericToJSON GAeson.opt
  toEncoding = GAeson.genericToEncoding GAeson.opt

instance FromJSON RequestMessage where
  parseJSON = GAeson.genericParseJSON GAeson.opt

-- | Convert an 'Operation' object to 'RequestMessage'.
toRequestMessage :: Operation o => UUID -> o -> RequestMessage
toRequestMessage rid o =
  RequestMessage { requestId = rid,
                   op = opName o,
                   processor = opProcessor o,
                   args = opArgs o
                 }

-- | Create a 'RequestMessage' from an 'Operation' object. The
-- 'requestId' is generated by the random number generator of the
-- system.
makeRequestMessage :: Operation o => o -> IO RequestMessage
makeRequestMessage o = toRequestMessage <$> nextRandom <*> pure o