axum-limit 0.1.0

Production-oriented rate limiting for Axum via extractors, with pluggable algorithms, storage backends, and dynamic quotas.
Documentation
use crate::backend::StorageKey;
use crate::Key;
use http::{Method, Uri, Version};

impl Key for Uri {
    type Extractor = Uri;

    fn from_extractor(extractor: &Self::Extractor) -> Self {
        extractor.clone()
    }
}

impl StorageKey for Uri {
    fn storage_key(&self) -> String {
        self.to_string()
    }
}

impl Key for Method {
    type Extractor = Method;

    fn from_extractor(extractor: &Self::Extractor) -> Self {
        extractor.clone()
    }
}

impl StorageKey for Method {
    fn storage_key(&self) -> String {
        self.as_str().to_string()
    }
}

impl Key for Version {
    type Extractor = Version;

    fn from_extractor(extractor: &Self::Extractor) -> Self {
        *extractor
    }
}

impl StorageKey for Version {
    fn storage_key(&self) -> String {
        format!("{self:?}")
    }
}

macro_rules! impl_key_for_tuple {
    ($($name:ident),+) => {
        #[allow(non_snake_case)]
        impl<$($name),+> Key for ($($name,)+)
        where
            $($name: Key,)+
        {
            type Extractor = ($($name::Extractor,)+);

            fn from_extractor(($($name,)+): &Self::Extractor) -> Self {
                ($($name::from_extractor($name),)+)
            }
        }

        #[allow(non_snake_case)]
        impl<$($name),+> StorageKey for ($($name,)+)
        where
            $($name: StorageKey,)+
        {
            fn storage_key(&self) -> String {
                let ($($name,)+) = self;
                vec![$($name.storage_key()),+].join("|")
            }
        }
    }
}

impl_key_for_tuple!(T0);
impl_key_for_tuple!(T0, T1);
impl_key_for_tuple!(T0, T1, T2);
impl_key_for_tuple!(T0, T1, T2, T3);
impl_key_for_tuple!(T0, T1, T2, T3, T4);
impl_key_for_tuple!(T0, T1, T2, T3, T4, T5);
impl_key_for_tuple!(T0, T1, T2, T3, T4, T5, T6);
impl_key_for_tuple!(T0, T1, T2, T3, T4, T5, T6, T7);
impl_key_for_tuple!(T0, T1, T2, T3, T4, T5, T6, T7, T8);
impl_key_for_tuple!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9);
impl_key_for_tuple!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);
impl_key_for_tuple!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11);