apikeys_rs/manager/
mod.rs

1use async_trait::async_trait;
2
3use crate::{
4    errors::{ApiKeyLimiterError, ApiKeyManagerError, ApiKeyStorageError},
5    traits::{ApiKeyLimiter, ApiKeyManager, ApiKeyStorage},
6    types::ApiKey,
7};
8
9#[derive(Clone)]
10pub struct KeyManager<S, L>
11where
12    S: ApiKeyStorage + Send + Sync,
13    L: ApiKeyLimiter + Send + Sync,
14{
15    storage: S,
16    limiter: L,
17}
18
19impl<S, L> KeyManager<S, L>
20where
21    S: ApiKeyStorage + Send + Sync,
22    L: ApiKeyLimiter + Send + Sync,
23{
24    pub fn new(storage: S, limiter: L) -> Self {
25        KeyManager { storage, limiter }
26    }
27}
28
29#[async_trait]
30impl<S, L> ApiKeyManager for KeyManager<S, L>
31where
32    S: ApiKeyStorage + Send + Sync,
33    L: ApiKeyLimiter + Send + Sync,
34{
35    async fn get_key(&self, key: &str) -> Result<ApiKey, ApiKeyManagerError> {
36        let api_key = self.storage.retrieve_api_key(key).await?;
37
38        Ok(api_key)
39    }
40
41    async fn use_key(&self, key: &str) -> Result<(), ApiKeyManagerError> {
42        let api_key = self.get_key(key).await?;
43
44        self.limiter.use_key(&api_key).await?;
45
46        Ok(())
47    }
48}
49
50impl From<ApiKeyLimiterError> for ApiKeyManagerError {
51    fn from(error: ApiKeyLimiterError) -> Self {
52        ApiKeyManagerError::LimiterError(error)
53    }
54}
55
56impl From<ApiKeyStorageError> for ApiKeyManagerError {
57    fn from(error: ApiKeyStorageError) -> Self {
58        ApiKeyManagerError::StorageError(error)
59    }
60}