Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Marconi.Core.JsonRpc
Description
This library provides some utilities for running `marconi-core`'s Queryable
interface throught a
JSON-RPC HTTP server.
Particularly, these utilities use the `servant-server` Haskell package.
Synopsis
- type ReaderHandler env = ExceptT ServerError (ReaderT env IO)
- type ReaderServer env api = ServerT api (ReaderHandler env)
- catchHttpHandlerExceptions :: Trace IO Text -> Handler a -> Handler a
- dimapHandler :: Functor m => (qry' -> qry) -> (res -> res') -> (qry -> m (Either e res)) -> qry' -> m (Either e res')
- hoistHttpHandler :: Handler a -> ReaderHandler env a
- hoistReaderHandler :: env -> ReaderHandler env a -> Handler a
- mkHttpRequestTracer :: MonadIO m => Trace IO Text -> m Middleware
- queryHttpHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => Getter env (MVar (indexer event)) -> env -> query -> Handler (Either (JsonRpcErr String) (Result query))
- queryHttpReaderHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => Getter env (MVar (indexer event)) -> query -> ReaderHandler env (Either (JsonRpcErr String) (Result query))
- queryIndexerHttpHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => indexer event -> query -> Handler (Either (JsonRpcErr String) (Result query))
- queryIndexerVarHttpHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => MVar (indexer event) -> query -> Handler (Either (JsonRpcErr String) (Result query))
- queryErrToRpcErr :: Show (Result query) => QueryError query -> JsonRpcErr String
- withReaderHandler :: (r' -> r) -> ReaderHandler r a -> ReaderHandler r' a
Documentation
type ReaderHandler env = ExceptT ServerError (ReaderT env IO) #
type ReaderServer env api = ServerT api (ReaderHandler env) #
catchHttpHandlerExceptions :: Trace IO Text -> Handler a -> Handler a #
dimapHandler :: Functor m => (qry' -> qry) -> (res -> res') -> (qry -> m (Either e res)) -> qry' -> m (Either e res') #
Given two mapping functions, one for the query and one for the result, convert a query handler into one that takes a modified version of the query and returns a modified version of the result.
This is technically a profunctor operation with some extra levels of Functor
on the right: dimapHandler l ≡ dimap l . fmap . fmap
However, since we need it only for (->)
it's not worth pulling in the profunctor
dependency.
Example ===
originalHandler :: SomeQuery -> ReaderHandler HttpServerConfig (Either (JsonRpcErr String) SomeResult) originalHandler = queryHttpReaderHandler someLens modifiedHandler :: ModifiedQuery -> ReaderHandler HttpServerConfig (Either (JsonRpcErr String) ModifiedResult) modifiedHandler = let mapQuery = ... :: ModifiedQuery -> SomeQuery mapResult = ... :: SomeResult -> ModifiedResult in dimapHandler mapQuery mapResult originalHandler
hoistHttpHandler :: Handler a -> ReaderHandler env a #
hoistReaderHandler :: env -> ReaderHandler env a -> Handler a #
mkHttpRequestTracer :: MonadIO m => Trace IO Text -> m Middleware #
queryHttpHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => Getter env (MVar (indexer event)) -> env -> query -> Handler (Either (JsonRpcErr String) (Result query)) #
Given an env
and a way to get the indexer inside an MVar
, run the query
in a Servant
Handler
.
queryHttpReaderHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => Getter env (MVar (indexer event)) -> query -> ReaderHandler env (Either (JsonRpcErr String) (Result query)) #
Given a way to get the indexer from the environment, run the query
in a ReaderHandler
.
queryIndexerHttpHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => indexer event -> query -> Handler (Either (JsonRpcErr String) (Result query)) #
Given an indexer event
, run the query
in a Servant Handler
.
queryIndexerVarHttpHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => MVar (indexer event) -> query -> Handler (Either (JsonRpcErr String) (Result query)) #
Given an indexer event
inside an MVar
, run the query
in a Servant Handler
.
queryErrToRpcErr :: Show (Result query) => QueryError query -> JsonRpcErr String #
Convert a query error to a JSON-RPC protocol error.
withReaderHandler :: (r' -> r) -> ReaderHandler r a -> ReaderHandler r' a #