{-# language DataKinds             #-}
{-# language FlexibleContexts      #-}
{-# language FlexibleInstances     #-}
{-# language MultiParamTypeClasses #-}
{-# language PolyKinds             #-}
{-# language TypeFamilies          #-}
{-# language UndecidableInstances  #-}
module Mu.GRpc.Bridge where

import           Data.ByteString
import           Data.Kind
import           Data.Proxy
import           Network.GRPC.HTTP2.Proto3Wire

import           Mu.GRpc.Avro

data GRpcMessageProtocol
  = MsgProtoBuf | MsgAvro
  deriving (GRpcMessageProtocol -> GRpcMessageProtocol -> Bool
(GRpcMessageProtocol -> GRpcMessageProtocol -> Bool)
-> (GRpcMessageProtocol -> GRpcMessageProtocol -> Bool)
-> Eq GRpcMessageProtocol
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GRpcMessageProtocol -> GRpcMessageProtocol -> Bool
$c/= :: GRpcMessageProtocol -> GRpcMessageProtocol -> Bool
== :: GRpcMessageProtocol -> GRpcMessageProtocol -> Bool
$c== :: GRpcMessageProtocol -> GRpcMessageProtocol -> Bool
Eq, Int -> GRpcMessageProtocol -> ShowS
[GRpcMessageProtocol] -> ShowS
GRpcMessageProtocol -> String
(Int -> GRpcMessageProtocol -> ShowS)
-> (GRpcMessageProtocol -> String)
-> ([GRpcMessageProtocol] -> ShowS)
-> Show GRpcMessageProtocol
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GRpcMessageProtocol] -> ShowS
$cshowList :: [GRpcMessageProtocol] -> ShowS
show :: GRpcMessageProtocol -> String
$cshow :: GRpcMessageProtocol -> String
showsPrec :: Int -> GRpcMessageProtocol -> ShowS
$cshowsPrec :: Int -> GRpcMessageProtocol -> ShowS
Show)

msgProtoBuf :: Proxy 'MsgProtoBuf
msgProtoBuf :: Proxy 'MsgProtoBuf
msgProtoBuf = Proxy 'MsgProtoBuf
forall k (t :: k). Proxy t
Proxy
msgAvro :: Proxy 'MsgAvro
msgAvro :: Proxy 'MsgAvro
msgAvro = Proxy 'MsgAvro
forall k (t :: k). Proxy t
Proxy

class MkRPC (p :: GRpcMessageProtocol) where
  type RPCTy p :: Type
  mkRPC :: Proxy p -> ByteString -> ByteString -> ByteString -> RPCTy p
instance MkRPC 'MsgProtoBuf where
  type RPCTy 'MsgProtoBuf = RPC
  mkRPC :: Proxy 'MsgProtoBuf
-> ByteString -> ByteString -> ByteString -> RPCTy 'MsgProtoBuf
mkRPC _ = ByteString -> ByteString -> ByteString -> RPC
ByteString -> ByteString -> ByteString -> RPCTy 'MsgProtoBuf
RPC
instance MkRPC 'MsgAvro where
  type RPCTy 'MsgAvro = AvroRPC
  mkRPC :: Proxy 'MsgAvro
-> ByteString -> ByteString -> ByteString -> RPCTy 'MsgAvro
mkRPC _ = ByteString -> ByteString -> ByteString -> AvroRPC
ByteString -> ByteString -> ByteString -> RPCTy 'MsgAvro
AvroRPC