packages feed

grapesy-1.0.0: src/Network/GRPC/Client/Binary.hs

-- | Convenience functions for working with binary RPC
--
-- Intended for qualified import.
--
-- import Network.GRPC.Client.Binary qualified as Binary
module Network.GRPC.Client.Binary (
    -- * Convenience wrappers using @binary@ for serialization/deserialization
    sendInput
  , sendNextInput
  , sendFinalInput
  , recvOutput
  , recvNextOutput
  , recvFinalOutput
  ) where

import Control.Monad.IO.Class
import Data.Binary
import Data.ByteString.Lazy qualified as Lazy (ByteString)

import Network.GRPC.Client (Call)
import Network.GRPC.Client qualified as Client
import Network.GRPC.Common
import Network.GRPC.Common.Binary (decodeOrThrow)

{-------------------------------------------------------------------------------
  Convenience wrappers using @binary@ for serialization/deserialization
-------------------------------------------------------------------------------}

sendInput :: forall inp rpc m.
     (Binary inp, Input rpc ~ Lazy.ByteString, MonadIO m)
  => Call rpc
  -> StreamElem NoMetadata inp
  -> m ()
sendInput call inp = Client.sendInput call (encode <$> inp)

sendNextInput ::
     (Binary inp, Input rpc ~ Lazy.ByteString, MonadIO m)
  => Call rpc
  -> inp
  -> m ()
sendNextInput call inp = Client.sendNextInput call (encode inp)

sendFinalInput :: forall inp rpc m.
     (Binary inp, Input rpc ~ Lazy.ByteString, MonadIO m)
  => Call rpc
  -> inp
  -> m ()
sendFinalInput call inp =
   Client.sendFinalInput call (encode inp)

recvOutput :: forall out rpc m.
     (Binary out, Output rpc ~ Lazy.ByteString, MonadIO m)
  => Call rpc
  -> m (StreamElem (ResponseTrailingMetadata rpc) out)
recvOutput call =
     Client.recvOutput call >>= traverse decodeOrThrow

recvNextOutput ::
     (Binary out, Output rpc ~ Lazy.ByteString, MonadIO m)
  => Call rpc
  -> m out
recvNextOutput call = Client.recvNextOutput call >>= decodeOrThrow

recvFinalOutput :: forall out rpc m.
     (Binary out, Output rpc ~ Lazy.ByteString, MonadIO m)
  => Call rpc
  -> m (out, ResponseTrailingMetadata rpc)
recvFinalOutput call = do
    (out, md) <- Client.recvFinalOutput call
    (, md) <$> decodeOrThrow out