apikeys_rs/manager/
mod.rs1use 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}