{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}
-- |
-- Module: Network.Greskell.WebSocket.Response
-- Description: Response from Gremlin Server
-- Maintainer: Toshio Ito <debug.ito@gmail.com>
--
--
module Network.Greskell.WebSocket.Response
    ( -- * ResponseMessage
      ResponseMessage (..)
      -- * ResponseStatus
    , ResponseStatus (..)
      -- * ResponseResult
    , ResponseResult (..)
      -- * ResponseCode
    , ResponseCode (..)
    , codeToInt
    , codeFromInt
    , isTerminating
    , isSuccess
    , isClientSideError
    , isServerSideError
    ) where

import           Control.Applicative           ((<$>), (<*>))
import           Data.Aeson                    (FromJSON (..), Object, ToJSON (..),
                                                Value (Number, Object), defaultOptions,
                                                genericParseJSON)
import           Data.Greskell.GraphSON        (FromGraphSON (..), GValueBody (..), gsonValue,
                                                parseUnwrapAll, (.:))
import           Data.Greskell.GraphSON.GValue (gValueBody)
import           Data.Text                     (Text)
import           Data.UUID                     (UUID)
import           GHC.Generics                  (Generic)



-- | Response status code
data ResponseCode = Success | NoContent | PartialContent | Unauthorized | Authenticate | MalformedRequest | InvalidRequestArguments | ServerError | ScriptEvaluationError | ServerTimeout | ServerSerializationError deriving
    ( ResponseCode
ResponseCode -> ResponseCode -> Bounded ResponseCode
forall a. a -> a -> Bounded a
$cminBound :: ResponseCode
minBound :: ResponseCode
$cmaxBound :: ResponseCode
maxBound :: ResponseCode
Bounded
    , Int -> ResponseCode
ResponseCode -> Int
ResponseCode -> [ResponseCode]
ResponseCode -> ResponseCode
ResponseCode -> ResponseCode -> [ResponseCode]
ResponseCode -> ResponseCode -> ResponseCode -> [ResponseCode]
(ResponseCode -> ResponseCode)
-> (ResponseCode -> ResponseCode)
-> (Int -> ResponseCode)
-> (ResponseCode -> Int)
-> (ResponseCode -> [ResponseCode])
-> (ResponseCode -> ResponseCode -> [ResponseCode])
-> (ResponseCode -> ResponseCode -> [ResponseCode])
-> (ResponseCode -> ResponseCode -> ResponseCode -> [ResponseCode])
-> Enum ResponseCode
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: ResponseCode -> ResponseCode
succ :: ResponseCode -> ResponseCode
$cpred :: ResponseCode -> ResponseCode
pred :: ResponseCode -> ResponseCode
$ctoEnum :: Int -> ResponseCode
toEnum :: Int -> ResponseCode
$cfromEnum :: ResponseCode -> Int
fromEnum :: ResponseCode -> Int
$cenumFrom :: ResponseCode -> [ResponseCode]
enumFrom :: ResponseCode -> [ResponseCode]
$cenumFromThen :: ResponseCode -> ResponseCode -> [ResponseCode]
enumFromThen :: ResponseCode -> ResponseCode -> [ResponseCode]
$cenumFromTo :: ResponseCode -> ResponseCode -> [ResponseCode]
enumFromTo :: ResponseCode -> ResponseCode -> [ResponseCode]
$cenumFromThenTo :: ResponseCode -> ResponseCode -> ResponseCode -> [ResponseCode]
enumFromThenTo :: ResponseCode -> ResponseCode -> ResponseCode -> [ResponseCode]
Enum
    , ResponseCode -> ResponseCode -> Bool
(ResponseCode -> ResponseCode -> Bool)
-> (ResponseCode -> ResponseCode -> Bool) -> Eq ResponseCode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ResponseCode -> ResponseCode -> Bool
== :: ResponseCode -> ResponseCode -> Bool
$c/= :: ResponseCode -> ResponseCode -> Bool
/= :: ResponseCode -> ResponseCode -> Bool
Eq
    , Eq ResponseCode
Eq ResponseCode =>
(ResponseCode -> ResponseCode -> Ordering)
-> (ResponseCode -> ResponseCode -> Bool)
-> (ResponseCode -> ResponseCode -> Bool)
-> (ResponseCode -> ResponseCode -> Bool)
-> (ResponseCode -> ResponseCode -> Bool)
-> (ResponseCode -> ResponseCode -> ResponseCode)
-> (ResponseCode -> ResponseCode -> ResponseCode)
-> Ord ResponseCode
ResponseCode -> ResponseCode -> Bool
ResponseCode -> ResponseCode -> Ordering
ResponseCode -> ResponseCode -> ResponseCode
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ResponseCode -> ResponseCode -> Ordering
compare :: ResponseCode -> ResponseCode -> Ordering
$c< :: ResponseCode -> ResponseCode -> Bool
< :: ResponseCode -> ResponseCode -> Bool
$c<= :: ResponseCode -> ResponseCode -> Bool
<= :: ResponseCode -> ResponseCode -> Bool
$c> :: ResponseCode -> ResponseCode -> Bool
> :: ResponseCode -> ResponseCode -> Bool
$c>= :: ResponseCode -> ResponseCode -> Bool
>= :: ResponseCode -> ResponseCode -> Bool
$cmax :: ResponseCode -> ResponseCode -> ResponseCode
max :: ResponseCode -> ResponseCode -> ResponseCode
$cmin :: ResponseCode -> ResponseCode -> ResponseCode
min :: ResponseCode -> ResponseCode -> ResponseCode
Ord
    , Int -> ResponseCode -> ShowS
[ResponseCode] -> ShowS
ResponseCode -> [Char]
(Int -> ResponseCode -> ShowS)
-> (ResponseCode -> [Char])
-> ([ResponseCode] -> ShowS)
-> Show ResponseCode
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ResponseCode -> ShowS
showsPrec :: Int -> ResponseCode -> ShowS
$cshow :: ResponseCode -> [Char]
show :: ResponseCode -> [Char]
$cshowList :: [ResponseCode] -> ShowS
showList :: [ResponseCode] -> ShowS
Show
    )

