use std::future::Future;
use std::pin::Pin;
use bytes::Bytes;
use http::HeaderMap;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TierIdentity {
pub user_id: String,
pub tier: String,
}
impl TierIdentity {
pub fn new(user_id: impl Into<String>, tier: impl Into<String>) -> Self {
Self {
user_id: user_id.into(),
tier: tier.into(),
}
}
}
pub trait TierIdentifier: Send + Sync + 'static {
fn identify(
&self,
headers: &HeaderMap,
) -> Pin<Box<dyn Future<Output = Option<TierIdentity>> + Send + '_>>;
fn identify_with_body(
&self,
headers: &HeaderMap,
_body: &Bytes,
) -> Pin<Box<dyn Future<Output = Option<TierIdentity>> + Send + '_>> {
self.identify(headers)
}
}
#[allow(dead_code)]
pub(crate) struct ClosureIdentifier<F>(pub(crate) F);
impl<F> TierIdentifier for ClosureIdentifier<F>
where
F: Fn(&HeaderMap) -> Option<TierIdentity> + Send + Sync + 'static,
{
fn identify(
&self,
headers: &HeaderMap,
) -> Pin<Box<dyn Future<Output = Option<TierIdentity>> + Send + '_>> {
Box::pin(std::future::ready((self.0)(headers)))
}
}