##
# Copyright 2020 Telefonica Investigacion y Desarrollo, S.A.U.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##
# Generated by the Protocol Buffers compiler. DO NOT EDIT!
# source: osm_lcm/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_lcm.frontend_pb2


class FrontendExecutorBase(abc.ABC):
    @abc.abstractmethod
    async def RunPrimitive(
        self,
        stream: "grpclib.server.Stream[osm_lcm.frontend_pb2.PrimitiveRequest, osm_lcm.frontend_pb2.PrimitiveReply]",
    ) -> None:
        pass

    @abc.abstractmethod
    async def GetSshKey(
        self,
        stream: "grpclib.server.Stream[osm_lcm.frontend_pb2.SshKeyRequest, osm_lcm.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_lcm.frontend_pb2.PrimitiveRequest,
                osm_lcm.frontend_pb2.PrimitiveReply,
            ),
            "/osm_ee.FrontendExecutor/GetSshKey": grpclib.const.Handler(
                self.GetSshKey,
                grpclib.const.Cardinality.UNARY_UNARY,
                osm_lcm.frontend_pb2.SshKeyRequest,
                osm_lcm.frontend_pb2.SshKeyReply,
            ),
        }


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