{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# OPTIONS_GHC -fno-warn-orphans #-} -- | -- Module: Servant.Client.JsonRpc -- -- This module provides support for generating JSON-RPC clients in the Servant framework. -- -- > type Mul = JsonRpc "mul" (Int, Int) String Int -- > mul :: (Int, Int) -> ClientM (JsonRpcResponse String Int) -- > mul = client $ Proxy @Mul -- -- Note: This client implementation runs over HTTP and the semantics of HTTP -- remove the need for the message id. module Servant.Client.JsonRpc ( module Servant.JsonRpc ) where import Data.Aeson (FromJSON, ToJSON) import Data.Proxy (Proxy (..)) import GHC.TypeLits (KnownSymbol, symbolVal) import Servant.API (NoContent) import Servant.Client.Core (HasClient (..), RunClient) import Servant.JsonRpc -- | The 'RawJsonRpc' construct is completely transparent to clients instance (RunClient m, HasClient m api) => HasClient m (RawJsonRpc api) where type Client m (RawJsonRpc api) = Client m api clientWithRoute pxm _ = clientWithRoute pxm (Proxy @api) hoistClientMonad pxm _ = hoistClientMonad pxm (Proxy @api) instance (RunClient m, KnownSymbol method, ToJSON p, FromJSON e, FromJSON r) => HasClient m (JsonRpc method p e r) where type Client m (JsonRpc method p e r) = p -> m (JsonRpcResponse e r) clientWithRoute _ _ req p = client req jsonRpcRequest where client = clientWithRoute (Proxy @m) endpoint jsonRpcRequest = Request (symbolVal $ Proxy @method) p (Just 0) endpoint = Proxy @(JsonRpcEndpoint (JsonRpc method p e r)) hoistClientMonad _ _ f x p = f $ x p instance (RunClient m, KnownSymbol method, ToJSON p) => HasClient m (JsonRpcNotification method p) where type Client m (JsonRpcNotification method p) = p -> m NoContent clientWithRoute _ _ req p = client req jsonRpcRequest where client = clientWithRoute (Proxy @m) endpoint jsonRpcRequest = Request (symbolVal $ Proxy @method) p Nothing endpoint = Proxy @(JsonRpcEndpoint (JsonRpcNotification method p)) hoistClientMonad _ _ f x p = f $ x p