# Generated by the Protocol Buffers compiler. DO NOT EDIT!
# source: osm_ee/frontend.proto
# plugin: grpclib.plugin.main
import abc
import typing

import grpclib.const
import grpclib.client
if typing.TYPE_CHECKING:
    import grpclib.server

import osm_ee.frontend_pb2


class FrontendExecutorBase(abc.ABC):

    @abc.abstractmethod
    async def RunPrimitive(self, stream: 'grpclib.server.Stream[osm_ee.frontend_pb2.PrimitiveRequest, osm_ee.frontend_pb2.PrimitiveReply]') -> None:
        pass

    @abc.abstractmethod
    async def GetSshKey(self, stream: 'grpclib.server.Stream[osm_ee.frontend_pb2.SshKeyRequest, osm_ee.frontend_pb2.SshKeyReply]') -> None:
        pass

    def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]:
        return {
            '/osm_ee.FrontendExecutor/RunPrimitive': grpclib.const.Handler(
                self.RunPrimitive,
                grpclib.const.Cardinality.UNARY_STREAM,
                osm_ee.frontend_pb2.PrimitiveRequest,
                osm_ee.frontend_pb2.PrimitiveReply,
            ),
            '/osm_ee.FrontendExecutor/GetSshKey': grpclib.const.Handler(
                self.GetSshKey,
                grpclib.const.Cardinality.UNARY_UNARY,
                osm_ee.frontend_pb2.SshKeyRequest,
                osm_ee.frontend_pb2.SshKeyReply,
            ),
        }


class FrontendExecutorStub:

    def __init__(self, channel: grpclib.client.Channel) -> None:
        self.RunPrimitive = grpclib.client.UnaryStreamMethod(
            channel,
            '/osm_ee.FrontendExecutor/RunPrimitive',
            osm_ee.frontend_pb2.PrimitiveRequest,
            osm_ee.frontend_pb2.PrimitiveReply,
        )
        self.GetSshKey = grpclib.client.UnaryUnaryMethod(
            channel,
            '/osm_ee.FrontendExecutor/GetSshKey',
            osm_ee.frontend_pb2.SshKeyRequest,
            osm_ee.frontend_pb2.SshKeyReply,
        )
