diff --git a/src/lib.rs b/src/lib.rs index 0d488adf8..2b819f5bc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -130,6 +130,7 @@ pub mod dev { //! ``` pub use crate::config::{AppConfig, AppService}; + pub use actix_service::fn_factory; #[doc(hidden)] pub use crate::handler::Handler; pub use crate::info::ConnectionInfo; diff --git a/src/route.rs b/src/route.rs index 0a297b456..9ef54be74 100644 --- a/src/route.rs +++ b/src/route.rs @@ -126,6 +126,55 @@ impl Route { self } + /// Set the service to be called when this route is hit. + /// + /// ``` + /// # use actix_web::{*, dev::*, http::header}; + /// # use std::task::{Context, Poll}; + /// # use std::pin::Pin; + /// # use std::future::Future; + /// use futures_util::future::{ok, LocalBoxFuture}; + /// + /// struct HelloWorld; + /// + /// impl Service for HelloWorld { + /// type Response = ServiceResponse; + /// type Error = actix_web::Error; + /// type Future = LocalBoxFuture<'static, Result>; + /// + /// fn poll_ready(&self, _: &mut Context<'_>) -> Poll> { + /// Poll::Ready(Ok(())) + /// } + /// + /// fn call(&self, req: ServiceRequest) -> Self::Future { + /// let (req, _) = req.into_parts(); + /// + /// let res = HttpResponse::Ok() + /// .insert_header(header::ContentType::plaintext()) + /// .body("Hello world!"); + /// + /// Box::pin(ok(ServiceResponse::new(req, res))) + /// } + /// } + /// + /// App::new().service( + /// web::resource("/").route(web::get().service(fn_factory(|| ok(HelloWorld)))) + /// ); + /// ``` + pub fn service(mut self, service: S) -> Self + where + S: ServiceFactory< + ServiceRequest, + Response = ServiceResponse, + Error = Error, + InitError = (), + Config = (), + > + 'static, + { + self.service = boxed::factory(service); + self + } + /// Set handler function, use request extractors for parameters. /// /// ```