pub mod database; pub mod federation; use std::sync::Arc; #[cfg(feature = "oauth-discord")] use url::Url; #[cfg(feature = "oauth-discord")] use crate::{config::DiscordOauth, server::driver::auth::OauthClient}; use crate::{config::Config, server::driver::SellershutDriver}; #[derive(Clone)] pub struct AppState { driver: Arc, #[cfg(feature = "oauth-discord")] pub oauth_discord: OauthClient, } impl AppState { pub async fn new(config: &Config, driver: impl SellershutDriver) -> anyhow::Result { Ok(Self { driver: Arc::new(driver), #[cfg(feature = "oauth-discord")] oauth_discord: discord_client(&config.oauth.discord, &config.oauth.oauth_redirect_url)?, }) } } #[cfg(feature = "oauth-discord")] fn discord_client(disc: &DiscordOauth, redirect: &Url) -> anyhow::Result { use crate::server::driver::{self, auth::ClientOptions}; let discord_opts = ClientOptions::builder() .client_id(disc.client_id.to_owned()) .redirect_url(redirect.to_string()) .auth_url(disc.auth_url.to_string()) .client_secret(disc.client_secret.clone()) .token_url(disc.token_url.to_string()) .build(); Ok(driver::auth::oauth_client(&discord_opts)?) }