use crate::convert::CreateResponseFilter;
use crate::{
convert::{
ConvertRequest, ConvertRequestLayer, ConvertResponse, ConvertResponseLayer,
CreateResponseFilterLayer, FilterResponse,
},
http::{HttpConversionLayer, HttpRequestConverter, HttpResponseConverter},
};
pub use id::{ConstantSizeId, Id};
pub use request::{
BatchJsonRpcRequest, HttpBatchJsonRpcRequest, HttpJsonRpcRequest, JsonRequestConversionError,
JsonRequestConverter, JsonRpcRequest,
};
pub use response::{
BatchJsonRpcResponse, ConsistentJsonRpcIdFilter, ConsistentResponseIdFilterError,
CreateJsonRpcIdFilter, HttpBatchJsonRpcResponse, HttpJsonRpcResponse,
JsonResponseConversionError, JsonResponseConverter, JsonRpcError, JsonRpcResponse,
};
use serde::{de::DeserializeOwned, Serialize};
use std::{fmt::Debug, marker::PhantomData};
use tower_layer::{Layer, Stack};
pub use version::Version;
#[cfg(test)]
mod tests;
mod id;
mod request;
mod response;
mod version;
#[derive(Debug)]
pub struct JsonConversionLayer<I, O> {
_marker: PhantomData<(I, O)>,
}
impl<I, O> JsonConversionLayer<I, O> {
pub fn new() -> Self {
Self {
_marker: PhantomData,
}
}
}
impl<I, O> Clone for JsonConversionLayer<I, O> {
fn clone(&self) -> Self {
Self {
_marker: self._marker,
}
}
}
impl<I, O> Default for JsonConversionLayer<I, O> {
fn default() -> Self {
Self::new()
}
}
impl<S, I, O> Layer<S> for JsonConversionLayer<I, O>
where
I: Serialize,
O: DeserializeOwned,
{
type Service =
ConvertResponse<ConvertRequest<S, JsonRequestConverter<I>>, JsonResponseConverter<O>>;
fn layer(&self, inner: S) -> Self::Service {
let stack = tower_layer::Stack::new(
ConvertRequestLayer::new(JsonRequestConverter::<I>::new()),
ConvertResponseLayer::new(JsonResponseConverter::<O>::new()),
);
stack.layer(inner)
}
}
#[derive(Debug)]
pub struct JsonRpcHttpLayer<Request, Response> {
_marker: PhantomData<(Request, Response)>,
}
impl<Request, Response> JsonRpcHttpLayer<Request, Response> {
pub fn new() -> Self {
Self {
_marker: PhantomData,
}
}
}
impl<Request, Response> Clone for JsonRpcHttpLayer<Request, Response> {
fn clone(&self) -> Self {
Self {
_marker: self._marker,
}
}
}
impl<Request, Response> Default for JsonRpcHttpLayer<Request, Response> {
fn default() -> Self {
Self::new()
}
}
impl<Request, Response, S> Layer<S> for JsonRpcHttpLayer<Request, Response>
where
Request: Serialize,
Response: DeserializeOwned,
CreateJsonRpcIdFilter<Request, Response>:
CreateResponseFilter<http::Request<Request>, http::Response<Response>>,
{
type Service = FilterResponse<
ConvertResponse<
ConvertRequest<
ConvertResponse<ConvertRequest<S, HttpRequestConverter>, HttpResponseConverter>,
JsonRequestConverter<Request>,
>,
JsonResponseConverter<Response>,
>,
CreateJsonRpcIdFilter<Request, Response>,
>;
fn layer(&self, inner: S) -> Self::Service {
stack(
HttpConversionLayer,
JsonConversionLayer::<Request, Response>::new(),
CreateResponseFilterLayer::new(CreateJsonRpcIdFilter::new()),
)
.layer(inner)
}
}
fn stack<L1, L2, L3>(l1: L1, l2: L2, l3: L3) -> Stack<L1, Stack<L2, L3>> {
Stack::new(l1, Stack::new(l2, l3))
}