codeToInt :: ResponseCode -> Int
codeToInt :: ResponseCode -> Int
codeToInt ResponseCode
c = case ResponseCode
c of
  ResponseCode
Success                  -> Int
200
  ResponseCode
NoContent                -> Int
204
  ResponseCode
PartialContent           -> Int
206
  ResponseCode
Unauthorized             -> Int
401
  ResponseCode
Authenticate             -> Int
407
  ResponseCode
MalformedRequest         -> Int
498
  ResponseCode
InvalidRequestArguments  -> Int
499
  ResponseCode
ServerError              -> Int
500
  ResponseCode
ScriptEvaluationError    -> Int
597
  ResponseCode
ServerTimeout            -> Int
598
  ResponseCode
ServerSerializationError -> Int
599

codeFromInt :: Int -> Maybe ResponseCode
codeFromInt :: Int -> Maybe ResponseCode
codeFromInt Int
i = case Int
i of
  Int
200 -> ResponseCode -> Maybe ResponseCode
forall a. a -> Maybe a
Just ResponseCode
Success
  Int
204 -> ResponseCode -> Maybe ResponseCode
forall a. a -> Maybe a
Just ResponseCode
NoContent
  Int
206 -> ResponseCode -> Maybe ResponseCode
forall a. a -> Maybe a
Just ResponseCode
PartialContent
  Int
401 -> ResponseCode -> Maybe ResponseCode
forall a. a -> Maybe a
Just ResponseCode
Unauthorized
  Int
407 -> ResponseCode -> Maybe ResponseCode
forall a. a -> Maybe a
Just ResponseCode
Authenticate
  Int
498 -> ResponseCode -> Maybe ResponseCode
forall a. a -> Maybe a
Just ResponseCode
MalformedRequest
  Int
499 -> ResponseCode -> Maybe ResponseCode
forall a. a -> Maybe a
Just ResponseCode
InvalidRequestArguments
  Int
500 -> ResponseCode -> Maybe ResponseCode
forall a. a -> Maybe a
Just ResponseCode
ServerError
  Int
597 -> ResponseCode -> Maybe ResponseCode
forall a. a -> Maybe a
Just ResponseCode
ScriptEvaluationError
  Int
598 -> ResponseCode -> Maybe ResponseCode
forall a. a -> Maybe a
Just ResponseCode
ServerTimeout
  Int
