//! Trait object [`Service`] instances //! //! Dynamically dispatched [`Service`] objects allow for erasing the underlying //! [`Service`] type and using the `Service` instances as opaque handles. This can //! be useful when the service instance cannot be explicitly named for whatever //! reason. //! //! There are two variants of service objects. [`BoxService`] requires both the //! service and the response future to be [`Send`]. These values can move freely //! across threads. [`UnsyncBoxService`] requires both the service and the //! response future to remain on the current thread. This is useful for //! representing services that are backed by [`Rc`] or other non-[`Send`] types. //! //! # Examples //! //! ``` //! use futures_util::future::ready; //! # use tower_service::Service; //! # use tower::util::{BoxService, service_fn}; //! // Respond to requests using a closure, but closures cannot be named... //! # pub fn main() { //! let svc = service_fn(|mut request: String| { //! request.push_str(" response"); //! ready(Ok(request)) //! }); //! //! let service: BoxService = BoxService::new(svc); //! # drop(service); //! } //! ``` //! //! [`Service`]: crate::Service //! [`Rc`]: std::rc::Rc mod layer; mod sync; mod unsync; #[allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 pub use self::{layer::BoxLayer, sync::BoxService, unsync::UnsyncBoxService};