X-Git-Url: http://average.org/gitweb/?a=blobdiff_plain;f=Data%2FJsonRpc.hs;h=9b3ff48965fe47a3731567e70652831aae9e6ba7;hb=b8fcca7aff6b55c000b4bd4b6da352b23780d0c8;hp=b1879bccef89f57638ad44a122ad2d93f1c892c1;hpb=dc93b41b2b38777c077e7327fe019e9a10acc8b9;p=pdns-pipe-nmc.git diff --git a/Data/JsonRpc.hs b/Data/JsonRpc.hs index b1879bc..9b3ff48 100644 --- a/Data/JsonRpc.hs +++ b/Data/JsonRpc.hs @@ -1,20 +1,44 @@ -module JsonRpc ( JsonRpcRequest(..) - , JsonRpcNotification(..) - , JsonRpcResponse(..) +{-# LANGUAGE OverloadedStrings #-} + +module JsonRpc ( JsonRpcVersion(JsonRpcV1, JsonRpcV2) + , JsonRpcRequest + , JsonRpcNotification + , JsonRpcError + , JsonRpcResponse + , parseJsonRpc ) where -import Data.ByteString (ByteString) +import Data.ByteString.Lazy (ByteString) import Control.Applicative ((<$>), (<*>), empty) +import Data.Either import Data.Aeson -data JsonRpcRequest = JsonRpcRequest { jrpcReqMethod :: ByteString - , jrpcReqParams :: [ByteString] - , jrpcReqId :: ByteString +data JsonRpcVersion = JsonRpcV1 | JsonRpcV2 + deriving (Show) + +data JsonRpcRequest = JsonRpcRequest { jrpcVersion :: JsonRpcVersion + , jrpcReqMethod :: ByteString + , jrpcReqParams :: [ByteString] + , jrpcReqId :: ByteString } deriving (Show) +instance ToJSON JsonRpcRequest where + toJSON (JsonRpcRequest version method params id) = + let l = [ "method" .= method, "params" .= params, "id" .= id ] + in case version of + JsonRpcV1 -> object l + JsonRpcV2 -> object $ ("jsonrpc" .= toJSON ("2.0" :: ByteString)):l -data JsonRpcNotification = JsonRpcNotification { jrpcNtfMethod :: ByteString - , jrpcNtfParams :: [ByteString] - } deriving (Show) +data JsonRpcNotification = JsonRpcNotification + { jrpcNtfVersion :: JsonRpcVersion + , jrpcNtfMethod :: ByteString + , jrpcNtfParams :: [ByteString] + } deriving (Show) +instance ToJSON JsonRpcNotification where + toJSON (JsonRpcNotification version method params) = + let l = [ "method" .= method, "params" .= params ] + in case version of + JsonRpcV1 -> object l + JsonRpcV2 -> object $ ("jsonrpc" .= toJSON ("2.0" :: ByteString)):l data JsonRpcError = JsonRpcError { jrpcErrCode :: Int , jrpcErrMessage :: ByteString @@ -26,4 +50,5 @@ data JsonRpcResponse = JsonRpcResponse { jrpcRspResult :: Maybe Value , jrpcRspId :: ByteString } deriving (Show) - +parseJsonRpc :: ByteString -> Either JsonRpcError JsonRpcResponse +parseJsonRpc _ = Left $ JsonRpcError (-1) "someerror" Nothing