use async_trait::async_trait;
use crate::error::KnafehError;
use crate::rpc::message::{RpcRequest, RpcResponse};
use crate::rpc::stream::{RpcStreamRequest, RpcStreamResponse};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MethodKind {
Unary,
ServerStreaming,
ClientStreaming,
BidiStreaming,
}
#[derive(Debug, Clone)]
pub struct MethodDescriptor {
pub name: String,
pub kind: MethodKind,
}
#[async_trait]
pub trait Service: Send + Sync + 'static {
fn name(&self) -> &str;
fn methods(&self) -> Vec<MethodDescriptor>;
async fn call_unary(
&self,
method: &str,
request: RpcRequest,
) -> Result<RpcResponse, KnafehError>;
async fn call_server_stream(
&self,
method: &str,
request: RpcRequest,
) -> Result<RpcStreamResponse, KnafehError>;
async fn call_client_stream(
&self,
method: &str,
stream: RpcStreamRequest,
) -> Result<RpcResponse, KnafehError>;
async fn call_bidi_stream(
&self,
method: &str,
stream: RpcStreamRequest,
) -> Result<RpcStreamResponse, KnafehError>;
}