599 -> ResponseCode -> Maybe ResponseCode
forall a. a -> Maybe a
Just ResponseCode
ServerSerializationError
  Int
_   -> Maybe ResponseCode
forall a. Maybe a
Nothing

-- | Returns 'True' if the 'ResponseCode' is a terminating code.
isTerminating :: ResponseCode -> Bool
isTerminating :: ResponseCode -> Bool
isTerminating ResponseCode
PartialContent = Bool
False
isTerminating ResponseCode
_              = Bool
True

isCodeClass :: Int -> ResponseCode -> Bool
isCodeClass :: Int -> ResponseCode -> Bool
isCodeClass Int
n ResponseCode
c = (ResponseCode -> Int
codeToInt ResponseCode
c Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
100) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
n

-- | Returns 'True' if the 'ResponseCode' is a success.
isSuccess :: ResponseCode -> Bool
isSuccess :: ResponseCode -> Bool
isSuccess = Int -> ResponseCode -> Bool
isCodeClass Int
2

-- | Returns 'True' if the 'ResponseCode' is a client-side failure.
isClientSideError :: ResponseCode -> Bool
isClientSideError :: ResponseCode -> Bool
isClientSideError = Int -> ResponseCode -> Bool
isCodeClass Int
4

-- | Returns 'True' if the 'ResponseCode' is a server-side failure.
isServerSideError :: ResponseCode -> Bool
isServerSideError :: ResponseCode -> Bool
isServerSideError = Int -> ResponseCode -> Bool
isCodeClass Int
5

instance FromJSON ResponseCode where
  parseJSON :: Value -> Parser ResponseCode
parseJSON (Number Scientific
n) = Parser ResponseCode
-> (ResponseCode -> Parser ResponseCode)
-> Maybe ResponseCode
-> Parser ResponseCode
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Parser ResponseCode
forall {a}. Parser a
err ResponseCode -> Parser ResponseCode
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe ResponseCode -> Parser ResponseCode)
-> Maybe ResponseCode -> Parser ResponseCode
forall a b. (a -> b) -> a -> b
$ Int -> Maybe ResponseCode
codeFromInt (Int -> Maybe ResponseCode) -> Int -> Maybe ResponseCode
forall a b. (a -> b) -> a -> b
$ Scientific -> Int
forall b. Integral b => Scientific -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor Scientific
n
    where
      err :: Parser a
err = [Char] -> Parser a
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char]
"Unknown response code: " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ Scientific -> [Char]
forall a. Show a => a -> [Char]
show Scientific
n)
  parseJSON Value
v = [Char] -> Parser ResponseCode
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char]
"Expected Number, but got " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ Value -> [Char]
forall a. Show a => a -> [Char]
show Value
v)

instance FromGraphSON ResponseCode where
  parseGraphSON :: GValue -> Parser ResponseCode
parseGraphSON = GValue -> Parser ResponseCode
forall a. FromJSON a => GValue -> Parser a
parseUnwrapAll

instance ToJSON ResponseCode where
  toJSON :: ResponseCode -> Value
toJSON = Int -> Value
forall a. ToJSON a => a -> Value
toJSON (Int -> Value) -> (ResponseCode -> Int) -> ResponseCode -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResponseCode -> Int
codeToInt

