// Copyright 2026 Leo Cheng
// SPDX-License-Identifier: Apache-2.0

///|
/// What stands in front of a pool's backend. Every part is optional and the
/// preset has none, which leaves the pool exactly as it is without a ward.
///
/// The four guards are about a backend that misbehaves. The limiter is about the
/// pool's own concurrency: it holds a lease for every loan, and the limit it keeps
/// moves with how long those loans take, so a quiet backend is allowed more at once
/// and a slow one fewer, under the same `size`.
pub(all) struct Ward {
  breaker : @moonward.Breaker?
  bucket : @moonward.Bucket?
  backoff : @moonward.Backoff?
  shedder : @moonward.Shedder?
  limiter : @moonward.Limiter?
}

///|
pub let ward : Ward = {
  breaker: None,
  bucket: None,
  backoff: None,
  shedder: None,
  limiter: None,
}

///|
pub fn Ward::new(
  breaker? : @moonward.Breaker,
  bucket? : @moonward.Bucket,
  backoff? : @moonward.Backoff,
  shedder? : @moonward.Shedder,
  limiter? : @moonward.Limiter,
) -> Ward {
  { breaker, bucket, backoff, shedder, limiter, }
}

///|
pub using @moonward {
  type Backoff,
  type Bucket,
  type Gate,
  type Jitter,
  type Sliding,
  backoff,
}