{-# LANGUAGE DeriveGeneric, OverloadedStrings #-}
module Network.Greskell.WebSocket.Response
(
ResponseMessage(..),
ResponseStatus(..),
ResponseResult(..),
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)
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
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
isSuccess :: ResponseCode -> Bool
isSuccess :: ResponseCode -> Bool
isSuccess = Int -> ResponseCode -> Bool
isCodeClass Int
2
isClientSideError :: ResponseCode -> Bool
isClientSideError :: ResponseCode -> Bool
isClientSideError = Int -> ResponseCode -> Bool
isCodeClass Int
4
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
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)
data ResponseResult s =
ResponseResult
{ ResponseResult s -> s
resultData :: !s,
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 }
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 }