lxy 0.1.1

A convenient async http and RPC framework in Rust
Documentation
use tonic::service::RoutesBuilder;
use tonic::transport::Server;

use super::{GrpcConfig, GrpcServer};
use crate::error::Result;

impl crate::AppBuilder {
  /// Configure gRPC services
  ///
  /// # Example
  ///
  /// ```rust
  /// use lxy::App;
  ///
  /// App::builder()
  ///     .with_grpc(|routes| {
  ///         // routes.add_service(my_service);
  ///     });
  /// ```
  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)
  }
}