use std::task::{Context, Poll};
use http::Request;
use tower_layer::Layer;
use tower_service::Service;
#[derive(Debug, Clone, Copy)]
pub struct TierCost(pub u32);
pub fn tier_cost(cost: u32) -> TierCostLayer {
TierCostLayer(cost)
}
#[derive(Debug, Clone, Copy)]
pub struct TierCostLayer(u32);
impl<S> Layer<S> for TierCostLayer {
type Service = TierCostService<S>;
fn layer(&self, inner: S) -> Self::Service {
TierCostService {
inner,
cost: self.0,
}
}
}
#[derive(Debug, Clone)]
pub struct TierCostService<S> {
inner: S,
cost: u32,
}
impl<S, B> Service<Request<B>> for TierCostService<S>
where
S: Service<Request<B>>,
{
type Response = S::Response;
type Error = S::Error;
type Future = S::Future;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
self.inner.poll_ready(cx)
}
fn call(&mut self, mut req: Request<B>) -> Self::Future {
req.extensions_mut().insert(TierCost(self.cost));
self.inner.call(req)
}
}