#[cfg(feature = "opentelemetry")]
#[cfg_attr(docsrs, doc(cfg(feature = "opentelemetry")))]
pub mod opentelemetry;
#[cfg(feature = "prometheus")]
#[cfg_attr(docsrs, doc(cfg(feature = "prometheus")))]
pub mod prometheus;
#[cfg(feature = "retry")]
#[cfg_attr(docsrs, doc(cfg(feature = "retry")))]
pub mod retry;
#[cfg(feature = "sentry")]
#[cfg_attr(docsrs, doc(cfg(feature = "sentry")))]
pub mod sentry;
#[cfg(feature = "tracing")]
#[cfg_attr(docsrs, doc(cfg(feature = "tracing")))]
pub mod tracing;
#[cfg(feature = "limit")]
#[cfg_attr(docsrs, doc(cfg(feature = "limit")))]
pub mod limit {
pub use tower::limit::ConcurrencyLimitLayer;
pub use tower::limit::GlobalConcurrencyLimitLayer;
pub use tower::limit::RateLimitLayer;
}
#[cfg(feature = "catch-panic")]
use apalis_core::error::AbortError;
use apalis_core::{backend::Backend, worker::builder::WorkerBuilder};
#[cfg(feature = "catch-panic")]
use catch_panic::CatchPanicLayer;
use tower::layer::util::{Identity, Stack};
#[cfg(feature = "timeout")]
#[cfg_attr(docsrs, doc(cfg(feature = "timeout")))]
pub use tower::timeout::TimeoutLayer;
#[cfg(feature = "catch-panic")]
#[cfg_attr(docsrs, doc(cfg(feature = "catch-panic")))]
pub mod catch_panic;
pub trait WorkerBuilderExt<Args, Ctx, Source, Middleware> {
fn option_layer<T>(
self,
layer: Option<T>,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::Either<T, Identity>, Middleware>>;
fn layer_fn<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::layer::LayerFn<F>, Middleware>>;
#[cfg(feature = "limit")]
fn concurrency(
self,
max: usize,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::limit::ConcurrencyLimitLayer, Middleware>>;
#[cfg(feature = "limit")]
fn rate_limit(
self,
num: u64,
per: std::time::Duration,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::limit::RateLimitLayer, Middleware>>;
#[cfg(feature = "retry")]
fn retry<P>(
self,
policy: P,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::retry::RetryLayer<P>, Middleware>>;
#[cfg(feature = "timeout")]
fn timeout(
self,
timeout: std::time::Duration,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::timeout::TimeoutLayer, Middleware>>;
#[cfg(feature = "filter")]
fn filter<P>(
self,
predicate: P,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::filter::FilterLayer<P>, Middleware>>;
#[cfg(feature = "filter")]
fn filter_async<P>(
self,
predicate: P,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::filter::AsyncFilterLayer<P>, Middleware>>;
fn map_request<F, R1, R2>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::MapRequestLayer<F>, Middleware>>
where
F: FnMut(R1) -> R2 + Clone;
fn map_response<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::MapResponseLayer<F>, Middleware>>;
fn map_err<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::MapErrLayer<F>, Middleware>>;
fn map_future<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::MapFutureLayer<F>, Middleware>>;
fn then<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::ThenLayer<F>, Middleware>>;
fn and_then<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::AndThenLayer<F>, Middleware>>;
fn map_result<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::MapResultLayer<F>, Middleware>>;
#[cfg(feature = "catch-panic")]
#[cfg_attr(docsrs, doc(cfg(feature = "catch-panic")))]
#[allow(clippy::type_complexity)]
fn catch_panic(
self,
) -> WorkerBuilder<
Args,
Ctx,
Source,
Stack<
CatchPanicLayer<fn(Box<dyn std::any::Any + Send>) -> AbortError, AbortError>,
Middleware,
>,
>;
#[cfg(feature = "tracing")]
#[cfg_attr(docsrs, doc(cfg(feature = "tracing")))]
fn enable_tracing(
self,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tracing::TraceLayer, Middleware>>;
}
impl<Args, Ctx, Source, Middleware> WorkerBuilderExt<Args, Ctx, Source, Middleware>
for WorkerBuilder<Args, Ctx, Source, Middleware>
where
Source: Backend<Args = Args, Context = Ctx>,
{
fn option_layer<T>(
self,
layer: Option<T>,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::Either<T, Identity>, Middleware>> {
self.layer(tower::util::option_layer(layer))
}
fn layer_fn<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::layer::LayerFn<F>, Middleware>> {
self.layer(tower::layer::layer_fn(f))
}
#[cfg(feature = "limit")]
fn concurrency(
self,
max: usize,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::limit::ConcurrencyLimitLayer, Middleware>>
{
self.layer(tower::limit::ConcurrencyLimitLayer::new(max))
}
#[cfg(feature = "limit")]
fn rate_limit(
self,
num: u64,
per: std::time::Duration,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::limit::RateLimitLayer, Middleware>> {
self.layer(tower::limit::RateLimitLayer::new(num, per))
}
#[cfg(feature = "retry")]
fn retry<P>(
self,
policy: P,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::retry::RetryLayer<P>, Middleware>> {
self.layer(tower::retry::RetryLayer::new(policy))
}
#[cfg(feature = "timeout")]
fn timeout(
self,
timeout: std::time::Duration,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::timeout::TimeoutLayer, Middleware>> {
self.layer(tower::timeout::TimeoutLayer::new(timeout))
}
#[cfg(feature = "filter")]
fn filter<P>(
self,
predicate: P,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::filter::FilterLayer<P>, Middleware>> {
self.layer(tower::filter::FilterLayer::new(predicate))
}
#[cfg(feature = "filter")]
fn filter_async<P>(
self,
predicate: P,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::filter::AsyncFilterLayer<P>, Middleware>>
{
self.layer(tower::filter::AsyncFilterLayer::new(predicate))
}
fn map_request<F, R1, R2>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::MapRequestLayer<F>, Middleware>>
where
F: FnMut(R1) -> R2 + Clone,
{
self.layer(tower::util::MapRequestLayer::new(f))
}
fn map_response<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::MapResponseLayer<F>, Middleware>> {
self.layer(tower::util::MapResponseLayer::new(f))
}
fn map_err<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::MapErrLayer<F>, Middleware>> {
self.layer(tower::util::MapErrLayer::new(f))
}
fn map_future<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::MapFutureLayer<F>, Middleware>> {
self.layer(tower::util::MapFutureLayer::new(f))
}
fn then<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::ThenLayer<F>, Middleware>> {
self.layer(tower::util::ThenLayer::new(f))
}
fn and_then<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::AndThenLayer<F>, Middleware>> {
self.layer(tower::util::AndThenLayer::new(f))
}
fn map_result<F>(
self,
f: F,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tower::util::MapResultLayer<F>, Middleware>> {
self.layer(tower::util::MapResultLayer::new(f))
}
#[cfg(feature = "catch-panic")]
#[cfg_attr(docsrs, doc(cfg(feature = "catch-panic")))]
fn catch_panic(
self,
) -> WorkerBuilder<
Args,
Ctx,
Source,
Stack<
CatchPanicLayer<fn(Box<dyn std::any::Any + Send>) -> AbortError, AbortError>,
Middleware,
>,
> {
self.layer(CatchPanicLayer::new())
}
#[cfg(feature = "tracing")]
#[cfg_attr(docsrs, doc(cfg(feature = "tracing")))]
fn enable_tracing(
self,
) -> WorkerBuilder<Args, Ctx, Source, Stack<tracing::TraceLayer, Middleware>> {
use tracing::TraceLayer;
self.layer(TraceLayer::new())
}
}