-- | \"status\" field.
data ResponseStatus
  = ResponseStatus
      { ResponseStatus -> ResponseCode
code       :: !ResponseCode
      , ResponseStatus -> Text
message    :: !Text
      , ResponseStatus -> Object
attributes :: !Object
      }
  deriving (ResponseStatus -> ResponseStatus -> Bool
(ResponseStatus -> ResponseStatus -> Bool)
-> (ResponseStatus -> ResponseStatus -> Bool) -> Eq ResponseStatus
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ResponseStatus -> ResponseStatus -> Bool
== :: ResponseStatus -> ResponseStatus -> Bool
$c/= :: ResponseStatus -> ResponseStatus -> Bool
/= :: ResponseStatus -> ResponseStatus -> Bool
Eq, (forall x. ResponseStatus -> Rep ResponseStatus x)
-> (forall x. Rep ResponseStatus x -> ResponseStatus)
-> Generic ResponseStatus
forall x. Rep ResponseStatus x -> ResponseStatus
forall x. ResponseStatus -> Rep ResponseStatus x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ResponseStatus -> Rep ResponseStatus x
from :: forall x. ResponseStatus -> Rep ResponseStatus x
$cto :: forall x. Rep ResponseStatus x -> ResponseStatus
to :: forall x. Rep ResponseStatus x -> ResponseStatus
Generic, Int -> ResponseStatus -> ShowS
[ResponseStatus] -> ShowS
ResponseStatus -> [Char]
(Int -> ResponseStatus -> ShowS)
-> (ResponseStatus -> [Char])
-> ([ResponseStatus] -> ShowS)
-> Show ResponseStatus
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ResponseStatus -> ShowS
showsPrec :: Int -> ResponseStatus -> ShowS
$cshow :: ResponseStatus -> [Char]
show :: ResponseStatus -> [Char]
$cshowList :: [ResponseStatus] -> ShowS
showList :: [ResponseStatus] -> ShowS
Show)

instance FromJSON ResponseStatus where
  parseJSON :: Value -> Parser ResponseStatus
parseJSON Value
v = GValue -> Parser ResponseStatus
forall a. FromGraphSON a => GValue -> Parser a
parseGraphSON (GValue -> Parser ResponseStatus)
-> Parser GValue -> Parser ResponseStatus
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Value -> Parser GValue
forall a. FromJSON a => Value -> Parser a
parseJSON Value
v

instance FromGraphSON ResponseStatus where
  parseGraphSON :: GValue -> Parser ResponseStatus
parseGraphSON GValue
gv = case GValue -> GValueBody
gValueBody GValue
gv of
    GObject KeyMap GValue
o ->
      ResponseCode -> Text -> Object -> ResponseStatus
ResponseStatus
      (ResponseCode -> Text -> Object -> ResponseStatus)
-> Parser ResponseCode -> Parser (Text -> Object -> ResponseStatus)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> KeyMap GValue
o KeyMap GValue -> Key -> Parser ResponseCode
forall a. FromGraphSON a => KeyMap GValue -> Key -> Parser a
.: Key
"code"
      Parser (Text -> Object -> ResponseStatus)
-> Parser Text -> Parser (Object -> ResponseStatus)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap GValue
o KeyMap GValue -> Key -> Parser Text
forall a. FromGraphSON a => KeyMap GValue -> Key -> Parser a
.: Key
"message"
      Parser (Object -> ResponseStatus)
-> Parser Object -> Parser ResponseStatus
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap GValue
o KeyMap GValue -> Key -> Parser Object
forall a. FromGraphSON a => KeyMap GValue -> Key -> Parser a
.: Key
"attributes"
    GValueBody
gb -> [Char] -> Parser ResponseStatus
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char]
"Expected GObject, but got " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ GValueBody -> [Char]
forall a. Show a => a -> [Char]
show GValueBody
gb)


-- | \"result\" field.
data ResponseResult s
  = ResponseResult
      { forall s. ResponseResult s -> s
resultData :: !s
        -- ^ \"data\" field.
      , forall s. ResponseResult s -> Object
meta       :: !Object
      }
  deriving (ResponseResult s -> ResponseResult s -> Bool
(ResponseResult s -> ResponseResult s -> Bool)
-> (ResponseResult s -> ResponseResult s -> Bool)
-> Eq (ResponseResult s)
forall s. Eq s => ResponseResult s -> ResponseResult s -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall s. Eq s => ResponseResult s -> ResponseResult s -> Bool
== :: ResponseResult s -> ResponseResult s -> Bool
$c/= :: forall s. Eq s => ResponseResult s -> ResponseResult s -> Bool
/= :: ResponseResult s -> ResponseResult s -> Bool
Eq, (forall x. ResponseResult s -> Rep (ResponseResult s) x)
-> (forall x. Rep (ResponseResult s) x -> ResponseResult s)
-> Generic (ResponseResult s)
forall x. Rep (ResponseResult s) x -> ResponseResult s
forall x. ResponseResult s -> Rep (ResponseResult s) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall s x. Rep (ResponseResult s) x -> ResponseResult s
forall s x. ResponseResult s -> Rep (ResponseResult s) x
$cfrom :: forall s x. ResponseResult s -> Rep (ResponseResult s) x
from :: forall x. ResponseResult s -> Rep (ResponseResult s) x
$cto :: forall s x. Rep (ResponseResult s) x -> ResponseResult s
to :: forall x. Rep (ResponseResult s) x -> ResponseResult s
Generic, Int -> ResponseResult s -> ShowS
[ResponseResult s] -> ShowS
ResponseResult s -> [Char]
(Int -> ResponseResult s -> ShowS)
-> (ResponseResult s -> [Char])
-> ([ResponseResult s] -> ShowS)
-> Show (ResponseResult s)
forall s. Show s => Int -> ResponseResult s -> ShowS
forall s. Show s => [ResponseResult s] -> ShowS
forall s. Show s => ResponseResult s -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall s. Show s => Int -> ResponseResult s -> ShowS
showsPrec :: Int -> ResponseResult s -> ShowS
$cshow :: forall s. Show s => ResponseResult s -> [Char]
show :: ResponseResult s -> [Char]
$cshowList :: forall s. Show s => [ResponseResult s] -> ShowS
showList :: [ResponseResult s] -> ShowS
Show)

