# 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,
        )
