{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
module Network.Greskell.WebSocket.Request
(
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 (..))
data RequestMessage
= RequestMessage
{ RequestMessage -> UUID
requestId :: !UUID
, RequestMessage -> Text
op :: !Text
, RequestMessage -> Text
processor :: !Text
, RequestMessage -> Object
args :: !Object
}
deriving (RequestMessage -> RequestMessage -> Bool
(RequestMessage -> RequestMessage -> Bool)
-> (RequestMessage -> RequestMessage -> Bool) -> Eq RequestMessage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RequestMessage -> RequestMessage -> Bool
== :: RequestMessage -> RequestMessage -> Bool
$c/= :: RequestMessage -> RequestMessage -> Bool
/= :: RequestMessage -> RequestMessage -> Bool
Eq, (forall x. RequestMessage -> Rep RequestMessage x)
-> (forall x. Rep RequestMessage x -> RequestMessage)
-> Generic RequestMessage
forall x. Rep RequestMessage x -> RequestMessage
forall x. RequestMessage -> Rep RequestMessage x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. RequestMessage -> Rep RequestMessage x
from :: forall x. RequestMessage -> Rep RequestMessage x
$cto :: forall x. Rep RequestMessage x -> RequestMessage
to :: forall x. Rep RequestMessage x -> RequestMessage
Generic, Int -> RequestMessage -> ShowS
[RequestMessage] -> ShowS
RequestMessage -> String
(Int -> RequestMessage -> ShowS)
-> (RequestMessage -> String)
-> ([RequestMessage] -> ShowS)
-> Show RequestMessage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RequestMessage -> ShowS
showsPrec :: Int -> RequestMessage -> ShowS
$cshow :: RequestMessage -> String
show :: RequestMessage -> String
$cshowList :: [RequestMessage] -> ShowS
showList :: [RequestMessage] -> ShowS
Show)
instance ToJSON RequestMessage where
toJSON :: RequestMessage -> Value
toJSON = Options -> RequestMessage -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
GAeson.genericToJSON Options
GAeson.opt
toEncoding :: RequestMessage -> Encoding
toEncoding = Options -> RequestMessage -> Encoding
forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
GAeson.genericToEncoding Options
GAeson.opt
instance FromJSON RequestMessage where
parseJSON :: Value -> Parser RequestMessage
parseJSON = Options -> Value -> Parser RequestMessage
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
GAeson.genericParseJSON Options
GAeson.opt
toRequestMessage :: Operation o => UUID -> o -> RequestMessage
toRequestMessage :: forall o. Operation o => UUID -> o -> RequestMessage
toRequestMessage UUID
rid o
o =
RequestMessage { $sel:requestId:RequestMessage :: UUID
requestId = UUID
rid,
$sel:op:RequestMessage :: Text
op = o -> Text
forall o. Operation o => o -> Text
opName o
o,
$sel:processor:RequestMessage :: Text
processor = o -> Text
forall o. Operation o => o -> Text
opProcessor o
o,
$sel:args:RequestMessage :: Object
args = o -> Object
forall o. Operation o => o -> Object
opArgs o
o
}
makeRequestMessage :: Operation o => o -> IO RequestMessage
makeRequestMessage :: forall o. Operation o => o -> IO RequestMessage
makeRequestMessage o
o = UUID -> o -> RequestMessage
forall o. Operation o => UUID -> o -> RequestMessage
toRequestMessage (UUID -> o -> RequestMessage)
-> IO UUID -> IO (o -> RequestMessage)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO UUID
nextRandom IO (o -> RequestMessage) -> IO o -> IO RequestMessage
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> o -> IO o
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure o
o