pub mod database; use sellershut_auth::{ClientOptions, OauthClient}; use sqlx::PgPool; #[cfg(feature = "oauth-discord")] use url::Url; use crate::config::Config; #[cfg(feature = "oauth-discord")] use crate::config::DiscordOauth; pub struct AppState { database: PgPool, #[cfg(feature = "oauth-discord")] oauth_discord: OauthClient, } impl AppState { pub async fn new(config: &Config) -> anyhow::Result { let database = database::connect(&config.database).await?; Ok(Self { database, 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 { 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(sellershut_auth::oauth_client(&discord_opts)?) }