{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
module Network.JSONRPC.Data
(
Request(..)
, BatchRequest(..)
, FromRequest(..)
, fromRequest
, ToRequest(..)
, buildRequest
, Response(..)
, BatchResponse(..)
, FromResponse(..)
, fromResponse
, Respond
, buildResponse
, ErrorObj(..)
, fromError
, errorParse
, errorInvalid
, errorParams
, errorMethod
, errorId
, Message(..)
, Method
, Id(..)
, fromId
, Ver(..)
) where
import Control.Applicative
import Control.DeepSeq
import Control.Monad
import Data.Aeson (encode)
import Data.Aeson.Types
import Data.ByteString (ByteString)
import qualified Data.ByteString.Lazy as L
import Data.Hashable (Hashable)
import Data.Maybe
import Data.Text (Text)
import qualified Data.Text as T
import Data.Text.Encoding
import GHC.Generics (Generic)
data Request = Request { Request -> Ver
getReqVer :: !Ver
, Request -> Text
getReqMethod :: !Method
, Request -> Value
getReqParams :: !Value
, Request -> Id
getReqId :: !Id
}
| Notif { getReqVer :: !Ver
, getReqMethod :: !Method
, getReqParams :: !Value
}
deriving (Request -> Request -> Bool
(Request -> Request -> Bool)
-> (Request -> Request -> Bool) -> Eq Request
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Request -> Request -> Bool
== :: Request -> Request -> Bool
$c/= :: Request -> Request -> Bool
/= :: Request -> Request -> Bool
Eq, Int -> Request -> ShowS
[Request] -> ShowS
Request -> [Char]
(Int -> Request -> ShowS)
-> (Request -> [Char]) -> ([Request] -> ShowS) -> Show Request
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Request -> ShowS
showsPrec :: Int -> Request -> ShowS
$cshow :: Request -> [Char]
show :: Request -> [Char]
$cshowList :: [Request] -> ShowS
showList :: [Request] -> ShowS
Show, (forall x. Request -> Rep Request x)
-> (forall x. Rep Request x -> Request) -> Generic Request
forall x. Rep Request x -> Request
forall x. Request -> Rep Request x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Request -> Rep Request x
from :: forall x. Request -> Rep Request x
$cto :: forall x. Rep Request x -> Request
to :: forall x. Rep Request x -> Request
Generic)
instance NFData Request where
rnf :: Request -> ()
rnf (Request Ver
v Text
m Value
p Id
i) = Ver -> ()
forall a. NFData a => a -> ()
rnf Ver
v () -> () -> ()
forall a b. a -> b -> b
`seq` Text -> ()
forall a. NFData a => a -> ()
rnf Text
m () -> () -> ()
forall a b. a -> b -> b
`seq` Value -> ()
forall a. NFData a => a -> ()
rnf Value
p () -> () -> ()
forall a b. a -> b -> b
`seq` Id -> ()
forall a. NFData a => a -> ()
rnf Id
i
rnf (Notif Ver
v Text
m Value
p) = Ver -> ()
forall a. NFData a => a -> ()
rnf Ver
v () -> () -> ()
forall a b. a -> b -> b
`seq` Text -> ()
forall a. NFData a => a -> ()
rnf Text
m () -> () -> ()
forall a b. a -> b -> b
`seq` Value -> ()
forall a. NFData a => a -> ()
rnf Value
p
instance ToJSON Request where
toJSON :: Request -> Value
toJSON (Request Ver
V2 Text
m Value
p Id
i) = [Pair] -> Value
object ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$ case Value
p of
Value
Null -> [Pair
jr2, Key
"method" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
m, Key
"id" Key -> Id -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Id
i]
Value
_ -> [Pair
jr2, Key
"method" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
m, Key
"id" Key -> Id -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Id
i, Key
"params" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
p]
toJSON (Request Ver
V1 Text
m Value
p Id
i) =
[Pair] -> Value
object [Key
"method" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
m, Key
"params" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
p, Key
"id" Key -> Id -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Id
i]
toJSON (Notif Ver
V2 Text
m Value
p) = [Pair] -> Value
object ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$ case Value
p of
Value
Null -> [Pair
jr2, Key
"method" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
m]
Value
_ -> [Pair
jr2, Key
"method" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
m, Key
"params" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
p]
toJSON (Notif Ver
V1 Text
m Value
p) =
[Pair] -> Value
object [Key
"method" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
m, Key
"params" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
p, Key
"id" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
class FromRequest q where
parseParams :: Method -> Maybe (Value -> Parser q)
fromRequest :: FromRequest q => Request -> Either ErrorObj q
fromRequest :: forall q. FromRequest q => Request -> Either ErrorObj q
fromRequest Request
req =
case Maybe (Value -> Parser q)
parserM of
Maybe (Value -> Parser q)
Nothing -> ErrorObj -> Either ErrorObj q
forall a b. a -> Either a b
Left (ErrorObj -> Either ErrorObj q) -> ErrorObj -> Either ErrorObj q
forall a b. (a -> b) -> a -> b
$ Text -> ErrorObj
errorMethod Text
m
Just Value -> Parser q
parser ->
case (Value -> Parser q) -> Value -> Either [Char] q
forall a b. (a -> Parser b) -> a -> Either [Char] b
parseEither Value -> Parser q
parser Value
p of
Left [Char]
e -> ErrorObj -> Either ErrorObj q
forall a b. a -> Either a b
Left (ErrorObj -> Either ErrorObj q) -> ErrorObj -> Either ErrorObj q
forall a b. (a -> b) -> a -> b
$ Value -> [Char] -> ErrorObj
errorParams Value
p [Char]
e
Right q
q -> q -> Either ErrorObj q
forall a b. b -> Either a b
Right q
q
where
m :: Text
m = Request -> Text
getReqMethod Request
req
p :: Value
p = Request -> Value
getReqParams Request
req
parserM :: Maybe (Value -> Parser q)
parserM = Text -> Maybe (Value -> Parser q)
forall q. FromRequest q => Text -> Maybe (Value -> Parser q)
parseParams Text
m
instance FromRequest Value where
parseParams :: Text -> Maybe (Value -> Parser Value)
parseParams = Maybe (Value -> Parser Value)
-> Text -> Maybe (Value -> Parser Value)
forall a b. a -> b -> a
const (Maybe (Value -> Parser Value)
-> Text -> Maybe (Value -> Parser Value))
-> Maybe (Value -> Parser Value)
-> Text
-> Maybe (Value -> Parser Value)
forall a b. (a -> b) -> a -> b
$ (Value -> Parser Value) -> Maybe (Value -> Parser Value)
forall a. a -> Maybe a
Just Value -> Parser Value
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return
instance FromRequest () where
parseParams :: Text -> Maybe (Value -> Parser ())
parseParams = Maybe (Value -> Parser ()) -> Text -> Maybe (Value -> Parser ())
forall a b. a -> b -> a
const (Maybe (Value -> Parser ()) -> Text -> Maybe (Value -> Parser ()))
-> (Parser () -> Maybe (Value -> Parser ()))
-> Parser ()
-> Text
-> Maybe (Value -> Parser ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Value -> Parser ()) -> Maybe (Value -> Parser ())
forall a. a -> Maybe a
Just ((Value -> Parser ()) -> Maybe (Value -> Parser ()))
-> (Parser () -> Value -> Parser ())
-> Parser ()
-> Maybe (Value -> Parser ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser () -> Value -> Parser ()
forall a b. a -> b -> a
const (Parser () -> Text -> Maybe (Value -> Parser ()))
-> Parser () -> Text -> Maybe (Value -> Parser ())
forall a b. (a -> b) -> a -> b
$ () -> Parser ()
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
instance FromJSON Request where
parseJSON :: Value -> Parser Request
parseJSON = [Char] -> (Object -> Parser Request) -> Value -> Parser Request
forall a. [Char] -> (Object -> Parser a) -> Value -> Parser a
withObject [Char]
"request" ((Object -> Parser Request) -> Value -> Parser Request)
-> (Object -> Parser Request) -> Value -> Parser Request
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
(Ver
v, Maybe Id
n, Text
m, Value
p) <- Object -> Parser (Ver, Maybe Id, Text, Value)
parseVerIdMethParams Object
o
case Maybe Id
n of Maybe Id
Nothing -> Request -> Parser Request
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Request -> Parser Request) -> Request -> Parser Request
forall a b. (a -> b) -> a -> b
$ Ver -> Text -> Value -> Request
Notif Ver
v Text
m Value
p
Just Id
i -> Request -> Parser Request
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Request -> Parser Request) -> Request -> Parser Request
forall a b. (a -> b) -> a -> b
$ Ver -> Text -> Value -> Id -> Request
Request Ver
v Text
m Value
p Id
i
parseVerIdMethParams :: Object -> Parser (Ver, Maybe Id, Method, Value)
parseVerIdMethParams :: Object -> Parser (Ver, Maybe Id, Text, Value)
parseVerIdMethParams Object
o = do
Ver
v <- Object -> Parser Ver
parseVer Object
o
Maybe Id
i <- Object
o Object -> Key -> Parser (Maybe Id)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"id"
Text
m <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"method"
Value
p <- Object
o Object -> Key -> Parser (Maybe Value)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"params" Parser (Maybe Value) -> Value -> Parser Value
forall a. Parser (Maybe a) -> a -> Parser a
.!= Value
Null
(Ver, Maybe Id, Text, Value) -> Parser (Ver, Maybe Id, Text, Value)
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Ver
v, Maybe Id
i, Text
m, Value
p)
class ToRequest q where
requestMethod :: q -> Method
requestIsNotif :: q -> Bool
instance ToRequest Value where
requestMethod :: Value -> Text
requestMethod = Text -> Value -> Text
forall a b. a -> b -> a
const Text
"json"
requestIsNotif :: Value -> Bool
requestIsNotif = Bool -> Value -> Bool
forall a b. a -> b -> a
const Bool
False
instance ToRequest () where
requestMethod :: () -> Text
requestMethod = Text -> () -> Text
forall a b. a -> b -> a
const Text
"json"
requestIsNotif :: () -> Bool
requestIsNotif = Bool -> () -> Bool
forall a b. a -> b -> a
const Bool
False
buildRequest :: (ToJSON q, ToRequest q)
=> Ver
-> q
-> Id
-> Request
buildRequest :: forall q. (ToJSON q, ToRequest q) => Ver -> q -> Id -> Request
buildRequest Ver
ver q
q = if q -> Bool
forall q. ToRequest q => q -> Bool
requestIsNotif q
q
then Request -> Id -> Request
forall a b. a -> b -> a
const (Request -> Id -> Request) -> Request -> Id -> Request
forall a b. (a -> b) -> a -> b
$ Ver -> Text -> Value -> Request
Notif Ver
ver (q -> Text
forall q. ToRequest q => q -> Text
requestMethod q
q) (q -> Value
forall a. ToJSON a => a -> Value
toJSON q
q)
else Ver -> Text -> Value -> Id -> Request
Request Ver
ver (q -> Text
forall q. ToRequest q => q -> Text
requestMethod q
q) (q -> Value
forall a. ToJSON a => a -> Value
toJSON q
q)
data Response = Response { Response -> Ver
getResVer :: !Ver
, Response -> Value
getResult :: !Value
, Response -> Id
getResId :: !Id
}
| ResponseError { getResVer :: !Ver
, Response -> ErrorObj
getError :: !ErrorObj
, getResId :: !Id
}
| OrphanError { getResVer :: !Ver
, getError :: !ErrorObj
}
deriving (Response -> Response -> Bool
(Response -> Response -> Bool)
-> (Response -> Response -> Bool) -> Eq Response
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Response -> Response -> Bool
== :: Response -> Response -> Bool
$c/= :: Response -> Response -> Bool
/= :: Response -> Response -> Bool
Eq, Int -> Response -> ShowS
[Response] -> ShowS
Response -> [Char]
(Int -> Response -> ShowS)
-> (Response -> [Char]) -> ([Response] -> ShowS) -> Show Response
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Response -> ShowS
showsPrec :: Int -> Response -> ShowS
$cshow :: Response -> [Char]
show :: Response -> [Char]
$cshowList :: [Response] -> ShowS
showList :: [Response] -> ShowS
Show, (forall x. Response -> Rep Response x)
-> (forall x. Rep Response x -> Response) -> Generic Response
forall x. Rep Response x -> Response
forall x. Response -> Rep Response x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Response -> Rep Response x
from :: forall x. Response -> Rep Response x
$cto :: forall x. Rep Response x -> Response
to :: forall x. Rep Response x -> Response
Generic)
instance NFData Response where
rnf :: Response -> ()
rnf (Response Ver
v Value
r Id
i) = Ver -> ()
forall a. NFData a => a -> ()
rnf Ver
v () -> () -> ()
forall a b. a -> b -> b
`seq` Value -> ()
forall a. NFData a => a -> ()
rnf Value
r () -> () -> ()
forall a b. a -> b -> b
`seq` Id -> ()
forall a. NFData a => a -> ()
rnf Id
i
rnf (ResponseError Ver
v ErrorObj
o Id
i) = Ver -> ()
forall a. NFData a => a -> ()
rnf Ver
v () -> () -> ()
forall a b. a -> b -> b
`seq` ErrorObj -> ()
forall a. NFData a => a -> ()
rnf ErrorObj
o () -> () -> ()
forall a b. a -> b -> b
`seq` Id -> ()
forall a. NFData a => a -> ()
rnf Id
i
rnf (OrphanError Ver
v ErrorObj
o) = Ver -> ()
forall a. NFData a => a -> ()
rnf Ver
v () -> () -> ()
forall a b. a -> b -> b
`seq` ErrorObj -> ()
forall a. NFData a => a -> ()
rnf ErrorObj
o
instance ToJSON Response where
toJSON :: Response -> Value
toJSON (Response Ver
V1 Value
r Id
i) = [Pair] -> Value
object
[Key
"id" Key -> Id -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Id
i, Key
"result" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
r, Key
"error" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (Response Ver
V2 Value
r Id
i) = [Pair] -> Value
object
[Pair
jr2, Key
"id" Key -> Id -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Id
i, Key
"result" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
r]
toJSON (ResponseError Ver
V1 ErrorObj
e Id
i) = [Pair] -> Value
object
[Key
"id" Key -> Id -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Id
i, Key
"error" Key -> ErrorObj -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ErrorObj
e, Key
"result" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (ResponseError Ver
V2 ErrorObj
e Id
i) = [Pair] -> Value
object
[Pair
jr2, Key
"id" Key -> Id -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Id
i, Key
"error" Key -> ErrorObj -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ErrorObj
e]
toJSON (OrphanError Ver
V1 ErrorObj
e) = [Pair] -> Value
object
[Key
"id" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
Null, Key
"error" Key -> ErrorObj -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ErrorObj
e, Key
"result" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (OrphanError Ver
V2 ErrorObj
e) = [Pair] -> Value
object
[Pair
jr2, Key
"id" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
Null, Key
"error" Key -> ErrorObj -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ErrorObj
e]
class FromResponse r where
parseResult :: Method -> Maybe (Value -> Parser r)
fromResponse :: FromResponse r => Method -> Response -> Maybe r
fromResponse :: forall r. FromResponse r => Text -> Response -> Maybe r
fromResponse Text
m (Response Ver
_ Value
r Id
_) = Text -> Maybe (Value -> Parser r)
forall r. FromResponse r => Text -> Maybe (Value -> Parser r)
parseResult Text
m Maybe (Value -> Parser r)
-> ((Value -> Parser r) -> Maybe r) -> Maybe r
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ((Value -> Parser r) -> Value -> Maybe r)
-> Value -> (Value -> Parser r) -> Maybe r
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Value -> Parser r) -> Value -> Maybe r
forall a b. (a -> Parser b) -> a -> Maybe b
parseMaybe Value
r
fromResponse Text
_ Response
_ = Maybe r
forall a. Maybe a
Nothing
instance FromResponse Value where
parseResult :: Text -> Maybe (Value -> Parser Value)
parseResult = Maybe (Value -> Parser Value)
-> Text -> Maybe (Value -> Parser Value)
forall a b. a -> b -> a
const (Maybe (Value -> Parser Value)
-> Text -> Maybe (Value -> Parser Value))
-> Maybe (Value -> Parser Value)
-> Text
-> Maybe (Value -> Parser Value)
forall a b. (a -> b) -> a -> b
$ (Value -> Parser Value) -> Maybe (Value -> Parser Value)
forall a. a -> Maybe a
Just Value -> Parser Value
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return
instance FromResponse () where
parseResult :: Text -> Maybe (Value -> Parser ())
parseResult = Maybe (Value -> Parser ()) -> Text -> Maybe (Value -> Parser ())
forall a b. a -> b -> a
const Maybe (Value -> Parser ())
forall a. Maybe a
Nothing
instance FromJSON Response where
parseJSON :: Value -> Parser Response
parseJSON = [Char] -> (Object -> Parser Response) -> Value -> Parser Response
forall a. [Char] -> (Object -> Parser a) -> Value -> Parser a
withObject [Char]
"response" ((Object -> Parser Response) -> Value -> Parser Response)
-> (Object -> Parser Response) -> Value -> Parser Response
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
(Ver
v, Maybe Id
d, Either ErrorObj Value
s) <- Object -> Parser (Ver, Maybe Id, Either ErrorObj Value)
parseVerIdResultError Object
o
case Either ErrorObj Value
s of
Right Value
r -> do
Bool -> Parser ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Parser ()) -> Bool -> Parser ()
forall a b. (a -> b) -> a -> b
$ Maybe Id -> Bool
forall a. Maybe a -> Bool
isJust Maybe Id
d
Response -> Parser Response
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Response -> Parser Response) -> Response -> Parser Response
forall a b. (a -> b) -> a -> b
$ Ver -> Value -> Id -> Response
Response Ver
v Value
r (Maybe Id -> Id
forall a. HasCallStack => Maybe a -> a
fromJust Maybe Id
d)
Left ErrorObj
e ->
case Maybe Id
d of
Just Id
i -> Response -> Parser Response
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Response -> Parser Response) -> Response -> Parser Response
forall a b. (a -> b) -> a -> b
$ Ver -> ErrorObj -> Id -> Response
ResponseError Ver
v ErrorObj
e Id
i
Maybe Id
Nothing -> Response -> Parser Response
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Response -> Parser Response) -> Response -> Parser Response
forall a b. (a -> b) -> a -> b
$ Ver -> ErrorObj -> Response
OrphanError Ver
v ErrorObj
e
parseVerIdResultError :: Object
-> Parser (Ver, Maybe Id, Either ErrorObj Value)
parseVerIdResultError :: Object -> Parser (Ver, Maybe Id, Either ErrorObj Value)
parseVerIdResultError Object
o = do
Ver
v <- Object -> Parser Ver
parseVer Object
o
Maybe Id
i <- Object
o Object -> Key -> Parser (Maybe Id)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"id"
Value
r <- Object
o Object -> Key -> Parser (Maybe Value)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"result" Parser (Maybe Value) -> Value -> Parser Value
forall a. Parser (Maybe a) -> a -> Parser a
.!= Value
Null
Either ErrorObj Value
p <- case Ver
v of
Ver
V1 -> if Value
r Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
== Value
Null then ErrorObj -> Either ErrorObj Value
forall a b. a -> Either a b
Left (ErrorObj -> Either ErrorObj Value)
-> Parser ErrorObj -> Parser (Either ErrorObj Value)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser ErrorObj
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"error" else Either ErrorObj Value -> Parser (Either ErrorObj Value)
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either ErrorObj Value -> Parser (Either ErrorObj Value))
-> Either ErrorObj Value -> Parser (Either ErrorObj Value)
forall a b. (a -> b) -> a -> b
$ Value -> Either ErrorObj Value
forall a b. b -> Either a b
Right Value
r
Ver
V2 -> Either ErrorObj Value
-> (ErrorObj -> Either ErrorObj Value)
-> Maybe ErrorObj
-> Either ErrorObj Value
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Value -> Either ErrorObj Value
forall a b. b -> Either a b
Right Value
r) ErrorObj -> Either ErrorObj Value
forall a b. a -> Either a b
Left (Maybe ErrorObj -> Either ErrorObj Value)
-> Parser (Maybe ErrorObj) -> Parser (Either ErrorObj Value)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser (Maybe ErrorObj)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"error"
(Ver, Maybe Id, Either ErrorObj Value)
-> Parser (Ver, Maybe Id, Either ErrorObj Value)
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Ver
v, Maybe Id
i, Either ErrorObj Value
p)
buildResponse :: (Monad m, FromRequest q, ToJSON r)
=> Respond q m r
-> Request
-> m (Maybe Response)
buildResponse :: forall (m :: * -> *) q r.
(Monad m, FromRequest q, ToJSON r) =>
Respond q m r -> Request -> m (Maybe Response)
buildResponse Respond q m r
f req :: Request
req@(Request Ver
v Text
_ Value
_ Id
i) =
case Request -> Either ErrorObj q
forall q. FromRequest q => Request -> Either ErrorObj q
fromRequest Request
req of
Left ErrorObj
e -> Maybe Response -> m (Maybe Response)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Response -> m (Maybe Response))
-> (Response -> Maybe Response) -> Response -> m (Maybe Response)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Response -> Maybe Response
forall a. a -> Maybe a
Just (Response -> m (Maybe Response)) -> Response -> m (Maybe Response)
forall a b. (a -> b) -> a -> b
$ Ver -> ErrorObj -> Id -> Response
ResponseError Ver
v ErrorObj
e Id
i
Right q
q -> do
Either ErrorObj r
rE <- Respond q m r
f q
q
case Either ErrorObj r
rE of
Left ErrorObj
e -> Maybe Response -> m (Maybe Response)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Response -> m (Maybe Response))
-> (Response -> Maybe Response) -> Response -> m (Maybe Response)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Response -> Maybe Response
forall a. a -> Maybe a
Just (Response -> m (Maybe Response)) -> Response -> m (Maybe Response)
forall a b. (a -> b) -> a -> b
$ Ver -> ErrorObj -> Id -> Response
ResponseError Ver
v ErrorObj
e Id
i
Right r
r -> Maybe Response -> m (Maybe Response)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Response -> m (Maybe Response))
-> (Response -> Maybe Response) -> Response -> m (Maybe Response)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Response -> Maybe Response
forall a. a -> Maybe a
Just (Response -> m (Maybe Response)) -> Response -> m (Maybe Response)
forall a b. (a -> b) -> a -> b
$ Ver -> Value -> Id -> Response
Response Ver
v (r -> Value
forall a. ToJSON a => a -> Value
toJSON r
r) Id
i
buildResponse Respond q m r
_ Request
_ = Maybe Response -> m (Maybe Response)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Response
forall a. Maybe a
Nothing
type Respond q m r = q -> m (Either ErrorObj r)
data ErrorObj = ErrorObj { ErrorObj -> [Char]
getErrMsg :: !String
, ErrorObj -> Int
getErrCode :: !Int
, ErrorObj -> Value
getErrData :: !Value
}
| ErrorVal { getErrData :: !Value }
deriving (Int -> ErrorObj -> ShowS
[ErrorObj] -> ShowS
ErrorObj -> [Char]
(Int -> ErrorObj -> ShowS)
-> (ErrorObj -> [Char]) -> ([ErrorObj] -> ShowS) -> Show ErrorObj
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ErrorObj -> ShowS
showsPrec :: Int -> ErrorObj -> ShowS
$cshow :: ErrorObj -> [Char]
show :: ErrorObj -> [Char]
$cshowList :: [ErrorObj] -> ShowS
showList :: [ErrorObj] -> ShowS
Show, ErrorObj -> ErrorObj -> Bool
(ErrorObj -> ErrorObj -> Bool)
-> (ErrorObj -> ErrorObj -> Bool) -> Eq ErrorObj
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ErrorObj -> ErrorObj -> Bool
== :: ErrorObj -> ErrorObj -> Bool
$c/= :: ErrorObj -> ErrorObj -> Bool
/= :: ErrorObj -> ErrorObj -> Bool
Eq, (forall x. ErrorObj -> Rep ErrorObj x)
-> (forall x. Rep ErrorObj x -> ErrorObj) -> Generic ErrorObj
forall x. Rep ErrorObj x -> ErrorObj
forall x. ErrorObj -> Rep ErrorObj x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ErrorObj -> Rep ErrorObj x
from :: forall x. ErrorObj -> Rep ErrorObj x
$cto :: forall x. Rep ErrorObj x -> ErrorObj
to :: forall x. Rep ErrorObj x -> ErrorObj
Generic)
instance NFData ErrorObj where
rnf :: ErrorObj -> ()
rnf (ErrorObj [Char]
m Int
c Value
d) = [Char] -> ()
forall a. NFData a => a -> ()
rnf [Char]
m () -> () -> ()
forall a b. a -> b -> b
`seq` Int -> ()
forall a. NFData a => a -> ()
rnf Int
c () -> () -> ()
forall a b. a -> b -> b
`seq` Value -> ()
forall a. NFData a => a -> ()
rnf Value
d
rnf (ErrorVal Value
v) = Value -> ()
forall a. NFData a => a -> ()
rnf Value
v
instance FromJSON ErrorObj where
parseJSON :: Value -> Parser ErrorObj
parseJSON Value
Null = Parser ErrorObj
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero
parseJSON v :: Value
v@(Object Object
o) = Parser ErrorObj
p1 Parser ErrorObj -> Parser ErrorObj -> Parser ErrorObj
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ErrorObj
p2 where
p1 :: Parser ErrorObj
p1 = do
[Char]
m <- Object
o Object -> Key -> Parser [Char]
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"message"
Int
c <- Object
o Object -> Key -> Parser Int
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"code"
Value
d <- Object
o Object -> Key -> Parser (Maybe Value)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"data" Parser (Maybe Value) -> Value -> Parser Value
forall a. Parser (Maybe a) -> a -> Parser a
.!= Value
Null
ErrorObj -> Parser ErrorObj
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (ErrorObj -> Parser ErrorObj) -> ErrorObj -> Parser ErrorObj
forall a b. (a -> b) -> a -> b
$ [Char] -> Int -> Value -> ErrorObj
ErrorObj [Char]
m Int
c Value
d
p2 :: Parser ErrorObj
p2 = ErrorObj -> Parser ErrorObj
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (ErrorObj -> Parser ErrorObj) -> ErrorObj -> Parser ErrorObj
forall a b. (a -> b) -> a -> b
$ Value -> ErrorObj
ErrorVal Value
v
parseJSON Value
v = ErrorObj -> Parser ErrorObj
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (ErrorObj -> Parser ErrorObj) -> ErrorObj -> Parser ErrorObj
forall a b. (a -> b) -> a -> b
$ Value -> ErrorObj
ErrorVal Value
v
instance ToJSON ErrorObj where
toJSON :: ErrorObj -> Value
toJSON (ErrorObj [Char]
s Int
i Value
d) = [Pair] -> Value
object ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$ [Key
"message" Key -> [Char] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Char]
s, Key
"code" Key -> Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Int
i]
[Pair] -> [Pair] -> [Pair]
forall a. [a] -> [a] -> [a]
++ if Value
d Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
== Value
Null then [] else [Key
"data" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
d]
toJSON (ErrorVal Value
v) = Value
v
fromError :: ErrorObj -> String
fromError :: ErrorObj -> [Char]
fromError (ErrorObj [Char]
m Int
c Value
v) = Int -> [Char]
forall a. Show a => a -> [Char]
show Int
c [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
": " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
m [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
": " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ Value -> [Char]
valueAsString Value
v
fromError (ErrorVal (String Text
t)) = Text -> [Char]
T.unpack Text
t
fromError (ErrorVal Value
v) = Value -> [Char]
valueAsString Value
v
valueAsString :: Value -> String
valueAsString :: Value -> [Char]
valueAsString = Text -> [Char]
T.unpack (Text -> [Char]) -> (Value -> Text) -> Value -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
decodeUtf8 (ByteString -> Text) -> (Value -> ByteString) -> Value -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
L.toStrict (ByteString -> ByteString)
-> (Value -> ByteString) -> Value -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode
errorParse :: ByteString -> ErrorObj
errorParse :: ByteString -> ErrorObj
errorParse = [Char] -> Int -> Value -> ErrorObj
ErrorObj [Char]
"Parse error" (-Int
32700) (Value -> ErrorObj)
-> (ByteString -> Value) -> ByteString -> ErrorObj
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Value
String (Text -> Value) -> (ByteString -> Text) -> ByteString -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
decodeUtf8
errorInvalid :: Value -> ErrorObj
errorInvalid :: Value -> ErrorObj
errorInvalid = [Char] -> Int -> Value -> ErrorObj
ErrorObj [Char]
"Invalid request" (-Int
32600)
errorParams :: Value -> String -> ErrorObj
errorParams :: Value -> [Char] -> ErrorObj
errorParams Value
v [Char]
e = [Char] -> Int -> Value -> ErrorObj
ErrorObj ([Char]
"Invalid params: " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
e) (-Int
32602) Value
v
errorMethod :: Method -> ErrorObj
errorMethod :: Text -> ErrorObj
errorMethod = [Char] -> Int -> Value -> ErrorObj
ErrorObj [Char]
"Method not found" (-Int
32601) (Value -> ErrorObj) -> (Text -> Value) -> Text -> ErrorObj
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Value
forall a. ToJSON a => a -> Value
toJSON
errorId :: Id -> ErrorObj
errorId :: Id -> ErrorObj
errorId = [Char] -> Int -> Value -> ErrorObj
ErrorObj [Char]
"Id not recognized" (-Int
32000) (Value -> ErrorObj) -> (Id -> Value) -> Id -> ErrorObj
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Id -> Value
forall a. ToJSON a => a -> Value
toJSON
data BatchRequest
= BatchRequest { BatchRequest -> [Request]
getBatchRequest :: ![Request] }
| SingleRequest { BatchRequest -> Request
getSingleRequest :: !Request }
deriving (BatchRequest -> BatchRequest -> Bool
(BatchRequest -> BatchRequest -> Bool)
-> (BatchRequest -> BatchRequest -> Bool) -> Eq BatchRequest
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BatchRequest -> BatchRequest -> Bool
== :: BatchRequest -> BatchRequest -> Bool
$c/= :: BatchRequest -> BatchRequest -> Bool
/= :: BatchRequest -> BatchRequest -> Bool
Eq, Int -> BatchRequest -> ShowS
[BatchRequest] -> ShowS
BatchRequest -> [Char]
(Int -> BatchRequest -> ShowS)
-> (BatchRequest -> [Char])
-> ([BatchRequest] -> ShowS)
-> Show BatchRequest
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BatchRequest -> ShowS
showsPrec :: Int -> BatchRequest -> ShowS
$cshow :: BatchRequest -> [Char]
show :: BatchRequest -> [Char]
$cshowList :: [BatchRequest] -> ShowS
showList :: [BatchRequest] -> ShowS
Show, (forall x. BatchRequest -> Rep BatchRequest x)
-> (forall x. Rep BatchRequest x -> BatchRequest)
-> Generic BatchRequest
forall x. Rep BatchRequest x -> BatchRequest
forall x. BatchRequest -> Rep BatchRequest x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BatchRequest -> Rep BatchRequest x
from :: forall x. BatchRequest -> Rep BatchRequest x
$cto :: forall x. Rep BatchRequest x -> BatchRequest
to :: forall x. Rep BatchRequest x -> BatchRequest
Generic)
instance NFData BatchRequest where
rnf :: BatchRequest -> ()
rnf (BatchRequest [Request]
qs) = [Request] -> ()
forall a. NFData a => a -> ()
rnf [Request]
qs
rnf (SingleRequest Request
q) = Request -> ()
forall a. NFData a => a -> ()
rnf Request
q
instance FromJSON BatchRequest where
parseJSON :: Value -> Parser BatchRequest
parseJSON qs :: Value
qs@Array{} = [Request] -> BatchRequest
BatchRequest ([Request] -> BatchRequest)
-> Parser [Request] -> Parser BatchRequest
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser [Request]
forall a. FromJSON a => Value -> Parser a
parseJSON Value
qs
parseJSON q :: Value
q@Object{} = Request -> BatchRequest
SingleRequest (Request -> BatchRequest) -> Parser Request -> Parser BatchRequest
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser Request
forall a. FromJSON a => Value -> Parser a
parseJSON Value
q
parseJSON Value
_ = Parser BatchRequest
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero
instance ToJSON BatchRequest where
toJSON :: BatchRequest -> Value
toJSON (BatchRequest [Request]
qs) = [Request] -> Value
forall a. ToJSON a => a -> Value
toJSON [Request]
qs
toJSON (SingleRequest Request
q) = Request -> Value
forall a. ToJSON a => a -> Value
toJSON Request
q
data BatchResponse
= BatchResponse { BatchResponse -> [Response]
getBatchResponse :: ![Response] }
| SingleResponse { BatchResponse -> Response
getSingleResponse :: !Response }
deriving (BatchResponse -> BatchResponse -> Bool
(BatchResponse -> BatchResponse -> Bool)
-> (BatchResponse -> BatchResponse -> Bool) -> Eq BatchResponse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BatchResponse -> BatchResponse -> Bool
== :: BatchResponse -> BatchResponse -> Bool
$c/= :: BatchResponse -> BatchResponse -> Bool
/= :: BatchResponse -> BatchResponse -> Bool
Eq, Int -> BatchResponse -> ShowS
[BatchResponse] -> ShowS
BatchResponse -> [Char]
(Int -> BatchResponse -> ShowS)
-> (BatchResponse -> [Char])
-> ([BatchResponse] -> ShowS)
-> Show BatchResponse
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BatchResponse -> ShowS
showsPrec :: Int -> BatchResponse -> ShowS
$cshow :: BatchResponse -> [Char]
show :: BatchResponse -> [Char]
$cshowList :: [BatchResponse] -> ShowS
showList :: [BatchResponse] -> ShowS
Show, (forall x. BatchResponse -> Rep BatchResponse x)
-> (forall x. Rep BatchResponse x -> BatchResponse)
-> Generic BatchResponse
forall x. Rep BatchResponse x -> BatchResponse
forall x. BatchResponse -> Rep BatchResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BatchResponse -> Rep BatchResponse x
from :: forall x. BatchResponse -> Rep BatchResponse x
$cto :: forall x. Rep BatchResponse x -> BatchResponse
to :: forall x. Rep BatchResponse x -> BatchResponse
Generic)
instance NFData BatchResponse where
rnf :: BatchResponse -> ()
rnf (BatchResponse [Response]
qs) = [Response] -> ()
forall a. NFData a => a -> ()
rnf [Response]
qs
rnf (SingleResponse Response
q) = Response -> ()
forall a. NFData a => a -> ()
rnf Response
q
instance FromJSON BatchResponse where
parseJSON :: Value -> Parser BatchResponse
parseJSON qs :: Value
qs@Array{} = [Response] -> BatchResponse
BatchResponse ([Response] -> BatchResponse)
-> Parser [Response] -> Parser BatchResponse
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser [Response]
forall a. FromJSON a => Value -> Parser a
parseJSON Value
qs
parseJSON q :: Value
q@Object{} = Response -> BatchResponse
SingleResponse (Response -> BatchResponse)
-> Parser Response -> Parser BatchResponse
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser Response
forall a. FromJSON a => Value -> Parser a
parseJSON Value
q
parseJSON Value
_ = Parser BatchResponse
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero
instance ToJSON BatchResponse where
toJSON :: BatchResponse -> Value
toJSON (BatchResponse [Response]
qs) = [Response] -> Value
forall a. ToJSON a => a -> Value
toJSON [Response]
qs
toJSON (SingleResponse Response
q) = Response -> Value
forall a. ToJSON a => a -> Value
toJSON Response
q
data Message
= MsgRequest { Message -> Request
getMsgRequest :: !Request }
| MsgResponse { Message -> Response
getMsgResponse :: !Response }
| MsgBatch { Message -> [Message]
getBatch :: ![Message] }
deriving (Message -> Message -> Bool
(Message -> Message -> Bool)
-> (Message -> Message -> Bool) -> Eq Message
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Message -> Message -> Bool
== :: Message -> Message -> Bool
$c/= :: Message -> Message -> Bool
/= :: Message -> Message -> Bool
Eq, Int -> Message -> ShowS
[Message] -> ShowS
Message -> [Char]
(Int -> Message -> ShowS)
-> (Message -> [Char]) -> ([Message] -> ShowS) -> Show Message
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Message -> ShowS
showsPrec :: Int -> Message -> ShowS
$cshow :: Message -> [Char]
show :: Message -> [Char]
$cshowList :: [Message] -> ShowS
showList :: [Message] -> ShowS
Show, (forall x. Message -> Rep Message x)
-> (forall x. Rep Message x -> Message) -> Generic Message
forall x. Rep Message x -> Message
forall x. Message -> Rep Message x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Message -> Rep Message x
from :: forall x. Message -> Rep Message x
$cto :: forall x. Rep Message x -> Message
to :: forall x. Rep Message x -> Message
Generic)
instance NFData Message where
rnf :: Message -> ()
rnf (MsgRequest Request
q) = Request -> ()
forall a. NFData a => a -> ()
rnf Request
q
rnf (MsgResponse Response
r) = Response -> ()
forall a. NFData a => a -> ()
rnf Response
r
rnf (MsgBatch [Message]
b) = [Message] -> ()
forall a. NFData a => a -> ()
rnf [Message]
b
instance ToJSON Message where
toJSON :: Message -> Value
toJSON (MsgRequest Request
q) = Request -> Value
forall a. ToJSON a => a -> Value
toJSON Request
q
toJSON (MsgResponse Response
r) = Response -> Value
forall a. ToJSON a => a -> Value
toJSON Response
r
toJSON (MsgBatch [Message]
b) = [Message] -> Value
forall a. ToJSON a => a -> Value
toJSON [Message]
b
instance FromJSON Message where
parseJSON :: Value -> Parser Message
parseJSON Value
v = (Request -> Message
MsgRequest (Request -> Message) -> Parser Request -> Parser Message
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser Request
forall a. FromJSON a => Value -> Parser a
parseJSON Value
v)
Parser Message -> Parser Message -> Parser Message
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Response -> Message
MsgResponse (Response -> Message) -> Parser Response -> Parser Message
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser Response
forall a. FromJSON a => Value -> Parser a
parseJSON Value
v)
Parser Message -> Parser Message -> Parser Message
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Message] -> Message
MsgBatch ([Message] -> Message) -> Parser [Message] -> Parser Message
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser [Message]
forall a. FromJSON a => Value -> Parser a
parseJSON Value
v)
type Method = Text
data Id = IdInt { Id -> Int
getIdInt :: !Int }
| IdTxt { Id -> Text
getIdTxt :: !Text }
deriving (Id -> Id -> Bool
(Id -> Id -> Bool) -> (Id -> Id -> Bool) -> Eq Id
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Id -> Id -> Bool
== :: Id -> Id -> Bool
$c/= :: Id -> Id -> Bool
/= :: Id -> Id -> Bool
Eq, Int -> Id -> ShowS
[Id] -> ShowS
Id -> [Char]
(Int -> Id -> ShowS)
-> (Id -> [Char]) -> ([Id] -> ShowS) -> Show Id
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Id -> ShowS
showsPrec :: Int -> Id -> ShowS
$cshow :: Id -> [Char]
show :: Id -> [Char]
$cshowList :: [Id] -> ShowS
showList :: [Id] -> ShowS
Show, ReadPrec [Id]
ReadPrec Id
Int -> ReadS Id
ReadS [Id]
(Int -> ReadS Id)
-> ReadS [Id] -> ReadPrec Id -> ReadPrec [Id] -> Read Id
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Id
readsPrec :: Int -> ReadS Id
$creadList :: ReadS [Id]
readList :: ReadS [Id]
$creadPrec :: ReadPrec Id
readPrec :: ReadPrec Id
$creadListPrec :: ReadPrec [Id]
readListPrec :: ReadPrec [Id]
Read, (forall x. Id -> Rep Id x)
-> (forall x. Rep Id x -> Id) -> Generic Id
forall x. Rep Id x -> Id
forall x. Id -> Rep Id x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Id -> Rep Id x
from :: forall x. Id -> Rep Id x
$cto :: forall x. Rep Id x -> Id
to :: forall x. Rep Id x -> Id
Generic)
instance Hashable Id
instance NFData Id where
rnf :: Id -> ()
rnf (IdInt Int
i) = Int -> ()
forall a. NFData a => a -> ()
rnf Int
i
rnf (IdTxt Text
t) = Text -> ()
forall a. NFData a => a -> ()
rnf Text
t
instance Enum Id where
toEnum :: Int -> Id
toEnum = Int -> Id
IdInt
fromEnum :: Id -> Int
fromEnum (IdInt Int
i) = Int
i
fromEnum Id
_ = [Char] -> Int
forall a. HasCallStack => [Char] -> a
error [Char]
"Can't enumerate non-integral ids"
instance FromJSON Id where
parseJSON :: Value -> Parser Id
parseJSON s :: Value
s@(String Text
_) = Text -> Id
IdTxt (Text -> Id) -> Parser Text -> Parser Id
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser Text
forall a. FromJSON a => Value -> Parser a
parseJSON Value
s
parseJSON n :: Value
n@(Number Scientific
_) = Int -> Id
IdInt (Int -> Id) -> Parser Int -> Parser Id
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser Int
forall a. FromJSON a => Value -> Parser a
parseJSON Value
n
parseJSON Value
_ = Parser Id
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero
instance ToJSON Id where
toJSON :: Id -> Value
toJSON (IdTxt Text
s) = Text -> Value
forall a. ToJSON a => a -> Value
toJSON Text
s
toJSON (IdInt Int
n) = Int -> Value
forall a. ToJSON a => a -> Value
toJSON Int
n
fromId :: Id -> String
fromId :: Id -> [Char]
fromId (IdInt Int
i) = Int -> [Char]
forall a. Show a => a -> [Char]
show Int
i
fromId (IdTxt Text
t) = Text -> [Char]
T.unpack Text
t
data Ver = V1
| V2
deriving (Ver -> Ver -> Bool
(Ver -> Ver -> Bool) -> (Ver -> Ver -> Bool) -> Eq Ver
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Ver -> Ver -> Bool
== :: Ver -> Ver -> Bool
$c/= :: Ver -> Ver -> Bool
/= :: Ver -> Ver -> Bool
Eq, Int -> Ver -> ShowS
[Ver] -> ShowS
Ver -> [Char]
(Int -> Ver -> ShowS)
-> (Ver -> [Char]) -> ([Ver] -> ShowS) -> Show Ver
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Ver -> ShowS
showsPrec :: Int -> Ver -> ShowS
$cshow :: Ver -> [Char]
show :: Ver -> [Char]
$cshowList :: [Ver] -> ShowS
showList :: [Ver] -> ShowS
Show, ReadPrec [Ver]
ReadPrec Ver
Int -> ReadS Ver
ReadS [Ver]
(Int -> ReadS Ver)
-> ReadS [Ver] -> ReadPrec Ver -> ReadPrec [Ver] -> Read Ver
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Ver
readsPrec :: Int -> ReadS Ver
$creadList :: ReadS [Ver]
readList :: ReadS [Ver]
$creadPrec :: ReadPrec Ver
readPrec :: ReadPrec Ver
$creadListPrec :: ReadPrec [Ver]
readListPrec :: ReadPrec [Ver]
Read, (forall x. Ver -> Rep Ver x)
-> (forall x. Rep Ver x -> Ver) -> Generic Ver
forall x. Rep Ver x -> Ver
forall x. Ver -> Rep Ver x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Ver -> Rep Ver x
from :: forall x. Ver -> Rep Ver x
$cto :: forall x. Rep Ver x -> Ver
to :: forall x. Rep Ver x -> Ver
Generic)
instance NFData Ver where
rnf :: Ver -> ()
rnf Ver
v = Ver
v Ver -> () -> ()
forall a b. a -> b -> b
`seq` ()
jr2 :: Pair
jr2 :: Pair
jr2 = Key
"jsonrpc" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"2.0" :: Text)
parseVer :: Object -> Parser Ver
parseVer :: Object -> Parser Ver
parseVer Object
o = do
Maybe Text
j <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"jsonrpc"
Ver -> Parser Ver
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Ver -> Parser Ver) -> Ver -> Parser Ver
forall a b. (a -> b) -> a -> b
$ if Maybe Text
j Maybe Text -> Maybe Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text -> Maybe Text
forall a. a -> Maybe a
Just (Text
"2.0" :: Text) then Ver
V2 else Ver
V1