packages feed

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

-- | Convenience functions for working with binary RPC
--
-- Intended for qualified import.
--
-- import Network.GRPC.Server.Binary qualified as Binary
module Network.GRPC.Server.Binary (
    -- | Convenience wrappers using @binary@ for serialization/deserialization
    sendOutput
  , sendNextOutput
  , sendFinalOutput
  , recvInput
  , recvNextInput
  , recvFinalInput
  ) where

import Data.Binary
import Data.ByteString.Lazy qualified as Lazy (ByteString)
import GHC.Stack

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

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

sendOutput ::
     (Binary out, Output rpc ~ Lazy.ByteString, HasCallStack)
  => Call rpc
  -> StreamElem (ResponseTrailingMetadata rpc) out
  -> IO ()
sendOutput call out =
    Server.sendOutput call (encode <$> out)

sendNextOutput ::
     (Binary out, Output rpc ~ Lazy.ByteString, HasCallStack)
  => Call rpc
  -> out
  -> IO ()
sendNextOutput call out =
    Server.sendNextOutput call (encode out)

sendFinalOutput ::
     (Binary out, Output rpc ~ Lazy.ByteString, HasCallStack)
  => Call rpc
  -> (out, ResponseTrailingMetadata rpc)
  -> IO ()
sendFinalOutput call (out, trailers) =
    Server.sendFinalOutput call (encode out, trailers)

recvInput ::
     (Binary inp, Input rpc ~ Lazy.ByteString, HasCallStack)
  => Call rpc
  -> IO (StreamElem NoMetadata inp)
recvInput call =
    Server.recvInput call >>= traverse decodeOrThrow

recvNextInput ::
     (Binary inp, Input rpc ~ Lazy.ByteString, HasCallStack)
  => Call rpc
  -> IO inp
recvNextInput call =
    Server.recvNextInput call >>= decodeOrThrow

recvFinalInput ::
     (Binary inp, Input rpc ~ Lazy.ByteString, HasCallStack)
  => Call rpc
  -> IO inp
recvFinalInput call =
     Server.recvFinalInput call >>= decodeOrThrow