use bon::Builder; use oauth2::{AuthUrl, ClientId, ClientSecret, EndpointNotSet, EndpointSet, RedirectUrl, TokenUrl}; use secrecy::{ExposeSecret, SecretString}; #[derive(Builder)] pub struct ClientOptions { client_id: String, client_secret: SecretString, token_url: String, auth_url: String, redirect_url: String, } pub type OauthClient = oauth2::basic::BasicClient< EndpointSet, EndpointNotSet, EndpointNotSet, EndpointNotSet, EndpointSet, >; pub fn oauth_client(opts: &ClientOptions) -> anyhow::Result { let redirect_url = RedirectUrl::new(opts.redirect_url.to_owned())?; let client_id = ClientId::new(opts.client_id.to_owned()); let auth_url = AuthUrl::new(opts.auth_url.to_owned())?; let token_url = TokenUrl::new(opts.token_url.to_owned())?; let client_secret = ClientSecret::new(opts.client_secret.expose_secret().to_string()); Ok(oauth2::basic::BasicClient::new(client_id) .set_client_secret(client_secret) .set_auth_uri(auth_url) .set_token_uri(token_url) .set_redirect_uri(redirect_url)) }