packages feed

grpc-spec-1.0.0: src/Network/GRPC/Spec/RPC/Raw.hs

{-# LANGUAGE OverloadedStrings #-}

module Network.GRPC.Spec.RPC.Raw (RawRpc) where

import Data.ByteString.Char8 qualified as BS.Char8
import Data.ByteString.Lazy qualified as Lazy (ByteString)
import Data.Proxy
import GHC.TypeLits

import Network.GRPC.Spec.CustomMetadata.Typed
import Network.GRPC.Spec.RPC
import Network.GRPC.Spec.RPC.StreamType

{-------------------------------------------------------------------------------
  Raw format
-------------------------------------------------------------------------------}

-- | Custom gRPC format
--
-- Usually @gRPC@ runs over Protobuf, but it does not have to. 'RawRpc' provides
-- an alternative format, which does not use serialization/deserialization at
-- all, just using raw bytestrings for messages. This is a non-standard format
-- (which the gRPC specification explicitly permits).
data RawRpc (serv :: Symbol) (meth :: Symbol)

type instance Input  (RawRpc serv meth) = Lazy.ByteString
type instance Output (RawRpc serv meth) = Lazy.ByteString

instance ( KnownSymbol serv
         , KnownSymbol meth

           -- Metadata constraints
         , Show (RequestMetadata (RawRpc serv meth))
         , Show (ResponseInitialMetadata (RawRpc serv meth))
         , Show (ResponseTrailingMetadata (RawRpc serv meth))
         ) => IsRPC (RawRpc serv meth) where
  rpcContentType _ = defaultRpcContentType "raw"
  rpcServiceName _ = BS.Char8.pack $ symbolVal (Proxy @serv)
  rpcMethodName  _ = BS.Char8.pack $ symbolVal (Proxy @meth)
  rpcMessageType _ = Nothing

instance ( IsRPC (RawRpc serv meth)

           -- Metadata constraints
         , BuildMetadata (RequestMetadata (RawRpc serv meth))
         , ParseMetadata (ResponseInitialMetadata (RawRpc serv meth))
         , ParseMetadata (ResponseTrailingMetadata (RawRpc serv meth))
         ) => SupportsClientRpc (RawRpc serv meth) where
  rpcSerializeInput    _ = id
  rpcDeserializeOutput _ = return

instance ( IsRPC (RawRpc serv meth)

           -- Metadata constraints
         , ParseMetadata (RequestMetadata (RawRpc serv meth))
         , BuildMetadata (ResponseInitialMetadata (RawRpc serv meth))
         , StaticMetadata (ResponseTrailingMetadata (RawRpc serv meth))
         ) => SupportsServerRpc (RawRpc serv meth) where
  rpcDeserializeInput _ = return
  rpcSerializeOutput  _ = id

-- | For the raw protocol we do not check communication protocols
instance ValidStreamingType styp
      => SupportsStreamingType (RawRpc serv meth) styp