packages feed

utxorpc-server-0.0.1.0: src/Utxorpc/Submit.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RankNTypes #-}

module Utxorpc.Submit (SubmitHandlers (..), serviceHandlers) where

import Control.Monad.IO.Class (MonadIO)
import Network.GRPC.HTTP2.ProtoLens (RPC (RPC))
import Network.GRPC.Server (ServerStreamHandler, ServiceHandler, UnaryHandler)
import Proto.Utxorpc.V1alpha.Submit.Submit
import Utxorpc.Logged (UtxorpcServiceLogger, loggedSStream, loggedUnary)

data SubmitHandlers m a b = SubmitHandlers
  { submitTx :: UnaryHandler m SubmitTxRequest SubmitTxResponse,
    readMempool :: UnaryHandler m ReadMempoolRequest ReadMempoolResponse,
    waitForTx :: ServerStreamHandler m WaitForTxRequest WaitForTxResponse a,
    watchMempool :: ServerStreamHandler m WatchMempoolRequest WatchMempoolResponse b
  }

serviceHandlers ::
  (MonadIO m) =>
  Maybe (UtxorpcServiceLogger m) ->
  (forall x. m x -> IO x) ->
  SubmitHandlers m b c ->
  [ServiceHandler]
serviceHandlers logger f SubmitHandlers {submitTx, readMempool, waitForTx, watchMempool} =
  [submitTxSH, readMempoolSH, waitForTxSH, watchMempoolSH]
  where
    submitTxSH = loggedUnary f (RPC :: RPC SubmitService "submitTx") submitTx logger
    readMempoolSH = loggedUnary f (RPC :: RPC SubmitService "readMempool") readMempool logger
    waitForTxSH = loggedSStream f (RPC :: RPC SubmitService "waitForTx") waitForTx logger
    watchMempoolSH = loggedSStream f (RPC :: RPC SubmitService "watchMempool") watchMempool logger