intrepid_core/system/
stateless.rsuse tower::Service;
use crate::{ActionContext, Frame, FrameFuture, Handler};
use super::System;
#[derive(Clone, Copy, Default)]
pub struct Stateless;
pub type StatelessSystem = System<Stateless, ()>;
impl StatelessSystem {
pub fn handle_frame(self, frame: crate::Frame) -> FrameFuture {
match self {
Self::Direct(system) => system.handle_frame(frame),
Self::Dispatch(system) => system.handle_frame(frame),
Self::Routed(system) => system.handle_frame(frame),
}
}
}
impl Handler<Frame, ()> for StatelessSystem {
type Future = FrameFuture;
fn invoke(&self, frame: impl Into<Frame>, _: ()) -> Self::Future {
let frame = frame.into();
let instance = self.clone();
match instance {
Self::Direct(system) => system.handle_frame(frame),
Self::Dispatch(system) => system.handle_frame(frame),
Self::Routed(system) => system.handle_frame(frame),
}
}
fn context(&self) -> ActionContext<()> {
match self {
Self::Direct(system) => system.action_context(),
Self::Dispatch(system) => system.action_context(),
Self::Routed(system) => system.action_context(),
}
}
}
impl<IntoFrame> Service<IntoFrame> for StatelessSystem
where
IntoFrame: Into<Frame> + Clone + Send + 'static,
{
type Response = Frame;
type Error = crate::Error;
type Future = FrameFuture;
fn poll_ready(
&mut self,
_: &mut std::task::Context<'_>,
) -> std::task::Poll<Result<(), Self::Error>> {
std::task::Poll::Ready(Ok(()))
}
fn call(&mut self, frame: IntoFrame) -> Self::Future {
let frame: Frame = frame.into();
let instance = self.clone();
instance.invoke(frame, ())
}
}