#![allow(dead_code)]
#![allow(unused_imports)]
use super::types::*;
use async_trait::async_trait;
use rpcnet::{RpcConfig, RpcError, RpcServer};
use std::sync::Arc;
#[async_trait]
pub trait GreetingHandler: Send + Sync + 'static {
async fn greet(&self, request: GreetRequest) -> Result<GreetResponse, GreetingError>;
}
pub struct GreetingServer<H: GreetingHandler> {
handler: Arc<H>,
rpc_server: RpcServer,
}
impl<H: GreetingHandler> GreetingServer<H> {
pub fn new(handler: H, config: RpcConfig) -> Self {
Self {
handler: Arc::new(handler),
rpc_server: RpcServer::new(config),
}
}
pub async fn register_all(&mut self) {
{
let handler = self.handler.clone();
self.rpc_server
.register("Greeting.greet", move |params| {
let handler = handler.clone();
async move {
let request: GreetRequest =
bincode::deserialize(¶ms).map_err(RpcError::SerializationError)?;
match handler.greet(request).await {
Ok(response) => {
bincode::serialize(&response).map_err(RpcError::SerializationError)
}
Err(e) => Err(RpcError::StreamError(format!("{:?}", e))),
}
}
})
.await;
}
}
pub async fn serve(mut self) -> Result<(), RpcError> {
self.register_all().await;
let quic_server = self.rpc_server.bind()?;
println!("Server listening on: {:?}", self.rpc_server.socket_addr);
self.rpc_server.start(quic_server).await
}
}