Skip to main content

openauth_core/options/
root.rs

1use std::fmt;
2use std::sync::Arc;
3
4use openauth_oauth::oauth2::SocialOAuthProvider;
5
6use crate::crypto::SecretEntry;
7use crate::plugin::AuthPlugin;
8
9use super::account::AccountOptions;
10use super::advanced::AdvancedOptions;
11use super::email_verification::EmailVerificationOptions;
12use super::origins::TrustedOriginOptions;
13use super::password::PasswordOptions;
14use super::rate_limit::RateLimitOptions;
15use super::session::SessionOptions;
16use super::user::UserOptions;
17
18/// Telemetry collection settings (parity with Better Auth `telemetry` init option).
19#[derive(Debug, Clone, PartialEq, Eq, Default)]
20pub struct TelemetryOptions {
21    /// When `None`, option-side telemetry is off unless overridden by environment.
22    pub enabled: Option<bool>,
23    pub debug: bool,
24}
25
26/// Experimental feature flags.
27#[derive(Debug, Clone, PartialEq, Eq, Default)]
28pub struct ExperimentalOptions {
29    pub joins: bool,
30}
31
32/// Top-level OpenAuth configuration.
33#[derive(Clone, Default)]
34pub struct OpenAuthOptions {
35    pub base_url: Option<String>,
36    pub base_path: Option<String>,
37    pub secret: Option<String>,
38    pub secrets: Vec<SecretEntry>,
39    pub trusted_origins: TrustedOriginOptions,
40    pub disabled_paths: Vec<String>,
41    pub session: SessionOptions,
42    pub user: UserOptions,
43    pub email_verification: EmailVerificationOptions,
44    pub password: PasswordOptions,
45    pub account: AccountOptions,
46    pub advanced: AdvancedOptions,
47    pub rate_limit: RateLimitOptions,
48    pub plugins: Vec<AuthPlugin>,
49    pub social_providers: Vec<Arc<dyn SocialOAuthProvider>>,
50    pub production: bool,
51    pub telemetry: TelemetryOptions,
52    pub experimental: ExperimentalOptions,
53}
54
55impl fmt::Debug for OpenAuthOptions {
56    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
57        formatter
58            .debug_struct("OpenAuthOptions")
59            .field("base_url", &self.base_url)
60            .field("base_path", &self.base_path)
61            .field("secret", &self.secret.as_ref().map(|_| "<redacted>"))
62            .field(
63                "secrets",
64                &format_args!("{} secret(s) redacted", self.secrets.len()),
65            )
66            .field("trusted_origins", &self.trusted_origins)
67            .field("disabled_paths", &self.disabled_paths)
68            .field("session", &self.session)
69            .field("user", &self.user)
70            .field("email_verification", &self.email_verification)
71            .field("password", &self.password)
72            .field("account", &self.account)
73            .field("advanced", &self.advanced)
74            .field("rate_limit", &self.rate_limit)
75            .field("plugins", &self.plugins)
76            .field(
77                "social_providers",
78                &self
79                    .social_providers
80                    .iter()
81                    .map(|provider| provider.id())
82                    .collect::<Vec<_>>(),
83            )
84            .field("production", &self.production)
85            .field("telemetry", &self.telemetry)
86            .field("experimental", &self.experimental)
87            .finish()
88    }
89}