pub mod layer;
pub use layer::*;
use futures_util::Future;
use jsonrpsee_core::server::MethodResponse;
use jsonrpsee_types::Request;
use layer::either::Either;
use tower::layer::util::{Identity, Stack};
use tower::layer::LayerFn;
pub trait RpcServiceT<'a> {
type Future: Future<Output = MethodResponse> + Send;
fn call(&self, request: Request<'a>) -> Self::Future;
}
#[derive(Debug, Clone)]
pub struct RpcServiceBuilder<L>(tower::ServiceBuilder<L>);
impl Default for RpcServiceBuilder<Identity> {
fn default() -> Self {
RpcServiceBuilder(tower::ServiceBuilder::new())
}
}
impl RpcServiceBuilder<Identity> {
pub fn new() -> Self {
Self(tower::ServiceBuilder::new())
}
}
impl<L> RpcServiceBuilder<L> {
pub fn option_layer<T>(self, layer: Option<T>) -> RpcServiceBuilder<Stack<Either<T, Identity>, L>> {
let layer = if let Some(layer) = layer { Either::Left(layer) } else { Either::Right(Identity::new()) };
self.layer(layer)
}
pub fn layer<T>(self, layer: T) -> RpcServiceBuilder<Stack<T, L>> {
RpcServiceBuilder(self.0.layer(layer))
}
pub fn layer_fn<F>(self, f: F) -> RpcServiceBuilder<Stack<LayerFn<F>, L>> {
RpcServiceBuilder(self.0.layer_fn(f))
}
pub fn rpc_logger(self, max_log_len: u32) -> RpcServiceBuilder<Stack<RpcLoggerLayer, L>> {
RpcServiceBuilder(self.0.layer(RpcLoggerLayer::new(max_log_len)))
}
pub(crate) fn service<S>(&self, service: S) -> L::Service
where
L: tower::Layer<S>,
{
self.0.service(service)
}
}