{-# LANGUAGE DeriveGeneric, 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
  ( Object, ToJSON(..), FromJSON(..), Value(Number, Object),
    defaultOptions, genericParseJSON
  )
import Data.Greskell.GraphSON
  ( gsonValue, FromGraphSON(..), parseUnwrapAll, (.:),
    GValueBody(..)
  )
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 (Int -> ResponseCode -> ShowS
[ResponseCode] -> ShowS
ResponseCode -> String
(Int -> ResponseCode -> ShowS)
-> (ResponseCode -> String)
-> ([ResponseCode] -> ShowS)
-> Show ResponseCode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ResponseCode] -> ShowS
$cshowList :: [ResponseCode] -> ShowS
show :: ResponseCode -> String
$cshow :: ResponseCode -> String
showsPrec :: Int -> ResponseCode -> ShowS
$cshowsPrec :: Int -> ResponseCode -> ShowS
Show,ResponseCode -> ResponseCode -> Bool
(ResponseCode -> ResponseCode -> Bool)
-> (ResponseCode -> ResponseCode -> Bool) -> Eq ResponseCode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ResponseCode -> ResponseCode -> Bool
$c/= :: ResponseCode -> ResponseCode -> Bool
== :: ResponseCode -> ResponseCode -> Bool
$c== :: 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
min :: ResponseCode -> ResponseCode -> ResponseCode
$cmin :: ResponseCode -> ResponseCode -> ResponseCode
max :: ResponseCode -> ResponseCode -> ResponseCode
$cmax :: ResponseCode -> ResponseCode -> ResponseCode
>= :: ResponseCode -> ResponseCode -> Bool
$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
compare :: ResponseCode -> ResponseCode -> Ordering
$ccompare :: ResponseCode -> ResponseCode -> Ordering
$cp1Ord :: Eq ResponseCode
Ord,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
enumFromThenTo :: ResponseCode -> ResponseCode -> ResponseCode -> [ResponseCode]
$cenumFromThenTo :: ResponseCode -> ResponseCode -> ResponseCode -> [ResponseCode]
enumFromTo :: ResponseCode -> ResponseCode -> [ResponseCode]
$cenumFromTo :: ResponseCode -> ResponseCode -> [ResponseCode]
enumFromThen :: ResponseCode -> ResponseCode -> [ResponseCode]
$cenumFromThen :: ResponseCode -> ResponseCode -> [ResponseCode]
enumFrom :: ResponseCode -> [ResponseCode]
$cenumFrom :: ResponseCode -> [ResponseCode]
fromEnum :: ResponseCode -> Int
$cfromEnum :: ResponseCode -> Int
toEnum :: Int -> ResponseCode
$ctoEnum :: Int -> ResponseCode
pred :: ResponseCode -> ResponseCode
$cpred :: ResponseCode -> ResponseCode
succ :: ResponseCode -> ResponseCode
$csucc :: ResponseCode -> ResponseCode
Enum,ResponseCode
ResponseCode -> ResponseCode -> Bounded ResponseCode
forall a. a -> a -> Bounded a
maxBound :: ResponseCode
$cmaxBound :: ResponseCode
minBound :: ResponseCode
$cminBound :: ResponseCode
Bounded)

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 Success
-- True
-- >>> isSuccess Unauthorized
-- False
-- >>> isSuccess ServerError
-- False
isSuccess :: ResponseCode -> Bool
isSuccess :: ResponseCode -> Bool
isSuccess = Int -> ResponseCode -> Bool
isCodeClass Int
2

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

-- | Returns 'True' if the 'ResponseCode' is a server-side failure.
--
-- >>> isServerSideError Success
-- False
-- >>> isServerSideError Unauthorized
-- False
-- >>> isServerSideError ServerError
-- True
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 (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 a b. (RealFrac a, Integral b) => a -> b
floor Scientific
n
    where
      err :: Parser a
err = String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Unknown response code: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Scientific -> String
forall a. Show a => a -> String
show Scientific
n)
  parseJSON Value
v = String -> Parser ResponseCode
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Expected Number, but got " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Value -> String
forall a. Show a => a -> String
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 (Int -> ResponseStatus -> ShowS
[ResponseStatus] -> ShowS
ResponseStatus -> String
(Int -> ResponseStatus -> ShowS)
-> (ResponseStatus -> String)
-> ([ResponseStatus] -> ShowS)
-> Show ResponseStatus
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ResponseStatus] -> ShowS
$cshowList :: [ResponseStatus] -> ShowS
show :: ResponseStatus -> String
$cshow :: ResponseStatus -> String
showsPrec :: Int -> ResponseStatus -> ShowS
$cshowsPrec :: Int -> ResponseStatus -> ShowS
Show,ResponseStatus -> ResponseStatus -> Bool
(ResponseStatus -> ResponseStatus -> Bool)
-> (ResponseStatus -> ResponseStatus -> Bool) -> Eq ResponseStatus
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ResponseStatus -> ResponseStatus -> Bool
$c/= :: ResponseStatus -> ResponseStatus -> Bool
== :: ResponseStatus -> ResponseStatus -> Bool
$c== :: 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
$cto :: forall x. Rep ResponseStatus x -> ResponseStatus
$cfrom :: forall x. ResponseStatus -> Rep ResponseStatus x
Generic)

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 HashMap Text 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
<$> HashMap Text GValue
o HashMap Text GValue -> Text -> Parser ResponseCode
forall a. FromGraphSON a => HashMap Text GValue -> Text -> Parser a
.: Text
"code"
      Parser (Text -> Object -> ResponseStatus)