instance FromGraphSON s => FromJSON (ResponseResult s) where
  parseJSON :: Value -> Parser (ResponseResult s)
parseJSON Value
v = GValue -> Parser (ResponseResult s)
forall a. FromGraphSON a => GValue -> Parser a
parseGraphSON (GValue -> Parser (ResponseResult s))
-> Parser GValue -> Parser (ResponseResult s)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Value -> Parser GValue
forall a. FromJSON a => Value -> Parser a
parseJSON Value
v

instance FromGraphSON s => FromGraphSON (ResponseResult s) where
  parseGraphSON :: GValue -> Parser (ResponseResult s)
parseGraphSON GValue
gv = case GValue -> GValueBody
gValueBody GValue
gv of
    GObject KeyMap GValue
o ->
      s -> Object -> ResponseResult s
forall s. s -> Object -> ResponseResult s
ResponseResult
      (s -> Object -> ResponseResult s)
-> Parser s -> Parser (Object -> ResponseResult s)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> KeyMap GValue
o KeyMap GValue -> Key -> Parser s
forall a. FromGraphSON a => KeyMap GValue -> Key -> Parser a
.: Key
"data"
      Parser (Object -> ResponseResult s)
-> Parser Object -> Parser (ResponseResult s)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap GValue
o KeyMap GValue -> Key -> Parser Object
forall a. FromGraphSON a => KeyMap GValue -> Key -> Parser a
.: Key
"meta"
    GValueBody
gb -> [Char] -> Parser (ResponseResult s)
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char]
"Expected GObject, but got " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ GValueBody -> [Char]
forall a. Show a => a -> [Char]
show GValueBody
gb)

instance Functor ResponseResult where
  fmap :: forall a b. (a -> b) -> ResponseResult a -> ResponseResult b
fmap a -> b
f ResponseResult a
rr = ResponseResult a
rr { resultData = f $ resultData rr }

