use crate::codec::{BackendMessage, FrontendMessage};
pub trait MiddlewareFactory<Context> {
type Handler;
fn create(&self, context: &Context) -> Self::Handler;
}
impl<Context, Handler, Factory> MiddlewareFactory<Context> for Factory
where
Factory: Fn(&Context) -> Handler,
{
type Handler = Handler;
fn create(&self, context: &Context) -> Handler {
self(context)
}
}
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct IdentityMiddleware;
impl<Context> MiddlewareFactory<Context> for IdentityMiddleware {
type Handler = Self;
fn create(&self, _context: &Context) -> Self {
*self
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct MiddlewareChain<First, Second>(pub First, pub Second);
impl<Context, First, Second> MiddlewareFactory<Context> for MiddlewareChain<First, Second>
where
First: MiddlewareFactory<Context>,
Second: MiddlewareFactory<Context>,
{
type Handler = MiddlewareChain<First::Handler, Second::Handler>;
fn create(&self, context: &Context) -> Self::Handler {
MiddlewareChain(self.0.create(context), self.1.create(context))
}
}
pub trait ClientMiddleware<State, Context> {
fn pre_startup(
&mut self,
_context: &Context,
_state: &mut State,
message: crate::pre_startup::PreStartupMessage,
) -> crate::pre_startup::PreStartupMessage {
message
}
fn startup(
&mut self,
_context: &Context,
_state: &mut State,
message: crate::startup::StartupMessage,
) -> crate::startup::StartupMessage {
message
}
fn frontend(
&mut self,
_context: &Context,
_state: &mut State,
message: FrontendMessage,
) -> FrontendMessage {
message
}
fn backend(
&mut self,
_context: &Context,
_state: &mut State,
message: BackendMessage,
) -> BackendMessage {
message
}
}
impl<State, Context> ClientMiddleware<State, Context> for IdentityMiddleware {}
impl<State, Context, First, Second> ClientMiddleware<State, Context>
for MiddlewareChain<First, Second>
where
First: ClientMiddleware<State, Context>,
Second: ClientMiddleware<State, Context>,
{
fn pre_startup(
&mut self,
context: &Context,
state: &mut State,
message: crate::pre_startup::PreStartupMessage,
) -> crate::pre_startup::PreStartupMessage {
let message = self.0.pre_startup(context, state, message);
self.1.pre_startup(context, state, message)
}
fn startup(
&mut self,
context: &Context,
state: &mut State,
message: crate::startup::StartupMessage,
) -> crate::startup::StartupMessage {
let message = self.0.startup(context, state, message);
self.1.startup(context, state, message)
}
fn frontend(
&mut self,
context: &Context,
state: &mut State,
message: FrontendMessage,
) -> FrontendMessage {
let message = self.0.frontend(context, state, message);
self.1.frontend(context, state, message)
}
fn backend(
&mut self,
context: &Context,
state: &mut State,
message: BackendMessage,
) -> BackendMessage {
let message = self.0.backend(context, state, message);
self.1.backend(context, state, message)
}
}
pub trait ServerMiddleware<State, Context> {
fn pre_startup(
&mut self,
_context: &Context,
_state: &mut State,
message: crate::pre_startup::PreStartupMessage,
) -> crate::pre_startup::PreStartupMessage {
message
}
fn startup(
&mut self,
_context: &Context,
_state: &mut State,
message: crate::startup::StartupMessage,
) -> crate::startup::StartupMessage {
message
}
fn cancellation(
&mut self,
_context: &Context,
_state: &mut State,
request: crate::CancellationRequest,
) -> crate::CancellationRequest {
request
}
fn frontend(
&mut self,
_context: &Context,
_state: &mut State,
message: FrontendMessage,
) -> FrontendMessage {
message
}
fn backend(
&mut self,
_context: &Context,
_state: &mut State,
message: BackendMessage,
) -> BackendMessage {
message
}
}
impl<State, Context> ServerMiddleware<State, Context> for IdentityMiddleware {}
impl<State, Context, First, Second> ServerMiddleware<State, Context>
for MiddlewareChain<First, Second>
where
First: ServerMiddleware<State, Context>,
Second: ServerMiddleware<State, Context>,
{
fn pre_startup(
&mut self,
context: &Context,
state: &mut State,
message: crate::pre_startup::PreStartupMessage,
) -> crate::pre_startup::PreStartupMessage {
let message = self.0.pre_startup(context, state, message);
self.1.pre_startup(context, state, message)
}
fn startup(
&mut self,
context: &Context,
state: &mut State,
message: crate::startup::StartupMessage,
) -> crate::startup::StartupMessage {
let message = self.0.startup(context, state, message);
self.1.startup(context, state, message)
}
fn cancellation(
&mut self,
context: &Context,
state: &mut State,
request: crate::CancellationRequest,
) -> crate::CancellationRequest {
let request = self.0.cancellation(context, state, request);
self.1.cancellation(context, state, request)
}
fn frontend(
&mut self,
context: &Context,
state: &mut State,
message: FrontendMessage,
) -> FrontendMessage {
let message = self.0.frontend(context, state, message);
self.1.frontend(context, state, message)
}
fn backend(
&mut self,
context: &Context,
state: &mut State,
message: BackendMessage,
) -> BackendMessage {
let message = self.0.backend(context, state, message);
self.1.backend(context, state, message)
}
}