Skip to main content

rustauth_fred/
bundle.rs

1use std::sync::Arc;
2
3use rustauth_core::error::RustAuthError;
4use rustauth_core::options::{RateLimitOptions, RustAuthOptions};
5
6use crate::config::{FredRateLimitOptions, FredSecondaryStorageOptions};
7use crate::storage::FredSecondaryStorage;
8use crate::store::{connect_client, FredRateLimitStore};
9
10/// Shared connection options for rate limiting and secondary storage.
11#[derive(Debug, Clone, PartialEq, Eq, Default)]
12pub struct FredOptions {
13    pub rate_limit: FredRateLimitOptions,
14    pub secondary_storage: FredSecondaryStorageOptions,
15}
16
17/// Previous name for [`FredOptions`]; kept for migration.
18pub type FredRustAuthOptions = FredOptions;
19
20/// Rate limit and secondary storage backed by one `fred` client.
21#[derive(Clone)]
22pub struct FredStores {
23    pub rate_limit: FredRateLimitStore,
24    pub secondary_storage: FredSecondaryStorage,
25}
26
27/// Previous name for [`FredStores`]; kept for migration.
28pub type FredRustAuthStores = FredStores;
29
30impl FredStores {
31    pub async fn connect(url: &str) -> Result<Self, RustAuthError> {
32        Self::connect_with_options(url, FredOptions::default()).await
33    }
34
35    pub async fn connect_with_options(
36        url: &str,
37        options: FredOptions,
38    ) -> Result<Self, RustAuthError> {
39        let client = connect_client(url).await?;
40        Ok(Self {
41            rate_limit: FredRateLimitStore::new(client.clone(), options.rate_limit),
42            secondary_storage: FredSecondaryStorage::new(client, options.secondary_storage),
43        })
44    }
45
46    /// Wires both stores into [`RustAuthOptions`] (secondary storage + distributed rate limit).
47    #[must_use]
48    pub fn apply_to_options(&self, options: RustAuthOptions) -> RustAuthOptions {
49        options
50            .secondary_storage(Arc::new(self.secondary_storage.clone()))
51            .rate_limit(RateLimitOptions::secondary_storage(self.rate_limit.clone()))
52    }
53}