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#[derive(Debug, Clone, PartialEq, Eq, Default)]
12pub struct FredOptions {
13 pub rate_limit: FredRateLimitOptions,
14 pub secondary_storage: FredSecondaryStorageOptions,
15}
16
17pub type FredRustAuthOptions = FredOptions;
19
20#[derive(Clone)]
22pub struct FredStores {
23 pub rate_limit: FredRateLimitStore,
24 pub secondary_storage: FredSecondaryStorage,
25}
26
27pub 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 #[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}