{-# OPTIONS_GHC -Wno-orphans #-}

module Network.GRPC.Etcd.Client.Simple (
    put,
    range,
    watch,
) where

import Control.Monad.Catch (MonadMask)
import Control.Monad.IO.Class (MonadIO)
import Network.GRPC.Client (Connection, rpc)
import Network.GRPC.Client.StreamType.IO (biDiStreaming, nonStreaming)
import Network.GRPC.Common.NextElem qualified as NextElem
import Network.GRPC.Common.Protobuf (Proto, Protobuf)
import Network.GRPC.Etcd (KV, PutRequest, PutResponse, RangeRequest, RangeResponse, Watch, WatchRequest, WatchResponse)

put :: (MonadIO m) => (MonadMask m) => Connection -> Proto PutRequest -> m (Proto PutResponse)
put :: forall (m :: * -> *).
(MonadIO m, MonadMask m) =>
Connection -> Proto PutRequest -> m (Proto PutResponse)
put Connection
conn = Connection
-> ClientHandler'
     'NonStreaming (ReaderT Connection m) (Protobuf KV "put")
-> Input (Protobuf KV "put")
-> m (Output (Protobuf KV "put"))
forall {k} (rpc :: k) (m :: * -> *).
Connection
-> ClientHandler' 'NonStreaming (ReaderT Connection m) rpc
-> Input rpc
-> m (Output rpc)
nonStreaming Connection
conn (forall {k} (rpc :: k) (styp :: StreamingType) (m :: * -> *).
(CanCallRPC m, SupportsClientRpc rpc,
 SupportsStreamingType rpc styp, Default (RequestMetadata rpc)) =>
ClientHandler' styp m rpc
forall rpc (styp :: StreamingType) (m :: * -> *).
(CanCallRPC m, SupportsClientRpc rpc,
 SupportsStreamingType rpc styp, Default (RequestMetadata rpc)) =>
ClientHandler' styp m rpc
rpc @(Protobuf KV "put"))

range :: (MonadIO m) => (MonadMask m) => Connection -> Proto RangeRequest -> m (Proto RangeResponse)
range :: forall (m :: * -> *).
(MonadIO m, MonadMask m) =>
Connection -> Proto RangeRequest -> m (Proto RangeResponse)
range Connection
conn = Connection
-> ClientHandler'
     'NonStreaming (ReaderT Connection m) (Protobuf KV "range")
-> Input (Protobuf KV "range")
-> m (Output (Protobuf KV "range"))
forall {k} (rpc :: k) (m :: * -> *).
Connection
-> ClientHandler' 'NonStreaming (ReaderT Connection m) rpc
-> Input rpc
-> m (Output rpc)
nonStreaming Connection
conn (forall {k} (rpc :: k) (styp :: StreamingType) (m :: * -> *).
(CanCallRPC m, SupportsClientRpc rpc,
 SupportsStreamingType rpc styp, Default (RequestMetadata rpc)) =>
ClientHandler' styp m rpc
forall rpc (styp :: StreamingType) (m :: * -> *).
(CanCallRPC m, SupportsClientRpc rpc,
 SupportsStreamingType rpc styp, Default (RequestMetadata rpc)) =>
ClientHandler' styp m rpc
rpc @(Protobuf KV "range"))

watch :: (MonadIO m) => (MonadMask m) => Connection -> [Proto WatchRequest] -> (Proto WatchResponse -> m ()) -> m ()
watch :: forall (m :: * -> *).
(MonadIO m, MonadMask m) =>
Connection
-> [Proto WatchRequest] -> (Proto WatchResponse -> m ()) -> m ()
watch Connection
conn [Proto WatchRequest]
reqs Proto WatchResponse -> m ()
resp = Connection
-> ClientHandler'
     'BiDiStreaming (ReaderT Connection m) (Protobuf Watch "watch")
-> ((NextElem (Input (Protobuf Watch "watch")) -> m ())
    -> m (NextElem (Output (Protobuf Watch "watch"))) -> m ())
-> m ()
forall {k} (rpc :: k) (m :: * -> *) r.
MonadIO m =>
Connection
-> ClientHandler' 'BiDiStreaming (ReaderT Connection m) rpc
-> ((NextElem (Input rpc) -> m ())
    -> m (NextElem (Output rpc)) -> m r)
-> m r
biDiStreaming Connection
conn (forall {k} (rpc :: k) (styp :: StreamingType) (m :: * -> *).
(CanCallRPC m, SupportsClientRpc rpc,
 SupportsStreamingType rpc styp, Default (RequestMetadata rpc)) =>
ClientHandler' styp m rpc
forall rpc (styp :: StreamingType) (m :: * -> *).
(CanCallRPC m, SupportsClientRpc rpc,
 SupportsStreamingType rpc styp, Default (RequestMetadata rpc)) =>
ClientHandler' styp m rpc
rpc @(Protobuf Watch "watch")) (((NextElem (Input (Protobuf Watch "watch")) -> m ())
  -> m (NextElem (Output (Protobuf Watch "watch"))) -> m ())
 -> m ())
-> ((NextElem (Input (Protobuf Watch "watch")) -> m ())
    -> m (NextElem (Output (Protobuf Watch "watch"))) -> m ())
-> m ()
forall a b. (a -> b) -> a -> b
$ \NextElem (Input (Protobuf Watch "watch")) -> m ()
send m (NextElem (Output (Protobuf Watch "watch")))
recv -> do
    [Proto WatchRequest]
-> (NextElem (Proto WatchRequest) -> m ()) -> m ()
forall (m :: * -> *) a.
Monad m =>
[a] -> (NextElem a -> m ()) -> m ()
NextElem.forM_ [Proto WatchRequest]
reqs NextElem (Input (Protobuf Watch "watch")) -> m ()
NextElem (Proto WatchRequest) -> m ()
send
    m (NextElem (Proto WatchResponse))
-> (Proto WatchResponse -> m ()) -> m ()
forall (m :: * -> *) a.
Monad m =>
m (NextElem a) -> (a -> m ()) -> m ()
NextElem.whileNext_ m (NextElem (Output (Protobuf Watch "watch")))
m (NextElem (Proto WatchResponse))
recv Proto WatchResponse -> m ()
resp