drogue_client/openid/provider/
mod.rs

1mod access_token;
2#[cfg(feature = "openid")]
3mod openid;
4
5pub use self::access_token::*;
6#[cfg(feature = "openid")]
7pub use self::openid::*;
8
9use crate::error::ClientError;
10use async_trait::async_trait;
11use std::fmt::Debug;
12
13#[derive(Clone, Debug)]
14pub enum Credentials {
15    Bearer(String),
16    Basic(String, Option<String>),
17}
18
19/// A provider for access credentials (mostly access tokens).
20#[async_trait]
21pub trait TokenProvider: Send + Sync + Debug {
22    async fn provide_access_token(&self) -> Result<Option<Credentials>, ClientError>;
23}
24
25/// A token provider which does not provide tokens.
26#[derive(Debug, Clone, Copy)]
27pub struct NoTokenProvider;
28
29#[async_trait]
30impl TokenProvider for NoTokenProvider {
31    async fn provide_access_token(&self) -> Result<Option<Credentials>, ClientError> {
32        Ok(None)
33    }
34}
35
36#[async_trait]
37impl<T> TokenProvider for Option<T>
38where
39    T: TokenProvider + Sync,
40{
41    async fn provide_access_token(&self) -> Result<Option<Credentials>, ClientError> {
42        match self {
43            None => Ok(None),
44            Some(provider) => provider.provide_access_token().await,
45        }
46    }
47}
48
49#[async_trait]
50impl TokenProvider for String {
51    async fn provide_access_token(&self) -> Result<Option<Credentials>, ClientError> {
52        Ok(Some(Credentials::Bearer(self.clone())))
53    }
54}