diff --git a/src/service.rs b/src/service.rs index e51be9964..0d0bda43b 100644 --- a/src/service.rs +++ b/src/service.rs @@ -1,3 +1,5 @@ +use std::future::Future; +use std::task::{Context, Poll}; use std::cell::{Ref, RefMut}; use std::rc::Rc; use std::{fmt, net}; @@ -9,7 +11,9 @@ use actix_http::{ ResponseHead, }; use actix_router::{IntoPattern, Path, Resource, ResourceDef, Url}; -use actix_service::{IntoServiceFactory, ServiceFactory}; +use actix_service::{IntoServiceFactory, ServiceFactory, Service}; + +use futures::future::{ok, Ready}; use crate::config::{AppConfig, AppService}; use crate::data::Data; @@ -487,6 +491,58 @@ impl WebService { guards: self.guards, } } + + pub fn handler(self, handler: S) -> impl HttpServiceFactory + where + S: Handle + Clone + 'static, + { + + self.finish(Handler { + service: handler + }) + + } +} + + +pub trait Handle { + type Future: Future>; + + fn call(&mut self, req: ServiceRequest) -> Self::Future; +} + +#[derive(Clone)] +pub struct Handler { + service: S +} + +impl Service for Handler { + type Request = ServiceRequest; + type Response = ServiceResponse; + type Error = Error; + type Future = S::Future; + + fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, req: ServiceRequest) -> Self::Future { + self.service.call(req) + } +} + +impl ServiceFactory for Handler { + type Request = ServiceRequest; + type Response = ServiceResponse; + type Error = Error; + type Future = Ready, ()>>; + type Config = (); + type InitError = (); + type Service = Handler; + + fn new_service(&self, _config: ()) -> Self::Future { + ok(self.clone()) + } } struct WebServiceImpl {