1use std::sync::Arc;
2
3use futures::future::BoxFuture;
4
5use self::credential::GcpCredential;
6use crate::CredentialProvider;
7use crate::{ClientOptions, RequestSigner, Result, RetryConfig};
8
9pub use builder::*;
10
11mod builder;
12pub(crate) mod credential;
13
14pub type GcpCredentialProvider = Arc<dyn CredentialProvider<Credential = GcpCredential>>;
15
16#[derive(Debug, Clone)]
17pub struct GoogleConfig {
18 pub credentials: GcpCredentialProvider,
19
20 pub retry_config: RetryConfig,
21
22 pub client_options: ClientOptions,
23}
24
25impl GoogleConfig {
26 pub(crate) fn new(
27 credentials: GcpCredentialProvider,
28 retry_config: RetryConfig,
29 client_options: ClientOptions,
30 ) -> Self {
31 Self {
32 credentials,
33 retry_config,
34 client_options,
35 }
36 }
37
38 pub(crate) async fn get_credential(&self) -> Result<Arc<GcpCredential>> {
39 self.credentials.get_credential().await
40 }
41}
42
43impl RequestSigner for GoogleConfig {
44 fn sign<'a>(
45 &'a self,
46 req: reqwest::RequestBuilder,
47 ) -> BoxFuture<'a, Result<reqwest::RequestBuilder>> {
48 Box::pin(async move {
49 let credential = self.get_credential().await?;
50 Ok(req.bearer_auth(&credential.bearer))
51 })
52 }
53}