use super::{Credentials, TokenProvider};
use crate::sender::Error;
use std::future::Future;
use tracing::instrument;
pub trait TokenInjector: Sized + Send + Sync {
fn inject_token(
self,
token_provider: &dyn TokenProvider,
) -> impl Future<Output = Result<Self, Error>>;
}
impl TokenInjector for reqwest::RequestBuilder {
#[allow(clippy::blocks_in_conditions)]
#[instrument(level = "debug", skip(token_provider), err)]
async fn inject_token(self, token_provider: &dyn TokenProvider) -> Result<Self, Error> {
if let Some(credentials) = token_provider.provide_access_token().await? {
Ok(match credentials {
Credentials::Bearer(token) => self.bearer_auth(token),
Credentials::Basic(username, password) => self.basic_auth(username, password),
})
} else {
Ok(self)
}
}
}