-- | ResponseMessage object from Gremlin Server. See
-- <http://tinkerpop.apache.org/docs/current/dev/provider/>.
--
-- Type @s@ is the type of the response data.
data ResponseMessage s
  = ResponseMessage
      { forall s. ResponseMessage s -> UUID
requestId :: !UUID
      , forall s. ResponseMessage s -> ResponseStatus
status    :: !ResponseStatus
      , forall s. ResponseMessage s -> ResponseResult s
result    :: !(ResponseResult s)
      }
  deriving (ResponseMessage s -> ResponseMessage s -> Bool
(ResponseMessage s -> ResponseMessage s -> Bool)
-> (ResponseMessage s -> ResponseMessage s -> Bool)
-> Eq (ResponseMessage s)
forall s. Eq s => ResponseMessage s -> ResponseMessage s -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall s. Eq s => ResponseMessage s -> ResponseMessage s -> Bool
== :: ResponseMessage s -> ResponseMessage s -> Bool
$c/= :: forall s. Eq s => ResponseMessage s -> ResponseMessage s -> Bool
/= :: ResponseMessage s -> ResponseMessage s -> Bool
Eq, (forall x. ResponseMessage s -> Rep (ResponseMessage s) x)
-> (forall x. Rep (ResponseMessage s) x -> ResponseMessage s)
-> Generic (ResponseMessage s)
forall x. Rep (ResponseMessage s) x -> ResponseMessage s
forall x. ResponseMessage s -> Rep (ResponseMessage s) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall s x. Rep (ResponseMessage s) x -> ResponseMessage s
forall s x. ResponseMessage s -> Rep (ResponseMessage s) x
$cfrom :: forall s x. ResponseMessage s -> Rep (ResponseMessage s) x
from :: forall x. ResponseMessage s -> Rep (ResponseMessage s) x
$cto :: forall s x. Rep (ResponseMessage s) x -> ResponseMessage s
to :: forall x. Rep (ResponseMessage s) x -> ResponseMessage s
Generic, Int -> ResponseMessage s -> ShowS
[ResponseMessage s] -> ShowS
ResponseMessage s -> [Char]
(Int -> ResponseMessage s -> ShowS)
-> (ResponseMessage s -> [Char])
-> ([ResponseMessage s] -> ShowS)
-> Show (ResponseMessage s)
forall s. Show s => Int -> ResponseMessage s -> ShowS
forall s. Show s => [ResponseMessage s] -> ShowS
forall s. Show s => ResponseMessage s -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall s. Show s => Int -> ResponseMessage s -> ShowS
showsPrec :: Int -> ResponseMessage s -> ShowS
$cshow :: forall s. Show s => ResponseMessage s -> [Char]
show :: ResponseMessage s -> [Char]
$cshowList :: forall s. Show s => [ResponseMessage s] -> ShowS
showList :: [ResponseMessage s] -> ShowS
Show)

instance FromGraphSON s => FromJSON (ResponseMessage s) where
  parseJSON :: Value -> Parser (ResponseMessage s)
parseJSON Value
v = GValue -> Parser (ResponseMessage s)
forall a. FromGraphSON a => GValue -> Parser a
parseGraphSON (GValue -> Parser (ResponseMessage s))
-> Parser GValue -> Parser (ResponseMessage s)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Value -> Parser GValue
forall a. FromJSON a => Value -> Parser a
parseJSON Value
v

instance FromGraphSON s => FromGraphSON (ResponseMessage s) where
  parseGraphSON :: GValue -> Parser (ResponseMessage s)
parseGraphSON GValue
gv = case GValue -> GValueBody
gValueBody GValue
gv of
    GObject KeyMap GValue
o ->
      UUID -> ResponseStatus -> ResponseResult s -> ResponseMessage s
forall s.
UUID -> ResponseStatus -> ResponseResult s -> ResponseMessage s
ResponseMessage
      (UUID -> ResponseStatus -> ResponseResult s -> ResponseMessage s)
-> Parser UUID
-> Parser (ResponseStatus -> ResponseResult s -> ResponseMessage s)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (KeyMap GValue
o KeyMap GValue -> Key -> Parser UUID
forall a. FromGraphSON a => KeyMap GValue -> Key -> Parser a
.: Key
"requestId")
      Parser (ResponseStatus -> ResponseResult s -> ResponseMessage s)
-> Parser ResponseStatus
-> Parser (ResponseResult s -> ResponseMessage s)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap GValue
o KeyMap GValue -> Key -> Parser ResponseStatus
forall a. FromGraphSON a => KeyMap GValue -> Key -> Parser a
.: Key
"status")
      Parser (ResponseResult s -> ResponseMessage s)
-> Parser (ResponseResult s) -> Parser (ResponseMessage s)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap GValue
o KeyMap GValue -> Key -> Parser (ResponseResult s)
forall a. FromGraphSON a => KeyMap GValue -> Key -> Parser a
.: Key
"result")
    GValueBody
gb -> [Char] -> Parser (ResponseMessage s)
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char]
"Expected GObject, but got " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ GValueBody -> [Char]
forall a. Show a => a -> [Char]
show GValueBody
gb)

instance Functor ResponseMessage where
  fmap :: forall a b. (a -> b) -> ResponseMessage a -> ResponseMessage b
fmap a -> b
f ResponseMessage a
rm = ResponseMessage a
rm { result = fmap f $ result rm }