walker_common/sender/provider/
inject.rs

1use super::{Credentials, TokenProvider};
2use crate::sender::Error;
3use std::future::Future;
4use tracing::instrument;
5
6/// Allows injecting tokens.
7pub trait TokenInjector: Sized + Send + Sync {
8    fn inject_token(
9        self,
10        token_provider: &dyn TokenProvider,
11    ) -> impl Future<Output = Result<Self, Error>>;
12}
13
14/// Injects tokens into a request by setting the authorization header to a "bearer" token.
15impl TokenInjector for reqwest::RequestBuilder {
16    // Workaround until https://github.com/tokio-rs/tracing/issues/2876 is fixed
17    #[allow(clippy::blocks_in_conditions)]
18    #[instrument(level = "debug", skip(token_provider), err)]
19    async fn inject_token(self, token_provider: &dyn TokenProvider) -> Result<Self, Error> {
20        if let Some(credentials) = token_provider.provide_access_token().await? {
21            Ok(match credentials {
22                Credentials::Bearer(token) => self.bearer_auth(token),
23                Credentials::Basic(username, password) => self.basic_auth(username, password),
24            })
25        } else {
26            Ok(self)
27        }
28    }
29}