1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
use std::future::Future; use std::pin::Pin; use std::task::{Context, Poll}; use actix_codec::{AsyncRead, AsyncWrite, Framed}; use actix_service::{IntoService, Service}; use actix_utils::framed; use super::{Codec, Frame, Message}; pub struct Dispatcher<S, T> where S: Service<Request = Frame, Response = Message> + 'static, T: AsyncRead + AsyncWrite, { inner: framed::Dispatcher<S, T, Codec>, } impl<S, T> Dispatcher<S, T> where T: AsyncRead + AsyncWrite, S: Service<Request = Frame, Response = Message>, S::Future: 'static, S::Error: 'static, { pub fn new<F: IntoService<S>>(io: T, service: F) -> Self { Dispatcher { inner: framed::Dispatcher::new(Framed::new(io, Codec::new()), service), } } pub fn with<F: IntoService<S>>(framed: Framed<T, Codec>, service: F) -> Self { Dispatcher { inner: framed::Dispatcher::new(framed, service), } } } impl<S, T> Future for Dispatcher<S, T> where T: AsyncRead + AsyncWrite, S: Service<Request = Frame, Response = Message>, S::Future: 'static, S::Error: 'static, { type Output = Result<(), framed::DispatcherError<S::Error, Codec>>; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { Pin::new(&mut self.inner).poll(cx) } }