# Generated by the gRPC FlatBuffers compiler. DO NOT EDIT!

from __future__ import annotations

import grpc
import typing

from service_test_generated import HelloRequest, HelloResponse


class HelloServiceStub(object):
  def __init__(self, channel: grpc.Channel) -> None: ...
  def Hello(self, request: HelloRequest) -> HelloResponse: ...
  def StreamClient(self, request_iterator: typing.Iterator[HelloRequest]) -> HelloResponse: ...
  def StreamServer(self, request: HelloRequest) -> typing.Iterator[HelloResponse]: ...
  def Stream(self, request_iterator: typing.Iterator[HelloRequest]) -> typing.Iterator[HelloResponse]: ...


class HelloServiceServicer(object):
  def Hello(self, request: HelloRequest, context: grpc.ServicerContext) -> HelloResponse: ...
  def StreamClient(self, request_iterator: typing.Iterator[HelloRequest], context: grpc.ServicerContext) -> HelloResponse: ...
  def StreamServer(self, request: HelloRequest, context: grpc.ServicerContext) -> typing.Iterator[HelloResponse]: ...
  def Stream(self, request_iterator: typing.Iterator[HelloRequest], context: grpc.ServicerContext) -> typing.Iterator[HelloResponse]: ...


def add_HelloServiceServicer_to_server(servicer: HelloServiceServicer, server: grpc.Server) -> None: ...

