use tonic::service::RoutesBuilder;
use tonic::transport::Server;
use super::{GrpcConfig, GrpcServer};
use crate::error::Result;
impl crate::AppBuilder {
pub fn with_grpc<F>(&mut self, register_services: F) -> Result<&mut Self>
where
F: Fn(&mut RoutesBuilder),
{
self.bind_config::<GrpcConfig>()?;
let mut builder = RoutesBuilder::default();
register_services(&mut builder);
let routes = builder.routes();
let grpc_config = self.get_config::<GrpcConfig>()?;
let mut server = Server::builder();
if let Some(limit) = grpc_config.concurrency_limit {
server = server.concurrency_limit_per_connection(limit);
}
let server = server.layer(crate::app::layer::AppLayer(self.app().clone()));
#[cfg(feature = "request-context")]
let server = server.layer(crate::context::layer::ContextLayer);
#[cfg(feature = "otel")]
let server = server.layer(crate::telemetry::TracingLayer);
let grpc_server = GrpcServer::new(server, routes, grpc_config);
self.add_server(grpc_server);
Ok(self)
}
}