drogue_client/openid/
inject.rs1use crate::{
2 error::ClientError,
3 openid::{Credentials, TokenProvider},
4};
5use async_trait::async_trait;
6use tracing::instrument;
7
8#[async_trait]
10pub trait TokenInjector: Sized + Send + Sync {
11 async fn inject_token(self, token_provider: &dyn TokenProvider) -> Result<Self, ClientError>;
12}
13
14#[async_trait]
16impl TokenInjector for reqwest::RequestBuilder {
17 #[instrument(level = "debug", skip(token_provider), err)]
18 async fn inject_token(self, token_provider: &dyn TokenProvider) -> Result<Self, ClientError> {
19 if let Some(credentials) = token_provider
20 .provide_access_token()
21 .await
22 .map_err(|err| ClientError::Token(Box::new(err)))?
23 {
24 Ok(match credentials {
25 Credentials::Bearer(token) => self.bearer_auth(token),
26 Credentials::Basic(username, password) => self.basic_auth(username, password),
27 })
28 } else {
29 Ok(self)
30 }
31 }
32}