-> Parser Text -> Parser (Object -> ResponseStatus)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HashMap Text GValue
o HashMap Text GValue -> Text -> Parser Text
forall a. FromGraphSON a => HashMap Text GValue -> Text -> Parser a
.: Text
"message"
      Parser (Object -> ResponseStatus)
-> Parser Object -> Parser ResponseStatus
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HashMap Text GValue
o HashMap Text GValue -> Text -> Parser Object
forall a. FromGraphSON a => HashMap Text GValue -> Text -> Parser a
.: Text
"attributes"
    GValueBody
gb -> String -> Parser ResponseStatus
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Expected GObject, but got " String -> ShowS
forall a. [a] -> [a] -> [a]
++ GValueBody -> String
forall a. Show a => a -> String
show GValueBody
gb)
  

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

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 HashMap Text 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
<$> HashMap Text GValue
o HashMap Text GValue -> Text -> Parser s
forall a. FromGraphSON a => HashMap Text GValue -> Text -> Parser a
.: Text
"data"
      Parser (Object -> ResponseResult s)
-> Parser Object -> Parser (ResponseResult s)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HashMap Text GValue
o HashMap Text GValue -> Text -> Parser Object
forall a. FromGraphSON a => HashMap Text GValue -> Text -> Parser a
.: Text
"meta"
    GValueBody
gb -> String -> Parser (ResponseResult s)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Expected GObject, but got " String -> ShowS
forall a. [a] -> [a] -> [a]
++ GValueBody -> String
forall a. Show a => a -> String
show GValueBody
gb)

instance Functor ResponseResult where
  fmap :: (a -> b) -> ResponseResult a -> ResponseResult b
fmap a -> b
f ResponseResult a
rr = ResponseResult a
rr { resultData :: b
resultData = a -> b
f (a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
$ ResponseResult a -> a
forall s. ResponseResult s -> s
resultData ResponseResult a
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
  { ResponseMessage s -> UUID
requestId :: !UUID,
    ResponseMessage s -> ResponseStatus
status :: !ResponseStatus,
    ResponseMessage s -> ResponseResult s
result :: !(ResponseResult s)
  }
  deriving (Int -> ResponseMessage s -> ShowS
[ResponseMessage s] -> ShowS
ResponseMessage s -> String
(Int -> ResponseMessage s -> ShowS)
-> (ResponseMessage s -> String)
-> ([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 -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ResponseMessage s] -> ShowS
$cshowList :: forall s. Show s => [ResponseMessage s] -> ShowS
show :: ResponseMessage s -> String
$cshow :: forall s. Show s => ResponseMessage s -> String
showsPrec :: Int -> ResponseMessage s -> ShowS
$cshowsPrec :: forall s. Show s => Int -> ResponseMessage s -> ShowS
Show,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
/= :: ResponseMessage s -> ResponseMessage s -> Bool
$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
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
$cto :: forall s x. Rep (ResponseMessage s) x -> ResponseMessage s
$cfrom :: forall s x. ResponseMessage s -> Rep (ResponseMessage s) x
Generic)

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 HashMap Text 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
<$> (HashMap Text GValue
o HashMap Text GValue -> Text -> Parser UUID
forall a. FromGraphSON a => HashMap Text GValue -> Text -> Parser a
.: Text
"requestId")
      Parser (ResponseStatus -> ResponseResult s -> ResponseMessage s)
-> Parser ResponseStatus
-> Parser (ResponseResult s -> ResponseMessage s)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (HashMap Text GValue
o HashMap Text GValue -> Text -> Parser ResponseStatus
forall a. FromGraphSON a => HashMap Text GValue -> Text -> Parser a
.: Text
"status")
      Parser (ResponseResult s -> ResponseMessage s)
-> Parser (ResponseResult s) -> Parser (ResponseMessage s)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (HashMap Text GValue
o HashMap Text GValue -> Text -> Parser (ResponseResult s)
forall a. FromGraphSON a => HashMap Text GValue -> Text -> Parser a
.: Text
"result")
    GValueBody
gb -> String -> Parser (ResponseMessage s)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Expected GObject, but got " String -> ShowS
forall a. [a] -> [a] -> [a]
++ GValueBody -> String
forall a. Show a => a -> String
show GValueBody
gb)

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