use std::fmt;
use crate::layer::{Identity, Layer, Stack};
#[derive(Clone)]
pub struct ServiceBuilder<L> {
layer: L,
}
impl Default for ServiceBuilder<Identity> {
fn default() -> Self {
Self::new()
}
}
impl ServiceBuilder<Identity> {
pub fn new() -> Self {
ServiceBuilder {
layer: Identity::new(),
}
}
}
impl<L> ServiceBuilder<L> {
pub fn layer<T>(self, layer: T) -> ServiceBuilder<Stack<T, L>> {
ServiceBuilder {
layer: Stack::new(layer, self.layer),
}
}
pub fn option_layer<T>(
self,
layer: Option<T>,
) -> ServiceBuilder<Stack<crate::utils::Either<T, Identity>, L>> {
self.layer(crate::utils::option_layer(layer))
}
pub fn layer_fn<F>(self, f: F) -> ServiceBuilder<Stack<crate::layer::LayerFn<F>, L>> {
self.layer(crate::layer::layer_fn(f))
}
pub fn timeout(
self,
timeout: Option<std::time::Duration>,
) -> ServiceBuilder<Stack<crate::timeout::TimeoutLayer, L>> {
self.layer(crate::timeout::TimeoutLayer::new(timeout))
}
pub fn map_err<F>(self, f: F) -> ServiceBuilder<Stack<crate::layer::MapErrLayer<F>, L>> {
self.layer(crate::layer::MapErrLayer::new(f))
}
pub fn into_inner(self) -> L {
self.layer
}
pub fn service<S>(self, service: S) -> L::Service
where
L: Layer<S>,
{
self.layer.layer(service)
}
pub fn service_fn<F>(self, f: F) -> L::Service
where
L: Layer<crate::service::ServiceFn<F>>,
{
self.service(crate::service::service_fn(f))
}
}
impl<L: fmt::Debug> fmt::Debug for ServiceBuilder<L> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("ServiceBuilder").field(&self.layer).finish()
}
}
impl<S, L> Layer<S> for ServiceBuilder<L>
where
L: Layer<S>,
{
type Service = L::Service;
fn layer(self, inner: S) -> Self::Service {
self.layer.layer(inner)
}
}